3
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 = []

これは起こるべきことではありません。パスには、アルゴリズムが通過した一連の「状態」が含まれている必要があります。何が問題なのですか?

4

3 に答える 3

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)
    ).

ここでは、線形時間を取得するためにアキュムレータは必要ありません。

于 2010-10-07T10:43:54.543 に答える
1

パスを構築する方法に問題があると思います。述語の先頭に組み込むように書き直したくなるかもしれません。このようなもの:

resolve(K, K, []) :- writeln('finished'). %goal state
resolve(CurrentState, GoalState, [CurrentState|Path]) :-
    suc(_, CurrentState, NextState, GoalState),
    resolve(NextState, GoalState, Path).

最初の句で再帰が終了します。状態 K から状態 K に移動するには、既にゴール状態にあるため、Path として [] を返します。2 番目の句はパスを構築し、次の状態を取得して呼び出しを再帰的に解決し、再帰が終了したときに通過したパスを構築します。

于 2010-10-06T15:15:27.790 に答える
0

述語の用語NextPathは?appendNewPath

現在、 はに完全にバインドできるため、 NextPathsoPathは にバインドする必要があります。[]NextPath[CurrentState]

于 2010-10-06T11:10:32.160 に答える