Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа №4
Тема : использование правил в запросах.
Цель: научиться строить запросы, содержащие правила,ознакомиться с отрицанием предиката в Прологе.
.
Теоретические сведения.
Запросы строятся из предикатов, содержащих условия, которые ограничивают пути поиска желаемых результатов, причем, в случае, когда какой-либо запрос нужно повторить несколько раз, разумно предусмотреть возможность не задавать всякий раз одни и те же условия.
В Прологе эта задача решается конструированием правил, не содержащих в себе данных, т. е. правил нулевой арности. Задача таким образом сводится к написанию сокращенного варианта запроса.
Например:
Фрэнк и Мэри являются мужем и женой. Их сына зовут Сэмом, а дочку - Дебби. Ниже приведен небольшой диалог, касающийся этой семьи.
Вопрос: Кем приходятся друг другу Дебби и Сэм ?
Ответ: Дебби - сестра Сэма.
Вопрос: Из чего Вы это заключили ?
Ответ : У Дебби и Сэма одни и те же родители, Дебби - де вочка. Таким образом, Дебби - сестра Сэма.
Второй из вопросов является разговорной формулировкой правила, которое будет использоваться для ответа на запрос.
Это правило можно перефразировать таким образом:
Дебби - сестра Сэма, если
Дебби - существо женского пола,
и родители Дебби есть родители Сэма.
Фраза включает в себя условие "если" (if), который логически связывает оба утверждения. Утверждение, предшествующее "если" называется заключением или логическим следствием, а утверждение, следующее за "если" - допущением или предпосылкой.
Предикатные выражения являются теми блоками, из которых в Прологе строятся правила. Факты, описывающие отношения между Фрэнком, Мэри, Сэмом и Дебби можно сформулировать при помощи таких утверждений Пролога:
male("Frank"). /* Фрэнк - мужского пола */
male("Sam"). /* Сэм - мужского пола */
female("Mary"). /* Мэри - женского пола */
female("Debbie"). /* Дебби - женского пола */
parents("Sam","Frank","Mary").
/* Родители Сэма есть Фрэнк и Мери */
parents("Debbie","Frank","Mary").
/* Родители Дебби есть Фрэнк и Мери */
Имея в наличии эти утверждения, необходимо лишь ввести правило, задающее отношение брат-сестра:
sister(Sister,Brother) if
female(Sister),
parents(Sister,Father,Mother),
parents(Brother,Father,Mother).
Отметим, что в формулировке правила нет никаких данных о конкретной семье; объекты Sister, Brother, Father и Mother являются переменными. Двойное использование предиката parents устанавливает логическую связь между переменными Sister и Brother. Наличие предиката female позволяет выбрать ребенка женского пола. Три предиката предпосылки правила вполне достаточны для получения нужного заключения. Программа "Родственники" (листинг 1) является конечной программой на Прологе, демонстрирующей использование перечисленных фактов и правила sister.
Листинг 1
domains
person = symbol
predicates
male(person)
female(person)
parents(person,person,person)
sister(person,person)
who_is_the_sister
goal
who_is_the_sister
clauses
/* факты */
male("Frank").
male("Sam").
female("Mary").
female("Debbie").
parents("Sam","Frank","Mary").
parents("Debbie","Frank","Mary").
/* правила */
who_is_the_sister if
sister(Sister,Brother),
write(Sister,
" is the sister of ",
Brother,
"."),
nl.
sister(Sister,Brother) if
female(Sister),
parents(Sister,Father,Mother),
parents(Brother,Father,Mother).
Программа "Родственники" содержит еще одно правило: предикат who_is_the_sister. who_is_the_sister является целью программы, ее единственным целевым утверждением. Это правило определяется в разделе утверждений программы clauses. Ввиду того, что цель задается в виде правила, точка входа раздела goal являет собой единственное целевое утверждение без подцелей. Тело правила состоит из двух частей. Первая часть - это правило sister. В качестве второй части - предпосылки -используется предикат write, который выводит полученные правилом sister результаты.
Правила в Турбо-Прологе записываются в разделе утверждений. Программа может содержать достаточно много правил, вырабатывающих различные заключения. Эффект введения правил точно такой же, как если бы программа содержала большое число утверждений-фактов. В программе "Родственники", например,можно в раздел clauses ввести еще ряд правил в дополнение к уже определенным. Предположим, что Вы хотите узнать имя сына. Этот запрос оформляется при помощи правила:
who_is_the_son if
son(parents,_,_),
male(Son),
write("The son is ",Son,"."),nl.
Это правило можно поместить в раздел clauses и заменить этим правилом целевое утверждение. Когда при запуске программы новое правило будет испытано, на экране появится надпись "The son is Sam".
Отрицание
Помимо принадлежности одному и тому же домену, некоторые объекты могут иметь еще некоторое число общих атрибутов. Например, определенные страны Европы имеют общие между собой границы, в то время как другие их не имеют. Предикатом для представления этого отношения служит
border(country,country)
Тот факт, что "Германия и Франция имеют общую границу", можно представить в виде утверждения
border("France", "Germany").
Франция с Германией имеют общую границу, так же как и Франция с Испанией, и Франция с Италией.
Шесть утверждений задают все возможные пары четырех выбранных европейских стран:
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").
Предположим теперь, что вы хотите определить, какие из стран не имеют общей границы. Вместо того чтобы выдавать на экран все пары стран с общей границей, а потом визуально искать все пары, не попавшие в этот список, лучше воспользоваться более простым и эффективным средством - отрицанием.
Отрицание предиката border задается при помощи предиката not:
not(border(Country1,Country2)).
Этот предикат выдает все пары не граничащих друг с другом стран.
1. Введите программу "Родственники" и запустите ее на счет. Модифицируйте программу, введя правило определения имени брата. Цель изменений состоит в получении сообщения о том, что Сэм является братом Дебби.
2. Модифицируйте программу, ведя правило определения имени тети (дяди, бабушки, дедушки, прабабушки, кузена и т.п.-по запросу преподавателя) и добавив необходимые домены,предикаты,утверждения.
3. Напишите программу "Подбор партнера", использовав правило для отыскания имени высокого мужчины, блондина, владельца спортивного автомобиля. Она содержит сведения о 7 мужчинах по параметрам: рост, цвет волос, класс машины. Единственным доменом программы является домен man.
4. Напишите программу "Пары стран Европы" (Германия, Франция, Италия, Испания), которая выдает все пары не граничащих друг с другом стран.
Содержание отчета.
1. Цель работы.
2. Задания .
3.Программы и результат их выполнения.