Skip to content

Path with visited set

Avoid cycles by tracking visited nodes.

edge(a,b). edge(b,c). edge(c,a). edge(c,d).

path(X, Y) :- path_(X, Y, [X]).

path_(X, Y, _) :- edge(X, Y).
path_(X, Z, Visited) :-
    edge(X, Y),
    \+ member(Y, Visited),
    path_(Y, Z, [Y|Visited]).

% member/2
member(X, [X|_]).
member(X, [_|T]) :- member(X, T).
?- path(a, d).
true.

?- path(a, a).
false.  % cycle avoided by visited set