为什么我的序言程序陷入无限递归

Why is my prolog program stucked in endless recursion

我有以下实验代码

s(a,b).
s(b,c).
s(c,b).
r(a).
r(c).
r(d).
p(X,Y) :- s(X,Y), not(r(Y)).
q(X,Y) :- q(Y,X), r(X).
q(X,Y) :- p(Y,X), s(X,Y).
t(X,Y) :- r(X), q(X,Y).

查询 t(X,Y) 将导致无休止的递归炸毁堆栈。但我实际上可以认为 X=c,Y=b 是解决方案,因为

t(c,b) <- r(c), q(c,b)
q(c,b) <- q(b,c), r(c)
q(b,c) <- p(c,b), s(b,c)
p(c,b) <- s(c,b), not(r(b))

谁能给我解释一下,为什么 prolog 没有找到这个解决方案,而是陷入了围绕 q(c,b) and q(b,c)

的无休止递归

非常感谢!

在SWI-Prolog中,您可以使用表执行解决问题。

:- table q/2.

s(a,b).
s(b,c).
s(c,b).
r(a).
r(c).
r(d).
p(X,Y) :- s(X,Y), not(r(Y)).
q(X,Y) :- q(Y,X), r(X).
q(X,Y) :- p(Y,X), s(X,Y).
t(X,Y) :- r(X), q(X,Y).

示例:

?- t(X,Y).
X = c,
Y = b ;
false.

?- q(X,Y).
X = c,
Y = b ;
X = b,
Y = c.