Prolog路由例程

Prolog路由例程,prolog,logic,path-finding,Prolog,Logic,Path Finding,我试图写一个路由函数,但我似乎无法得到所需的结果。这是到目前为止的代码。 前置查找链接到N的节点,并将其作为P返回 traceroute(_,L) :- member((A,A),L). traceroute(N,L) :- predecessor(N,P), append(N,L,L1), traceroute(P,L1). 当我运行我的traceroute(placeA,Y)时。将返回此数据。。 Y=[(G575,G575)| G579]。 基本上,对于tracerout

我试图写一个路由函数,但我似乎无法得到所需的结果。这是到目前为止的代码。 前置查找链接到N的节点,并将其作为P返回

traceroute(_,L) :- member((A,A),L).
traceroute(N,L) :-
   predecessor(N,P),
   append(N,L,L1),
   traceroute(P,L1).
当我运行我的
traceroute(placeA,Y)时。
将返回此数据。。
Y=[(G575,G575)| G579]。

基本上,对于traceroute的第一行,如果任何成员是其自身的前身,我将尝试终止递归。第二部分应该循环遍历所有节点,并将它们添加到列表(L)中

节点的存储方式为[(placeA,placeB),(placeB,placeC)],列表的存储方式应为[placeA,placeB,placeC]


我不明白为什么我会得到这些结果。

一个看起来像这样的解决方案(当它不正确时)通常意味着你没有在你应该有的地方建立(即实例化)一个术语

我不完全确定您的代码是如何工作的,但看起来您的主要问题是您正在为traceroute的第二个参数传递一个非圆形变量

在成员调用中,因为L是非圆形的,所以实际上要求prolog返回一个形式为(A,A)的项,它是一个完全未实例化列表的元素。虽然这没有多大意义,但有时做这种事情是有用的,因此prolog会尽职尽责地遵守,并(在回溯时)生成在某个点上具有项(A,A)的非整数变量的递增长度列表(因为您没有在任何地方指定长度)。即:

?- traceroute(placeA, Y).
Y = [ (_G271, _G271)|_G275] ;
Y = [_G274, (_G271, _G271)|_G278] ;
Y = [_G274, _G277, (_G271, _G271)|_G281] ;
Y = [_G274, _G277, _G280, (_G271, _G271)|_G284] ;
您需要为Y传递一个值,该值为ground,或者进一步约束它在谓词中接受的值,或者甚至可能两者都需要

另外,即使第二个子句没有实际执行,您也有一个类似的问题:L也是非圆形的,它被附加到N上,产生L1,L1也是非圆形的。由于该谓词递归地执行此操作,因此最终列表始终是非圆形的