ЗАВДАННЯ 3
Розробити автоматизовану СПР, яка вирішить задачу Ейнштейна. Умова задачі: На одній вулиці розташовано 5 будинків різного кольору (синього, білого, жовтого, зеленого і червоного). В цих будинках живе 5 людей різних національностей (швед, данець, англієць, німець та норвежець), які п'ють 5 різних видів напоїв (пиво, кава, чай, вода, молоко), курять 5 різних марок цигарок(Dunhill, Marlboro, Rothmans, Pall Mall та Phillip Morris) та розводять 5 різних тваринок (коні, птахи, рибки, коти та собаки). 1. Норвежець живе в 1 будинку. 2. Англієць живе в червоному будинку. 3. Зелений будинок знаходиться зліва від білого. 4. Данець п'є чай. 5. Хто курить Rothmans, живе біля того, хто розводить котів. 6. Хто живе в жовтому будинку, курить Dunhill. 7. Німець курить Marlboro. 8. Хто живе в центральному будинку, той п'є молоко. 9. Сусід того, хто курить Rothmans, п'є воду. 10. Хто курить Pall Mall, розводить пташок. 11. Швед розводить собак. 12. Норвежець живе біля синього будинку. 13. Хто розводить коней, живе в синьому будинку. 14. Хто курить Phillip Morris, п'є пиво. 15. В зеленому будинку п'ють каву. Запитання: хто розводить рибок?
Лістинг 3.1 – Код для вирішення задачі Ейнштейна houses([ house(first, _, _, _, _, _), house(second, _, _, _, _, _), house(third, _, _, _, _, _), house(forth, _, _, _, _, _), house(fifth, _, _, _, _, _)]). right_of(A, B, [B, A | _]).right_of(A, B, [_ | Y]):- right_of(A, B, Y). next_to(A, B, [A, B | _]).next_to(A, B, [B, A | _]).next_to(A, B, [_ | Y]):- next_to(A, B, Y). mymember(X, [X|_]).mymember(X, [_|Y]):- mymember(X, Y). print_houses([]).print_houses([A|B]):- write(A), nl, print_houses(B). where_fish(H):-houses(H), mymember(house(_,red,english,_,_,_),H), mymember(house(_,_,swedish,dog,_,_),H), mymember(house(_,_,datman,_,tea,_),H), right_of(house(_,green,_,_,_,_), house(_,white,_,_,_,_),H), mymember(house(_,green,_,_,coffe,_),H), mymember(house(_,_,_,bird,_,pallmall),H), H=[_,_,house(_,_,_,_,milk,_),_,_], mymember(house(_,yellow,_,_,_,dunhill),H), mymember(house(first,_,norway,_,_,_),H), next_to(house(_,_,_,_,_,marlboro), house(_,_,_,cat,_,_),H), next_to(house(_,_,_,horse,_,_), house(_,_,_,_,_,dunhill),H), mymember(house(_,_,_,_,bear,winfield),H), next_to(house(_,_,norway,_,_,_), house(_,blue,_,_,_,_),H), mymember(house(_,_,denmark,_,_,rothmans),H), next_to(house(_,_,_,_,_,marlboro), house(_,_,_,_,water,_),H), print_houses(H).:-where_fish(_).
Запускаємо пошук рішення задачі Ейнштейна рисунок 3.1.
Рисунок 3.1 – Результат роботи вирішення задачі Ейнштейна
Отже, при вирішенні задачі Ейнштейна визначили, що Данець розводить рибок.
ВИСНОВОК
Згідно завданню лабораторної роботи, виконала необхідні завдання. Основними поняттями в мові Пролог є факти, правила логічного висновку і запити, що дозволяють описувати бази знань, процедури логічного висновку і прийняття рішень. Факти в мові Пролог описуються логічними предикатами з конкретними значеннями. Правила в Пролозі записуються у формі правил логічного висновку з логічними висновками і списком логічних умов. Факти в базах знань на мові Пролог представляють конкретні відомості (знання). Узагальнені відомості та знання в мові Пролог задаються правилами логічного висновку (визначеннями) і наборами таких правил виводу (визначень) над конкретними фактами і узагальненими відомостями. Програма Prolog складається з пропозицій. Кожна пропозиція закінчується точкою.
|