Prolog 带和条件的无限递归错误?
我的数据库中有以下事实和规则Prolog 带和条件的无限递归错误?,prolog,Prolog,我的数据库中有以下事实和规则 above(b, a). above(c, b). above(d, c). above(X,Y):-above(X,Z),above(Z,Y). below(X,Y):- above(Y,X). 这与积极案例的预期效果一样,因此如果我质疑 C,a 返回值为True。但是,当我尝试下面的查询时,预期为False A,c 我收到了留言 Stack sizes: local: 0.2Gb, global: 16Kb, trail: 3Kb Stack dept
above(b, a).
above(c, b).
above(d, c).
above(X,Y):-above(X,Z),above(Z,Y).
below(X,Y):- above(Y,X).
这与积极案例的预期效果一样,因此如果我质疑
C,a
返回值为True。但是,当我尝试下面的查询时,预期为False
A,c
我收到了留言
Stack sizes: local: 0.2Gb, global: 16Kb, trail: 3Kb
Stack depth: 2,839,964, last-call: 0%, Choice points: 12
Probable infinite recursion (cycle):
[2,839,964] above(a, _1394)
[2,839,963] above(a, _1420)
我的理解是,由于没有与a,X关联的atom X,并且该查询确实返回False,因此我的规则的第一个条件将不满足,这将足以得出查询为False的结论。情况似乎并非如此。我如何设置规则,使其在仍按预期用于阳性案例的情况下返回False?因为上述a,X与前三条事实不匹配,因此进入第四条,即上述X,Y:-。。。。在这之后,你要做的第一件事就是在x,Z上面,也就是说,在a,Z上面。然后尝试前三个子句,失败了,然后它又到了x,Y上面。这是无限递归的来源
解决方案是通过重命名其中一个来将规则与事实分开,例如:
is_above(b, a).
is_above(c, b).
is_above(d, c).
above(X,Y):- is_above(X,Z), above(Z,Y).
below(X,Y):- above(Y,X).
这样,您就不会有无界递归,在它递归之前,您必须在上面取得一些进展。谢谢您的解释。你的建议奏效了,我只需确保我保留了上述事实以及上述信息。很高兴能提供帮助,希望它有意义!