Prolog 序言:无向图的问题:一个方向的路径有效,但另一个方向的无限循环有效

Prolog 序言:无向图的问题:一个方向的路径有效,但另一个方向的无限循环有效,prolog,Prolog,我在这里给出了这个代码: edge(a,w). edge(t,b). edge(t,f). edge(t,p). edge(b,f). edge(b,g). edge(b,w). edge(f,w). edge(g,j). edge(g,p). edge(j,p). edge(X,Y) :- edge(Y,X). 我喜欢在上面添加更多的行(不改变上面的部分),这样我可以问程序:“有一条从节点X到节点Y的路径吗?” 这就是我使用递归的方法,我将这些行添加到代码中 path(X,X). path(

我在这里给出了这个代码:

edge(a,w).
edge(t,b).
edge(t,f).
edge(t,p).
edge(b,f).
edge(b,g).
edge(b,w).
edge(f,w).
edge(g,j).
edge(g,p).
edge(j,p).
edge(X,Y) :- edge(Y,X).
我喜欢在上面添加更多的行(不改变上面的部分),这样我可以问程序:“有一条从节点X到节点Y的路径吗?”

这就是我使用递归的方法,我将这些行添加到代码中

path(X,X).
path(X,Y) :- edge(X,Z), path(Z,Y).
例如,当我询问prolog是否存在从节点
t
到节点
w
的路径时,例如

?- path(t,w).
序言说:
正确。
这很好。但是当我想要另一个方向时:
?-path(w,t)。
我处于无休止的递归循环中,程序崩溃,我的电脑声音很大:/


我曾尝试在代码中添加其他行,但无法使其正常工作。在上面的代码中有:
edge(X,Y):-edge(Y,X)。
但我不知道如何才能为它添加一个好东西,这样它就能正常工作?

提示:如果您在边列表的顶部添加
edge(t,z)。
,您的计算机也应该是响亮的:-)您需要确保您不会无休止地反复访问相同的节点。您可以跟踪已访问的节点,并确保(形象地说)仅在以前未访问过新节点的情况下才踏上该节点。