
- •Лекция 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. Ламбда-исчисление как формализация языка функционального программирования
В лекции производится анализ идеологии, математического основания и возможностей ламбда-исчисления – математической формализации, моделирующей языки функционального программирования.
Пожалуй, наиболее продуктивной формализацией понятия "функция" стала математическая теория, известная сегодня под названием ламбда-исчисления. Более точно это исчисление следует называть исчислением ламбда-конверсий.
Под конверсией понимается преобразование объектов исчисления (а в программировании – функций и данных) из одной формы в другую. Исходной задачей в математике было стремление к упрощению формы выражений. В программировании именно эта задача не является столь существенной, хотя, как мы увидим в дальнейшем, использование ламбда-исчисления как исходной формализации может способствовать упрощению вида программы, т.е. вести к оптимизации программного кода.
Кроме того, конверсии обеспечивают переход к вновь введенным обозначениям и, таким образом, позволяют представлять предметную область в более компактном или более детальном виде, или, говоря математическим языком, изменять уровень абстракции по отношению к предметной области. Эту возможность широко используют также языки объектно-ориентированного и структурно-модульного программирования в иерархии объектов, фрагментов программ и структур данных. На этом же принципе основано взаимодействие компонентов приложения в .NET. Именно в этом смысле переход к новым обозначениям является одним из важнейших элементов программирования в целом, и именно ламбда-исчисление (в отличие от многих других разделов математики) представляет собой адекватный способ формализации переобозначений.
Поскольку основным объектом ламбда-исчисления является функция, этот подход весьма продуктивен при моделировании языков функционального программирования.
Заметим, однако, что под словом "функция" в математической формализации и программной реализации имеются ввиду различные понятия.
Напомним, что определение функции в математике было сформулировано в лекции 3.
Определение 5.1. Функцией в языке программирования называется конструкция этого языка, описывающая правила преобразования аргумента (так называемого фактического параметра) в результат.
Напомним ход эволюции теорий, лежащих в основе современного подхода к ламбда-исчислению.
Как видно из вступительной лекции, практически все ранее созданные формализации языков функционального программирования (включая абстрактные машины и средства оптимизации вычислений) базируются на фундаменте ламбда-исчисления в той или иной его форме.
Перейдем к описанию ламбда-исчисления как формальной системы. Согласно математической практике, необходимо определить следующие элементы теории:
алфавит;
утверждения (?).
аксиомы (частный вид утверждений);
правила вывода;
При этом под алфавитом понимается множество символов, допустимых в нотации той или иной формализации.
Утверждения устанавливают правила образования терминальных символов математической теории.
Под аксиомами понимаются элементарные утверждения, которые считаются истинными без необходимости доказательства истинности.
Правила вывода определяют законы преобразования одних символов (объектов), исследуемых в теории, в другие объекты.
5.1. Алфавит ламбда-исчисления.
Допускаются элементы четырех видов:
константы;
переменные;
специальные символы;
выражения (или термы).
При этом принимаются следующие обозначения.
5.1.1. Константы
Константы c1 , c2 , ... обозначаются малыми буквами латинского алфавита, возможно, с индексами.
5.1.2. Переменные
Переменные x, y, ... обозначаются малыми буквами латинского алфавита, возможно, с индексами.
5.1.3. Специальные символы
Допускается использование следующих специальных символов (взяты в кавычки и разделены запятыми): "(", ")", "."
5.1.4. Выражения (термы)
Выражения (или, иначе, термы) M, N, ... обозначаются заглавными буквами латинского алфавита, возможно, с индексами.
Рассмотрим далее порядок конструирования допустимых для заданного алфавита ламбда-выражений, или, иначе, термов.
Ламбда-термы строятся по индукции (порядок построения можно считать определением) следующим образом.
Базис индукции: любая переменная или константа является ламбда-термом по определению.
Шаг индукции: если M, N – произвольные ламбда-термы и x – произвольная переменная, то справедливо, что:
1) ламбда-выражение (λx.M) является допустимым ламбда-термом и обозначает операцию абстракции;
2) ламбда-выражение (MN) является допустимым ламбда-термом и обозначает операцию аппликации (или применения функции к аргументу).
Будем считать, что никакой другой набор символов не является допустимым ламбда-термом.