【发布时间】:2010-02-01 19:57:37
【问题描述】:
我正在编写一个谓词来查找 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 成为的样子,所以它看起来正在做我想做的事情,而不是......我在哪里想要。
请问,我该如何解决这个问题?
【问题讨论】:
标签: recursion prolog unification