Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
progF_pos.doc
Скачиваний:
36
Добавлен:
11.05.2015
Размер:
1.51 Mб
Скачать

5.2. Вычисление -выражений

Мы рассмотрели, как -нотация может быть использована для представления функциональных выражений и сейчас готовы к тому, чтобы определить правила вывода -исчисления, которые описывают, как вычислять выражение, т. е. как получать конечное значение выражения из его первоначального вида.

Константы являются самоопределенными, т. е. их невозможно преобразовать в более простые выражения.

Применение константной функции записывается в виде встроенных соответствующих -правил , например

+ 1 3  4

Процесс упрощения выражений называется редукцией. Пример редукции ( – обозначение δ-редукции):

* (+ 1 2) (- 4 1)

 * (+ 1 2) 3

 * 3 3

 9

Правило редукции как применять -абстракцию: копируется тело абстракции с заменой всех вхождений связанной переменной на выражения аргумента - называется -редукцией (обозначается  или просто ).

( x . * x x) 2  * 2 2

((x . y . + x y) 7 ) 8

 (y. + 7 y) 8

 + 7 8

 15

Редуцируемое выражение называется редексом, и мы можем на данном этапе заключить, что процесс редукции ламбда-выражения состоит из множества редукций, применяемых к редексам данного выражения до тех пор, пока выражение включает в себя хотя бы один редекс. В зависимости от того, какое правило можно применить к редексу, используются понятия -редекса и -редекса.

При выполнении -редукции следует быть внимательными и не выполнять подстановку в тело абстракции, если связанная переменная этой абстракции имеет такое же имя, как и заменяемая переменная:

x . (x . x) (+ 1 x)

(x . (x . x) (+ 1 x)) 1

 (x . 1) (+ 1 1)

 (x . 1) 2

 1 Ошибка!

В этом случае нужно оставить такую (внутреннюю) абстракцию без изменений. Возможно также переименовать переменную - алфавитно-эквива-лентное преобразование.

Правильно:

(x . (x . x) (+ 1 x)) 1

 (x . x) (+ 1 1)

 (x . x) 2

 2

Примеры редукции выражений (используемые редексы подчеркнуты):

1)

(f . x . f 4 x) (y . x . + x y) 3

(x . (y .x . + x y) 4 x) 3 - выбрали один из двух возможных редексов

(y . x . + x y) 4 3

(x . + x 4) 3

 + 3 4

 7

2)

(f . x . f 4 x) (y . x . + x y) 3

 (x . (y .x . + x y) 4 x) 3 - выбрали один из двух возможных редексов

 (x . (x . + x 4) x ) 3 - снова делаем произвольный выбор

(x . + x 4) 3

 + 3 4

 7

5.3. Порядок редукций и нормальные формы

Говорят, что -выражение находится в нормальной форме, если к нему нельзя применить никакое правило редукции. Другими словами, -выражение - в нормальной форме, если оно не содержит редексов. Нормальная форма, таким образом, соответствует понятию конца вычислений в традиционном программировании. Отсюда немедленно вытекает наивная схема вычислений:

while существует хотя бы один редекс

do преобразовывать один из редексов

end (выражение теперь в нормальной форме).

Какие выбирать редексы?

Пример:

(x . y . y) ((z . z z) (z . z z))

 (x . y . y) ((z . z z) (z . z z))

 (x . y . y) ((z . z z) (z . z z))

 ...

(бесконечный процесс редукции)

(x . y . y) ((z . z z) (z . z z))

y . y

(редукция закончилась)

Порядок редукций (стратегия выбора редексов).

Самым левым редексом называется редекс, символ  которого (или идентификатор примитивной функции в случае -редекса) текстуально расположен в -выражении левее всех остальных редексов. (Аналогично определяется самый правый редекс.)

Самым внешним редексом называется редекс, который не содержится внутри никакого другого редекса.

Самым внутренним редексом называется редекс, не содержащий других редексов.

В контексте функциональных языков и -исчисления существуют два важных порядка редукций.

Аппликативный порядок редукций (АПР), который предписывает вначале преобразовывать самый левый из самых внутренних редексов.

Нормальный порядок редукций (НПР), который предписывает вначале преобразовывать самый левый из самых внешних редексов.

(x . y . y) ((z . z z) (z . z z)) - самый левый из самых внутренних редексов - вычисление никогда не закончится.

(x . y . y) ((z . z z) (z . z z)) - самый левый из самых внешних редексов - вычисление закончится за один шаг.

Функция x . y . y - это классический пример функции, которая отбрасывает свой аргумент. НПР в таких случаях эффективно откладывает вычисление любых редексов внутри выражения аргумента до тех пор, пока это возможно, в расчете на то, что такое вычисление может оказаться ненужным.

АПР оказывается значительно более эффективным при реализации на обычных компьютерах.

НПР - ленивые вычисления. “Не делай ничего, пока это не потребуется” - механизм вызова по необходимости (все аргументы передаются функции в не вычисленном виде и вычисляются только тогда, когда в них возникает необходимость внутри тела функции).

АПР - энергичные вычисления. “Делай все, что можешь”; другими словами, не надо заботиться о том, пригодится ли, в конечном счете, полученный результат - механизм вызова по значению (значение аргумента передается в тело функции).

Теорема Чёрча-Россера (следствие). Если выражение E может быть приведено двумя различными способами к двум нормальным формам, то эти нормальные формы являются алфавитно-эквивалентными.

Теорема стандартизации. Если выражение E имеет нормальную форму, то НПР гарантирует достижение этой нормальной формы (с точностью до алфавитной эквивалентности).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]