Головоломка №14 / p14
.pdfМосковский государственный университет леса Кафедра вычислительной техники
Лабораторная работа №1
по дисциплине "Интеллектуальные системы"
Выполнил:
студент группы ВТМ-11 Ларюшкин А.В.
Принял: Лапашина В.В.
Москва — 2012
Задание
Пользуясь методом «образовать и проверить», напишите на языке PROLOG программу для решения следующей головоломки:
Дима, Катя, Миша, Света и Юра проводили лето на даче вместе с родителями. Все дети разного возраста (4, 5, 6, 7 и 8 лет). У каждого из них своя любимая еда (бананы, мороженое, пиццa, спагетти, шоколад). И каждый чегонибудь боится (грозы, пауков, приведений, собак, темноты).
Нужно определить, сколько лет каждому из них, у кого какая любимая еда, и кто чего боится, если известно, что:
1.Девочки старше остальных, ни одна из них не боится темноты и обе не любят шоколад.
2.Света обожает пиццу и не страшится пауков.
3.Пятилетний ребенок больше всего боится привидений.
4.Шестилетний боится грозы и равнодушен к шоколаду и спагетти.
5.Самый младший ребенок любит есть бананы, а самый старший не боится собак.
6.Ни Дима (ему не пять лет), ни Миша не боятся ни темноты, ни пауков, и оба не любят бананы.
Текст программы для Turbo Prolog
domains
chname = string age = integer food = string fear = string
child = child(chname, age, food, fear) childlist = child*
predicates |
|
puzzle |
% головоломка |
structure(childlist) |
% структура |
key(childlist) |
% ключ |
solution(childlist) |
% решение |
chname(child, chname) |
% имя |
age(child, age) |
% возраст |
food(child, food) |
% любимая еда |
fear(child, fear) |
% боится |
nofear(child, fear) |
% не боится |
older(child) |
% старше |
unlike(child, food) |
% не любит |
member(child, childlist) |
% принадлежит списку |
goal |
|
puzzle. |
|
clauses |
|
|
% инициализация структуры: |
structure ([ |
|
child("Misha",_,_,_), child("Dima",_,_,_), child("Sveta",_,_,_), child("Katya",_,_,_), child("Yura",_,_,_)
]).
puzzle:- structure(Struct), key(Struct), solution(Struct).
key(Children):-
% объявление лакомств:
member(child(_,_,"Chocolate",_),Children), member(child(_,_,"Pizza",_),Children), member(child(_,_,"Spagetty",_),Children), member(child(_,_,"Banan",_),Children), member(child(_,_,"Icecream",_),Children),
% объявление страхов:
member(child(_,_,_,"Darkness"),Children), member(child(_,_,_,"Spiders"),Children), member(child(_,_,_,"Ghosts"),Children), member(child(_,_,_,"Storm"),Children), member(child(_,_,_,"Dogs"),Children),
% ключ 1:
%девочки старше остальных, ни одна из них не боится темноты и обе не
%любят шоколад
member(Ch1,Children),
member(Ch2,Children),
older(Ch1),
chname(Ch1,"Katya"),
older(Ch2),
chname(Ch2,"Sveta"),
not(fear(Ch1,"Darkness")),
not(fear(Ch2,"Darkness")),
not(food(Ch1,"Chocolate")),
not(food(Ch2,"Chocolate")),
% ключ 2:
% Света обожает пиццу и не страшится пауков
member(Ch3,Children),
food(Ch3,"Pizza"),
chname(Ch3,"Sveta"),
not(fear(Ch3,"Spiders")),
% ключ 3:
%пятилетний ребенок больше всего боится привидений member(Ch4,Children),
fear(Ch4,"Ghosts"),
age(Ch4,5),
%ключ 4:
%шестилетний боится грозы и равнодушен к шоколаду и спагетти member(Ch5,Children),
fear(Ch5,"Storm"),
age(Ch5,6),
not(food(Ch5,"Chocolate")),
not(food(Ch5,"Spagetty")),
%ключ 5:
%самый младший ребенок любит есть бананы, а самый старший не боится
%собак
member(Ch6,Children),
member(Ch7,Children),
age(Ch6,4),
food(Ch6,"Banan"),
age(Ch7,8),
not(fear(Ch7,"Dogs")),
% ключ 6:
%ни Дима (ему не пять лет), ни Миша не боятся ни темноты, ни пауков, и
%оба не любят бананы
member(Ch8,Children),
member(Ch9,Children),
chname(Ch8,"Dima"),
chname(Ch9,"Misha"),
not(age(Ch8,5)),
not(fear(Ch8,"Darkness")),
not(fear(Ch9,"Darkness")),
not(fear(Ch8,"Spiders")),
not(fear(Ch9,"Spiders")),
not(food(Ch8,"Banan")),
not(food(Ch9,"Banan")).
% вывод результата (структуры):
solution(Children):- write(Children).
chname(child(A,_,_,_),A). age(child(_,B,_,_),B). food(child(_,_,C,_),C).
unlike(child(_,_,C,_),C):- not(food(child(_,_,C,_), C)). fear(child(_,_,_,D),D).
nofear(child(_,_,_,D),D):- not(fear(child(_,_,_,D), D)). older(child(_,B,_,_)):- B=7; B=8.
member(X, [X|_]).
member(X, [_|Y]):- member(X, Y).
Результат
Имя |
Возраст |
Любимая еда |
Боится |
Миша |
5 |
шоколад |
приведений |
Дима |
6 |
мороженое |
грозы |
|
|
|
|
Света |
7 |
пицца |
собак |
Катя |
8 |
спагетти |
пауков |
|
|
|
|
Юра |
4 |
бананы |
темноты |