在本书中,我们被要求使用以下布局定义谓词 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 对事实和递归过程进行编码吗?