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

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


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

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

    をそれぞれ定義せよ。

  2. 問 2.6.1 (第 2 章 p.14)
    すべての有限リスト xs について、

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

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

  3. 問 2.10.2 (第 2 章 p.18)
    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. 問 2.12.2 (第 2 章 p.22)
    非負の整数 n を受け取り、 0 ≦ x ≦ y ≦ n となるすべての x, y の組を生成する関数 foo :: Integer -> [(Integer,Integer)]を内包表記を用いて定義せよ。

    ヒント: [m..n] を使う。

  5. (挑戦・非必須)(ナイト巡回) 問 2.13.4 (第 2 章 p.26)
    ナイトは、右の図 move of knight の中央のマスから○印のマスへ 移動できるチェスのコマである。5 × 5マスのチェス盤で、あるマス (例えば、左上隅)から始めてすべてのマスを 1 回ずつ訪れる経路を求めるプログラムを作成せよ。

  6. (代数的データ型) 問 3.1.3 (第 3 章 p.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) となる。

  7. (型クラス) Q 3.7.1 (第 3 章 p.9)

    組込みのリスト型と等価なデータ型

      data MyList a = MyNil | MyCons a (MyList a)
    

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

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

    ヒント: 少なくとも以下のケースをテストせよ。

    1. toMyList "abc" <= toMyList "xyz" -- True
    2. toMyList "abc" <= toMyList "abd" -- True
    3. toMyList "axc" <= toMyList "xbz" -- True
    4. toMyList "xbz" <= toMyList "axc" -- False
    5. toMyList "abc" <= toMyList "abcde" -- True
    6. toMyList "abc" <= toMyList "ab" -- False
    7. toMyList "" <= toMyList "abc" -- True
    8. toMyList "abc" <= toMyList "" -- False

    ただし toMyList は以下のように定義された補助関数とする。

        toMyList       :: [a] ->  MyList a
        toMyList []     = MyNil
        toMyList (x:xs) = MyCons x (toMyList xs)
    

    参考にするプログラム: TypeClassExample.hs

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

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

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