2012-11-01 85 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