p :- p.
前に宣言的意味と手続き的意味をやりました。この節の宣言的意味というのは「pが真ならば、pは真である」です。これは宣言としては正しいですね。しかし、手続き的には無意味です。「pが真ならば、pは真である」とすると、その条件部の「pが真ならば」はいつ、真かどうか判定されるのでしょうか。例えば、
?- p.
と入力したとしましょう。目標pは上の節により、副目標pに置き換えられます。これが、また更にpに置き換えられることになります。Prologは延々pをpに置き換え続け、無限ループに陥ります。
?- getbanana(state(a,floor,c,empty)).
を再び考えてみましょう。さて、探索の過程はどのようになるでしょうか。
getbanana(state(a,floor,c,empty)).
change(Operate,
state(a,floor,c,empty),
State2),
getbanana(State2).
となる。
change(walk(a,Place2),
state(a,floor,c,empty),
state(Place2,floor,c,empty)),
getbanana(state(Place2,floor,c,empty)).
となる。
change(Operate',
state(Place2,floor,c,empty),
State2'),
getbanana(State2').
となる。ここまでは、前章と同じである。前章では、ここでclimbを適用して失敗し、pushを適用して目標状態へ遷移した。しかし、今回はchange節の最初にwalkがあるので、ここでwalkを適用する。Operate'にwalk(Place2,Place2')を適用すると
change(walk(Place2,Place2'),
state(Place2,floor,c,empty),
state(Place2',floor,c,empty)),
getbanana(state(Place2',floor,c,empty)).
となる。

図7.1 猿うろうろの探索木
descendant(X,Y):- % descendant_rule_1
parent(Y,X).
descendant(X,Y):- % descendant_rule_2
parent(Y,Z),
descendant(X,Z).
となっていました。これを元のプログラムとして、変形パターンを3つ示します。descendant関係は2つの節からなり、その一方の節は2つの目標からなっています。そこで、
% 元のプログラム
trans1(X,Y):-
parent(Y,X).
trans1(X,Y):-
parent(Y,Z),
trans1(X,Z).
% trans2 元のプログラムの節の入れ替え
trans2(X,Y):-
parent(Y,Z),
trans2(X,Z).
trans2(X,Y):-
parent(Y,X).
% trans3 元のプログラムの2番目の節の目標の入れ替え
trans3(X,Y):-
parent(Y,X).
trans3(X,Y):-
trans3(X,Z),
parent(Y,Z).
% trans4 元のプログラムの目標と節の入れ替え
trans4(X,Y):-
trans4(X,Z),
parent(Y,Z).
trans4(X,Y):-
parent(Y,X).
3章で舟さんとタラちゃんのdescendant関係について勉強しました。ここでも同じように舟さんとタラちゃんのtrans1,trans2,trans3,trans4のそれぞれの関係について考えてみましょう。
さて、次のように入力したらどうなるでしょう。
?- trans1(tara,fune).
?- trans2(tara,fune).
?- trans3(tara,fune).
?- trans4(tara,fune).
人 間「人間は皆同じね。」 ELIZA 「どのように?」 人 間「みんな私を困らせるわ。」 ELIZA 「例えばどんな風に?」 人 間「私のボーイフレンドはここに行けと言ったし。」 ELIZA 「あなたのボーイフレンドがここに行けと言ったのですね?」 人 間「彼は私が憂鬱症だと言うの。」 ELIZA 「憂鬱症とはお気の毒です。」 人 間「そうなんです。私は不幸です。」 ELIZA 「ここに来ると不幸でなくなると思いましたか?」 人 間「誰かに助けて欲しいんです。」 ELIZA 「あなたにとって助けとは何でしょうか?」 人 間「お母さんと仲良くできることかと思います。」 ELIZA 「あなたの家族についてもっと話してください。」実際にこのプログラムの振る舞いを見た多くの人々が、ELIZAは人間の言葉を理解して、ユーザの抱える問題に真剣に対応してくれたものと信じました。精神分析医たちは、このプログラムの中に本当に診療知識が入っていて、患者の役に立つと考えました。あるユーザはプログラムと数時間も対話し、主治医か長年の親友のように思いこみました。 しかし、実はELIZAは見せかけの対話をしていたにすぎなかったのです。例えば、ユーザが入力した言葉の中に"母"という単語があったら、"あなたの家族についてもっと話してください。"と出力する、というような仕組みになっていたのです。誰が何のためにこのようなプログラムを作成したのでしょうか。続きは8章の最終ページです。