下面的代码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