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). В этом случае необходимо доказать только соблюдение отношения « родитель (жб, гг)».

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие