1

Prolog のグリッド内の特定の 2 点間にパスを作成する必要があります。私がこれまでに持っているコードは次のとおりです。

createPath(GridSize, BeginPosition, EndPosition, VisitedPoints, Path):-
    nextStep(BeginPosition, NextStep, GridSize),
    (
        NextStep \== EndPosition,
    ->
        nonmember(NextStep, VisitedPoints),
        add(NextStep, VisitedPoints, NewVisitedPoints),
        add(NextStep, Path, NewPath),
        createPath(GridSize, NextStep, EndPosition, NewVisitedPoints, NewPath)
    ;
        ???
    ).

私のコードの少しの説明:

GridSize は単なる整数です。2 の場合、グリッドは 2x2 グリッドです。したがって、すべてのグリッドは正方形です。

BeginPosition と EndPosition は、pos(X,Y) のように表示されます。

関数 nextStep は、指定された位置の有効な隣人を探します。X と Y の値は、1 とグリッド サイズの間でなければなりません。nextStep の 4 つの異なる述語 (X + 1、X - 1、Y + 1、Y - 1) を宣言しました。コードは次のとおりです。

nextStep(pos(X,Y),pos(X1,Y),GridSize):-
    X1 is X + 1,
    X1 =< GridSize.
nextStep(pos(X,Y),pos(X1,Y),_):-
    X1 is X - 1,
    X1 >= 1.
nextStep(pos(X,Y),pos(X,Y1),GridSize):-
    Y1 is Y + 1,
    Y1 =< GridSize.
nextStep(pos(X,Y),pos(X,Y1),_):-
    Y1 is Y - 1,
    Y1 >= 1.

nonmember は、特定の要素が特定のリストにない場合に true を返します。

add は、指定されたリストに要素を追加し、その要素を含むリストを返します。

VisitedPoints について知っておくべきもう 1 つのこと: 最初は、BeginPosition と EndPosition がそのリストに格納されます。たとえば、2x2 グリッドでパスを検索する必要があり、ポイント pos(2,1) を回避する必要がある場合は、次のように関数を呼び出します。

createPath(2, pos(1,1), pos(2,2), [pos(1,1),pos(2,2),pos(2,1)], X).

私が得るべき結果は次のとおりです。

X = [pos(1,2)]

それが pos(1,1) と pos(2,2) を接続するために必要なポイントだからです。私の質問は、NextStep == EndPosition のときにコードの実行を停止するにはどうすればよいかということです。つまり、'???' の位置に何を入力すればよいのでしょうか。? または、この問題を間違った方法で処理していますか?

私は Prolog にかなり慣れていないので、オブジェクト指向言語からこれに移行するのは非常に困難です。

誰かが私の質問に答えてくれることを願っています。

敬具、

ウォル

4

1 に答える 1

1

パスへの「割り当て」を間違った場所に配置したと思います

createPath(GridSize, BeginPosition, EndPosition, VisitedPoints, Path):-
    nextStep(BeginPosition, NextStep, GridSize),
    (
        NextStep \== EndPosition,
    ->
        nonmember(NextStep, VisitedPoints),
        add(NextStep, VisitedPoints, NewVisitedPoints),
        % add(NextStep, Path, NewPath),
        % createPath(GridSize, NextStep, EndPosition, NewVisitedPoints, NewPath)
        createPath(GridSize, NextStep, EndPosition, NewVisitedPoints, Path)
    ;
        % ???
        % bind on success the output variable, maybe add EndPosition
        Path = VisitedPoints
    ).

たぶん、これは完全に答える価値があるわけではありませんが、コメントは少し「ぼやけている」でしょう

于 2012-11-05T13:11:35.370 に答える