Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекція_4_21_лог_зад.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
420.35 Кб
Скачать

10. Проблема мешканців острова

Постановка задачі. На деякому острові живуть:

  • "лицарі", які завжди горять правду,

  • "брехуни", які завжди брешуть, і

  • нормальні люди, які іноді брешуть, іноді говорять правду.

Троє мешканців острова А, В і С, серед яких є лицар, брехун і нормальна людина, висловлюють наступні твердження:

1) А каже: "Я нормальна людина".

2) В каже: "Це правда".

3) С каже: "Я не нормальна людина".

Хто ж такі А, В і С?

men(M):- M="knіght"; M="lear"; M="normal". % лицар,

брехун, нормальна людина

people(A,B,C):-men(A),men(B),A=\=B,men(C),A=\=C,B=\=C.

say1(A):- A="normal".

say3(C):- C=\="normal".

checkА(A):-A="knіght",say1(A);A="lear",not(say1(A));

A="normal".

checkВ(A,B):-B="knіght",say1(A);B="lear",not(say1(A));

B="normal".

checkС(C):-C="knіght",say3(C); C="lear", not(say3(C));

C="normal".

check(A,B,C):-рeopl(A,B,C),checkА(A),checkВ(A,B),checkС(C).

goal

?-check(A,B,C),wrіte([A,B,C]).

Відповідь:

[lear,normal,knіght]

11. Проблема зебри.

Постановка задачі. П'ять людей різної національності живуть у п'ятьох перших будинках однієї з вулиць. Вони є представниками п'яти різних професій, і в кожного є свої улюблені напої й тварини, серед яких нема повторюваних. Дома, у яких вони живуть, пофарбовані в різні кольори. Відомо, що:

  • англієць живе в червоному будинку;

  • в іспанця є собака;

  • японець є художником;

  • італієць п'є чай;

  • норвежець живе в першому будинку ліворуч;

  • власник зеленого будинку п'є каву;

  • зелений будинок розташований праворуч від білого;

  • скульптор розводить равликів;

  • дипломат живе в жовтому будинку;

  • у будинку посередині п'ють молоко;

  • норвежець живе поруч із блакитним будинком;

  • скрипаль п'є фруктові соки;

  • лиса тримають у будинку, сусідньому з будинком лікаря;

  • коня тримають по сусідству з будинком дипломата.

Необхідно визначити, хто тримає зебру, і хто п'є воду.

Рішення Generate-and-Test

Стан задачі:

L = [Colours,Drinks,Nationalities,Professions,Pets]

Colours = [ blue:1, yellow:2, …]

solve([Colours,Drinks,Nationalities,Professions,Pets]) :-

generate([Colours,Drinks,Nationalities,Professions,Pets]),

test(Colours,Drinks,Nationalities,Professions,Pets).

Рішення способом 1.

generate([L1, L2, L3, L4, L5]) :-

perm(L1,[red,yellow,blue,green,white]),

perm(L2,[juice,tea,coffee,milk,water]),

perm(L3,[english,spanish,japanese,norwegian,italian]),

perm(L4,[diplomat,sculptor,painter,musician,doctor]),

perm(L5,[dog,fox,snails,horse,zebra]).

perm([U:A,V:B,X:C,Y:D,Z:E],L) :-

permute([A,B,C,D,E], [1,2,3,4,5]), [U,V,X,Y,Z] = L.

permute([],[]).

permute(L,[X|T]) :- remove(X,L,R),permute(R,T).

remove(X,[X|T],T).

remove(X,[H|T],[H|R]):- remove(X,T,R).

test(C, D, N, S, P) :-

% Англієць живе в червоному домі

member(english:H1, N), member(red:H1,C),

% У Іспанця є собака

member(spanish:H2, N), member(dog:H2,P),

% Японець є художником

member(japanese:H11, N),member(painter:H11, S),

% Італієць п’є чай

