Prologはじめました

夏の暑さに頭をやられてしまったので,Prologを始めることにした.
始める,というと正確ではない.学部3年生の講義でちらりとかじったことはあるので,Prologという名前くらいは知っている.

そのときに購入した入門書が家に残っていた.

Prologへの入門 (PrologとAI)

Prologへの入門 (PrologとAI)


よっしゃやってみよう,ということで処理系のインストール.
昔はWindowsでSWI-Prologを使っていたけれど,portsからインストールできるという理由でGNU Prologを選択.
当時は,ちんぷんかんぷんだったことが今は簡単になんとか理解できる.
この3年間で獲得した経験値から察するに,まだ,アリアハンを旅立っていないらしい.(ひたすらスライムとおおがらすを倒してきたということ)


おそらくProlog初学者が必ず入力するであろう家系図のプログラム

parent(pam, bob).
parent(tom, bob).
parent(bob, ann).
parent(bob, pat).
parent(tom, liz).
parent(pat, jim).

female(pam).
male(tom).
male(bob).
female(liz).
female(pat).
female(ann).
male(jim).

offspring(X, Y) :- parent(Y, X).
grandparent(X, Z) :- parent(X, Y), parent(Y, Z).
sister(X, Y) :- parent(Z, X), parent(Z, Y), female(X), female(Y).


いきなり警告が出る.

| ?- [family].
compiling ~/workspace/prolog/p1/family.pro for byte code...
~/workspace/prolog/p1/family.pro:12 warning: discontiguous predicate female/1 - clause ignored
~/workspace/prolog/p1/family.pro:13 warning: discontiguous predicate female/1 - clause ignored
~/workspace/prolog/p1/family.pro:14 warning: discontiguous predicate male/1 - clause ignored
~/workspace/prolog/p1/family.pro compiled, 18 lines read - 2057 bytes written, 48 ms

(1 ms) yes

warningのくせして,しっかりバグ扱いです.

| ?- female(X).

X = pam

yes
| ?-


yesじゃねーよ.liz, pat, annが認識されていない.
もしかして処理系が悪いのかと,SWI-Prologでも確認.やっぱり挙動がおかしい.
GNU PrologもSWI-PrologもISO準拠らしい.DEC-10準拠じゃないといけないのか??


とさんざん悩んだ挙句,エラーメッセージを考察することにした.

"discontiguous predicate"

もしかして...

female(pam).
female(liz).
female(pat).
female(ann).
male(jim).
male(tom).
male(bob).

こうしないといけないんじゃ…?
同名の述語は連続して記述する必要があるのでは?そのほうがコンパイラも最適化しやすそうだし...



…正解


というわけで順序は関係ない宣言的意味言語のはずなのに,最近の処理系は整形されたプログラムを好むみたいです.





ちなみに同時期に購入し,勉強したLISPの本を眺めてみた.懐かしい.3分の2くらい演習問題が解かれてチェック印がついている.
・・・が,今みると謎の記号列にしか見えない.一行の情報量が多すぎる.car-cdr再帰ってナンだ??
全く読めない,書けない.

LISPerの方々は一生LISPと付き合っていくのだろうけれど,もし何年もLISPを使うことがなくなっても,ぱっと思い出せるのだろうか?
自分は半期しか勉強しなかったが,それなりにやりこんだ記憶があるにも関わらず綺麗さっぱりLISPを忘れてしまっている.
悲しくなりました.