Содержание работы
1. Изучить материал, изложенный в литературе [3, с. 6-45].
2. Изучить методические указания к лабораторным работам № 1,2 (с. )
2. Выполнить задания, приведенные в данной лабораторной работе.
3. Оформить отчет.
4. Защитить лабораторную работу, ответив на контрольные вопросы.
Содержание отчета
1. Тексты задания.
2. Тексты программ.
3. Результаты выполнения.
Схема поиска решения или пояснения к полученным результатам.
Методические указания
Для того чтобы лучше понять алгоритм поиска решения в Прологе и принцип программирования в этой системе, необходимо выполнить все предложенные упражнения и задания в режиме трассировки.
Задания
Следующая программа представляет собой законченную программу Турбо-Пролога, служащую небольшим телефонным справочником. Так как используются только стандартные типы данных – секция domains в этой программе не нужна.
predicates
phone_number(symbol,symbol)
clauses
phone_number(“Albert”,”ETY-3665”) .
phone_number(“Betty”,”555-5233”).
phone_number(“Carol”,”909-1010”).
phone_number(“Dororty”,”438-8400”).
Наберите эту программу в окне редактора, запустите программу на выполнение, а затем по очереди задайте ей следующие вопросы:
phone_number(“Carol”, Number)
phone_number(Who,”438-8400”)
phone_number(“Albert”, Number)
phone_number(Who,Number)
Теперь измените предложения. Предположим, что Kim и Dorothy имеют один и тот же номер телефона. Добавьте этот факт в секцию clauses и введите цель:
phone_number(Who,”438-8400”)
Наберите эту программу в окне редактора
predicates
isletter(char)
clauses
isletter(Ch): - 'a'<= Ch, Ch<='z'.
isletter(Ch): - 'A'<=Ch, Ch<='Z'.
Запустите программу и испытайте по очереди каждую из этих целей:
isletter('x')
isletter('2')
isletter('hello')
isletter(a)
isletter(X)
Определите декларативный смысл предложений. Объясните, почему некоторые цели не обрабатываются Турбо-Прологом.
3. Наберите следующую программу в окне редактора
predicates
can_buy(symol,symbol) /* может купить*/
person(symbol) /*человек*/
car(symbol) /*машина*/
likes(symbol,symbol) /*нравится*/
for_sale(symbol) /*продается*/
clauses
can_buy(Name, Model) : -
person(Name) and
car(Name) and
likes(Name, Model) and
for_sale(Model).
person (kelly).
person (judy).
car(lemon).
car(hot_rod).
likes(pizza, hot_rod).
likes(judy, pizza).
for_sale (pizza).
for_sale (lemon).
for_sale (hot_rod).
Что могут купить Judy и Kelly? Кто может купить hot_rod. На приглашение Goal в диалоговом окне вы можете задать следующие вопросы:
can_buy (Who, What) /* Who =? What = ? */
can_buy (judy, What) /* What =? */
can_buy (kelly, What) /* What =? */
can_buy (Who, hot_rod) /* Who =? */
Добавьте факты о стоимости машины и о текущих счетах в банке у Kelly, Judy и т.д. Измените правило покупки автомобиля с учетом этих фактов. Проверьте новую программу теми же вопросами, что и раньше. Пролог отвечает именно то, что вы и ждали?
4. Данное задание выполните в Турбо-Прологе. Считая, что отношение РОДИТЕЛЬ определено как
РОДИТЕЛЬ(пам,боб).
РОДИТЕЛЬ(том,боб).
РОДИТЕЛЬ(том,лиз).
РОДИТЕЛЬ(боб,энн).
РОДИТЕЛЬ(боб,пат).
РОДИТЕЛЬ(пам,джим).
а) найдите, какими будут ответы на следующие вопросы:
РОДИТЕЛЬ(джим,Х)
РОДИТЕЛЬ(Х,джим)
РОДИТЕЛЬ(пам,Х), РОДИТЕЛЬ(X,пат)
РОДИТЕЛЬ(пам,Х), РОДИТЕЛЬ(X,У). РОДИТЕЛЬ(У,джим)
б) сформулируйте на Прологе следующие вопросы об отношении РОДИТЕЛЬ;
Кто родитель Пат?
Есть ли у Лиз ребенок?
Кто является родителем родителя Пат?
в) Переведите следующие утверждения в правила на Прологе:
Всякий, кто имеет ребенка, - счастлив, введя одноаргументное отношение СЧАСТЛИВ.
Всякий X, имеющий ребенка, у которого есть сестра или брат, имеет двух детей, введя новое отношение ИМЕТЬ_ДВУХ_ДЕТЕЙ.
Определите отношение ВНУК (Х,У), используя отношение РОДИТЕЛЬ.
Определите отношение ТЕТЯ (Х,У) через отношения РОДИТЕЛЬ и СЕСТРА.
Сформулируйте вопросы к вновь введенным правилам.
Контрольные вопросы
1. Что такое Пролог-программа?
2. Синтаксис и семантика Пролог - предложений.
3. Типы предложений Пролога, их назначение и декларативный смысл.
4. Переменная, ее роль и область действия в Пролог - программе.
5. Что является результатом работы Пролог - программы? Как он формируется?
6. Структура программы в Турбо-Прологе (основные разделы), краткая характеристика каждого раздела.
7. Согласование типов и преобразование типов в Турбо-Прологе.
Лабораторная работа №2
Разработка первой программы на Прологе
Цель работы
На примере простейших баз данных научиться описывать факты и простейшие отношения между объектами на языке Пролог.
Содержание работы
1. Прочитать теоретический материал [1, с. 13-43], [2, c. 18-47] и методические указания.
2. Выполнить индивидуальное задание.
3. Оформить отчет.
4. Ответить на контрольные вопросы.
5. Защитить лабораторную работу.
Содержание отчета
1. Текст задания.
2. Описать декларативный смысл фактов и предложений разрабатываемой программы.
3. Описать декларативный смысл целей и привести деревья поиска решения для поставленных целей.
Методические указания к выполнению лабораторных работ № 1,2.
Используя знания, полученные при выполнении первой лабораторной работы, напишите свою первую программу по аналогии с ранее рассмотренными программами.
Ниже приведены основные начальные сведения о Прологе и Турбо-Прологе, с которыми Вы познакомились, выполняя первую лабораторную работу.
1. Программы на Прологе включают в себя фразы двух типов (также известных под названием "предложения"): факты и правила.
Факты соответствуют связям и свойствам, о которых вы (программист) знаете, что они всегда истинны.
Правила соответствуют зависимым связям, так как они позволяют Прологу выводить одно утверждение из другого. Правило становится истинным, если доказывается, что истинно заданное множество условий. Каждое правило зависит от доказательства истинности соответствующих условий.
2. Все правила в Прологе имеют две части: заголовок и тело, соединенные символом "if". Символ "if" можно заменить обозначением ":-". Заголовок содержит заключение правила. Тело - это множество (конъюнкция) условий, которые должны быть истинны, для того, чтобы Пролог мог доказать истинность заголовка правила.
Факт – это частный случай правила. Факт – это правило, состоящее из одного заголовка (не содержащее тала).
3. Определив для Пролога множество фактов и правил, вы можете задавать вопросы (формировать цель): это называется запросом к системе. Вопрос – это частный случай правила (правило без заголовка), содержащий только условия, требующие доказательства. Вопрос может быть конъюнктивным (конъюнкция целей). Пролога.
4. Для доказательства цели (ответа на запрос) механизм вывода Пролога ищет в программе правило или факт, заголовок которого сопоставляется (унифицируется) с целью. Пролог всегда ищет решение, начиная с первого факта или правила в программе, и просматривает их до достижения самого последнего. Найдя нужное правило, механизм вывода Пролога берет из тела этого правила условия (поочередно, слева направо) и пытается их доказать, ставя новые цели для разрешения. Если все условия из тела правила оказываются истинны (доказаны из программы), то цель считается истинной. Если же не все условия истинны - использование правила ни к чему не приводит. В этом случае Пролог-система пытается найти другое правило для доказательства исходной цели. Если же ей не удается этого делать, то поставленная цель не может быть выведена из программы (является ложной).
5. Программа на Турбо - Прологе имеет следующую общую структуру:
domains /* ...объявление доменов ... */
predicates /* ...объявление предикатов ... */
goal /* ...подцель_1, подцель_2, и т.д. ... */
clauses /* ...предложения (факты и правила) ... */
6. В секции clauses размещаются факты и правила, с которыми будет работать Турбо - Пролог, пытаясь доказать цель программы.
7. В секции predicates объявляются предикаты и типы (домены) аргументов этих предикатов. Имена предикатов должны начинаться с буквы (строчной), за которой следует последовательность латинских букв, цифр и символов подчеркивания (до 250 знаков). В именах предикатов нельзя использовать символы пробела, минуса, звездочки, обратной и прямой черты.
Объявление предиката имеет следующую форму:
predicates
predicateName (argument_ type1, argument_ type2, ..., argument_typeN)
Здесь argument_ type1, argument_ type2, ..., argument_typeN – либо стандартные домены, либо домены, объявленные вами в секции domains. Объявление домена аргумента и описание типа аргумента суть одно и то же.
8. Секция domains – это секция, в которой вы объявляете любые нестандартные домены, используемые вами для аргументов ваших предикатов. Домены в Прологе являются аналогами типов в других языках. Основными стандартными доменами Турбо - Пролога являются – char, integer, real, string, и symbol; более подробно стандартные домены описаны в следующих разделах. Основная форма объявления доменов имеет следующий вид:
domains
argument _type1, … , argument _typeN = < стандартный домен >
argument 1, … , argument N = < составной домен 1 >;
< составной домен 2 >;
<...>;
< составной домен N >.
9. В секции goal вы задаете внутреннюю цель своей программы, что позволяет программе запускаться независимо от среды разработки. Если внутренняя цель включена в программу, то Турбо Пролог выполняет поиск только первого решения, и связываемые с переменными значения не выводятся на экран. Если внутренняя цель не используется, то в процессе работы вы будете вводить в диалоговом окне внешнюю цель. При использовании внешней цели (без использования секции goal) Турбо-Пролог ищет все решения и выводит в диалоговое окно все значения, связываемые с переменными, присутствующими в цели.
10. Арность (размерность) предиката - это число принимаемых им аргументов. Два предиката с одним именем могут иметь различную арность. Предикаты с одним именем, но с различными версиями арности должны собираться вместе и в секции predicates, и в секции clauses; при этом предикаты с различными арностями (но с одним именем) рассматриваются как абсолютно разные.
11. Правила имеют форму:
ЗАГОЛОВОК : - <Подцель1>, <Подцель2>,…,<ПодцельN>.
Для разрешения правила Пролог должен разрешить все его подцели, создав при этом соответствующее множество связанных переменных. Если же одна из подцелей ложна, Пролог возвратится назад и просмотрит альтернативные решения предыдущих подцелей, а затем вновь пойдет вперед, но с другими значениями переменных. Такой процесс называется " поиск с возвратом ".
12. Символ Пролога "if" отличается от "IF", используемых в других языках: правило Пролога работает в соответствии с условной формой then/if, тогда как оператор других языков IF работает в соответствии с условной формой if/then.
13. Менее часто используемыми секциями программ на Турбо-Прологе являются секции database и constans, а также различные глобальные (global) секции (секция database будет нами использоваться в следующей лабораторной работе).
Задания
1. Разработайте базу данных, содержащую сведения об игрушках: название игрушки (кукла, кубики, мяч, и т.д.), ее стоимость и возрастные границы детей, для которых игрушка предназначена. Получить следующие сведения:
а) название игрушек, цена которых не превышает 4 руб. и которые подходят детям 5 лет;
б) название игрушек, которые подходят как детям 4 лет, так и детям 10 лет;
в) цены всех кубиков;
г) можно ли подобрать игрушку, любую, кроме мяча, подходящую ребенку 3 лет, и дополнительно мяч так,
чтобы суммарная стоимость покупки не превосходила 6 руб.;
д) название наиболее дорогих игрушек (цена которых отличается от самой дорогой игрушки не более чем на 1 руб.
2. Сведения об ученике состоят из его имени и фамилии, названии класса, отметок, полученных учениками в последней четверти. Составьте предложения, которые позволяли бы получить самую разнообразную информацию об учениках. Например:
а) можно было узнать, имеются ли в школе однофамильцы;
б) сколько отличников в таком-то классе и т.д.
3. Разработайте базу данных библиотеки с самыми типичными отношениями между объектами (поиск книг по автору, поиск автора по названию книги, должники и т.д).
4. Разработайте базу данных - городской транспорт. (Простейший вариант.)
5. Разработайте базу данных - лекарства. Необходимо учесть симптомы болезни, возраст больного, противопоказания, стоимость, наличие и т.д.
6. Разработайте базу данных - продукты (магазины, ассортимент, стоимость, фирма производитель и т.д.).
7. Разработайте базу данных - одежда (по аналогии с заданием 1) .
8. Разработайте базу данных - кафедра (списочный состав, читаемые курсы, время и место проведения занятий, взаимозаменяемость и т.д.).
Контрольные вопросы
1. Что такое унификация? Алгоритм унификации. Приведите примеры.
2. Сравните операцию унификации с операцией присваивания в традиционных языках программирования.
3. Сравните вычислительные модели логического программирования: Пролога и Турбо-Пролога.
4. Основной механизм управления в Прологе.
5. Дерево поиска решений. Способы обхода дерева. Влияет ли порядок правил и порядок целей в предложении на дерево поиска решений.
Лабораторная работа №3
Внутренняя база данных Турбо - Пролога
Цель работы
Понять принципы создания, управления и использования внутренних баз данных в Турбо-Прологе, научиться использовать их при проектировании программ.