2

私はプロローグに非常に慣れていないので、チェス盤の騎士が別の正方形にジャンプできるかどうか、または与えられた正方形に騎士がジャンプできるすべての正方形を出力できるかどうかを判断する簡単な方法を作成しようとしています。このメソッドでは、最初の引数を常にインスタンス化する必要があると想定しています。両方のパラメーターを指定すると正しく動作しますが、指定されたパラメーターのみを出力しない理由がわかりません。

% validSquare/2
% validSquare(X1/Y1, X2/Y2) iff the coordinate is a valid position on an 8x8 chessboard.
validSquare(X1/Y1, X2/Y2) :-
  X1 >= 1, X1 =< 8,
  Y1 >= 1, Y1 =< 8,
  X2 >= 1, X2 =< 8,
  Y2 >= 1, Y2 =< 8.


% jump/2
% jump(Square1, Square2) iff a knight could jump to the coordinate
% Square1/Square2 on a chessboard.
jump(X1/Y1, X2/Y2) :-
  validSquare(X1/Y1, X2/Y2),
  X2 is X1 + 1,
  Y2 is Y1 + 2.
jump(X1/Y1, X2/Y2) :-
  validSquare(X1/Y1, X2/Y2),
  X2 is X1 + 2,
  Y2 is Y1 + 1.
jump(X1/Y1, X2/Y2) :-
  validSquare(X1/Y1, X2/Y2),
  X2 is X1 + 1,
  Y2 is Y1 - 2.
jump(X1/Y1, X2/Y2) :-
  validSquare(X1/Y1, X2/Y2),
  X2 is X1 + 2,
  Y2 is Y1 - 1.
jump(X1/Y1, X2/Y2) :-
  validSquare(X1/Y1, X2/Y2),
  X2 is X1 - 1,
  Y2 is Y1 - 2.
jump(X1/Y1, X2/Y2) :-
  validSquare(X1/Y1, X2/Y2),
  X2 is X1 - 2,
  Y2 is Y1 - 1.
jump(X1/Y1, X2/Y2) :-
  validSquare(X1/Y1, X2/Y2),
  X2 is X1 - 1,
  Y2 is Y1 + 2.
jump(X1/Y1, X2/Y2) :-
  validSquare(X1/Y1, X2/Y2),
  X2 is X1 - 2,
  Y2 is Y1 + 1.

私が言ったように、私は Prolog に非常に慣れていないので、クエリをどのようにフォーマットすればよいかよくわかりません。このクエリは誤りです。

?- jump(1/1, X2/Y2).
ERROR: >=/2: Arguments are not sufficiently instantiated

助けてくれてありがとう。

4

3 に答える 3

1

これは、この素晴らしい回答で提示されたコードの代替です。に基づいています。

ジャンプ(X0/Y0, X/Y) :-
   D_x #= X0-X,
   D_y #= Y0-Y,
   abs(D_x) #\= abs(D_y),
   [D_x , D_y] ins (-2 .. -1)\/(1..2),
   [X0,X,Y0,Y] ins 1..8.

効率的です1,2 !


脚注 1: バージョン 4.3.2 (64 ビット) およびバージョン 7.3.11 (64 ビット)でテスト済み。
脚注 2: SICStus Prolog は、(ins)/2上記のコードを実行するために の適切な定義を必要とします。

于 2015-11-25T18:43:45.127 に答える
1

の >= テストで壊れていvalidSquareます。X <= Y基本的に、数値演算子は値を割り当てないため、両方がバインドされていない場合の真の値を決定することはできません。これは、メンバーを使用して座標を有効な正方形にバインドすることで解決できます。

validSquare(X1/Y1, X2/Y2):-
    member(X1, [1,2,3,4,5,6,7,8]),
    member(X2, [1,2,3,4,5,6,7,8]),
    member(Y1, [1,2,3,4,5,6,7,8]),
    member(Y2, [1,2,3,4,5,6,7,8]).

使用している Prolog の方言に応じて、組み込みmember(SWI-Prolog など) である場合とそうでない場合があります。

于 2014-11-22T19:55:17.687 に答える