resolve(K, K, _) :- writeln('finished'). %goal state
resolve(CurrentState, GoalState, Path) :-
suc(_, CurrentState, NextState, GoalState),
append(Path, [CurrentState], NextPath),
resolve(NextState, GoalState, NewPath).
我目前有这个算法,它可以正常工作。我这样运行它:
resolve(0, 10, Path).
我确信算法正在运行,它会进入目标状态,尽管Path
的值是
Path = []
这不应该发生什么。路径应包含我的算法已通过的“状态”序列。 可能是什么问题?
答案 0 :(得分:5)
最简单的方法是使用DCG表示法来描述列表:
path(State0, Target) -->
( { State0 == Target } -> []
; { suc(_, State0, State1, Target) },
[State1],
path(State1, Target)
).
您也可以手动执行此操作:
path(State0, Target, Path) :-
( State0 == Target -> Path = []
; suc(_, State0, State1, Target),
Path = [State1|Rest],
path(State1, Target, Rest)
).
这里不需要累加器来获得线性时间。
答案 1 :(得分:1)
我相信你想要构建Path的方式存在问题。 您可能希望重写它以便在谓词的头部构建它。 像这样:
resolve(K, K, []) :- writeln('finished'). %goal state
resolve(CurrentState, GoalState, [CurrentState|Path]) :-
suc(_, CurrentState, NextState, GoalState),
resolve(NextState, GoalState, Path).
第一个子句结束递归:从状态K转到状态K,您将[]作为路径返回,因为您已经处于目标状态。 第二个子句构建路径,它获取下一个状态并以递归方式解析,构建递归完成时遍历的路径。
答案 2 :(得分:0)
NextPath
谓词中的append
一词应该是NewPath
吗?
目前NextPath
没有任何其他用法,因此Path
必须绑定到[]
,因为NextPath
能够完全绑定到[CurrentState]
。