2016-11-21 86 views
0

我在prolog中創建了一個程序,它應該給我兩個站之間的所有可能的路線。在每條路線上,每個車站只能訪問一次。到目前爲止我的代碼是:序言中的循環路線程序

% facts 

connection(s1,s2). 
connection(s1,s4). 
connection(s2,s3). 
connection(s2,s5). 
connection(s3,s4). 
connection(s4,s5). 
connection(s5,s6). 
connection(s6,s1). 

% predicates 

direction1(X,Y) :- connection(X,Y). 
direction2(X,Y) :- connection(Y,X). 

route1(X,Y,R):- route1(X,Y,[],R). 
route1(X,Y,_,[X,Y]) :- direction1(X,Y). 
route1(X,Y,L,R) :- \+direction1(X,Y), direction1(X,Z), \+member(Z,L), route1(Z,Y,[Z|L],RZ), R=[X|RZ]. 

route2(X,Y,R):- route2(X,Y,[],R). 
route2(X,Y,_,[X,Y]) :- direction2(X,Y). 
route2(X,Y,L,R) :- \+direction2(X,Y), direction2(X,Z), \+member(Z,L), route2(Z,Y,[Z|L],RZ), R=[X|RZ]. 

route(X,Y,R) :- route1(X,Y,R); route2(X,Y,R). 

的問題是,序言不給我所有路線,爲exampel當我問路由[S1,S4,R],序言不給我的路線[ S1,S2,S3,S4]。我認爲這是由「+ direction1(X,Y)」和「+ direction2(X,Y)」造成的。但是我需要這個防止在一條路線上多次訪問站的序言。任何想法如何解決這一問題?

enter image description here enter image description here 在此先感謝!

回答

1

微創修復將刪除您正確識別爲此故障來源的\+direction1(X,Y),並在route1/4的定義中添加另一個\+ member(X, L)防護。

編輯:上述不夠。這裏是整個事情更清潔的重寫,以更易讀的格式和變量名:

route1(X,Y,R):- route1(X,Y,[X],R). % note that X is visited immediately 
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]. 

你應該那麼很可能統一路線謂詞的兩個變體:其中一個僅發現只有沿着「方向路線1「邊,其他只有沿」方向2「邊的那些邊。一般來說,你會希望能夠在任何方向上遍歷任何邊緣。

+0

那麼它不會給我所有的路線... – zer0kai

+0

什麼不能給你所有的路線,我在第一段中描述的變化還是在第二段中描述的變化?它不給你哪些路線? –

+0

例如,當我詢問「route(s2,s5,R)」時,它只給出「R = [s2,s5]」,但也存在類似[s2,s3,s4,s5]的路由。 – zer0kai