
- •Лекція 4.21. Логічні задачі
- •1. Проблема мавпи
- •2. Проблема фермера
- •3. Проблема слідчого
- •4. Поліцейська проблема
- •6. Маскарад
- •7. Таблиця велосипедних змагань
- •8. Студенти на велосипедах
- •10. Проблема мешканців острова
- •11. Проблема зебри.
- •12. Числовий ребус.
- •13. Ігрові програми. Гра "бики й корови" (видатний розум)
- •Висновки.
7. Таблиця велосипедних змагань
Постановка задачі. У велосипедних перегонах три перші місця зайняли Алеша, Петя й Коля. Яке місце зайняв кожен з них, якщо Петя зайняв не друге й не третє місце, а Коля – не третє?
Розв'язок задачі полягає у встановленні залежності між спортсменами й місцями, яку можна описати табл. 1 (прочерки указують відому інформацію):
Таблиця 1
Вочевидь, Петя може посісти лише перше місце, тоді Коля - тільки друге, а Алеше дістається третє (табл. 2).
Таблиця 2
При описі цієї задачі на Прологу виходить наступна програма.
PREDICATES
name(symbol)
mesto(symbol)
prizer(symbol,symbol)
solution(symbol,symbol,symbol,symbol,symbol,symbol)
CLAUSES
name(alex). name(pier). name(nike).
mesto(odin). mesto(dva). mesto(tri).
prizer(X,Y):-name(X),mesto(Y),X=pier,not(Y=dva),not(Y=tri);
name(X),mesto(Y),X=nike,not(Y=tri);
name(X),mesto(Y),not(X=pier),not(X=nike).
solution(X1,Y1,X2,Y2,X3,Y3):-name(X1),name(X2),name(X3),
mesto(Y1),mesto(Y2),mesto(Y3),
prizer(X1,Y1), prizer(X2,Y2),prizer(X3,Y3),
Y1<>Y2,Y2<>Y3,Y1<>Y3,X1<>X2,X2<>X3,X1<>X3,!.
Звичайно, у наведеному прикладі для одержання розв'язку швидше використати таблицю, ніж програму.
8. Студенти на велосипедах
Однак у складніших випадках таблиці стають багатовимірними і їхнє використання стає важчим, ніж програму. Розглянемо ще один приклад – логічну задачу (“Наука й життя ” №3, 1968).
Постановка задачі. П'ятеро студентів їдуть на велосипедах.
Їх кличуть Сергій, Борис, Леонід, Григорій і Віктор.
Велосипеди зроблені в п'ятьох містах: Ризі, Пензі, Львові, Харкові й Москві.
Кожен із студентів народився в одному із цих міст, але жоден з них не їде на велосипеді, зробленому на його батьківщині.
Сергій їде на велосипеді, зробленому в Ризі.
Борис родом з Риги, у нього велосипед з Пензи.
У Віктора велосипед з Москви.
У Григорія велосипед з Харкова.
Віктор родом з Львова.
Уродженець Пензи їде на велосипеді, зробленому на батьківщині Леоніда.
Хто зі студентів родом з Москви ?
Розв'язком цієї проблеми є наступна програма.
DOMAINS
name=simbol
PREDICATES
student(name) % ім'я студента
gorod(name) % назва міста
velo(name,name) %власник і «батьківщина» велосипеда fact(name,name) %факти про приналежність велосипедів fact1(name,name) % факти про місце народження rodom(name,name) % опис місця народження студента
rodom_penza(name) % опис для уродженця Пензи
CLAUSES
% 1 % student(X):- X=serg; X=boris; X=vict; X=grig; X=leo.
% 2 %gorod(Y):-Y=penza;Y=lvov;Y=moskva;Y=xarkov;Y=riga.
% 3 % fact(serg, riga). fact(boris,penza). fact(vict,moskva).
fact(grig,xarkov).
% 4 %velo(X,Y):- student(X),gorod(Y), fact(X,Y), ! ;
student(X),gorod(Y), not( fact(X, _ )),not(fact( _, Y)).
% 5 % fact1(boris,riga). fact1(vict,lvov).
% 6 % rodom_penza(X) :- student(X), Z=penza,not(fact1(X,_)),
gorod(U),not(U=Z),velo(X,U),rodom(leo,U).
% 7.1 % rodom(X,Z) :- student(X),gorod(Z),fact1(X,Z), ! ;
%7.2 % student(X),not(X=leo),Z=penza,rodom_penza(X), !;
%7.3 % student(X),gorod(Z),not(fact1(_,Z)),X=leo,
not(Z=penza),student(K),not(fact1(K,_)),velo(K,Z);
%7.4 % student(X),not(X=leo),gorod(Z),not(Z=penza),
not(fact1(_,Z)), not(fact1(X,_)), gorod(Y),not(Y=Z),
velo(X,Y),not(rodom(leo,Z)),not(rodom(leo,Y)).
Розглянемо опис фактів і правил у цій програмі:
Перші два правила описують можливі обмеження на значення предикатів student і gorod. Це необхідно, щоб здійснювати припустимі підстановки при пошуку рішення.
Факти, позначені цифрою три, описують відомі дані про те, де зроблено велосипеди деяких студентів.
Цифрою 4 позначене правило, що описує приналежність деякого велосипеда деякому студентові. Правило складається із двох альтернатив, розділених знаком “;” . Перша частина правила говорить, що студент X володіє велосипедом Y, якщо такий факт є. Друга частина правила дозволяє робити будь-які підстановки, які не суперечать відомим фактам. Предикат відсікання “!” тут зупиняє пошук нових варіантів, якщо виконано всі попередні йому умови.
Цифрою 5 позначено відомі факти про місце народження студентів.
Цифрою 6 описано знання про те, хто зі студентів може бути родом з Пензи. Це не можуть бути Борис або Віктор, оскільки відомо, що вони народились в інших містах, і має бути студент, велосипед якого зроблений на батьківщині Леоніда.
Правило 7, що складене з чотирьох частин, описує загальні знання про батьківщину кожного зі студентів:
По-перше, може бути відомий факт відносно цього і тоді інші варіанти розглядати нема необхідності.
Друга частина правила описує, хто може бути родом з Пензи.
Третя частина правила описує можливе місце народження Леоніда.
І, нарешті, четверта частина правила описує, з якого міста, окрім Пензи, можуть бути інші студенти, крім Леоніда.
Завантаживши цю програму, можна одержати шукане рішення.
9. Складання розкладів є однією з практичних задач, що часто зустрічаються.
Постановка задачі. П'ять студентів повинні відвідувати лекції весь тиждень, але за власними правилами, а саме:
1. Якщо прийшли Андрій і Дмитро, то Бориса бути не повинно, але якщо Дмитро не прийшов, то Борис повинен бути, а Віктор бути не повинен.
2. Якщо Віктор прийшов, то Андрія бути не повинно й навпаки.
3. Якщо Дмитро прийшов, то Григорія бути не повинно.
4. Якщо Бориса нема, то Дмитро повинен бути, коли нема також і Віктора, а якщо Віктор є, то Дмитра бути не повинно, але має бути Григорій.
5. Щодня студенти повинні приходити в різних комбінаціях.
Які це комбінації?
Для розв'язку цієї проблеми може бути використана програма.
DOMAINS
s=symbol
PREDICATES
st_A(s) st_D(s) st_B(s) st_V(s) st_G(s)
ogr1(s,s,s,s,s) ogr2(s,s,s,s,s)
spisok(s,s,s,s,s)
norm1(s,s,s,s,s) norm2(s,s,s,s,s)
norm3(s,s,s,s,s) norm4(s,s,s,s,s)
CLAUSES
st_A(A):-A=andre; A=net.
st_D(D):-D=dmitri; D=net.
st_B(B):-B=boris; B=net.
st_V(V):-V=victor; V=net.
st_G(G):-G=grig; G=net.
ogr1(andre,_,_,net,_). ogr1(net,_,_,victor,_).
ogr2(_,dmitri,_,_,net). ogr2(_,net,_,_,_).
norm1(andre,dmitri,net,_,_). norm2(andre,net,boris,net,_).
norm3(_,dmitri,net,net,_). norm4(_,net,net,victor,grig).
spisok(A,D,B,V,G):-st_A(A),st_D(D),st_B(B),st_V(V),st_G(G),
norm1(A,D,B,V,G),ogr1(A,D,B,V,G),ogr2(A,D,B,V,G);
st_A(A),st_D(D),st_B(B),st_V(V),st_G(G),
norm2(A,D,B,V,G),ogr1(A,D,B,V,G),ogr2(A,D,B,V,G);
st_A(A),st_D(D),st_B(B),st_V(V),st_G(G),
norm3(A,D,B,V,G),ogr1(A,D,B,V,G),ogr2(A,D,B,V,G);
st_A(A),st_D(D),st_B(B),st_V(V),st_G(G),
norm4(A,D,B,V,G),ogr1(A,D,B,V,G),ogr2(A,D,B,V,G);
st_A(A),st_D(D),st_B(B),st_V(V),st_G(G),
not(norm1(A,D,B,V,G)),not(norm2(A,D,B,V,G)),
not(norm3(A,D,B,V,G)),not(norm4(A,D,B,V,G)),
ogr1(A,D,B,V,G),ogr2(A,D,B,V,G).
Можливо, може бути сформульоване більш витончене програмне рішення, чим наведене. При його пошуку можна переконатись, що в подібних випадках дуже велике значення має вибір предикатів і правил, які можуть визначатися по-різному. При невдалому виборі правил можна одержати невірні рішення або вичерпати ресурси комп'ютера вкладеними викликами правил.