- 172 -
В Прологе отсутствуют локальные переменные для удержания
промежуточных результатов и их изменения в процессе вычисления.
Поэтому для реализации итерационных алгоритмов, требующих сохранение
промежуточных результатов, процедуры Пролога дополняются аргументами
называемыми накопителями. Обычно промежуточные значения
соответствуют результату вычисления при завершении итерации. Это
значение сопоставляется результирующей переменной с помощью
единичного предложения процедуры.
2.22 Пролог
Факт2(N, F):- Факт2(N1, F).
Факт2(N, T, F):- N>0, T1=T*N, N1=N-1, Факт2(N1, T1, F).
Факт2(0, F, F).
Подводя итог рассмотренным понятиям данного пункта, отметим, что
любая рекурсивная процедура должна включать в себя базис и шаг
рекурсии.
Базис рекурсии – это предложение, определяющее некую начальную
ситуацию или ситуацию в момент прекращения. Как правило, в этом
предложении записывается некий простейший случай, при котором ответ
получается сразу даже без использования рекурсии. Это предложение часто
содержит условие, при выполнении которого происходит выход из рекурсии
или отсечение.
Шаг рекурсии – это правило, в теле которого обязательно содержится,
в качестве подцели, вызов определяемого предиката. Если мы хотим
избежать зацикливания, определяемый предикат должен вызываться не от
тех же параметров, которые указаны в заголовке правила. Параметры
должны изменяться на каждом шаге так, чтобы в итоге либо сработал базис
рекурсии, либо условие выхода из рекурсии, размещенное в самом правиле.
В общем виде правило, реализующее шаг рекурсии, будет выглядеть так:
<имя определяемого предиката>:-
[<подцели>],
[<условие выхода из рекурсии>],
[<подцели>],
<имя определяемого предиката>,
[<подцели>].
Рекурсивные структуры данных в Прологе
Пролог позволяет определить рекурсивные типы данных. Примерами
рекурсивных типов данных служат списки и деревья.
Списки
Список – это объект данных, содержащий конечное число других
объектов (элементов списка). Список задается перечнем его элементов,
заключенным в квадратные скобки, элементы списка могут быть