Recursion 为什么赢了';这个序言谓词不统一吗?

Recursion 为什么赢了';这个序言谓词不统一吗?,recursion,prolog,unification,Recursion,Prolog,Unification,我正在编写一个谓词,以查找a*迭代的所有可能的后续状态,并将它们放在一个类似[(成本,状态),…]的列表中,目前的情况如下: addSuccessors(L, [], _). addSuccessors(L, [X|T], OrigList) :- memb(OrigList, Index, X), add((X, Index), L, List2),

我正在编写一个谓词,以查找a*迭代的所有可能的后续状态,并将它们放在一个类似[(成本,状态),…]的列表中,目前的情况如下:

addSuccessors(L, [], _).
addSuccessors(L, [X|T], OrigList) :- memb(OrigList, Index, X),
                                     add((X, Index), L, List2),
                                     addSuccessors(List2, T, OrigList).
addSuccessors(L, [X|[]], OrigList) :- memb(OrigList, Index, X),
                                     add((X, Index), L, L2),
                                     addSuccessors(L2, [], OrigList).
Add在列表末尾添加内容,memb获取列表的第(索引)个元素。我知道它们是有效的,当我在底部谓词中查看L2时,我得到如下结果

?- addSuccessors(X, [1500, 3670], [0, 0, 0, 1500, 3670]).
X = [] ;
[ (1500, 3), (3670, 4)]
X = [] ;
X = [_G1175] ;
[_G1175, (1500, 3), (3670, 4)]
X = [_G1175] ;
X = [_G1175, _G1181] ;
[_G1175, _G1181, (1500, 3), (3670, 4)]
X = [_G1175, _G1181] ;
...
这是非常令人沮丧的,因为[(1500,3),(3670,4)]列表是我希望X在我调用它之后的样子,所以它看起来是在做我想做的事情,而不是。。。在我想去的地方


请问,我该如何解决这个问题?

我在Prolog中编程已经有一段时间了,但我认为您需要将正在生成的列表与返回的列表分开(即,添加另一个参数)。[X |[]]的规则应该绑定输出变量,而不是递归

想想我是怎么得到它的初始值的。问题是它没有。你要做的是从头开始建立一个列表,所以你需要从一个空列表开始,而不是一个未绑定的变量。解决这个问题的一种方法是编写一个包装器谓词,它允许当前谓词充当累加器谓词

这可能看起来像这样,其中
add\u acc
将包含您已经定义的子句

addSuccessors(L, X, Y) :-
    addSuccessors_acc(L,[],X,Y).
其思想是,
addsuccessivers\u acc
谓词的第二个参数充当累加器,累加器是每个递归调用建立的列表。然后在累加器谓词的基本情况下,您只需要将累加器变量与第一个参数统一起来,以传递最终列表。例如:

 addSuccessors_acc(L,L,_,_).
此外,正如ergosys指出的,你的第三个子句实际上可以是基本情况。因为您处理的是列表中的最后一个元素,所以不需要递归-所做的只是将基本情况延迟一个额外的调用