Предикат не работает должным образом в Прологе (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)).
В этом примере результатом должно быть "да", но "нет".. Почему? Кто-нибудь может получить ошибку в коде?
С уважением
1 ответ
Вы должны сказать, какой вопрос вы задаете, мне не очевидно. Действительно, большая часть поведения Пролога контролируется с помощью создания переменных и без знания того, что 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),
....