授業中に一度解いた問題も含まれているかもしれませんが、改めて紙にまとめてください。
プリントの以下の問題を解いて下さい。
問 2.5.2-1(第 2 章 p.12)
真偽値のリスト [Bool]を 2進数と見なして、対応する整数を計算
する関数 fromBin :: [Bool] -> Integer を定義せよ。例えば、
fromBin [True,True] は 3、 fromBin [True,False,True,False] は 10になる。
ヒント: 引数の数を一つ増やした補助関数が必要になる。
ヒント: ホーナーの方法を使う。例えば
fromBin [True,False,True,False] は
\((1 \times 2 + 0) \times 2 + 1) \times 2 + 0\)、
fromBin [True,True,False,True] は
\((1 \times 2 + 1) \times 2 + 0) \times 2 + 1\)
となるように計算する。
問 2.5.2-2 (第 2 章 p.12)
真偽値のリスト [Bool]を 2進数と見なして、対応する整数を計算
する関数 fromBinRev :: [Bool] -> Integer を定義せよ。
ただし、先の問とは逆順に真偽値がならんでいると仮定せよ。例えば、
fromBinRev [True,True,False,True] は
\( 1 + 2 \times (1 + 2 \times (0 + 2 \times 1)) = 11_{(10)}\)
となる。
問 2.5.4 (第 2 章 p.12)
2つの引数 x
, xs
を受け取り、リスト xs
から
x
と等しい要素を
deleteOne
deleteAll
をそれぞれ定義せよ。
問 2.6.2 (第 2 章 p.14)
すべての有限リスト xs について、
が成り立つことを xs に関する帰納法で証明せよ。 (どこで帰納法の仮定を使用するか明示せよ。 さらに (++) の定義の等式:
[] ++ ys = ys -- ① (x:xs) ++ ys = x : (xs ++ ys) -- ②を使った場合は、①, ② をラベル付けせよ。 帰納法の仮定を使った場合は、⑨ をラベル付けせよ。 )
問 2.7.1 (第 2 章 p.16)
これらの関数(や以前に紹介した関数)を使って、次のような関数を定義せよ。
countEq
例えば countEq [1,2,3,5] [2,2,6,5,3]
は 2になる。
;
” をつけて
連接した文字列を返す addSemicolon
例えば addSemicolon ["abc","xyz","123"]
は "abc;xyz;123;"
になる。
問 2.12.2 (第 2 章 p.23)
非負の整数 \(n\) を受け取り、\( 0 \le x \le y \le n\) となるすべての \(x, y\)
の組を生成する関数 foo :: Integer -> [(Integer, Integer)]
を内包表記を用いて定義せよ。
ヒント: ..
を使う。
問 2.12.3 (第 2 章 p.23)
非負の整数 \(n\) を受け取り、
\(1 \le x \lt y \lt z \le n\)
の範囲で
\(x^2 + y^2 = z^2\)
となるすべての \(x, y, z\)
の組を生成する関数
chokkaku :: Integer -> [(Integer,Integer,Integer)]を内包表記を用いて定義せよ。
(挑戦・非必須)(ナイト巡回)問 2.13.4 (第 2 章 p.28)
ナイトは、右の図の中央のマスから○印のマスへ
移動できるチェスのコマである。5 × 5マスのチェス盤で、あるマス
(例えば、左上隅)から始めてすべてのマスを 1 回ずつ訪れる経路を求めるプログラムを作成せよ。
Tree 型に対して、次のような関数を定義せよ。
preorder :: Tree a -> [a] -- 前順走査 inorder :: Tree a -> [a] -- 中順走査 postorder :: Tree a -> [a] -- 後順走査例えば、 ② preorder tree4, ③ inorder tree4, ④ postorder tree4 の結果はそれぞれ、 ② [2,1,3,4], ③ [1,2,3,4], ④ [1,4,3,2] となる。
組込みのリスト型と等価なデータ型
data MyList a = MyNil | MyCons a (MyList a)
を、deriving を用いずに、Eq クラスと Ord クラスのインスタンスとして宣言せよ。 Ord クラスのメソッドにはいわゆる 辞書式の順序を用いよ。
(クラスの定義中にデフォルトの実装が定義されているので、Eq クラ スの == メソッドと Ord クラスの <= メソッドだけを 定義すれば、他のメソッドの定義は自動的に生成される。)
ヒント: 次のような、リストから MyList への変換を行う 関数を定義して、
toMyList :: [a] -> MyList a toMyList [] = MyNil toMyList (x:xs) = MyCons x (toMyList xs)
いくつかのケースをテストせよ。
toMyList "abc" <= toMyList "abd" -- True toMyList "ab" <= toMyList "abc" -- True toMyList "ab" <= toMyList "a" -- False toMyList "ab" <= toMyList "ba" -- True
以上の解答をできるだけ短く簡潔におさめて下さい。 手書きでもかまいません。 コンピューターを使う場合は \(\mathrm{\TeX}\) を推奨します。 (追加)いずれにしても、余白を上下左右 15mm 以上取るようにしてください。
提出〆切は、12月 05日(木)の「プログラミング言語意味論」授業開始時です。
(オンラインの提出はありません。)
4Q の「プログラミング言語意味論」を受講しない人は、
1 号棟 7 F 学科事務前の香川のポストに提出してもらっても構いません。