92
Number > 0,
Next_number = Number - 1,
sum_series(Next_number, Partial_Sum),
Sum = Number + Partial_Sum.
Данное правило имеет четыре компоненты и одно дополнительное не-
рекурсивное правило. Заметим, что последняя компонента правила рекур-
сии - это правило Sum с Partial_Sum (частичная сумма) в качестве пере-
менной. Это правило не может быть выполнено до тех пор, пока Partial_Sum
не получит некоторого значения.
Программа Сумма ряда 1 начинается
с попытки выполнить подцель
sum_series(7,Sum). Сначала программа пытается сопоставить подцель с
подправилом sum_series(1,1). Сопоставление неудачно. Затем она пы-
тается сопоставить подцель с sum_series(Number,Sum). На этот раз
сопоставление завершается успешно с присвоением переменной Number зна-
чения 7. Затем программа сравнивает значение Number, которое равно 7, с
0, т.е. проверяется условие выхода. Так как
7 больше 0, то сопоставление ус-
пешно, программа переходит к следующему подправилу.
Для этого подправила переменной Next_number присвоено значение 6,
т.е. значение Number - 1. Затем правило вызывает само себя в виде
sum_series(6,Partial_Sum). Следующим подправилом является правило
Sum, содержащее свободную переменную Partial_Sum. Так как только
что был вызван рекурсивный процесс, то правило Sum не
может быть вызва-
но.
Теперь программа пытается сопоставить неизменяемое правило
sum_series(1,1) с sum_series(6,Partial_Sum). Процесс сопоставления неус-
пешен, поскольку несопоставим ни один из параметров. В результате про-
грамма переходит к следующему правилу с головой
sum_series(Number,Sum), присваивая переменной Number значение 6.
Этот циклический процесс сопоставления продолжается до тех пор,
пока не будет получено
sum_series(1,Partial_Sum). Теперь это правило со-
поставляется с sum_series(1,1), а Partial_Sum приписывается значение 1.
При сопоставлении правила с головой правила переменная Sum получает
значение 1. Так как сопоставление продолжается дальше, то Next_number
получает значение 0 (1 - 1). При следующем цикле сопоставления перемен-
ная Number получает значение 0. Во время сопоставления с условием выхода
правило оказывается неуспешным, и сопоставление "
прыгает" к правилу
Sum.
Во время процесса сопоставления переменная Partial_Sum была сво-
бодна, а программа запоминала значения Number для последующего исполь-
зования. Но это правило продолжает означивать переменную Sum, присваи-
вая ей последовательно значения 1, 3, 6, 10, 15, 21 и 28. Конечное значение
Sum есть 28.
* Упражнения