title: How to move to safe adjacent square in prolog?
body: <p>I am trying to write a Prolog application were an archer will move into an adjacent square that is safe on a <strong>4 x 4 grid</strong>.</p>
  
  <p>For example the archer is in the square <strong>column 1 row 4</strong>, he can move up or right if it does not contain the monster recorded as <strong>M</strong>.  So if <strong>column 2 row 4</strong> had the <strong>Monster (M)</strong>, <strong>the archer(A)</strong> could not move there but if <strong>column 1 row 3</strong> is <strong>empty(E)</strong> he can move into this.  The archer can check if the adjacent squares are safe but not any further away than that.</p>
  
  <p>Here is what I got so far:</p>
  
  <pre><code>:- dynamic square/3.
  :- dynamic show/1.
  
  createBoard(N) :- 
      retractall(show(_)),
      assert(show([[1,1]])),
      retractall(square(_,_,_)),
      createBoard(N,N).
  
  testBoard :-
      retractall(square(_,_,_)),
      retractall(show(_)),
      assert(show([[4,1]])),
      asserta(square(1,1,[e])),
      asserta(square(1,2,[e])),
      asserta(square(1,3,[s])),
      asserta(square(1,4,[e])),
      asserta(square(2,1,[e])),
      asserta(square(2,2,[b,s])),
      asserta(square(2,3,[m])),
      asserta(square(2,4,[g,s])),
      asserta(square(3,1,[b])),
      asserta(square(3,2,[p])),
      asserta(square(3,3,[g,b,s])),
      asserta(square(3,4,[x])),
      asserta(square(4,1,[a,e])),
      asserta(square(4,2,[b])),
      asserta(square(4,3,[e])),
      asserta(square(4,4,[g])).
  
  % you can place a piece on a board of N size if you can generate a row
  %   and column value and you can place that piece on an square empty square
  place(Piece,N) :-
      Row1 is random(N),
      Col1 is random(N),
      place(Piece,Row1,Col1,N).
  
  % you can place a pit if the square is empty at the specified
  % position
  place(p,Row,Col,_) :-
      square(Row,Col,[e]),
      retract(square(Row,Col,[e])),
      assert(square(Row,Col,[p])).
  
  % Find an Item at a position R,C by
  % examining the contents of the R,C, location
  find(R,C,Item) :-
      square(R,C,Contents),
      member(Item,Contents).
  </code></pre>
  
  <p>I am struggling to make the archer check if an adjacent square is safe and if it is, then move into that square.</p>
  
  <p>How can this be done?</p>