2012-11-01 100 views
1

我有一个prolog谓词问题。在Prolog(SICStus)中谓词不能按预期工作

我有一个棋盘,我想检查一个棋手没有棋子的值在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)). 

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

Regards

回答

1

你应该说什么查询你问题,对我来说是不明显的。事实上,很多Prolog行为都是通过实例化变量来控制的,并且不知道绑定是什么,这很难回答。

无论如何,我认为你会得到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), 
.... 
+0

对手,我要检查,如果有个播放器(红色或蓝色)价值> 0和<11,如果他有谓词是真的,如果他没有,那么谓语是假的......这是我想要的,但不工作。 – mistic

+0

解决了,谢谢你! – mistic