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