90
Number < 8,
write(" ", Number), nl,
Next_number = Number + 1,
write_number(Next_number).
_______________________________________________________
Программа генерации ряда чисел (листинг 4.8) использует следующее
правило рекурсии:
write_number(8).
write_number(Number) :-
Number < 8,
write(Number), nl,
Next_Number = Number + 1,
write_number(Next_number).
Программа начинается с попытки вычислить подцель
write_number(1). Сначала программа сопоставляет подцель с первым прави-
лом write_number(8). Так как 1 не равно 8, то сопоставление неуспешно.
Программа вновь пытается сопоставить подцель, но уже с головой правила
write_number(Number)
. На этот раз сопоставление успешно вследствие
того, что переменной Number присвоено значение 1. Программа сравнивает
это значение с 8; это условие выхода. Так как 1 меньше 8, то подправило
успешно. Следующий предикат выдает значение, присвоенное Number. Пе-
ременная Next_Number получает значение 2, а значение Number увеличива-
ется 1. В этот момент правило write_number вызывает само себя с
новым
значением параметра, равным 2 и присвоенным Next_Number.
Заметим, что необязательно вызывать правило, используя то же имя
переменной, что используется в голове правила. Это всего лишь позиция в
списке параметров, имеющая значение при передаче значений. Фактически
если не передавать значение Next_Number, то приращение основного числа
программы невозможно. При рекурсивном вызове головы
правила, програм-
ма снова пытается выполнить подцель write_number(8). Программа про-
должает выполнять цикл сопоставления, присвоения и выдачи значений
Number до тех пор, пока значение Number не станет равным 8. В этот мо-
мент цель выполнена, правило успешно и программа завершается после вы-
дачи сообщения All done, bye! (Все сделано, привет!). Результат работы
этой
программы есть список целых чисел, выданных на экран.
* Упражнения
4.11. Измените программу генерации ряда чисел так, чтобы она выда-
вала все целые числа от 53 до 62.
4.12. Измените подцель и правило рекурсии так, чтобы результатом
программы была генерация целых чисел от 1 до 7 в порядке убывания.
Важное свойство правила рекурсии состоит в
его расширяемости. На-
пример, оно может быть расширено для подсчета суммы ряда целых чисел.