Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ФП.doc
Скачиваний:
9
Добавлен:
02.05.2015
Размер:
52.22 Кб
Скачать

Обход проблемы конфликта имен

Выражение x. ((x.y.+xy)x) не находится в нормальной форме и перед проведением-редукции необходимо-преобразование.

Однако, проблему можно решить без помощи -преобразования, определив ограниченную нормальную форму, называемуюслабой заголовочной нормальной формой(СЗНФ).

Выражение Енаходится в СЗНФ, если:

  1. Е является константой;

  2. Е является выражением видах.ЕдляЕ;

  3. Е имеет формурЕ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) вычисляется только один раз.