我想在Prolog中找到两个节点之间的最短路径。我已经知道如何找到两个节点之间的所有路径,但不幸的是下面的代码会陷入循环:
代码运行是:
所以,我的问题是:如何在不无限循环的情况下获取所有路径?
最终,我将获得列表的长度并找到最小值。
如果可能,请提供符合ISO 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).
感谢您。