Вы здесь определили предикат, который будет вызываться каждый раз сам (если не произойдет сбой call(Rel, S, X)
, но даже тогда нет способа «получить» результат), вам необходимо условие для остановки.
Это условие, когда источник S
и цель T
совпадают, в этом случае мы возвращаем в качестве пути список, содержащий S
, а также N=0
:
graph(_, S, S, [S], 0).
Кроме того, в рекурсивном случае мы должны правильно вести бухгалтерию с помощью N
и «пути»:
graph(Rel, S, T, [S|Rest], N) :-
call(Rel, S, X),
N1 #= N-1,
graph(Rel, X, T, Rest, N1).
, так что в полном объеме получаем:
:- use_module(library(clpfd)).
graph(_, S, S, [S], 0).
graph(Rel, S, T, [S|Rest], N) :-
N #> 0,
call(Rel, S, X),
N1 #= N-1,
graph(Rel, X, T, Rest, N1).