135
простой и формальный процесс преобразования выражений лямбда-
исчисления в простую форму с помощью только β- и δ-редукций. Такой
процесс преобразования примерно соответствует исполнению программы
в некотором простом языке функционального программирования. В
дальнейшем мы покажем, как можно сравнительно простыми
преобразованиями свести программу, написанную на языке, подобном
языку Haskell, к вычислению
выражения, записанного средствами лямбда-
исчисления, поэтому можно считать, что лямбда-исчисление является
основой для реализации исполнения функциональных программ.
Выше мы уже отмечали, что процесс преобразования формы
выражения при аппликативном порядке редукций напоминает процесс
выполнения функциональной программы при энергичном способе
исполнения, то есть при таком способе вызова функций, когда перед
началом работы
тела функции происходит вычисление фактических
аргументов и передача полученных значений в функцию для вычисления.
Напротив, при нормальном порядке применения редукций вычисления
происходят таким образом, что подстановка аргументов происходит до
того, как будут вычислены их значения, что примерно соответствует
ленивой схеме исполнения функциональной программы. Однако, имеется
и существенная разница между ленивыми
вычислениями и текстовыми
преобразованиями выражений так, как это принято в лямбда-исчислении.
При исполнении функциональной программы, даже если при вызове
функции ее аргумент и не вычисляется сразу же, он все же будет
вычисляться не более одного раза – при первом обращении к этому
аргументу из тела функции, когда он передается одной из
встроенных
функций или производится сопоставление этого аргумента с некоторым
образцом. В случае же преобразований выражений с помощью редукций
вычисление аргументов будет происходить при каждом обращении к
аргументу в теле вычисляемой функции. Поясним сказанное примером.
Пусть требуется привести к СЗНФ выражение
(λx.* x x)(+ 2 3). В этом выражении имеются два редекса, однако,
если
мы используем НПР, то прежде всего выполняется β-редукция, при
которой выражение аргумента (+ 2 3) подставляется вместо свободного
вхождения переменной x в тело лямбда-выражения, при этом получается
выражение (* (+ 2 3) (+ 2 3)). После этого выражение (+ 2 3)
придется вычислить два раза применением к нему δ-редукции, и только
затем уже будет получено окончательное значение 25
. С точки зрения
получения правильного результата не имеет значения то, сколько раз будет
применяться редукция к одним и тем же выражениям, поэтому отмеченная
нами "неэффективность" вычислений несущественна с точки зрения
построения теории вычислимых функций. Однако для того, чтобы строить
адекватную модель вычислений, средств, предложенных нами в качестве
описания преобразования выражений,
недостаточно.