たとえば、fun x -> e という式は関数を表すが、いったいこれの意味は何 かまだよくわかっていないうちに、その形式を処理するプログラムを書き始め るのである。
このようにする理由は、時間を節約するためではなく、むしろ、 「処理系を作成することが、そのプログラム言語を本当に理解するための近道 である。」という理由による。
効率などの理由により、これらの機能がどうしても必要な場面もあるのだが、 本実験では、関数型プログラム言語の表現力を理解してもらうため、 徹頭徹尾、これらの impure な機能を使わない という方針 で行く。(ただし、ファイルからの入出力などと、 例外処理機能は使う。)
その方針であっても、本実験でわかるように、プログラム言語の機能を理解す るためには十分な処理系が書けてしまうし、多くのアルゴリズムも書けてしま う、ということを体験してほしい。
以上の方針のもとに、本実験で必要な機能を厳選したものが、以下のリストで ある。
ヒント: x,y ともに正の整数であるとき、以下が成立する。(Euclidの互除法)
gcd(x,y) = x if x=y gcd(x,y) = gcd(x-y, y) if x>y gcd(x,y) = gcd(x, y-x) それ以外
fib(1) = 1 fib(2) = 1 fib(n+2) = fib(n) + fib(n+1) if n>0である。
(以下はオプショナル課題) 上記の定義を単純に実装すると非常に効率が悪い。 そこで、効率を改善したプログラムを実装せよ。 (ヒント: OCaml では、2つの数mとn の組は (m,n) という式で表現できる。)
prime(1) = 2 prime(3) = 5 prime(5) = 11である。
substring "abcabc" "abc" = 0 substring "abcabc" "bca" = 1 substring "abcabc" "bcd" = -1である。
亀山 幸義