我正在编写一个谓词来查找 A* 迭代的所有可能的后继状态,并将它们放在像 [(cost, state), ...] 这样的列表中,目前该列表如下:
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 成为的列表,所以它看起来正在做我想做的事情,而不是......我想要的地方。
请问,我该如何解决这个问题?