在prolog中多次避免同一答案

在prolog中多次避免同一答案,prolog,Prolog,所以我有这个无向图要遍历,我应该找到所有与给定顶点相连的垂直 edge(a, b). edge(b, c). edge(c, d). edge(d, e). edge(e, f). edge(f, d). edge(d, g). edge(g, f). edge(g, h). edge(h, i). edge(i, j). edge(j, d). edge(d, k). edge(l, m). edge(m, n). undirectedEdge(X, Y) :- edge(X, Y). un

所以我有这个无向图要遍历,我应该找到所有与给定顶点相连的垂直

edge(a, b).
edge(b, c).
edge(c, d).
edge(d, e).
edge(e, f).
edge(f, d).
edge(d, g).
edge(g, f).
edge(g, h).
edge(h, i).
edge(i, j).
edge(j, d).
edge(d, k).
edge(l, m).
edge(m, n).

undirectedEdge(X, Y) :- edge(X, Y).
undirectedEdge(X, Y) :- edge(Y, X).

connected(X, Y) :- undirectedEdge(X, Y).
connected(X, Y) :- connected(X, Z), connected(Z, Y), X \= Y.
一旦我输入
连接(a,X)。
它就会进入一个无限循环。 我明白我为什么会有它,但我不知道如何避免它,也许我可以在这里找到一些帮助

一旦我输入
连接(a,X)
。它进入一个无限循环

发生这种情况的原因是,它正在检查
a→b→a→b→a→b&rightarrow。所以它在两个节点之间保持“跳跃”

您可以维护算法已访问的节点列表,以防止类似情况:

connected(X, Y) :-
    connected(X, Y, [X]).

connected(X, X, _).
connected(X, Z, L) :-
    undirectedEdge(X, Y),
    \+ member(Y, L),
    connected(Y, Z, [Y|L]).
使用和
setof/3
我们得到:

connected(A,B) :-
   setof(t, closure0(undirectedEdge, A, B), _).

您维护一个列表,这样它就不会开始循环。感谢您的快速响应。。。现在我有29个X值,而不是一个无限循环。但29仍然有重复项,是否可以定义一个全局列表?@问题:大多数系统都有一个不可回溯的存储。但这通常不是一个好主意。您可以使用
distinct/1
元谓词。
connected(A,B) :-
   setof(t, closure0(undirectedEdge, A, B), _).