Как перейти на безопасный соседний квадрат в прологе?
Я пытаюсь написать приложение Prolog, в которое лучник переместится в соседний квадрат, который безопасен на сетке 4 x 4.
Например, лучник находится в квадратном столбце 1 строки 4, он может двигаться вверх или вправо, если в нем нет монстра, записанного как M. Таким образом, если в столбце 2 строки 4 был монстр (M), лучник (A) не смог бы туда двигаться, но если в столбце 1 строки 3 пусто (E), он может перейти в него. Лучник может проверить, безопасны ли соседние клетки, но не дальше.
Вот что я получил так далеко:
:- 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).
Я изо всех сил пытаюсь заставить лучника проверить, безопасен ли соседний квадрат, и если это так, то перейти в этот квадрат.
Как это может быть сделано?