この本では、次のレイアウトを使用して述語 left_of、right_of、above、below を定義するよう求められています。
% bike camera
% pencil hourglass butterfly fish
left_of(pencil, hourglass).
left_of(hourglass, butterfly).
left_of(butterfly, fish).
above(bike, pencil).
above(camera, butterfly).
right_of(Obj1, Obj2) :-
left_of(Obj2, Obj1).
below(Obj1, Obj2) :-
above(Obj2, Obj1).
これは正しい解決策を見つけるようです。
この本の後半で、left_of の再帰ルールを追加するよう求められます。私が見つけた唯一の解決策は、別のファンクター名 left_of2 を使用することです。だから私は基本的に先祖関係を再実装しました。
left_of2(Obj1, Obj2) :-
left_of(Obj1, Obj2).
left_of2(Obj1, Obj2) :-
left_of(Obj1, X),
left_of2(X, Obj2).
left_of を再利用しようとすると、すべて正しい解決策を得ることができますが、最後のやり直しでスタック オーバーフローが発生します。正しい基本ケースが定義されていないためだと思います。これは、事実と再帰的な手順に対して left_of を使用してコーディングできますか?