logo
Учебник_Final

3.3. Рекурсивные вычисления в Пролог-программе

Рекурсивное описание правила содержит в своем теле ссылку на заголовок этого же правила. Возможны следующие три варианта рекурсивных правил:

Для исключения зацикливания во время выполнения рекурсивного правила необходимо предусмотреть условия завершения рекурсии, которое обычно реализуется одним из двух способов:

Предикаты pr21( ), … , pr2M( ) не влияют на выполнение рекурсии, а выполняются только после выхода из нее. Эти предикаты получают значения переменных из стека, в который они помещаются на время выполнения рекурсии. Производимые при этом вычисления называют хвостовыми вычислениями. Идеи реализации рекурсивных вычислений представлены в примере и в табл. 3.1, составленной на основе соответствующей Пролог-программы.

Пример.

domains

number, product = integer

goal

fact (3, Rez), write ("Факториал 3=", Rez), nl.

clauses

fact (1, 1) :- !.

fact (N, R) :- Next_N = N - 1,

fact (Next_N, P) :- R = N * P.

Таблица 3.1.

Вызов предиката

Подстановки

Вычисления

Хвостовые вычисления

Результат вычислений

fact(3, Rez)

N=3, Rez=R

Next_N=N-1=2

R=N*P

Rez=R=3*2=6

fact(2, P)

N=2, P=R1

Next_N1=N1-1=1

R1=N1*P 1

P*=R1=2*1=2

fact(1, P1)

1=1, P=1