Prologはじめました
夏の暑さに頭をやられてしまったので,Prologを始めることにした.
始める,というと正確ではない.学部3年生の講義でちらりとかじったことはあるので,Prologという名前くらいは知っている.
そのときに購入した入門書が家に残っていた.
- 作者: Ivan Bratko,安部憲広
- 出版社/メーカー: 近代科学社
- 発売日: 1990/03/01
- メディア: 単行本
- 購入: 1人 クリック: 41回
- この商品を含むブログ (18件) を見る
よっしゃやってみよう,ということで処理系のインストール.
昔は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を忘れてしまっている.
悲しくなりました.