先週頑張ったので今週は全然やる気が起こらなくて眠くて仕方が無い。そこで気分転換に久しぶりに Prolog でもやるかと思って、マックを locate してみると、知らないうちに /opt/local/lib/hugs/demos/prolog/ というディレクトリがあった。なんじゃこりゃ。自分でも知らないうちに hugs のサンプルとして Haskell 用の Prolog が入っていたのであった。
デモの常として、やはりそのままでは動かなかった。readme にある通り hugs のシェルで Main を読み込もうとすると、
Hugs> :l Main ERROR "./Main.hs" - Can't find imported module "Interact"
のようなエラーになる。どうやら Interact のある場所にパスが通ってないみたいなので、コマンドライン の -P オプションで指定すると動いた。
$ hugs -P.:{Home}/lib/hugs/packages/*:/usr/local/lib/hugs/packages/*:{Hugs}/packages/*:{Hugs}/oldlib Hugs> :l Main Main> main Mini Prolog Version 1.5g (stack based) Reading stdlib........done >
この stdlib というのは、同じディレクトリにある stdlib ファイルの事で、数行の小さなライブラリが付いてくる。後は自分で好きにこのファイルに追加しろという事らしい。なお、?? を入力すると、prolog が知っている全ての式を表示する。折角なので、ありがちだけどサザエさんの家系図を打ち込む。
> child(sazae, namihei). child(sazae, fune). child(katsuo, namihei). child(katsuo, fune). child(wakame, namihei). child(wakame, fune). child(tara, sazae). child(tara, masuo). ?- child(X, fune) X = sazae ;;; ; X = katsuo ; X = wakame ; no. >
ちなみに、ターミナルの制御がうまく行ってなくて、; をうまく使って次の値を取り出す事が出来ない。次の値を得るためにセミコロンキーを押しても、エンターキーを押すまで反応しない(しかもエンターキーは OK の意味なので、どちみち次の値を得る事は出来ない)。そこで ;;; のように十分そうな数を連続して入力して誤摩化す。簡単な推論もしてみる。
> grandChild(X, Y) :- child(X, Z), child(Z, Y). > ?-grandChild(X, Y) ?-grandChild(X, Y) X = tara Y = namihei ;; ; X = tara Y = fune ; no.