- •Глава 1 факты и правила
- •1.1. Использование языка пролог
- •Вызов транслятора языка Пролог
- •Синтаксис различных версий Пролога
- •1. 2. Факты Части Пролог-программы
- •Форма записи фактов в Прологе
- •Ввод программы
- •3. Запросы к базе данных Составление запроса
- •Запросы с константами
- •Запросы с переменными
- •Выполнение запроса
- •Составные запросы
- •Переменная _
- •1. 4. Прав ила
- •Форма записи правила: Заголовок:— Тело
- •Правило, при определении которого используются переменные
- •Пример: база данных "путешествие"
- •Косвенные отношения
- •1. 5. Процедуры Декларативная и процедурная семантика
- •Версия программы "можно_путешествовать", состоящая из двух правил
- •Запросы к предикату "можно_путешествовать2"
- •Соединитель "или"
- •Версия предиката "можно_путешествовать", в которой употребляется соединитель;
- •1. 6. Рекурсивные процедуры Определение понятия рекурсии
- •"Предок"
- •Состав рекурсивной процедуры
- •Рекурсивная версия процедуры "можно_путешествовать"
- •Порядок выполнения запроса к процедуре "можно_путешествовать4"
- •1. 7. Типы отношений Характеристики отношений
- •Ограничения вида один-к-одному
- •Ограничения вида один-к-многим
- •Ограничения вида многие-к-одному
- •Ограничения вида многие-к-многим
- •Симметрия
- •Асимметрия
- •Рефлексивность и нерефлексивность
- •Транзитивность
- •Анализ общеупотребительных отношений
- •Библиографические заметки
- •Упражнения
Ограничения вида один-к-многим
Если бинарное отношение с аргументами Х и Y регулируется ограничением вида один-к-многим, обеспечивающим целостность этого отношения, то это означает, что для заданного значения Х может существовать много значений Y, удовлетворяющих этому отношению, но для заданного значения Y существует только одно значение X, которое удовлетворяет отношению.
Примером отношения, регулируемого ограничением вида один-к-многим, может служить процедура "отец". У отца может быть несколько детей, но никак не наоборот.
% один много
отец (билл, даниэль).
отец (билл, кеннет).
отец (джеффри, билл).
Ограничения вида многие-к-одному
Если бинарное отношение с аргументами Х и Y регулируется ограничением вида многие-к-одному, обеспечивающим целостность этого отношения, то это означает, что для заданного значения Х существует только одно значение Y, удовлетворяющее данному отношению, но для заданного значения Y может существовать много значений X, которые удовлетворяют отношению.
Примером отношения, регулируемого ограничением вида многие-к-одному, служит процедура "уроженец". В какой-либо стране может родиться много, людей, но один человек может быть уроженцем только одной страны.
% много один
уроженец (джереми, америка).
уроженец (нэнси, америка).
уроженец (рауль, Франция).
Ограничения вида многие-к-многим
Если бинарное отношение с аргументами Х и Y регулируется ограничением вида многие-к-многим, обеспечивающим целостность этого отношения, то для заданного значения Х может существовать много значений Y, Удовлетворяющих этому отношению, а для заданного значения Y может существовать много значений X, которые удовлетворяют этому отношению.
Можно привести пример базы данных, предназначенной для типографской компании. В этой базе данных содержатся сведения о сортах бумаги. Первый аргумент соответствует цвету бумаги, а второй — ее виду. Разрешена любая комбинация цвета и вида бумаги.
% цвет вид бумаги
бумага (красный, плотная).
бумага (белый, глянцевая).
бумага (кремовый, плотная).
бумага (белый, гладкая).
Если сказать, что отношение регулируется ограничением вида многие-к-многим, обеспечивающим его целостность, то это эквивалентно утверждению о том, что отношение вообще не регулируется никакими ограничениями. По умолчанию интерпретатор выполняет действия с предикатами, считая, что они регулируются ограничением вида многие-к-многим.
Симметрия
Отношение между двумя сущностями будет симметричным, если роли, которые играют эти сущности, взаимозаменимы. Если предикат языка Пролог обладает свойством симметрии, то порядок следования аргументов в запросе к этому предикату не будет иметь значения.
Примером симметричного отношения может служить отношение "брат_или_сестра". Если известно, что Джейн - это сестра Элис, то будет верным и тот факт, что Элис является сестрой Джейн. Рассмотрим, однако, пример простой базы данных языка Пролог, состоящей из фактов "брат_или_сестра":
брат_или_сестра (джейн, элис).
брат_или_сестра (кэти, дорога).
Если написать запрос к этой базе данных, в котором аргументы располагаются в том же порядке, как и у фактов, входящих в эту базу, то запрос будет успешным:
|? - брат_или_сестра (джейн, элис).
да
Но если поменять аргументы местами, то запрос потерпит неудачу:
|? -брат_или_сестра (элис, джейн).
нет
Отрицательный ответ на запрос свидетельствует о том, что приведенная здесь реализация отношения "брат_или_сестра" несимметрична.
Определение симметричного отношения
Одним из способов придания симметрии предикату "брат—или—сестра" может служить составление двух правил, ссылающихся на явную базу данных. Явная база данных носит название "братсест". Она содержит все сведения о Джейн, Элис, Кэти и Дороги:
братсест (джейн, злис).
братсест (кэти, дороги).
брат_или_сестра2 (А, Б): - братсест (А, Б). % (1)
брат_или_сестра2 (А, Б): - братсест (Б, А). % (2)
Правило (1) предиката "брат_или_сестра2" передает аргументы А и Б подцели "братсест" в том же порядке, как они заданы в заголовке правила. Правило (2) меняет порядок следования аргументов. Запрос:
|? - брат_или_сестра2 (джейн, элис).
да
решается в соответствии с правилом (1), а тот же самый запрос с обратным порядком следования аргументов:
|? - брат_или_сестра2 (элис, джейн).
да
решается в соответствии с правилом (2). Таким образом, предикат "брат_или_сестра2" ведет себя как симметричное отношение. Как Вы считаете, какая совокупность ответов будет получена в результате нижеследующего запроса?
|? - брат_или_сестра2 (X, Y).