プログラミング言語意味論 第1回レポート


  1. (代数的データ型)

    プリント第 3 章 p.20 問 3.11.2

    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) となる。

  2. (型クラス)

    プリント第 4 章 p.5 Q 4.5.1 (Eq および Ord 両方)

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

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

    を、deriving (発音は /diráiviŋ/) を用いずに、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

  3. main 関数を持つプログラム)

    プリント第 5 章 pp. 6 問 5.4.2(の 3つの小問のうち 2つ以上)

    • 入力文字列をごと大文字と小文字に変換して出力する。 例えば、Hello,↵ World↵hello,↵HELLO,↵world↵WORLD↵ になる。 (は改行を表す。)

    • 入力文字列中の数字(‘0’ 〜 ‘9’)の出現回数をカウントして出力する。

    • 入力文字列中の ‘@’ が出現する最初の10行だけを出力する。

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

  4. (CPS への変換)

    プリント第 8 章 問 8.3.1

    次の関数を「ボタンをクリックしたら、一つの線分を表示する」 というバージョンに書き換えよ。

    Sierpinski.htmlSierpinski.js

    ヒント: forward, sierpinski, zig, zag を CPS に変換する必要がある。turnLeft, turnRight については、 (この問題では) CPS にする必要はない。

    参考にするプログラム: Hanoi0.html, Hanoi0.js, Hanoi.html, Hanoi.js,
    Fib0.html, Fib0.js Fib.html, Fib.js

チャレンジ問題(ボーナス問題)

以下の問題は、非必須のチャレンジ問題です。

  1. (Prolog)

    Prolog言語をプリントで自習し、 プリント中のサンプルプログラムを元にして、 日本史や世界史、あるいは物語の中の有名な家系を Prologプログラムにし、 実行例を作成せよ。

  2. (Scheme)

    Scheme言語をプリントで自習し、 サンプルプログラム以外の call/ccの使用例を WWW などで探して、 できれば自分なりのアレンジを加えよ。

  3. (Haskell)

    Haskellによる画像作成ライブラリを用いて、 2, 3のオリジナル作品を作成せよ。


解答上の注意ほか

できるだけ短く簡潔におさめて下さい。

提出〆切は、2月 20日(木)の 18:00 です。 提出場所は、香川のレターボックス(7F 学科事務前)です。 (オンラインの提出はありません。)

B4/M2 など上記の締切までに提出するのが難しい人はメールで連絡を下さい。ただし、 成績の提出締切が 2/28 ですので、それ以降の提出の場合は、成績訂正というかたちになります。 (成績表に反映されるのが遅れます。) その場合でも、2/20 及び 2/27 の時点でできたところまで、 部分提出してもらうことが望ましいです。


プログラミング言語特論のホームページ
Koji Kagawa