Аннотация и ключевые слова
Аннотация (русский):
Приведено решение одной логической задачи в пакете SWIpl

Ключевые слова:
интеллектуальная система, программа, Пролог
Текст
Текст (PDF): Читать Скачать

В курсе «Проектирование и разработка интеллектуальных систем» одним из разделов является раздел «Интеллектуальные системы на основе формальной логики».

Задача: во время наводнения пять супружеских пар оказались отрезанными от суши водой. В их распоряжении была одна лодка, которая могла одновременно вместить только трех человек. Каждый супруг был настолько ревнив, что не мог позволить своей супруге находиться в лодке или на другом берегу с другим мужчиной (или мужчинами) в его отсутствие, если мужчина находился без своей супруги. Найти способ переправить на сушу этих мужчин и жен в целости и сохранности.

Ниже приведена программа, решающая данную задачу в пакете 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 с.

Войти или Создать
* Забыли пароль?