Prolog递归方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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以西。我一直得到这个存在错误,调试也不起作用。

答案

根据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.

以上是关于Prolog递归方法的主要内容,如果未能解决你的问题,请参考以下文章

根据Prolog中公共子树的数量,树之间的递归相似度

Prolog Eliza 实现 - 循环和递归

Prolog:递归无法正常工作

Prolog中的指令顺序和递归

Prolog 中的递归 - 寻找城市之间的路径

在 Prolog 中递归后返回一个值