domains
mesto=a(integer,integer,symbol)
spisok= mesto*
predicates
a(integer,integer,symbol)
путь(mesto,spisok,spisok)
member(mesto,spisok)
можем_идти(mesto,spisok)
clauses
a(1,1,стена).a(1,2,стена).a(1,3,стена).a(1,4,стена).
a(2,1,пусто).a(2,2,пусто).a(2,3,пусто).a(2,4,стена).
a(3,1,выход).a(3,1,пусто).a(3,2,стена).a(3,3,пусто).a(3,4,стена).
a(4,1,стена).a(4,2,стена).a(4,3,пусто).a(4,4,пусто).
a(5,1,стена).a(5,2,пусто).a(5,3,пусто).a(5,4,стена).
% a(I,J) представляет позицию в i ряду j колонке
% нашли путь?
путь(a(I,J,B),[a(I,J,B)],Были):-
a(I,J,выход),nl,write("Выход",I,J).
% Пытаемся идти на север
путь(a(I,J,B),[a(I,J,B)|P],Были) :-
K= I-1,
можем_идти(a(K,J,B),Были),
путь(a(K,J,B),P,[a(K,J,B)|Были]).
% Пытаемся идти на юг
путь(a(I,J,B),[a(I,J,B)|P],Были) :-
K= I+1,
можем_идти(a(K,J,B),Были),
путь(a(K,J,B),P,[a(K,J,B)|Были]).
% Пытаемся идти на запад
путь(a(I,J,B),[a(I,J,B)|P],Были) :-
L= J-1,
можем_идти(a(I,L,B),Были),
путь(a(I,L,B),P,[a(I,L,B)|Были]).
% Пытаемся идти на восток
путь(a(I,J,B),[a(I,J,B)|P],Были) :-
L= J+1,
можем_идти(a(I,L,B),Были),
путь(a(I,L,B),P,[a(I,L,B)|Были]).
% в позицию i j можно попасть если это не стена и мы не были в ней прежде
можем_идти(a(I,J,B),Были):-
a(I,J,пусто),
% проверить были ли?
not (member(a(I,J,_),Были)),
nl.
member(R,[R|T]).
member(R,[H|T]):-member(R,T).
goal
путь(a(4,2,пусто),P,[a(4,2,пусто)]), write(P).