if 猿が箱の位置以外にいたら
then 猿は箱の位置へ移動する.
if 猿が箱の位置にいて、バナナの下以外にいたら
then 猿は箱をバナナの下へ押していく.
.............
と考えました。この場合の猿は、プログラムの起動と同時に一目散に箱のところへ行き、箱をバナナの下へ押してきて、箱に登り、バナナをゲットしました。大変に賢い猿です。でも、それって「賢い」の?じゃあ、「賢い」ってどういうこと?「知識」を持っていること?じゃあ、「知識」ってなに?ということについて考えましたね。
state(猿の水平位置,猿の垂直位置,箱の位置,猿の手の状態).
このように定義すると、初期状態は
state(a,floor,c,empty).
と記述することができます。
state(_,_,_,banana).
と定義します。
ある状態から別の状態へ変化させる動作には何があるのでしょうか。これには、次の4つが考えられます。
change(動作,動作前の状態,動作後の状態).
バナナを獲るという動作をgraspと表現します。すると、graspに関する動作規則は
change(grasp,
state(b,box,b,empty),
state(b,box,b,banana)).
となります。
change(walk(Place1,Place2),
state(Place1,floor,Box,Hand),
state(Place2,floor,Box,Hand)).
となります。
この節が表現しているのは、
getbanana(State).
ここで引数Stateは猿の世界の状態です。getbananaがStateについて判定するには、次の2つの方法があります。
getbanana(state(_,_,_,banana)).
getbanana(State1):-
change(Operate,State1,State2),
getbanana(State2).
最初にgetbananaで指定された状態State1を何らかの動作Operateによって状態State2に変化させ、このState2を引数に指定して、getbananaを再帰呼び出しします。その結果、最終的にstate節の第4パラメータ、即ち猿の手の状態がbananaになればyesとなって、猿がバナナを獲れたことが判ります。
change(grasp, % バナナをつかむ
state(b,box,b,empty),
state(b,box,b,banana)).
change(climb, % 箱に乗る
state(Place,floor,Place,Hand),
state(Place,box,Place,Hand)).
change(push(Place1,Place2), % 箱をP1からP2へ押す
state(Place1,floor,Place1,Hand),
state(Place2,floor,Place2,Hand)).
change(walk(Place1,Place2), % P1からP2へ歩く
state(Place1,floor,Box,Hand),
state(Place2,floor,Box,Hand)).
getbanana(state(_,_,_,banana)). % 猿はバナナを入手した
getbanana(State1):-
change(Operate,State1,State2), % Operateにより状態は変化した
getbanana(State2). % 新たな状態について考える
この場合、change節が知識ベース、getbanana節が推論機構ということになります。
?- getbanana(state(a,floor,c,empty)).
Prologの答えはyesです。では、この答えに到達するために、Prologインタプリタ内部ではどのような処理が行われたのでしょうか。Prologが初期状態から始めて目標状態に至る探索過程を図に示します。

図6.1 猿バナナの探索木