Часть 2. Лабораторные работы
Лабораторная работа №1. Общие сведения об языке логического программирования
Пример 1. Наша первая Пролог программа будет содержать информацию о военнослужащих некоторого воинского подразделения и их званиях: “Павлов генерал”, “Сабо полковник”, “Денисов капитан”, “Матвеев капитан”, “Кулёмин сержант”, “Николаев сержант”. Сформулировать на Прологе следующие вопросы: 1) Павлов генерал? 2) Кто является полковником? 3)Кем является Денисов? 4)В подразделение есть военный в звание сержанта? 5) В подразделение есть военный в звание подполковника? 6) Вывести военных, имеющих одинаковые звания.
В программе каждого военного мы представим предикатом military размерности 2, каждый компонент- атом, первый представляет фамилию, а второй – его звание.
Программа 3. База данных «Военная часть»
Domains
s=symbol
Predicates
military(s,s)
Clauses
military(pavlov, general).
military(sabo, polkovnik).
military(denisov, kapitan).
military(matveev, kapitan).
military(kulemin, serzhant).
military(nikolaev, serzhant).
Сформулируем запросы:
1) ? military(pavlov, general)
Ответ: yes
2) ? military(X, polkovnik)
Ответ: X= sabo
3) ? military(denisov, X)
Ответ: X= kapitan
4) ? military(_, serzhant)
Ответ: yes
5)? military(_, podpolkovnik)
Ответ: no
6) ? military(X,Y), military(Z, Y), X<>Z
Ответ: X= denisov Z= matveev Y= kapitan
X= kulemin Z= nikolaev Y= serzhant
Пример 2. Данные о крупных реках России сведены в таблицу:
Таблица 5.
Данные о крупных реках России
Название реки | Длина, км | Годовой сток, км3 | Площадь бассейна, тыс. км2 | Истоки | Куда впадает |
Амур | Яблоневый хребет | Татарский пролив | |||
Лена | Байкальский хребет | Море Лаптевых | |||
Обь | Предгорья Алтая | Карское море | |||
Иртыш | Китай | Обь | |||
Енисей | Восточный Саян | Карское море | |||
Волга | Валдайская возвышенность | Каспийское море | |||
Колыма | Хребет Черского | Восточносибирское море | |||
Урал | Южный Урал | Каспийское море | |||
Дон | Среднерусская возвышенность | Азовское море | |||
Кама | Верхне — Камская возвышенность | Волга | |||
Печора | Северный Урал | Баренцево море | |||
Ангара | Байкал | Енисей | |||
Селенга | Монголия | Байкал | |||
Кубань | Кавказ | Азовское море |
Составить базу данных и ответить на следующие вопросы:
1) Определить реки, впадающие в Азовское море.
2) Определить реки, исток которых находится на Валдайской возвышенности?
3) Какие реки короче Камы?
4) Какие реки длиннее Иртыша?
5) Как задать вопрос, определяющий все данные о реке Кама?
Программа 4. База данных «Реки России»
Domains
S=symbol
N=integer
Predicates
reka(S,N,N,N,S,S)
Clauses
reka(amur, 4416, 350, 1855,yablonevi_hrebet,tatar_proliv).
reka(lena, 4400, 488, 2490, baikal_hrebet, more_laptevih).
reka(ob, 4070, 400, 2990, altai, more_karskoe).
reka(irtish, 4248, 323, 1643, kitai, ob).
reka(enisei, 3487, 600, 2580, vost_cain, more_karskoe).
reka(volga, 3530, 255, 1360, valdais_vozvishennost, more_kaspi).
reka(kolima, 2129, 44, 643, hrebet_cherskogo, vost_sibir_more).
reka(ural, 2428, 54, 231, yuzhni_ural, more_kaspi).
reka(don, 2200, 45, 504, sredn_rus_vozvvishennost, more_azov).
reka(kama, 1805, 130, 507, verhne_kamsk_ vozvvishennost, volga).
reka(pechora, 1809, 130, 322, sever_ural, barenzevo_more).
reka(angara, 1779, 62, 1039, baikal, enisei).
reka(selenga, 1024, 14, 447, mongolia, baikal).
reka(kuban, 870, 11, 58, kavkaz, more_azov).
Запросы:
reka(X, _, _, _, _, more_azov)
reka(X, _, _, _, valdais_vozvishennost,_)
reka(X, Y, _, _, _, _), reka(lena, Z, _, _, _, _), Y<Z
reka(X, Y, _, _, _, _), reka(irtish, Z, _, _, _, _), Y>Z
reka(kama, A,B,C,D,E)
Пример 3. Известно, что Лене нравится теннис, Денису нравится футбол, Борису – бейсбол, Эдику – плавание, Марку нравится теннис, а Фёдору то, что нравится Борису. Записать факты на Прологе и ответить на вопросы: 1)Кому нравится теннис? 2) Что нравится Федору? 3)Кто занимается одинаковыми видами спорта?
Программа 5. База знаний «Предпочтения»
Predicates
likes(symbol,symbol)
Clauses
likes(lenа, tennis).
likes(denis, football).
likes(boris, baseball).
likes(edic, swimming).
likes(mark, tennis).
likes(fedor, Activity):- likes(boris, Activity).
/* Activity играет роль переменной*/
Запросы
1) ? likes(X, tennis)
Ответ:
X= lenа
X= mark
2) ? likes(fedor, X)
Ответ:
X= baseball
3) ? likes(X, T), likes(Y, T)
Ответ:
X= lenа Y= mark T= tennis
X= mark Y= lenа T= tennis
X= boris Y= fedor T= baseball
X= fedor Y= boris T= baseball
Пример 4. Лена, Анна, Денис и Борис-люди, лада и нисан - автомобили, Лене нравится лада, Анне - пицца, Денису - футбол, а Борис - Мерседес, Ваське - рыбка. Пицца, лада, мерседес продаются. Человек может купить машину, если она продается, и она ему нравится. Сформулировать на прологе вопросы: 1)Какую машину может купить Лена? 2) Кто-нибудь может купить мерседес? 3) какие машины продаются, и ответить на них.
Программа 6. База знаний «Предпочтения и возможности»
Domains
s=symbol
Predicates
human(s)
car(s)
likes(s,s)
can_by(s,s)
cells(s)
Clauses
human( lena ).
human( anna ).
human( denis ).
human( boris ).
car( lada ).
car( nissan ).
likes( lena, lada ).
likes( anna, pizza ).
likes( denis, football ).
likes( boris, mersedes ).
likes( vasya, ribka ).
cells(pizza).
cells(lada).
cells(mersedes).
can_by(X,Y):-human(X), car(Y), likes(X,Y), cells(Y).
Запросы:
1) can_by(lena, X)
X=lada
2) can_by(_,mersedes)
no
3) car(X),cells(X)
X=lada
Пример 5. Программа иллюстрирует различные способы ввода данных.
Программа 7. Ввод данных
Predicates
vvod_int
vvod_ch
vvod_s
Clauses
vvod_int:- readint(N1), readint(N2), N=N1+N2, write(N).
vvod_ch:- readchar(N1), readchar(N2), N=N1+N2, write(N).
vvod_s:- readln(N1), readln(N2), concat(N1,N2,N), write(N).
Пример 6. Вывести в каждой строке сообщения: Леонард отец Катерины, Карл отец Джейсона, Карл отец Марины.
Программа 8. База знаний «Семья»
Domains
name = symbol
Predicates
father(name, name)
everybody
clauses
father(leonard, katherine).
father(carl, jason).
father(carl, marinа).
everybody :-
father(X, Y),
write(X, " is ", Y, "s father\n"),
fail.
В некоторых случаях может быть необходимым продолжение поиска дополнительных решений, для этого можно использовать встроенный предикат fail. Он не имеет аргументов, всегда считается ложным.
Проверьте работу программы с и без использования предиката fail.
Отрицание задается с помощью предиката not.
Пример 7. У нас есть информация о странах-партнерах Европы, имеющих общую границу. Предположим, нас интересуют какие страны-партнеры не имеют общей границы.
Программа 9. База знаний «Страны Европы»
Domains
country=symbol
Predicates
euro_pair(country, country)
border(country, country)
find_non_border_pair
Clauses
euro_pair(”France”, ”Germany”).
euro_pair(”France”, ”Spain”).
euro_pair(”France”, ”Italy”).
euro_pair(”Germany”, ”Spain”).
euro_pair(”Germany”, ”Italy”).
euro_pair(”Spain”, ”Italy”).
border(”France”, ”Germany”).
border(”France”, ”Spain”).
border (”France”, ”Italy”).
find_non_border_pair:-
euro_pair(X,Y),
not(border(X,Y)),
write(X,” – “,Y),fail,nl.
Goal
find_non_border_pair
Результатом запроса будет ответ
Germany - Spain. Germany - Italy. Spain - Italy.
Пример 8. Использование составных объектов
Программа 10. База данных «Коллекция»(Вариант 1)
Domains
personal_library=book(title, author, publisher, year)
collector, title, author, publisher=symbol
year=integer
Predicates
collection(collector, personal_library)
Clauses
collection(ivanov, book(”Zolushka”, ”Denis Tarakanov”, ”Dinamo”, 2003)).
collection(petrov, book(”Maslenniza”, ”Anna Zimina”, ”Zenit”, 2005)).
collection( petrov, book(”Repka”,”Irina Larina”, ”Mir”, 1999)).
/*Демонстрация двухуровневого составного объекта*/
Программа 11. База данных «Коллекция»(Вариант 2)
Domains
personal_library=book(title, author, publiсation)
publiсation= publiсation (publisher, year)
collector, title, author, publisher =symbol
year=integer
Predicates
collection(collector, personal_library)
Clauses
collection(ivanov,book(”Zolushka”,”Den Taran”, publiсation (”Dina”, 2003))).
collection(petrov,book(”Maslenniza”,”Anna Zima”,publiсation(”Zenit”,2005))).
collection( petrov, book(”Repka”,”Irina Larina”,publiсation (”Mir”, 1999))).
/*Демонстрация использования конструкций альтернативных доменов*/
Программа 12. База знаний «Клуб по интересам»
Domains
thing=misc_ thing (whatever);
book(author, title);
record(artist, album, type)
person, whatever, title, author,artist, album, type =symbol
Predicates
owns(person, thing)
show_misc_things
show_books
show_records
Clauses
owns (“Ivanov“, misc_things(“sports car“)).
owns (“Petrov“, misc_things(“motor cycle“)).
owns (“Smirnov“, misc_things(“piano“)).
owns (“Ivanov”, book (“James A.Mishener“,“Space“)).
owns (“Petrov”, book (“Frank Herbert“, “Dune“)).
owns (“Sidorov”, book (“J.R.R. Tolkein“,“Return of the Ring“)).
owns (“Ivanov”, record (“Elton John”, “Ice Fair”, “popular“)).
owns (“Petrov”, record(“Michael Jackson“, “We are the World“, “popular“)).
owns (“Sidorov”, record (“Madonna“,“Madonna“, “popular“)).
show_misc_things:- owns (X, misc_things(Y)),write( X, “ ”,Y), nl, fail.
show_books:- owns (X, book (_,Y)),write( X, “ ”,Y), nl, fail.
show_records:- owns (X, record (_,Y,_)),write( X, “ ”,Y), nl, fail.