0

I have a problem in a prolog program. The error is in predicate findall inside predicate moves. Anyone know why i got this error:

! Instantiation error in argument 1 of >= /2 ! goal: _1123>=0 % 1

The code is the following:

moves(Board, Player, BoardList) :-
  change_player(Player, Opposing),
  \+winners(Board, Player, Opposing),
  findall(NewBoard,
          (
            find_piece(Board, Player, 0, 0, XPiece, YPiece),
            get_piece(Board, XPiece, YPiece, Piece),
            validate_move(Board, XPiece, YPiece, XFinal, YFinal, Player,Piece,FinalPiece),
            move(Board, XPiece, YPiece, XFinal, YFinal, Player,Piece,FinalPiece, NewBoard)
          ),
          BoardList).


find_piece([], _, _, _, _, _) :- fail.

find_piece([[piece(_,_,Player)|_]|_], Player, XPiece, YPiece, XPiece, YPiece).

find_piece([[]|Row], Player, _, YCoord, XPiece, YPiece) :-
  NewYCoord is YCoord + 1,
  find_piece(Row, Player, 0, NewYCoord, XPiece, YPiece).

find_piece([[_|Column]|Row], Player, XCoord, YCoord, XPiece, YPiece) :-
  NewXCoord is XCoord + 1,
  find_piece([Column|Row], Player, NewXCoord, YCoord, XPiece, YPiece).

% get_piece/4
% get an piece from board
get_piece(Board, X, Y, Element) :-
  validate_coord(X, Y),
  get_from_board(Board, Y, Row),
  get_from_board(Row, X, Element).

% get_from_board/3
% get something from a certain position of the board
get_from_board([Head|_],0,Head).

get_from_board([Head|Tail],Pos,Elem):-
  Pos \= 0,
  NewPos is Pos - 1,
  get_from_board(Tail,NewPos,Elem).


validate_move(Board,XPiece,YPiece,XPiece,YFinal,Player,Piece,FinalPiece):-
  validate_coord(XPiece,YFinal),
  get_movement_y(YPiece,YFinal),
  piece(_,_,Player)=Piece,
  get_piece(Board,XPiece,YFinal,Elem),
  FinalPiece=Elem,
  piece(_,Value,_)=Piece,
  Value > 0,
  Value < 11,
  \+(piece(_,_,Player)=Elem).


validate_move(Board,XPiece,YPiece,XFinal,YPiece,Player,Piece,FinalPiece):-
  validate_coord(XFinal,YPiece),
  get_movement_x(XPiece,XFinal),
  piece(_,_,Player)=Piece,
  get_piece(Board,XFinal,YPiece,Elem),
  FinalPiece=Elem,
  piece(_,Value,_)=Piece,
  Value > 0,
  Value < 11,
  \+(piece(_,_,Player)=Elem).

% get_movement_y/2
% get and correct the move in y

get_movement_y(YPiece,YDesired):-
  ((YDesired > YPiece )-> (YDesired is YPiece+1)
             ;(YDesired is YPiece -1)).

% get_movement_x/2
% get and correct the move in x
get_movement_x(XPiece,XDesired):-
  ((XDesired > XPiece )-> (XDesired is XPiece+1)
             ;(XDesired is XPiece -1)).

% move/8
% True if NewBoard is the resulting board if the piece belonging to Player
% at (XPiece, YPiece) gets moved to (XFinal, YFinal) in Board
move(Board, XPiece, YPiece, XFinal, YFinal, Player,Piece,piece('   ',12, blk),NewBoard) :-
  get_from_board(Board, YFinal, TempRowFinal),
  set_element_at_index(TempRowFinal, XFinal, Piece, NewRowFinal),
  set_element_at_index(Board, YFinal, NewRowFinal, TempBoard),

  get_from_board(TempBoard, YPiece, TempRowPiece),
  set_element_at_index(TempRowPiece, XPiece, piece('   ',12,blk), NewRowPiece),
  set_element_at_index(TempBoard, YPiece, NewRowPiece, NewBoard).

validate_coord(X, Y) :- 
  X >= 0, 
  X < 10, 
  Y >= 0, 
  Y < 10, 
  \+(forbiden_area(X,Y)).

move(Board, XPiece, YPiece, XFinal, YFinal, Player,Piece,FinalPiece,NewBoard) :-

  clear_screen,
  write('######### CONFRONTO EM CURSO #########'),nl,nl,
  show_battle(Board,XFinal,YFinal,Player,0,0),
  sleep(2),
  clear_screen,
  move_battle(Piece,FinalPiece,PieceToUse),
  get_from_board(Board, YFinal, TempRowFinal),
  set_element_at_index(TempRowFinal, XFinal, PieceToUse, NewRowFinal),
  set_element_at_index(Board, YFinal, NewRowFinal, TempBoard),

  get_from_board(TempBoard, YPiece, TempRowPiece),
  set_element_at_index(TempRowPiece, XPiece, piece('   ',12,blk), NewRowPiece),
  set_element_at_index(TempBoard, YPiece, NewRowPiece, NewBoard).
mistic
  • 275
  • 5
  • 15
  • 1
    Your program is incomplete: There is no goal `(>=)/2` that could produce the instantiation error. In any case, that is independent of `findall/3` – false Oct 31 '12 at 21:21
  • @false i forget to put this function: `code validate_coord(X, Y) :- X >= 0, X < 10, Y >= 0, Y < 10, \+(forbiden_area(X,Y)).` I think that is here – mistic Oct 31 '12 at 22:43
  • Click on |edit| to insert it! And also your initial query! What does the goal to `moves/3` get uses? – false Oct 31 '12 at 22:51
  • 1
    I tried: `length(Board,5),maplist(maplist(\_^_^true,Board),Board), find_piece(Board, Player, 0, 0, XPiece, YPiece)` and it did not show the error at all. I suspect that the code you posted is different from what you test. – false Oct 31 '12 at 23:04
  • Hello, Thanks for your help. I can guarantee that this code is the code that is used for us. I dont understand why the error happen at all. – mistic Oct 31 '12 at 23:08
  • Where is your initial query? I don't see any, and even above query works.. – false Oct 31 '12 at 23:11

0 Answers0