- •Лекция 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
5.2. Аксиомы ламбда-исчисления
После определения алфавита и порядка построения допустимых ламбда-выражений посредством операций аппликации и абстракции перечислим аксиомы ламбда-исчисления.
5.2.1. Конвертируемость
Отметим, что символ "=" понимается в ламбда-исчислении как обозначение отношения конвертируемости, которым связываются соединенные этим значком ламбда-выражения.
Конвертируемость двух ламбда-выражений означает, что одно ламбда-выражение может быть преобразовано в другое. Отношение конвертируемости моделирует переобозначения и во многих отношениях, напоминает процесс программирования.
Следующие аксиомы задают свойства отношения конвертируемости:
Аксиома () о возможности подстановки терма z (конкретизации ?) вместо всех вхождений переменной x в ламбда-выражение a.
() λx.a = λz.[z/x]a;
Аксиома (β) о возможности редукции (то есть упрощения вида) ламбда-выражения в левой части путем подстановки b вместо всех вхождений переменной x в ламбда-выражение a.
(β) (λx.a)b = [b/x]a.
Фактически редукция означает возможность создания (в ламбда-исчислении или на языке программирования) одной функции (ламбда-выражения) как сокращенной записи другой функции (ламбда-выражения).
Перечислим правила вывода термов, которые задают характеристики отношения конвертируемости:
(μ) |
если a=b, то ca=cb |
|
(ν) |
если a=b, то ac=bc |
|
(ξ) |
если a=b, то λx.a=λx.b |
|
(ρ) |
a=a |
рефлексивность - конвертируемость произвольного ламбда-выражения к самому себе |
(σ) |
если a=b, то b=a |
симметричность - двунаправленность вывода ламбда-выражений посредством конверсии |
(τ) |
если a=b и b=c, то a=c |
транзитивность - возможность опускать промежуточные этапы конверсии для цепочек вывода |
Именно в силу фундаментальности отношения конвертируемости для ламбда-исчисления эта теория известна также под другим, более точно характеризующим ее суть названием, а именно, как исчисление ламбда-конверсий.
Соглашения об упрощении
К сожалению, относительная простота описания предыдущих этапов формальной теории ламбда-конверсий (алфавита, аксиом и правил вывода) порождает довольно громоздкие выкладки при моделировании вычислений.
В этой связи из соображения экономии пространства для вывода соотношений принимаются следующие соглашения, позволяющие значительно сократить запись и увеличить удобство прочтения и обработки ламбда-выражений.
1. Скобки для операции аппликации восстанавливаются по ассоциации влево, например:
xy = (xy), xyz = ((xy)z), ...
2. Избыточные скобки могут опускаться, например:
(xy) = xy, ((xy)z) = xyz, ...
3. Скобки для операции абстракции восстанавливаются по ассоциации вправо, например:
λxy.M = (λx.(λy.M)), λxyz.M = (λx.( λy.(λz.M))), ...
Примеры формального описания исчисления ламбда-конверсий
Рассмотрим следующие шесть ламбда-термов, возможно, с цепочками вывода, согласно правилам построения алфавита:
1 |
x |
переменная |
2 |
1 |
константа |
3 |
λx.x |
ламбда-абстракция переменного терма x к самому себе (определяет функцию тождества) |
4 |
λx.x + 1 |
добавляет* к аргументу x константу 1, т.е. определяет функцию инкремента (прибавления единицы) |
5 |
(λx.x + 1)2 = [2/x](x + 1) = 2+1 = 3 |
подстановка** согласно аксиоме () константы 2 вместо всех вхождений x в выражение x+1 |
6 |
a $ b |
недопустим из-за вхождения неопределенного символа "$" |
*Заметим, что в алфавите ламбда-исчисления отсутствует функция сложения как таковая, так что возможны различные интрепретации символа "+" (будем считать его далее "встроенной" функцией сложения).
**Вычисление значения функции в число 3 возможно при корректной интерпретации символа "+".
Соответствие между ламбда-исчислением и функциональным языком
Соответствие между математической моделью языка функционального программирования – ламбда-исчислением и языком функционального программирования (например SML) настолько естественно, что сопоставление ламбда-термов и SML-выражений происходит практически интуитивно и в дальнейших комментариях не нуждается.
Приведем фрагменты SML-программ, соответствующих допустимым ламбда-термам из предыдущего списка:
1 |
x |
переменная, тип которой определяется в процессе трансляции на этапе контроля типизации в соответствии с выводом типов |
2 |
1 |
константа |
3 |
fn x => x |
функция тождества |
4 |
fn x => x+1 |
функция инкремента |
5 |
(fn x => x+1) 2 |
вычисление значения функции, в результате выполнения получается целое число 3 |
Продолжим иллюстрацию соответствия между программами на языке SML и ламбда-выражениями.
В общем случае функция f языка программирования SML, имеющая формальный параметр x и тело b, задается следующим описанием:
fun f x = b;
Исследуем операцию аппликации функции к аргументу. Например, описание функции инкремента имеет вид:
fun f x = 1+x;
Для вычисления значения выражения необходимо произвести аппликацию функции к данному выражению; для аппликации функции f к целому числу 4 нужно записать:
f 4;
При вычислении значения функции аппликация производится к ближайшему аргументу. Так, запись
f 2 + 3;
означает порядок аппликации (f2)+3, а не f(2+3), т.е. находится в полном соответствии с соглашениями о скобках, принятыми в ламбда-исчислении.
Выводы по лекции 5
Рассмотрев формальное построение исчисления ламбда-конверсий (алфавит, аксиомы и правила вывода выражений) и сопоставив основные элементы (переменная, константа) и операции (аппликация, подстановка) этой теории с базовыми элементами (переменная, константа) и элементарными программами (объявление и аппликация функции) языка SML, можно сделать вывод о следующих несомненных преимуществах ламбда-исчисления как математической модели языка функционального программирования:
лаконичность (ограниченный необходимыми элементами алфавит, два способа построения выражений – аппликация и абстракция, небольшое количество аксиом и правил вывода);
интуитивная ясность (обозначения являются краткими и понятными);
иллюстративность (ламбда-термы легко интерпретируются не только с помощью алгебраической записи, но и посредством визуальной интерпретации в виде графов, причем редукция, т.е. упрощение вида графов, соответствует бета-редукции ламбда-термов);
полнота (в ламбда-исчислении можно представить произвольную, в частности, сколь угодно сложную, функцию);
естественная близость к языкам функционального программирования (SML, Scheme, Haskell, Miranda, Hope, Clean) была проиллюстрирована на примерах программ на языке SML.
Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [24, 32, 39, 43, 44, 47, 58, 76].
Лекция 6. Комбинаторная логика как формальная система
В лекции обсуждаются вопросы, относящиеся к идеологии, математическому основанию и обзору возможностей комбинаторной логики - математической формализации, моделирующей языки функционального программирования и абстрактные вычислительные машины.
Рассмотрим построение формальной системы логики. Заметим, что важнейшим понятием для любой формы комбинаторной логики является понятие комбинатора.
