Приведено решение одной логической задачи в пакете SWIpl
интеллектуальная система, программа, Пролог
В курсе «Проектирование и разработка интеллектуальных систем» одним из разделов является раздел «Интеллектуальные системы на основе формальной логики».
Задача: во время наводнения пять супружеских пар оказались отрезанными от суши водой. В их распоряжении была одна лодка, которая могла одновременно вместить только трех человек. Каждый супруг был настолько ревнив, что не мог позволить своей супруге находиться в лодке или на другом берегу с другим мужчиной (или мужчинами) в его отсутствие, если мужчина находился без своей супруги. Найти способ переправить на сушу этих мужчин и жен в целости и сохранности.
Ниже приведена программа, решающая данную задачу в пакете SWIpl.
prinad(X,[X|_]). prinad(X,[_|Y]):-prinad(X,Y). perv(X,[X|S]). uniq([X],[X]).
uniq([X|S],M):-prinad(X,S),uniq(S,M),!. uniq([X|S],[X|M]):-not(prinad(X,S)),uniq(S,M),!.
sset([],M). sset([X|L],M):-prinad(X,M),sset(L,M),!. sset(L,L). raz([],S,S).
raz([X|T],S,M):-del(X,S,S1),raz(T,S1,M).
del(A,[],[]). del(A,[A|S],M):- del(A,S,M),!.del(A,[B|L],[B|M]):-del(A,L,M).
rav([X],[X]). rav([X|T],L):-prinad(X,L),del(X,L,L1),rav(T,L1),!.
add([],Y,Y).
add([X|L],Y,Z):-prinad(X,Y),!,add(L,Y,Z). add([X|L],Y,[X|Z]):-add(L,Y,Z).
p(m1). p(m2). p(m3). p(m4). p(m5). p(f1). p(f2). p(f3). p(f4). p(f5).
pp([X|S]):-p(X),pp(S).
conf(S):-prinad(f1,S),not(prinad(m1,S)),
(prinad(m2,S);prinad(m3,S);prinad(m4,S);prinad(m5,S)),!.
conf(S):-prinad(f2,S),not(prinad(m2,S)),
(prinad(m1,S);prinad(m3,S);prinad(m4,S);prinad(m5,S)),!.
conf(S):-prinad(f3,S),not(prinad(m3,S)),
(prinad(m1,S);prinad(m2,S);prinad(m4,S);prinad(m5,S)),!.
conf(S):-prinad(f4,S),not(prinad(m4,S)),
(prinad(m1,S);prinad(m2,S);prinad(m3,S);prinad(m5,S)),!.
conf(S):-prinad(f5,S),not(prinad(m5,S)),
(prinad(m2,S);prinad(m3,S);prinad(m4,S);prinad(m1,S)),!.
gol([],_,_).
gol(L,P,R):- p(X),B=[X],not(rav(B,P)),sset(B,R),
raz(B,R,R1),not(conf(R1)),add(B,L,L1),
write(L),write('<---'),write(B),write('---'),write(R1), nl,nl,gor(L1,B,R1),!.
gor([],_,_).
gor(L,P,R):- p(X),p(Y),p(Z),B=[X,Y,Z],uniq(B,B1),not(rav(B1,P)),
sset(B1,L), raz(B1,L,L1),not(conf(L1)),not(conf(B1)),add(B1,R,R1),
write(L1),write('--->'),write(B1),write('---'),write(R1),nl,nl,
gol(L1,B1,R1),!.
Ниже переписано решение данной программы:
[m2,m3,m4,m5,f2,f3,f4,f5]--->[m1,f1]---[m1,f1]
[m2,m3,m4,m5,f2,f3,f4,f5]<---[m1]---[f1]
[m3,m4,m5,f3,f4,f5]--->[m1,m2,f2]---[m1,m2,f2,f1]
[m3,m4,m5,f3,f4,f5]<---[f1]---[m1,m2,f2]
[f1,f3,f4,f5]--->[m3,m4,m5]---[m3,m4,m5,m1,m2,f2]
[f1,f3,f4,f5]<---[m1]---[m3,m4,m5,m2,f2]
[f3,f4,f5]--->[m1,f1]---[m1,f1,m3,m4,m5,m2,f2]
[f3,f4,f5]<---[m3]---[m1,f1,m4,m5,m2,f2]
[f4,f5]--->[m3,f3]---[m3,f3,m1,f1,m4,m5,m2,f2]
[f4,f5]<---[m4]---[m3,f3,m1,f1,m5,m2,f2]
[f5]--->[m4,f4]---[m4,f4,m3,f3,m1,f1,m5,m2,f2]
[f5]<---[m5]---[m4,f4,m3,f3,m1,f1,m2,f2]
[]--->[m5,f5]---[m5,f5,m4,f4,m3,f3,m1,f1,m2,f2]
Замечание. При записи программы для выполнения в SWIpl, каждая команда после точки должна находиться на новой строке.
1. Игнатьева, А.В., Краснощекова, Т.И., Смирнов, В.Ф. Курс высшей математики. - М.: Издательство «Высшая школа», 1968. - 692 с.