在本书中,我们被要求使用以下布局来定义谓词left_of,right_of,above和below。从Prolog艺术中练习
% 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编码为事实和递归过程?
真的吗?它似乎对我来说工作正常。可能想要退出Prolog会话并再次加载代码以确保。 – 2013-05-01 20:03:18
丹尼尔,我的问题是可以用于事实和递归规则(不必使用left_of2)。我可能会解释这本书的练习是错误的。 – stirfoo 2013-05-01 20:11:54
在这种情况下,答案是否定的。 Prolog有许多场合,当你必须有单独的谓词时,你不需要在其他语言中使用它们(初始化或最终化步骤也会出现在循环中)。这只是其中之一。你总是可以用不同的名字来隐藏“内部”谓词(想到''''''''''''''''并且''left_of2''为您的用户'left_of'。 – 2013-05-01 20:18:43