
- •Лекция 5. Ламбда-исчисление как формализация языка функционального программирования
- •5.2. Аксиомы ламбда-исчисления
- •5.2.1. Конвертируемость
- •6.1. Понятие комбинатора
- •6.2. Комбинаторная логика как формальная система
- •6.2.1. Правила конструирования допустимых для заданного алфавита комбинаторных выражений (термов).
- •6.2.2. Аксиомы комбинаторной логики
- •6.2.3.Умолчания
- •6.2.4. Синтаксис выражений комбинаторной логики
- •6.2.5. Редукция комбинаторных термов
- •6.2.6. Базис термов
- •7.1. Определение типов
- •7.2. Аксиомы вывода типа комбинатора
- •7.3. Типизация выражений в sml
- •7.3.1. Схема типизации
- •7.3.2. Выводимость типов
- •7.3.3. Полиморфная типизация
- •7.4. Преимущества типизации
- •7.5. Применение типизации
- •7.5.1. Статическая типизация
- •7.5.2. Полимофная типизация
- •7.6. Управление типами в технологии .Net
6.2.3.Умолчания
К сожалению, относительная простота описания предыдущих этапов формальной теории комбинаторной логики (алфавита, аксиом и правил вывода) порождает довольно громоздкие выкладки при моделировании вычислений.
В этой связи из соображений экономии пространства для вывода соотношений принимаются следующие умолчания, позволяющие значительно сократить запись и увеличить удобство прочтения и обработки комбинаторных термов.
1. Скобки для операции аппликации восстанавливаются по ассоциации влево, например:
XY = (XY), XYZ = ((XY)Z), ...
2. Избыточные скобки могут опускаться, например:
(XY) = XY, ((XY)Z) = XYZ, ...
6.2.4. Синтаксис выражений комбинаторной логики
Определение 6.2. Под синтаксисом понимают раздел описания формального математического языка или языка программирования, исследующий вид, форму и структуру конструкций, без учета их значения (или, иначе, семантики) или практической применимости (или, иначе, прагматики).
Задать синтаксис языка возможно, перечислив описание его конструкций с использованием метаязыка, например, с помощью форм Бэкуса-Наура или БНФ. БНФ созданы в 60-х годах Дж. Бэкусом (John Backus) и развиты П. Науром (Peter Naur) как метаязык для формализации синтаксиса языка программирования ALGOL 60. Впоследствии БНФ получили широкое распространение и в настоящее время являются основной нотацией для формализации синтаксиса языков программирования (мы будем пользоваться БНФ для формализации синтаксиса языка программирования SML).
В нотации БНФ символ "::=" интерпретируется словами "может иметь вид", а символ "|" - словом "или". Определяемое понятие записывается слева от значка "::=", а определяющие понятия записываются в угловых скобках справа от значка "::=".
Формализуем синтаксис выражений комбинаторной логики (или комбинаторов).
БНФ-описание комбинатора имеет вид:
<комбинатор> ::= K | S | (<комбинатор> <комбинатор>)
БНФ-описание терма комбинаторной логики, возможно, содержащего переменные, имеет вид:
<комбинаторный терм> ::= K | S | <переменная> |
(<комбинаторный терм> <комбинаторный терм>)
Примеры комбинаторов для представленной формальной системы комбинаторной логики. Рассмотрим характеристические соотношения для комбинаторов, которые впоследствии окажутся теоретически интересными и практически полезными в данном курсе (некоторые из соотношений совпадают с введенными ранее аксиомами):
(I) |
I a = a |
комбинатор тождества |
(K) |
К ab = a |
комбинатор первой проекции (иначе именуемый канцелятором, т.е. "отменяющим" "выполнение" всех "инструкций", кроме первой) |
(S) |
S abc = ac(bc) |
комбинатор-коннектор - определяет порядок "связывания" "инструкций" программы таким образом, что третья "инструкция" "распределяется" по паре из двух первых |
(B) |
B abc = a(bc) |
комбинатор композиции - образует последовательность комбинаторных термов и служит для объединения более элементарных "инструкций" в более сложные, а в итоге - в "программы" |
(C) |
C abc = acb |
пермутация (перестановка) |
(W) |
W xy = xyy |
дублирование аргументов |