プログラミング・パラダイム レポート

授業中に一度解いた問題も含まれていますが、改めて紙にまとめてください。


プリントの以下の問題を解いて下さい。

  1. 問 3.5.2

    1. 真偽値のリスト [Bool] を 2進数と見なして、 対応する整数を計算する関数 fromBin :: [Bool] -> Integer を定義せよ。例えば、 fromBin [True,True]は 3、 fromBin [True,False,True,False]は 10になる。

      ヒント: 引数の数を一つ増やした補助関数が必要になる。
      ヒント: ホーナーの方法を使う。例えば fromBin [True,False,True,False] ((1 × 2 + 0) × 2 + 1) × 2 + 0fromBin [True,True,False,True] ((1 × 2 + 1) × 2 + 0) × 2 + 1 となるように計算する。

    2. 真偽値のリスト [Bool]を 2進数と見なして、対応する整数を計算 する関数 fromBinRev :: [Bool] -> Integer を定義せよ。ただし、先 の問とは逆順に真偽値がならんでいると仮定せよ。例えば、 fronBinRev [True,True,False,True] 1 + 2 × (1 + 2 × (0 + 2 × 1)) = 11(10) となる。

    3. リストを昇ベキの順に表された多項式と見なし、多項式の値を計算する関数
      evalPoly :: [Double] -> Double -> Double を定義せよ。例えば、 [1,2,3,4]というリストは 1 + 2 x + 3 x2 + 4 x3 という多項式と見なし、 evalPoly [1,2,3,4] 10の値は ( 1 + 2 × 10 + 3 × 102 + 4 × 103 = 4321 になる。

  2. 問 3.6.1
    すべての有限リスト xs について、

    1. xs ++ [] = xs
    2. (xs ++ ys) ++ zs = xs ++ (ys ++ zs)

    が成り立つことを xs に関する帰納法で証明せよ。 (どこで帰納法の仮定を使用するか明示せよ。)
    ただし (++) は、 プリント Ⅲ章 p.12 で定義されている関数である。

  3. 問3.10.2
    repeatList [2,5][2,5,2,5,2,5,2,5,2,5,…]repeatList [1,2,3][1,2,3,1,2,3,1,2,3,…] という無限リストになるような関数 repeatList :: [a] -> [a] を定義せよ。なお、引数のリストの要素数は任意である。

    ヒント: (++) を使用せよ。

  4. 問 3.13.3
    非負の整数 n を受け取り、 1 ≦ x < y < z ≦ n の範囲で、x2 + y2 = z2 となるすべての x, y, z の組を生成する関数 chokkaku :: Integer -> [(Integer,Integer,Integer)]を内包表記を用いて定義せよ。 例えば、chokkaku 20の値は、 [(3,4,5),(6,8,10),(5,12,13),(9,12,15),(8,15,17),(12,16,20)]となる。 (リスト内の順番はこの例と異なっていても良い。)

  5. (挑戦・非必須) 問 3.14.5

    1. ソートされた整数のリストのなかで、3つ並びの数、 2つの同じ数を見つけてリストアップする関数 shuntsu(順子), kotsu(刻子)、toitsu(対子) をそれぞれ定義せよ。

        Prelude> shuntsu [1,3,3,4,5,7,8,9]
        [[3,4,5],[7,8,9]]
        Prelude> toitsu [1,3,3,4,5,7,7,9]
        [[3,3],[7,7]]
      
    2. 14 個の要素を持つ Int のソートされたリストがマージャン清一色(チンイーソー)アガリ形になっているかを判定する関数 chinitsu を定義せよ。 ただし、アガリ形とは、順子(3つ並びの数)または 刻子(3つの同じ数)が 4つ、対子(2つの同じ数)が 1つ、そろった形である。

できるだけ短く簡潔におさめて下さい。 コンピュータを使う場合は ΤΕΧ link を推奨します。

提出〆切は、12月 12日(木)の「プログラミング言語意味論」授業開始時です。 (オンラインの提出はありません。)
4Q の「プログラミング言語意味論」を受講しない人は、 7F 学科事務前の香川のポストに提出してもらっても構いません。

プログラミング・パラダイム/プログラミング言語意味論 のホームページ
Koji Kagawa