小编sti*_*foo的帖子

左派从Prolog的艺术演习

在本书中,我们被要求使用以下布局定义谓词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).
Run Code Online (Sandbox Code Playgroud)

这似乎找到了正确的解决方案.

在本书的后面,我们被要求为left_of添加递归规则.我能找到的唯一解决方案是使用不同的函子名称:left_of2.所以我基本上重新实现了祖先的关系.

left_of2(Obj1, Obj2) :-
    left_of(Obj1, Obj2).
left_of2(Obj1, Obj2) :-
    left_of(Obj1, X),
    left_of2(X, Obj2).
Run Code Online (Sandbox Code Playgroud)

在我尝试重用left_of时,我可以获得所有正确的解决方案,但在最后的重做中,会发生堆栈溢出.我猜这是因为我没有定义正确的基本情况.可以使用left_of对事实递归过程进行编码吗?

prolog

3
推荐指数
1
解决办法
469
查看次数

标签 统计

prolog ×1