member(italian:H10, N),member(tea:H10, D),

% Норвежець живе в першому домі зліва

member(norwegian:1, N),

% Власник зеленого дома п’є кофе

member(coffee:H14, D),member(green:H14, C),

% Зелений дом розташований праворуч від білого

member(green:H15,C),left(H16, H15),member(white:H16,C),

% Скульптор вирощує равликів

member(sculptor:H8, S),member(snails:H8, P),

% Дипломат живе в жовтому домі

member(diplomat:H3, S),member(yellow:H3, C),

% В домі посередині пьют молоко

member(milk:3, D),

% Норвежець живе поряд з блакитним домом

member(norwegian:H6,N),next(H6, H7),member(blue:H7,C),

% Скрипаль п’є фруктові соки

member(musician:H9, S),member(orange_juice:H9, D),

% Лиса тримають в домі по-сусідству з домом лікаря

member(doctor:H4, S), next(H4, H5),member(fox:H5, P),

% Коня тримають в домі по-сусідству з домом дипломата

member(diplom:H12,S),next(H12, H13),member(horse:H13,P),

% Хтось тримає зебру и хтось п’є воду

member(zebra:_, P), member(water:_, D).

next(X,Y) :- left(X,Y); left(Y,X).

left(1,2). left(2,3). left(3,4). left(4,5).

Метод породження й перевірок вимагає розгляду (5!)5 варіантів розв'язку (25 мільярдів). При породженні породжується значне число рішень, які потім відкидаються предикатами member.

Рішення способом 2.

Скористаємось тим фактом, що предикати member здатні самі генерувати рішення. Generate буде повертати частково-конкретезований шаблон списку.

generate([]).

generate([L|T]) :- perm(L), generate(T).

perm([_:A,_:B,_:C,_:D,_:E]) :-

permute([A,B,C,D,E], [1,2,3,4,5]).

permute([],[]).

permute(L,[X|T]) :- remove(X,L,R),permute(R,T).

remove(X,[X|T],T).

remove(X,[H|T],[H|R]):- remove(X,T,R).

Метод гілок і границь.

Метод гілок і границь дозволяє відітнути й не розглядати цілі гілки дерева. Насправді, якщо предикат test має вигляд test(C) :- test1(C), test2(C), …, то в неявному виді використовується метод гілок і границь. Перехід до шаблонного подання списку дозволяє більшою мірою використовувати ідею методу гілок і границь.

Рішення способом 3.

Стан задачі:

S = [h(національність1, професія1, колір1, тварина1, напій1), …] – в порядку переліку будинків

solve(S):- Street =

[h(norwegian,_,_,_,_),h(_,_,blue,_,_),h(_,_,_,_,milk),_,_],

member(h(english,_,red,_,_),S),

member(h(spanish,_,_,dog,_),S),

member(h(japanese,painter,_,_,_),S),

member(h(italian,_,_,_,tea),S),

member(h(_,_,green,_,coffee),S),

next(h(_,_,white,_,_),h(_,_,green,_,_),S),

member(h(_,sculptor,_,snails,_),S),

member(h(_,diplomat,yellow,_,_),S),

member(h(_,musician,_,_,juice),S),

neighbour(h(_,_,_,fox,_),h(_,doctor,_,_,_),S),

neighbour(h(_,_,_,horse,_),h(_,diplomat,_,_,_),S),

member(h(_,_,_,zebra,_),S), member(h(_,_,_,_,water),S).

neighbour(X1,X2,L):- next(X1,X2,L); next(X2,X1,L).

Найсуттєвіші ознаки наведеного опису задачі:

  • У даному прикладі відсутній предикат генерації – перебір здійснюється предикатами member неявно.

  • Рішення задачі виходить винятково декларативним.

  • Неявний перебір використовує метод гілок і границь.

  • Генерація чергової порції рішень проводиться після часткової конкретизації розв'язку.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]