1

我对 prolog 谓词有疑问。

我有一个棋盘,我想检查一个玩家何时没有值在 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绑定的情况下很难回答。

无论如何,我认为您会得到false,因为Opponent不断更改一行中的每个元素,然后piece(_,PieceValue,Opponent)=LineHead,check_mobile_pieces_line/2 在执行您感兴趣的测试之前将失败。

编辑在列表中搜索的最简单方法是使用 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.

说玩家没有可移动物:

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