Обход проблемы конфликта имен
Выражение x. ((x.y.+xy)x) не находится в нормальной форме и перед проведением-редукции необходимо-преобразование.
Однако, проблему можно решить без помощи -преобразования, определив ограниченную нормальную форму, называемуюслабой заголовочной нормальной формой(СЗНФ).
Выражение Енаходится в СЗНФ, если:
Е является константой;
Е является выражением видах.ЕдляЕ;
Е имеет формурЕ1Е2…Еnдляконстантной функциирарностиk>n
Пример для 1-го правила:
5=Е
Пример 2-го правила
х.((y.x.+ x y) x) = E
здесь Е = (y.x.+xy)
Пример 3-го правила
*3
здесь * - константная функция арности 2, 3 – Е1
В третьем примере выражение находится в СЗНФ. Применить константную * невозможно. Однако это выражение можно переписать в вид х.*3xс помощью
Выражение х.*3x находится в СЗНФ (правило2). Третье правило утверждает, что любая частично примененная константная функция также является СЗНФ.
-преобразование основано на том, что выражения х.Еx и Е обозначают одну и ту же функцию при условии, чтохне является свободной переменной вЕ, так как
(х.Еx)А ЕА для А.
Мы пишем х.Еx Е, имея в виду, что выражениех.Еx -редуцируетсяв выражение Е. Выражениех.Еx является -редексом. А данное преобразование-редукцией.
Преимущество приведения выражений к СЗНФ вместо полной нормальной формы заключается в том, что избегаем необходимости применять -редукцию в присутствии свободных переменных. Мы можем встретить свободные переменные только в случае, если пройдем через, т.к. все ссылки на переменную, стоящую после, будут свободными только справа от (.). Останавливаясь передмы не входим в тело функции и, следовательно, не можем встретить свободные переменные вообще.
В примере 2 - х.((y. x.+ x y) x)мы не пытаемся вычислить подчеркнутый редекс, т.к. выражение в целом находится в СЗНФ. Только когда выражение применяется к аргументу, вычисление имеет место и это вычисление начинается с удаления самой левой связанной переменнойхв соответствии с правилами НПР. Таким образом, мы заменим порождающее проблему вхождение свободной переменнойхв выражение(y. x.+ x y) xзначениемх(которая также не может свободных переменных) и проблема конфликта имен никогда не возникнет.
Например:
(х.((y. x.+ y x) x)) 4
(y. x.+ y x) 4
x.+ 4x
Эффект разделения
Рассмотри следующее выражение (x.+ x x ) Е. Применив к нему правило-редукции получим:
+ Е Е
Чтобы преобразовать это выражение, необходимо сначала преобразовать аргументы функции +, а это означает, что выражение Е должно быть редуцировано дважды. Такое вычисление очень неэффективно. Способ, гарантирующий, что аргумент не будет вычисляться более одного раза, заключается в вычислении его перед выполнением -редукции. Это соответствует АПР.
В случае, если мы хотим реализовать НПР, то необходимо каким-то образом сделать так, чтобы первое вычисленное (т.е. приведенное к СЗНФ) выражение аргумента «разделилось» между всеми остальными выражениями этого аргумента, т.е. заменило бы любое из них своим значением. В таком случае говорят, что выражение аргумента является разделяемым. Для этого мы должны выразить тот факт, что, например, два вхождения одного и того же идентификатора относятся к одному и тому же выражению как-то иначе, нежели в случае копирования этого выражения дважды.
Имея выражение вида
(х.х … х …. x) Е
результат -редукции будем записывать в виде
х … х …. х …, гдехестьЕ,
чтобы обозначить, что х в результирующем выражении относится к Е.
Связь между именами переменных и их значениями обычно называют контекстом. И здесь механизм редукции основан на контексте, а не на копировании. Здесь мы отходим от-исчисления, т.к. в-исчислении имеется только механизм исчислений, основанный на копировании. Смысл такого подхода в том, что когдах (т.е.Е) вычисляется 1-й раз, редуцируемая форма Е заменяет не толькохв выражении, но иЕв контексте этого выражения. И когда нам в следующий раз потребуется вычислятьх, он будет немедленно заменен редуцируемой формойЕ.
Например:
(x.+xx) (+ 1 2)
+ х x, где х есть (+ 1 2)
+ 3 x, где х есть 3
+ 3 3
6
Здесь выражение аргумента (+ 1 2) вычисляется только один раз.