从Prolog中的谓词"返回"列表

dev*_*ium 3 prolog dcg

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)

这不是应该发生的事情.路径应包含我的算法已通过的"状态"序列.可能是什么问题?

mat*_*mat 5

使用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)

这里不需要累加器来获得线性时间.