我想制作一个程序,该程序应该给出两个站之间的所有可能路线。我遇到的问题是它没有给我所有的路线。到目前为止我的代码是:
connection(s1,s2).
connection(s2,s3).
connection(s3,s4).
connection(s4,s5).
connection(s5,s1).
connection(s1,s4).
connection(s2,s5).
direction1(X,Y) :- connection(X,Y).
direction2(X,Y) :- connection(Y,X).
route1(X,Y,R):- route1(X,Y,[X],R).
route1(X,Y,_,[X,Y]) :- direction1(X,Y).
route1(X, Y, Visited, Route) :- direction1(X, Z), Z \= Y, \+ member(Z, Visited), route1(Z, Y, [Z|Visited], Route1), Route = [X|Route1].
route2(X,Y,R):- route2(X,Y,[X],R).
route2(X,Y,_,[X,Y]) :- direction2(X,Y).
route2(X, Y, Visited, Route) :- direction2(X, Z), Z \= Y, \+ member(Z, Visited), route2(Z, Y, [Z|Visited], Route2), Route = [X|Route2].
route(X,Y,R) :- route1(X,Y,R); route2(X,Y,R).
例如,当我要求“?- route(s1,s4,R)
”时,它只会给我R = [s1, s4]
,R = [s1, s2, s3, s4]
和R = [s1, s5, s4]
。
但也有路线(s1,s2,s5,s4)和(s1,s5,s2,s3,s4),我不知道为什么我没有得到它们。如何解决这个问题?
提前致谢!
答案 0 :(得分:1)
够了
direction(X,Y) :- connection(X,Y).
direction(X,Y) :- connection(Y,X).
route(X,Y,R) :-
route(X,Y,[X],R).
route(X,Y,_,[X,Y]) :-
direction(X,Y).
route(X, Y, Visited, [X | Hr]) :-
direction(X, Z),
Z \= Y,
\+ member(Z, Visited),
route(Z, Y, [Z | Visited], Hr).
我的意思是:只使用一个direction/2
代替direction1/2
和direction2/2
的重复。使用Visited
列表可以避免潜在的循环。
因此,您可以在一个route1/3
中统一route2/3
和route/3
。
您的代码无法找到[s1, s2, s5, s4]
,因为从s1
到s5
您需要direction1/2
(所以route1/3
和route1/4
),但是来自{{ 1}}到s5
您需要s4
(但direction2/2
不会调用route1/4
)。
以类似的方式,您的代码无法找到direction2/2
,因为您需要从[s1, s5, s2, s3, s4]
到direction2/2
route2/3
route2/4
和s1
},但您需要s2
从direction1/2
到s2
。