6.4.
∗∗
Удаление подпрограмм 171
ложь — двухместная операция, возвращающая второй аргумент. То-
гда IF (x, y, z) можно записать в виде (x) (y, z). В самом деле, если
тест x истинен, то
(x) (y, z) = ИСТИНА (y, z) = y = IF (x, y, z) ,
а если ложен, то
(x) (y, z) = ЛОЖЬ (y, z) = z = IF (x, y, z) .
6.4
∗∗
Удалени е подпрограмм
Теперь докажем обратную теорему.
Теорема 6.2. (Об удалении подпрограмм) По к аждому алгорит-
му можно построить эквивалентный алгоритм без подпрограмм.
Доказательство. Докажем эту теорему для случая, когда нет ре-
курсии, а затем докажем, что каждый алгоритм можно преобразовать
к нерекурсивному. В этом случае должна быть подпрограмма f, в кото-
рой не встречаются никакие другие подпрограммы (в противном случае
имелась бы рекурсия). Пользуясь теоремой о подстановке можно удалить
подпрограмму f из всех остальных подпрограмм и основной программы.
Ввиду того, что внутри f другие подпрограммы не встречались, то по-
сле подстановки рекурсии не будет. Пользуясь этой процедурой можно
исключить по очереди все подпрограммы.
Такой метод не годится, если присутствует рекурсия, так подстав-
ляя вместо выражений вида f (e) тело подпрограммы f мы снова будем
получать выражения такого вида и никогда не сможем исключить их
полностью.
Прежде чем показывать, как удаляется рекурсия, докажем следую-
щую лемму.
Лемма 6.8. (О кодировании пар чисел) Существует вычислимая
двухместная функция ν такая, что
1. для всяких x, y, x
0
, y
0
:
ν (x, y) = ν (x
0
, y
0
) ⇐⇒ x = x
0
и y = y
0
;