有向图中的所有路线

时间:2016-11-24 21:01:42

标签: prolog

我想制作一个程序,该程序应该给出两个站之间的所有可能路线。我遇到的问题是它没有给我所有的路线。到目前为止我的代码是:

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).

enter image description here enter image description here 例如,当我要求“?- 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),我不知道为什么我没有得到它们。如何解决这个问题?

提前致谢!

1 个答案:

答案 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/2direction2/2的重复。使用Visited列表可以避免潜在的循环。

因此,您可以在一个route1/3中统一route2/3route/3

您的代码无法找到[s1, s2, s5, s4],因为从s1s5您需要direction1/2(所以route1/3route1/4),但是来自{{ 1}}到s5您需要s4(但direction2/2不会调用route1/4)。

以类似的方式,您的代码无法找到direction2/2,因为您需要从[s1, s5, s2, s3, s4]direction2/2 route2/3 route2/4s1},但您需要s2direction1/2s2