从Prolog中的谓词“返回”列表

时间:2010-10-06 10:09:18

标签: 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).

我目前有这个算法,它可以正常工作。我这样运行它:

resolve(0, 10, Path).

我确信算法正在运行,它会进入目标状态,尽管Path的值是

Path = []

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

3 个答案:

答案 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]