@明月月明月💤 你的第二个问题可以说得到了解决。
昨天在思考你的问题时,试了多次,还是没解决。决定网上找找思路。发现了一篇文章(http://www.cpp.edu/~jrfisher/www/prolog_tutorial/2_15.html),它所讲的就是这种问题,图中是一些相连接、互通的点,求两点间的距离;而且它的更进一步,并要推导出路径。
试了下,你的问题可以套用那个代码。看完了文章,发现自己原先的思路有问题,感觉这道题比第一道要难不少。
它的问题中,两点之间的距离还不等长。
其代码(http://www.cpp.edu/~jrfisher/www/prolog_tutorial/2_15A.pl)如下:
edge(1,2,1).
edge(1,4,3.5).
edge(1,3,2.5).
edge(2,3,1).
edge(2,5,2.5).
edge(3,4,1).
edge(3,5,2.2).
edge(4,5,1).
connected(X,Y,L) :- edge(X,Y,L) ; edge(Y,X,L).
path(A,B,Path,Len) :-
travel(A,B,[A],Q,Len),
reverse(Q,Path).
travel(A,B,P,[B|P],L) :-
connected(A,B,L).
travel(A,B,Visited,Path,L) :-
connected(A,C,D),
C \== B,
\+member(C,Visited),
travel(C,B,[C|Visited],Path,L1),
L is D+L1.
shortest(A,B,Path,Length) :-
setof([P,L],path(A,B,P,L),Set),
Set = [_|_], % fail if empty
minimal(Set,[Path,Length]).
minimal([F|R],M) :- min(R,F,M).%最短路径
min([],M,M).
min([[P,L]|R],[_,M],Min) :-
L < M, !,
min(R,[P,L],Min).
min([_|R],M,Min) :- min(R,M,Min).
/* 询问示例 ?- shortest(1,5,Path,Length).*/
昨天在思考你的问题时,试了多次,还是没解决。决定网上找找思路。发现了一篇文章(http://www.cpp.edu/~jrfisher/www/prolog_tutorial/2_15.html),它所讲的就是这种问题,图中是一些相连接、互通的点,求两点间的距离;而且它的更进一步,并要推导出路径。
试了下,你的问题可以套用那个代码。看完了文章,发现自己原先的思路有问题,感觉这道题比第一道要难不少。
它的问题中,两点之间的距离还不等长。
其代码(http://www.cpp.edu/~jrfisher/www/prolog_tutorial/2_15A.pl)如下:
edge(1,2,1).
edge(1,4,3.5).
edge(1,3,2.5).
edge(2,3,1).
edge(2,5,2.5).
edge(3,4,1).
edge(3,5,2.2).
edge(4,5,1).
connected(X,Y,L) :- edge(X,Y,L) ; edge(Y,X,L).
path(A,B,Path,Len) :-
travel(A,B,[A],Q,Len),
reverse(Q,Path).
travel(A,B,P,[B|P],L) :-
connected(A,B,L).
travel(A,B,Visited,Path,L) :-
connected(A,C,D),
C \== B,
\+member(C,Visited),
travel(C,B,[C|Visited],Path,L1),
L is D+L1.
shortest(A,B,Path,Length) :-
setof([P,L],path(A,B,P,L),Set),
Set = [_|_], % fail if empty
minimal(Set,[Path,Length]).
minimal([F|R],M) :- min(R,F,M).%最短路径
min([],M,M).
min([[P,L]|R],[_,M],Min) :-
L < M, !,
min(R,[P,L],Min).
min([_|R],M,Min) :- min(R,M,Min).
/* 询问示例 ?- shortest(1,5,Path,Length).*/