谓词在Prolog(SICStus)中无法正常工作

时间:2012-11-01 20:17:23

标签: prolog sicstus-prolog

我对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)).

在这个例子中,结果应该是“是”但是“不”。为什么?任何人都可以在代码中得到错误吗?

此致

1 个答案:

答案 0 :(得分: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),
....