6.3.
∗
Аппликативное и функциональное программирование 163
Обычный оператор присваивания часто называют также оператором
разрушающего присваивания, поскольку он уничтожает значение пере-
менной, которое было до его выполнения. Аппликативная программа
(apply — применять) называется так, потому что разрушения не про-
исходит, и все полученные результаты хранятся до конца.
Функциональная программа так называется, потому что единствен-
ный разрешенный оператор — ветвление. В конце параграфа мы пока-
жем, что если бы у нас была специальная операция IF (x, y, z), которая
бы вычисляла первый аргумент и в зависимости от того истинен он или
ложен возвращала значение второго или третьего аргумента, то можно
было бы обойтись и без этого оператора, то есть программы содержали
бы только вызовы подпрограмм. Более того, существует теория функци-
онального программирования, где доказывается, что можно обойтись и
без такой операции, если изменить обычные понятия истинности и лож-
ности.
Итак, перейдем к доказательству основных теорем.
Теорема 6.1. (О функциональных программах) Всякий алго-
ритм эквивалентен некоторому функциональному алгоритму.
Доказательство. Прежде всего, несколько замечаний. Будем считать,
что тело каждой подпрограммы является структурированной програм-
мой. Мы знаем, что этого можно добиться (теорема о структуризации).
Далее, основную программу с телом Π мы выделим в отдельную под-
программу, например, A
0
. То есть основную программу
Alg A;
arg x
1
, . . . , x
n
;
Π
end;
заменяем на
Sub A
0
;
arg x
1
, . . . , x
n
;
(Π)
A
A
0
end;
Alg A;
arg x
1
, . . . , x
n
;
A = A
0
(x
1
, . . . , x
n
) ;
end;