Prolog递归方法

问题描述 投票:0回答:1

所以我正在编写一个包含规则waywest(X,Y)的数据库。 waywest沿着一条街道建造2座建筑物,并返回建筑物X建筑物Y以西不止一栋建筑物。我有:

waywest(X,Y) :- not(west(X,Y)).
waywest(X,Y) :- not(west(X,Z)) , waywest(Z,Y).

这是一种递归循环使用west(X,Y)事实的方法,其中建筑X位于建筑Y以西。我一直得到这个存在错误,调试也不起作用。

recursion prolog
1个回答
2
投票

根据swi-prolog中没有的文档,你编程它的方式,你只能用它来反驳事实:

不是(:目标) 如果目标无法证明,则为真。仅保留兼容性。新代码应该使用+ / 1。

此外,我会在Prolog的开头不鼓励使用NOT,因为它不是(原文!)在你开始时想要/期望的。

如果我正确理解你的问题,这也应该做到这一点:

west(a,b).
west(b,c).
west(c,d).
west(d,e).

waywest(X,Z) :-
   west(X,Y),
   west(Y,Z).
waywest(X,Z) :-
   west(X,Y),
   waywest(Y,Z).

如果我们现在检查它,我们得到预期:

?- waywest(X,Y).
X = a, Y = c ;
X = b, Y = d ;
X = c, Y = e ;
X = a, Y = d ;
X = a, Y = e ;
X = b, Y = e ;
false.
© www.soinside.com 2019 - 2024. All rights reserved.