下面的代碼Prolog的遞歸做無限循環
flight(roc,syr,25).
flight(roc,jfk,55).
flight(jfk,bos,65).
flight(bos,syr,40).
flight(jfk,syr,50).
flight(bos,roc,50).
layover(roc,25).
layover(jfk,55).
layover(syr,30).
layover(bos,40).
route(X,Y,R,D) :-
flight(X,Y,L),
D is L,
R = [X,Y].
route(X,Y,R,D) :-
flight(X,Z,L),
route(Z,Y,P,M),
R = [X|P],
layover(Z,T),
D is M+L+T,
\+ member(X,P).
這裏發生了什麼。第二個子句
route(X,Y,R,D) :-
flight(X,Z,L),
route(Z,Y,P,M),
R = [X|P],
layover(Z,T),
D is M+L+T,
\+ member(X,P).
進入無限循環。它顯示我想要的答案,然後繼續找到更多的答案(因爲你可以保持循環基本停下來),並進行無限循環,直到停止。該計劃應該找到所有可能的飛行路線,而不是停在路邊。我知道爲什麼發生這種情況,但不知道如何更改我的代碼來修復它。請幫忙。
這裏有一個解決方案
?- route(roc, syr, Routing, Duration).
Routing = [roc, syr],
Duration = 25 ;
Routing = [roc, jfk, syr],
Duration = 160 ;
Routing = [roc, jfk, bos, syr],
Duration = 255 ;
false.
猜猜我沒有解釋所有的變量。 R是路線,D是距離(必須在中途停留)。 R和D是答案,所以當我打電話給規則時我不會把它們放進去。不知道你的建議是否正確。在你給出的路線案例中,H和T從何而來,而D從未被定義過。 – 2013-04-30 00:19:37
? - 路由(roc,syr,路由,持續時間)。 Routing = [roc,syr], Duration = 25; Routing = [roc,jfk,syr], Duration = 160; Routing = [roc,jfk,bos,syr], Duration = 255; 錯誤。 – 2013-04-30 00:31:32