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

授業中に一度解いた問題も含まれているかもしれませんが、改めてまとめてください。


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

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

  2. 問 2.5.4 (第 2 章
    2 つの引数 x, xs を受け取り、リスト xs から x と等しい要素を

    1. もっとも先頭に現れる一つの要素だけ取り除いたリストを返す関数 deleteOne

    2. すべて取り除いたリストを返す関数 deleteAll

    をそれぞれ定義せよ。

  3. 問 2.6.2 (第 2 章
    すべての有限リスト xs について、

    1. xs ++ [] = xs

    2. xs ++ (ys ++ zs) = (xs ++ ys) ++ zs

    が成り立つことを、xs に関する帰納法で証明せよ。 (どこで帰納法の仮定を使用するか明示せよ。)

  4. 問 2.7.1-2 (第 2 章
    これらの関数(や以前に紹介した関数)を使って、次のような関数を定義せよ。

    文字列のリストを受け取り、各文字列の最後に「;」をつけて 連接した文字列を返す addSemicolon

    例えば addSemicolon ["abc","xyz","123"] は "abc;xyz;123;" になる。

  5. 問 2.12.3 (第 2 章
    非負の整数 \(n\) を受け取り、\(1 \le x < y < z \le n\)の範囲で \(x^2 + y^2 = z^2\) となるすべての \(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)] となる。 (順番はこの例と異なっていても良い。)

  6. (挑戦・非必須)(ナイト巡回)問 2.13.4 (第 2 章

    (ナイト巡回)ナイトは、右の図の中央のマスから○印のマスへ 移動できるチェスのコマである。5 × 5マスのチェス盤で、あるマス (例えば、左上隅)から始めてすべてのマスを1回ずつ訪れる経路を求めるプログラムを作成せよ。

  7. (代数的データ型) 問 3.1.3 (第 3 章
    Tree 型に対して、次のような関数を定義せよ。

          depth     :: Tree a -> Integer -- 深さ
          preorder  :: Tree a -> [a]     -- 前順走査
          inorder   :: Tree a -> [a]     -- 中順走査
          postorder :: Tree a -> [a]     -- 後順走査
          reflect   :: Tree a -> Tree a  -- 鏡像
        

    例えば、① depth tree4, ② preorder tree4, ③ inorder tree4, ④ postorder tree4, ⑤ reflect tree4 の結果はそれぞれ、 ① 3, ② [2,1,3,4], ③ [1,2,3,4], ④ [1,4,3,2], ⑤ Branch (Branch (Branch Empty 4 Empty) 3 Empty) 2 (Branch Empty 1 Empty) となる。

  8. (型クラス) Q 3.5.1 (第 3 章 組込みのリスト型と等価なデータ型

    を、deriving を用いずに、Eq クラスと Ord クラス のインスタンスとして宣言せよ。Ord クラスのメソッドにはいわゆる 辞書式の順序を用いよ。

    (クラスの定義中にデフォルトの実装が定義されているので、Eq クラ スの == メソッドと Ord クラスの <= メソッドだけを 定義すれば、他のメソッドの定義は自動的に生成される。)

    ヒント: 次のような、リストから MyList への変換を行う 関数を定義して、

    いくつかのケースをテストせよ。

以上の解答をできるだけ短く簡潔におさめて下さい。Word などで作成し PDF に変換してください。 手書きでもかまいません。(その場合、スキャンして PDF にしてください。)
いずれにしても、綴じしろとして、余白を上下左右 15mm 以上取るようにしてください。

提出〆切は、12月 03日(木)の「プログラミング言語意味論」授業開始時です。
ファイルアップロードのページよりアップロードしてください。

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