Prolog 手習い (1) [Prolog]
何の脈絡もなく Prolog の勉強を始めた。Amazon のウィッシュリストにいつまでも Clocksin と Mellish の "Programming in Prolog"(第5版)があったのをカートに入れたのだ。
いまのところ第4章のカットのところまで読んだのだけど Prolog の動作の仕組みを念入りに解説してくれていて、大変わかりやすい。これまで Prolog に感じていたもやっとがかなり晴れた(やっぱり論理プログラミングとはいっても内部の動きを意識しないと腹に落ちないのか、と思うとちょっと微妙な気分だけど)。
ここまでの内容では is と数値計算用の関数がよくわからない。まず数値計算用の + だとかは中置演算子の形をしているだけで 1+1 は +(1,1) とみなせると言っている。
だからこう書いておけば
+(john, mary).
こうなる。
?- john + mary. Yes ?- X + Y. X = john Y = mary
ここまではいい。こうした演算子は is と組み合わせると突然数値計算を行う。
?- X is 1 + 1. X = 2
さっきの + は ML 風に書くと (term * term) -> bool だったんだけど is の右側にくるときは (term * term) -> term になっている。 普通の述語を is の右側に書くとエラーになる。なんか気持ち悪いのは、この is の機能はとってつけたようにこうなっているだけなんだろうか。 つまり + やら - やらは is の方で特別扱いされていて、ユーザ定義で (term * term) -> term になるようなものを書くことはできないってことでいいのかな。
ところで Programming in Prolog は分かりやすいんだけど Prolog の計算の流れを図示する方法は結構苦慮しているように思える。 述語の入れ子関係と、バックトラックの選択肢からなるツリーと、計算過程での変数の状況をいっぺんに静的な図で表現できる書き方はないかなあ。 バックトラックという「動き」はどうにも頭への収まりが悪い。
あと間違いを見つけた。p.56 の左再帰の例で
person(adam).
person(X) :- person(Y), mother(X, Y).
person(X) :- person(Y), mother(X, Y).
person(adam).
前者が左再帰で止まらなくて、後者が解決法だって書いてるんだけど逆ですよね。すごい悩んでしまった。(あと mother でいいのかとも)
コメント 0