0

そこで、8 タイル パズルの空白のタイルがスライドする方向を見つけようとしています。

X/Y を使用してタイルを決定しています。

これが私が持っているコードです。

mandist( X /Y , X1 / Y1 , D, Direction):-
       D is abs(X - X1 )+ abs(Y - Y1 ),
       Y is Y1  ->(
           (   X is X1 +1 -> Direction ='left')
           ;
           (   X1 is X +1 -> Direction = 'right'))
       ;  X is X1 ->(
               (   Y1 is Y +1 -> Direction ='up')
           ;
           (   Y is Y1 +1 -> Direction ='down')).

私が得ている問題は、マンディスト述語を呼び出すときに、期待した結果が得られないことです。

問題はifステートメントにあると確信しています。私がやろうとしていることを理解できるように、いくつかの疑似コードを書きました。

if(Y == Y1){
    // Change the X Axis
    if(X == X1 +1){
        This is a left move
    }
    else{
        This is a right move
    }
}else if (X == X1){
    // Change the Y Axis 
    if(Y == Y1 + 1){
        This is an up move
    }
    else{
        This is a down move
    }
}

例:

move([1/1, 3/1, 1/3, 2/3, 3/3, 1/2, 2/2, 3/2,2,1], X, Direction)

次に、mandist 述語を呼び出します

D が 1 に設定されているため、合法的な動きが保証されます。

予想外の結果は次のとおりです。

mandist(1/1, X,1, Direction).
Direction = up ;
false

Direction = rightまた、位置 1/1 は 3x3 グリッドの左下であり、左下からの移動は上または右のいずれかのみであるため、それが言うことも期待しています。

1/3 2/3 3/3

1/2 2/2 3/2

1/1 2/1 3/1

4

1 に答える 1

1

あなたの質問に基づいて、おそらく次の節を書きたいと思うでしょう:

mandist(X/Y,XD/Y,D,right) :-
    XD is X+D.
mandist(X/Y,X/YD,D,up) :-
    YD is Y+D.
mandist(X/Y,XD/Y,D,left) :-
    XD is X-D.
mandist(X/Y,X/YD,D,down) :-
    YD is Y-D.

これをファイルに書き込むと、次が生成されます。

?- mandist(1/1,X,1,Direction).
X = 2/1,
Direction = right ;
X = 1/2,
Direction = up ;
X = 0/1,
Direction = left ;
X = 1/0,
Direction = down.

さらに、インスタンス化された与えられDた 2 つの座標が特定の方向にあるかどうかを検証できます。

?- mandist(1/1,1/2,1,Direction).
Direction = up ;
false.

ただし、次の場合は機能しません。

?- mandist(1/1,1/2,D,Direction).
ERROR: is/2: Arguments are not sufficiently instantiated

ただし、これを行う方法があります。それが要件である場合は、質問を更新してください。

編集:

境界があるため、それらを節に追加するだけです。座標の最初のペアが有効であると仮定できる場合は、次のようになります。

mandist(X/Y,XD/Y,D,right) :-
    XD is X+D,
    XD < 4.
mandist(X/Y,X/YD,D,up) :-
    YD is Y+D,
    YD < 4.
mandist(X/Y,XD/Y,D,left) :-
    XD is X-D,
    XD > 0.
mandist(X/Y,X/YD,D,down) :-
    YD is Y-D,
    YD > 0.
于 2017-01-05T17:51:27.077 に答える