133
сделать будет уже гораздо труднее. Правда, ошибиться можно и при
выполнении начального α-преобразования.
В вышеописанном примере α-преобразование (замена переменной)
использовалось только для того, чтобы облегчить применение редукций;
если преобразование происходит автоматически, и программа,
выполняющая преобразование, достаточно "интеллектуальна", чтобы
отличать свободные вхождения переменных от связанных, то
переименование можно было
и не производить. Однако бывают случаи,
когда без переименования переменных не обойтись. Рассмотрим,
например, следующее выражение: λy.(λx.λy.+ x y) y. Здесь также
имеются два лямбда-выражения, имеющих одну и ту же связанную
переменную – y. Соответственно, в теле внешнего лямбда-выражения одно
вхождение переменной y является свободным, а другое – связанным. В
этом
выражении имеется единственный редекс, представляющий собой
тело функции, определенной внешним лямбда-выражением. Попытка
применить β-редукцию без предварительного проведения α-
преобразования приведет к ошибке: мы получим выражение
λy.(λy.+ y y), в котором свободное вхождение переменной y попало в
позицию, где переменная y связана.
Очевидно, что полученное выражение не эквивалентно исходному.
Чтобы
убедиться в этом, можно попробовать применить исходную и
результирующую функцию к одним и тем же аргументам, например, к
аргументам 1 и 2. Для исходного выражения, применяя β-редукции в
нормальном порядке, последовательно получим следующие выражения:
((λy.(λx.λy.+ x y) y) 1 2), затем (((λx.λy.+ x y) 1) 2),
((λy.+ 1 y) 2), (+ 1 2), и, наконец, 3. Для выражения,
полученного
в результате неправильного применения редукции, получим:
((λy.(λy.+ y y)) 1 2), ((λy.+ y y) 2), (+ 2 2) и, наконец,
4. Итак, видим, что иногда применение β-редукции без предварительного
переименования переменных может привести к ошибке.
Можно высказать и более общее утверждение: β-редукция может
привести к ошибке тогда, когда выражение, имеющее в своем составе
свободную переменную,
подставляется в качестве аргумента в выражение,
имеющее в своем составе связанную переменную с тем же именем.
Заметим, что необходимость в такой подстановке возникает лишь в
определенном случае, а именно, тогда, когда редукции производятся
внутри лямбда-выражения, то есть преобразованию подвергается тело
определяемой функции. Если имеется некоторое лямбда-выражение,
содержащее внутри себя
редексы, то при применении АПР редукции в теле
лямбда-выражения всегда будут производиться до того, как это лямбда-
выражение будет применено к аргументу. Однако, при применении НПР
необходимость в выполнении редукций внутри лямбда-выражения может
возникнуть только тогда, когда это лямбда-выражение не применяется уже