Prolog 序言-寻路
我想找到从A站到B站的路径,这是一条可行的路径,但是我找到的路径到处都是,它有时在两个偏离轨道的站之间来回,回到前一点,然后越过B站回到它,在路径中给我重复的和不需要的站点 我注意到的一个问题可能是,有些车站是同名的换乘站,但换乘线路不同。这些是arc站:Prolog 序言-寻路,prolog,Prolog,我想找到从A站到B站的路径,这是一条可行的路径,但是我找到的路径到处都是,它有时在两个偏离轨道的站之间来回,回到前一点,然后越过B站回到它,在路径中给我重复的和不需要的站点 我注意到的一个问题可能是,有些车站是同名的换乘站,但换乘线路不同。这些是arc站: %adjecent stations % % Central line adjacent(nh,lg,central,4). adjacent(lg,oc,central,4). adjacent(oc,tc,central,4). ad
%adjecent stations %
% Central line
adjacent(nh,lg,central,4).
adjacent(lg,oc,central,4).
adjacent(oc,tc,central,4).
adjacent(tc,cl,central,4).
adjacent(cl,ls,central,4).
adjacent(ls,bg,central,4).
% Victoria Line
adjacent(br,vi,victoria,4).
adjacent(vi,oc,victoria,4).
adjacent(oc,ws,victoria,4).
adjacent(ws,kx,victoria,4).
adjacent(kx,fp,victoria,4).
% Northern Line
adjacent(ke,em,northern,4).
adjacent(em,tc,northern,4).
adjacent(tc,ws,northern,4).
adjacent(ws,eu,northern,4).
% Metropolitan Line
adjacent(al,ls,metropolitan,4).
adjacent(ls,kx,metropolitan,4).
adjacent(bs,fr,metropolitan,4).
% Bakerloo Line
adjacent(ec,em,bakerloo,4).
adjacent(em,oc,bakerloo,4).
adjacent(oc,pa,bakerloo,4).
adjacent(pa,wa,bakerloo,4).
。。。规则如下:
next(X,Y,L):-adjacent(X,Y,L,_).
next(X,Y,L):-adjacent(Y,X,L,_).
direct_connect(X,Y,L,S,F):-
next(X,Z,L),
not(member(Z,S)),
direct_connect(Z,Y,L,[Z|S],F).
direct_connect(X,Y,L,S,[Y|S]):- next(X,Y,L).
one_change(X,Y,L,F):-
direct_connect(X,Z,L,[X],F1),
direct_connect(Z,Y,L2,[Z|F1],F),
L\=L2.
exist(X):-next(X,_,_).
member(X,[X|_]).
member(X,[_|T]):-member(X,T).
route(X,Y,F):-exist(X),exist(Y),
direct_connect(X,Y,_,[X],F),
write('Direct Connection'),nl,
revwrite(F).
route(X,Y,F):-exist(X),exist(Y),
one_change(X,Y,_,F),
write('One change required'),nl,
revwrite(F).
revwrite([X]):-write(X).
revwrite([H|T]):-revwrite(T), write('->'),write(H).
测试用例为:
route(em,ls,Route).
。。。我得到的结果是:
One change required
em->tc->ws->tc->tc->cl->ls->bg->ls
Route = [ls, bg, ls, cl, tc, tc, ws, tc, em]
我不明白为什么我会得到复制品。我如何才能避免这条路偏离路线、返回、到处走?问题(至少一个问题)在direct_connect/5
中;在下列条款中:
direct_connect(X,Y,L,S,F):-
next(X,Z,L),
not(member(Z,S)),
direct_connect(Z,Y,L,[Z|S],F).
您没有强制规定Z
与Y
不同
建议:修改如下,强制Z\=Y
direct_connect(X,Y,L,S,F):-
next(X,Z,L),
Z \= Y,
not(member(Z,S)),
direct_connect(Z,Y,L,[Z|S],F).
@JimAshworth:这个问题不是SWI特有的,因此它的标签不合适。