1

プロローグ述語に問題があります。

私はボードを1つ持っていますが、1人のプレーヤーがモバイルピースと呼ばれる1〜10の値のピースを持っていないかどうかを確認したいと思います。コードは上に示されています:

test_board([
      [piece('   ',12,blk),piece('R2 ',2,red),piece('RB ',11,red),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk)],
      [piece('   ',12,blk),piece('RB ',11,red),piece('RF ',0,red),piece('RB ',11,red),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('RB ',11,red),piece('   ',12,blk),piece('   ',12,blk)],
      [piece('   ',12,blk),piece('   ',12,blk),piece('RB ',11,red),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk)],
      [piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk),piece('   ',12,blk)],
      [piece('   ',12,blk),piece('   ',12,blk),piece('X  ',13,for),piece('X  ',13,for),piece('   ',12,blk),piece('   ',12,blk),piece('X  ',13,for),piece('X  ',13,for),piece('   ',12,blk),piece('   ',12,blk)],
      [piece('   ',12,blk),piece('   ',12,blk),piece('X  ',13,for),piece('X  ',13,for),piece('   ',12,blk),piece('   ',12,blk),piece('X  ',13,for),piece('X  ',13,for),piece('   ',12,blk),piece('   ',12,blk)],
      [piece('B6 ', 6,blue),piece('B4 ', 4,blue),piece('B5 ', 5,blue),piece('B10',10,blue),piece('B7 ', 7,blue),piece('B4 ', 4,blue),piece('B8 ', 8,blue),piece('B9 ', 9,blue),piece('B5 ', 5,blue),piece('B4 ', 4,blue)],
      [piece('B7 ', 7,blue),piece('B2 ', 2,blue),piece('B5 ', 5,blue),piece('BB ',11,blue),piece('B3 ', 3,blue),piece('B6 ', 6,blue),piece('B3 ', 3,blue),piece('B1 ', 1,blue),piece('B2 ', 2,blue),piece('B3 ', 3,blue)],
      [piece('B3 ', 3,blue),piece('B2 ', 2,blue),piece('BB ',11,blue),piece('B3 ', 3,blue),piece('BB ',11,blue),piece('B2 ', 2,blue),piece('BB ',11,blue),piece('B6 ', 6,blue),piece('B2 ', 2,blue),piece('B7 ', 7,blue)],
      [piece('B2 ', 2,blue),piece('B6 ', 6,blue),piece('B5 ', 5,blue),piece('B4 ', 4,blue),piece('B2 ', 2,blue),piece('BB ',11,blue),piece('BF ',0,blue),piece('BB ',11,blue),piece('B8 ', 8,blue),piece('B2 ', 2,blue)]]
).

check_mobile_pieces([],_):-
  fail.

check_mobile_pieces([BoardHead|BoardTail],Opponent):-
  check_mobile_pieces_line(BoardHead,Opponent);
  check_mobile_pieces(BoardTail,Opponent).

check_mobile_pieces_line([],_):-
  fail.

check_mobile_pieces_line([LineHead|LineTail],Opponent):-
  piece(_,PieceValue,Opponent)=LineHead,
  ((PieceValue > 0, PieceValue<11) -> true
                                   ;check_mobile_pieces_line(LineTail,Opponent)).

この例では、結果は「はい」であるはずですが、「いいえ」です。なぜですか?誰でもコードでエラーを取得できますか?

よろしく

4

1 に答える 1

1

あなたが発行するクエリは、私には明らかではないと言うべきです。実際、Prolog の動作の多くは変数のインスタンス化によって制御されており、何がOpponentバインドされているのかを知らずに答えるのは困難です。

とにかく、行内の各要素を変更し続けると、興味のあるテストを実行する前に check_mobile_pieces_line/2 が失敗するfalseため、取得できると思います。Opponentpiece(_,PieceValue,Opponent)=LineHead,

リストを検索する最も簡単な方法は、member/2 を使用することです次に、プレーヤーに可動部分があるかどうかを確認するには:

has_movable(Player) :-
  test_board(Board),
  member(Row, Board),                    % peek a row
  member(piece(_, Value, Player), Row),  % peek a Player'piece
  Value > 0, Value < 11.

Player に可動要素がないと言うには、次のようにします。

....
\+ has_movable(Player),
....
于 2012-11-01T22:03:36.790 に答える