Предикат не работает должным образом в Прологе (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),
....
Другие вопросы по тегам