Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion Prolog递归执行无限循环_Recursion_Prolog_Infinite - Fatal编程技术网

Recursion Prolog递归执行无限循环

Recursion Prolog递归执行无限循环,recursion,prolog,infinite,Recursion,Prolog,Infinite,这是密码 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,

这是密码

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.

对我的答案有一个警告——我对你的变量做了一些假设。我假设X是起点,Y是目的地,R是从X到Y(包括)的路径上的位置列表,D是行驶的距离?或者等待一段时间。不要紧

看起来你的基本情况有问题。您的基本情况是检查是否存在满足航线的
航班(X,Y,L)
。你需要检查的是从X到Y的位置列表(如果我没有弄错的话,R)是否已经覆盖了从X到Y的位置。也就是说,如果列表的最后一个元素R=Y和第一个元素R=X,那么你就完成了

您可以使用的最后一个功能是:

last([X],X).
last([H|T],R):- last(T,R).
然后您可以有一个基本情况:

route(X,Y,R,D):- last(R,L), L == Y, [H|T] = R, H == X.
或者是类似的。我已经有一段时间没有用prolog了


如果有帮助,请告诉我

我认为应该在递归调用之前移动
\+成员(X,p)
来解决您的问题。这是因为Prolog通过深度优先搜索子句来实现逻辑,即自上而下和从左到右的选择和匹配

当然,移动测试需要改变
p
计算。现在是参观后建成的。一种简单的方法是使用累加器,在第一次调用中初始化为[],并统一到目标上的完整路径。即

route(X,Y,Acc, [X,Y|Acc], D) :- flight(X,Y,L), D is L.
...

?- route(roc, syr, [], Routing, Duration).

我想我没有解释所有的变量。R是路线,D是距离(必须计入中途停留)。R和D是答案,所以我在调用规则时不把它们放进去。我不确定你的建议是否正确。在您给出的路由案例中,H和T来自何处,而D从未定义过。?-路由(roc、syr、路由、持续时间)。路由=[roc,syr],持续时间=25;路由=[roc,jfk,syr],持续时间=160;路由=[roc,jfk,bos,syr],持续时间=255;错。