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