Я хочу найти кратчайший путь между двумя узлами в Prolog. я понял, как найти все пути между двумя узлами, но, к сожалению, следующий код попадет в петлю:Найти кратчайший путь между двумя узлами в графе в Prolog
arc(a,b).
arc(b,a).
arc(b,c).
arc(c,b).
arc(c,d).
arc(d,c).
path(X,Y,[arc(X,Y)]) :-
arc(X,Y).
path(X,Y,[arc(X,Z)|P]) :-
arc(X,Z),
path(Z,Y,P).
Код ПУСК:
?- path(a,c,R).
R = [arc(a, b), arc(b, c)] ;
R = [arc(a, b), arc(b, a), arc(a, b), arc(b, c)] ;
R = [arc(a, b), arc(b, a), arc(a, b), arc(b, a), arc(a, b), arc(b, c)]
....
Итак, мой вопрос: Как получить все пути без цикла бесконечно?
в конце дня, я получу длину списка и найду минимум.
Пожалуйста, если возможно, дайте решения, которые являются ISO Prolog.
Примечание: здесь обновленный код, по-прежнему у меня проблема. По-видимому, предикат-член не работает при проверке факта, а не атома.
xxx([]).
path(X,Y,[arc(X,Y)]) :-
arc(X,Y).
path(X,Y,[arc(X,Z)|P]) :-
arc(X,Z)
,xxx(L)
,member(arc(X,Z),L)->
!;
(member(arc(Z,X),L)->
!;
(append(L,[arc(X,Z)],R),retract(xxx(_)),assert(xxx(R)),path(Z,Y,P))).
и мой член сказуемое:
member(X,[X|T]).
member(X,[H|T]) :- member(X,T).
Спасибо.
Я обновил свой код. Пожалуйста, посмотри на это. Кажется, что у меня проблемы с предикатом моего участника. –
Любое фактическое кодирование было бы гораздо более ценным, чем предложения. –