Prolog递归方法

时间:2018-02-28 20:28:26

标签: recursion prolog

所以我正在编写一个包含规则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的西边。我一直遇到这种存在错误,调试也不起作用。

1 个答案:

答案 0 :(得分: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.