Подборка лаб выполненых в Arity Prologе / ARI_DOC / SOCROV
.DOCПрограмма сбора всех доступных сокровищ
doroga('вход','бар').
doroga('вход','фонтан').
doroga('фонтан','монстры').
doroga('фонтан','выход').
doroga('бар','монстры').
doroga('фонтан','золото').
doroga('бар','серебро').
doroga('клад','монстры').
doroga('алмазы','выход').
doroga('разбойники','золото').
doroga1(X,Y):-doroga(X,Y).
doroga1(X,Y):-doroga(Y,X).
nenado(['монстры','разбойники']).
sokrov(['золото','алмазы','серебро','клад']).
prinadl(Z,[Z|_]).
prinadl(Z,[_|X]):-prinadl(Z,X).
first([First|_],First).
addsp([],Sp,Sp).
addsp([X|Sp1],Sp2,[X|Sp3]):-addsp(Sp1,Sp2,Sp3).
delfirst([_|M],M).
pechat([]):-!.
pechat([X|Tail]):-
pechat(Tail),
write(X),
write('-').
puty(Kom1,Kom2,Marsh,Marshr):-
doroga1(Kom1,Kom2),Marshr=[Kom2|Marsh].
puty(Kom1,Kom2,Marsh,Marshr):-
doroga1(Kom1,Kom),nenado(Monstrs),
not(prinadl(Kom,Monstrs)),not(prinadl(Kom,Marsh)),
puty(Kom,Kom2,[Kom|Marsh],Marshr).
gosokr:-
sokrov(Sokr),marsh(M),prinadl(S,Sokr),not(prinadl(S,M)),
first(M,Last),puty(Last,S,[Last],M1),retract(marsh(_)),
delfirst(M,M_),addsp(M1,M_,M2),assert(marsh(M2)),!,
gosokr,fail.
gos:-assert(marsh(['вход'])),gosokr.
gos:-retract(marsh(M)),first(M,Last),
puty(Last,'выход',[Last],M1),delfirst(M,M_),addsp(M1,M_,M2),
write(' Маршрутом '),nl,pechat(M2),nl,
write(' Cсобрали:'),sokrov(Sokr),!,
prinadl(S,Sokr),prinadl(S,M2),write(S),write(' '),fail.
go:-gos.
go.
Пример:
?- go.
Маршрутом
вход-фонтан-золото-фонтан-выход-алмазы-выход-фонтан-вход-бар-серебро-бар-вход-фонтан-выход
Cобрали:золото алмазы серебро
yes