resolve(K, K, _) :- writeln('finished'). %goal state
resolve(CurrentState, GoalState, Path) :-
suc(_, CurrentState, NextState, GoalState),
append(Path, [CurrentState], NextPath),
resolve(NextState, GoalState, NewPath).
Run Code Online (Sandbox Code Playgroud)
我目前有这个算法,它可以正常工作.我这样运行它:
resolve(0, 10, Path).
Run Code Online (Sandbox Code Playgroud)
我确信算法正在运行,它会达到目标状态,尽管它Path的值是
Path = []
Run Code Online (Sandbox Code Playgroud)
这不是应该发生的事情.路径应包含我的算法已通过的"状态"序列.可能是什么问题?
使用DCG表示法来描述列表最简单:
path(State0, Target) -->
( { State0 == Target } -> []
; { suc(_, State0, State1, Target) },
[State1],
path(State1, Target)
).
Run Code Online (Sandbox Code Playgroud)
您也可以手动执行此操作:
path(State0, Target, Path) :-
( State0 == Target -> Path = []
; suc(_, State0, State1, Target),
Path = [State1|Rest],
path(State1, Target, Rest)
).
Run Code Online (Sandbox Code Playgroud)
这里不需要累加器来获得线性时间.