Определение лямбда-исчисления
Эта статья может быть слишком технической для понимания большинства читателей . ( Ноябрь 2014 г. ) |
Лямбда-исчисление — это формальная математическая система, основанная на лямбда-абстракции и применении функций . Здесь даны два определения языка: стандартное определение и определение с использованием математических формул.
Стандартное определение
[ редактировать ]Это формальное определение было дано Алонсо Чёрчем .
Определение
[ редактировать ]Лямбда-выражения состоят из
- переменные , , ..., , ...
- символы абстракции лямбда ' ' и точка '.'
- скобки ( )
Набор лямбда-выражений, , можно определить индуктивно :
- Если является переменной, то
- Если является переменной и , затем
- Если , затем
Экземпляры правила 2 известны как абстракции, а случаи правила 3 — как приложения. [1]
Обозначения
[ редактировать ]Чтобы не загромождать обозначение лямбда-выражений, обычно применяются следующие соглашения.
- Крайние круглые скобки опускаются: вместо
- Предполагается, что приложения левоассоциативны: можно написать вместо [2]
- Тело абстракции простирается как можно дальше вправо : означает и не
- Сжимается последовательность абстракций: сокращается как [3] [4]
Свободные и связанные переменные
[ редактировать ]Оператор абстракции, Говорят, что он связывает свою переменную везде, где она встречается в теле абстракции. Переменные, попадающие в область абстракции, называются связанными . Все остальные переменные называются свободными . Например, в следующем выражении является связанной переменной и бесплатно: . Также обратите внимание, что переменная связана своей «ближайшей» абстракцией. В следующем примере единственное появление в выражении связана второй лямбдой:
Набор свободных переменных лямбда-выражения, , обозначается как и определяется рекурсией структуры терминов следующим образом:
- , где это переменная
- [5]
Выражение, не содержащее свободных переменных, называется замкнутым . Закрытые лямбда-выражения также известны как комбинаторы и эквивалентны терминам комбинаторной логики .
Снижение
[ редактировать ]Значение лямбда-выражений определяется тем, как выражения можно сократить. [6]
Существует три вида сокращения:
- α-преобразование : изменение связанных переменных ( альфа );
- β-редукция : применение функций к их аргументам ( бета );
- η-редукция : которая отражает понятие экстенсиональности ( эта ).
Будем говорить также о результирующих эквивалентностях: два выражения являются β-эквивалентными , если их можно β-преобразовать в одно и то же выражение, а α/η-эквивалентность определяется аналогично.
Термин редекс , сокращение от сокращаемого выражения , относится к подтермам, которые можно сократить с помощью одного из правил сокращения. Например, представляет собой β-редекс, выражающий замену для в ; если не является бесплатным в , является η-редексом. Выражение, к которому сводится редекс, называется его редукцией; используя предыдущий пример, сокращения этих выражений соответственно равны и .
α-конверсия
[ редактировать ]Альфа-конверсия, иногда известная как альфа-переименование, [7] позволяет изменять имена связанных переменных. Например, альфа-конверсия может дать . Термы, отличающиеся только альфа-конверсией, называются α-эквивалентными . Часто при использовании лямбда-исчисления α-эквивалентные термины считаются эквивалентными.
Точные правила альфа-конверсии не совсем тривиальны. Во-первых, при альфа-конвертировании абстракции переименовываются только те вхождения переменных, которые связаны с той же абстракцией. Например, альфа-конверсия может привести к , но это не могло привести к . Последнее имеет иное значение, чем оригинал.
Во-вторых, альфа-преобразование невозможно, если оно приведет к тому, что переменная будет захвачена другой абстракцией. Например, если мы заменим с в , мы получаем , что совсем не то.
В языках программирования со статической областью действия альфа-преобразование можно использовать для упрощения разрешения имен , гарантируя, что никакое имя переменной не маскирует имя в содержащей его области (см. раздел «Альфа-переименование, чтобы сделать разрешение имен тривиальным »).
Замена
[ редактировать ]Замена, написано , — это процесс замены всех свободных вхождений переменной в выражении с выражением . Замена в терминах лямбда-исчисления определяется рекурсией структуры терминов следующим образом (примечание: x и y — это только переменные, а M и N — любое выражение λ).
Чтобы подставить выражение в лямбда-абстракцию, иногда необходимо α-преобразовать выражение. Например, это неверно для привести к , поскольку замененный должен был быть свободным, но в итоге оказался связанным. Правильная замена в данном случае , с точностью до α-эквивалентности. Заметим, что замена определяется однозначно с точностью до α-эквивалентности.
β-восстановление
[ редактировать ]β-редукция отражает идею применения функции. β-восстановление определяется с точки зрения замещения: β-восстановление является .
Например, предполагая некоторую кодировку , мы имеем следующую β-редукцию: .
n-редукция
[ редактировать ]η-редукция выражает идею экстенсиональности , которая в данном контексте заключается в том, что две функции одинаковы тогда и только тогда, когда они дают одинаковый результат для всех аргументов. η-редукция преобразует между и в любое время не кажется бесплатным в .
Нормализация
[ редактировать ]Целью β-редукции является вычисление значения. Значение в лямбда-исчислении — это функция. Таким образом, β-редукция продолжается до тех пор, пока выражение не станет выглядеть как абстракция функции.
Лямбда-выражение, которое не может быть сокращено ни с помощью β-редекса, ни с помощью η-редекса, находится в нормальной форме. Обратите внимание, что альфа-преобразование может преобразовывать функции. Все нормальные формы, которые можно преобразовать друг в друга путем α-преобразования, считаются равными. смотрите в основной статье о бета-нормальной форме Подробности .
Обычный тип формы | Определение. |
---|---|
Нормальная форма | Никакие β- или η-редукции невозможны. |
Голова нормальной формы | В виде лямбда-абстракции, тело которой несводимо. |
Слабая голова, нормальная форма | В виде лямбда-абстракции. |
Определение синтаксиса в BNF
[ редактировать ]Лямбда-исчисление имеет простой синтаксис. Программа лямбда-исчисления имеет синтаксис выражения, где:
Имя | БНФ | Описание |
---|---|---|
Абстракция | <expression> ::= λ <variable-list> . <expression>
|
Определение анонимной функции. |
Срок подачи заявки | <expression> ::= <application-term>
|
|
Приложение | <application-term> ::= <application-term> <item>
|
Вызов функции. |
Элемент | <application-term> ::= <item>
|
|
Переменная | <item> ::= <variable>
|
Например, x, y, факт, сумма, ... |
Группировка | <item> ::= ( <expression> )
|
Выражение в квадратных скобках. |
Список переменных определяется как:
<variable-list> ::= <variable> | <variable>, <variable-list>
Переменная, используемая учеными-компьютерщиками, имеет синтаксис:
<variable> ::= <alpha> <extension>
<extension> ::=
<extension> ::= <extension-char> <extension>
<extension-char> ::= <alpha> | <digit> | _
Математики иногда ограничивают переменную одним буквенным символом. При использовании этого соглашения запятая в списке переменных опускается.
Лямбда-абстракция имеет более низкий приоритет, чем приложение, поэтому;
Приложения остаются ассоциативными;
Абстракция с несколькими параметрами эквивалентна нескольким абстракциям одного параметра.
где,
- х — переменная
- y — список переменных
- z — выражение
Определение как математические формулы
[ редактировать ]Проблема переименования переменных сложна. Это определение позволяет избежать проблемы, заменяя все имена каноническими именами, которые создаются на основе положения определения имени в выражении. Этот подход аналогичен тому, что делает компилятор, но адаптирован для работы в рамках математических ограничений.
Семантика
[ редактировать ]Выполнение лямбда-выражения происходит с использованием следующих сокращений и преобразований:
- α-конверсия -
- β-восстановление -
- n-редукция -
где,
- canonym — это переименование лямбда-выражения для присвоения ему стандартных имен в зависимости от положения имени в выражении.
- Оператор замены , это подмена имени по лямбда-выражению в лямбда-выражении .
- Свободный набор переменных это набор переменных, которые не принадлежат к лямбда-абстракции в .
Исполнение — это выполнение β-редукций и η-редукций над подвыражениями в канониме лямбда-выражения до тех пор, пока результатом не станет лямбда-функция (абстракция) в нормальной форме .
Все α-преобразования λ-выражения считаются эквивалентными.
Каноним — Канонические имена
[ редактировать ]Canonym — это функция, которая принимает лямбда-выражение и канонически переименовывает все имена в зависимости от их позиций в выражении. Это может быть реализовано как,
Где N — строка «N», F — строка «F», S — строка «S», + — конкатенация, а «имя» преобразует строку в имя.
Операторы карты
[ редактировать ]Сопоставьте одно значение с другим, если значение есть на карте. О — пустая карта.
Оператор замены
[ редактировать ]Если L — лямбда-выражение, x — имя, а y — лямбда-выражение; означает замену x на y в L. Правила таковы:
Обратите внимание, что правило 1 необходимо изменить, если оно будет использоваться с неканонически переименованными лямбда-выражениями. См. Изменения в операторе замены .
Наборы свободных и связанных переменных
[ редактировать ]Набор свободных переменных лямбда-выражения M обозначается как FV(M). Это набор имен переменных, экземпляры которых не связаны (не используются) в лямбда-абстракции внутри лямбда-выражения. Это имена переменных, которые могут быть связаны с переменными формальных параметров вне лямбда-выражения.
Набор связанных переменных лямбда-выражения M обозначается как BV(M). Это набор имен переменных, экземпляры которых связаны (используются) в лямбда-абстракции внутри лямбда-выражения.
Правила для двух наборов приведены ниже. [5]
- Бесплатный набор переменных | Комментарий | - Набор связанных переменных | Комментарий |
---|---|---|---|
где x — переменная | где x — переменная | ||
Свободные переменные M, исключая x | Связанные переменные M плюс x. | ||
Объедините свободные переменные из функции и параметра | Объедините связанные переменные из функции и параметра |
Использование;
- Набор свободных переменных FV используется выше в определении η-редукции .
- Набор связанных переменных, BV, используется в правиле для β-редекса неканонического лямбда-выражения.
Стратегия оценки
[ редактировать ]Это математическое определение структурировано так, что оно отражает результат, а не способ его расчета. Однако результат может быть разным при ленивой и нетерпеливой оценке. Эта разница описана в формулах оценки.
Приведенные здесь определения предполагают, что будет использоваться первое определение, соответствующее лямбда-выражению. Это соглашение используется для того, чтобы сделать определение более читабельным. В противном случае для точности определения потребуются некоторые условия.
Запуск или оценка лямбда-выражения L is:
где Q — префикс имени, возможно, пустая строка, а eval определяется как,
Тогда стратегия оценки может быть выбрана как:
Результат может быть разным в зависимости от используемой стратегии. При быстрой оценке будут применены все возможные сокращения, оставляя результат в нормальной форме, тогда как при ленивой оценке некоторые сокращения параметров будут пропущены, оставляя результат в «нормальной форме со слабой головой».
Нормальная форма
[ редактировать ]Все возможные сокращения были применены. Это результат, полученный в результате применения нетерпеливой оценки.
Во всех остальных случаях
Слабая голова, нормальная форма.
[ редактировать ](Приведенное ниже определение ошибочно, оно противоречит определению, согласно которому слабая нормальная форма головы — это либо нормальная форма головы, либо этот термин является абстракцией. [8] Это понятие было предложено Саймоном Пейтоном Джонсом. [9] )
Были применены сокращения функции (головы), но не все сокращения параметра были применены. Это результат, полученный в результате применения ленивой оценки.
Во всех остальных случаях
Вывод стандарта из математического определения
[ редактировать ]Стандартное определение лямбда-исчисления использует некоторые определения, которые можно рассматривать как теоремы, которые можно доказать на основе определения в виде математических формул .
Определение канонического именования решает проблему идентичности переменных путем создания уникального имени для каждой переменной на основе положения лямбда-абстракции для имени переменной в выражении.
Это определение знакомит с правилами, используемыми в стандартном определении, и объясняет их с точки зрения определения канонического переименования.
Свободные и связанные переменные
[ редактировать ]Оператор лямбда-абстракции λ принимает переменную формального параметра и выражение тела. При оценке переменная формального параметра идентифицируется со значением фактического параметра.
Переменные в лямбда-выражении могут быть «связанными» или «свободными». Связанные переменные — это имена переменных, которые уже прикреплены к переменным формальных параметров в выражении.
Говорят, что переменная формального параметра связывает имя переменной везде, где оно свободно встречается в теле. Переменная (имена), которая уже сопоставлена с переменной формального параметра, называется связанной . Все остальные переменные в выражении называются свободными .
Например, в следующем выражении y — связанная переменная, а x — свободная: . Также обратите внимание, что переменная связана своей «ближайшей» лямбда-абстракцией. В следующем примере единственное вхождение x в выражении связано второй лямбдой:
Изменения в операторе замены
[ редактировать ]В определении оператора замены правило:
необходимо заменить на,
Это делается для того, чтобы остановить подстановку связанных переменных с тем же именем. Этого не произошло бы в канонически переименованном лямбда-выражении.
Например, предыдущие правила были бы неправильно переведены:
Новые правила блокируют эту замену, так что она остается такой:
Трансформация
[ редактировать ]Значение лямбда-выражений определяется тем, как выражения можно преобразовать или сократить. [6]
Существует три вида трансформации:
- α-преобразование : изменение связанных переменных ( альфа );
- β-редукция : применение функций к их аргументам ( бета ), вызов функций;
- η-редукция : которая отражает понятие экстенсиональности ( эта ).
Будем говорить также о результирующих эквивалентностях: два выражения являются β-эквивалентными , если их можно β-преобразовать в одно и то же выражение, а α/η-эквивалентность определяется аналогично.
Термин редекс , сокращение от сокращаемого выражения , относится к подтермам, которые можно сократить с помощью одного из правил сокращения.
α-конверсия
[ редактировать ]Альфа-конверсия, иногда известная как альфа-переименование, [7] позволяет изменять имена связанных переменных. Например, альфа-конверсия мог бы дать . Термы, отличающиеся только альфа-конверсией, называются α-эквивалентными .
При α-преобразовании имена могут быть заменены новыми именами, если новое имя не является свободным в теле, поскольку это приведет к захвату свободных переменных .
Обратите внимание, что замена не будет повторяться в теле лямбда-выражений с формальным параметром. из-за изменения оператора замены, описанного выше.
См. пример;
α-конверсия | λ-выражение | Канонически названный | Комментарий |
---|---|---|---|
Оригинальные выражения. | |||
правильно переименуйте y в k (потому что k не используется в теле) | Никаких изменений в каноническом переименованном выражении. | ||
наивно переименовывать y в z (неправильно, потому что z свободен в ) | захвачен. |
β-редукция (избегание захвата)
[ редактировать ]β-редукция отражает идею применения функции (также называемой вызовом функции) и реализует замену выражения фактического параметра на переменную формального параметра. β-восстановление определяется с точки зрения замещения.
Если никакие имена переменных не являются свободными в фактическом параметре и не связаны в теле, β-редукция может быть выполнена на лямбда-абстракции без канонического переименования.
Альфа-переименование может использоваться на переименовывать имена, свободные в но связанный , чтобы выполнить предварительное условие для этого преобразования.
См. пример;
β-восстановление | λ-выражение | Канонически названный | Комментарий | ||||
---|---|---|---|---|---|---|---|
Оригинальные выражения. | |||||||
Наивная бета-версия 1, |
|
x (P) и y (PN) были уловлены при замене. | |||||
Альфа переименовывает внутреннюю, х → а, у → б |
|||||||
Бета 2, |
|
x и y не захвачены. |
В этом примере
- В β-редексе
- Свободные переменные:
- Связанные переменные:
- Наивный β-редекс изменил смысл выражения, поскольку x и y из фактического параметра стали фиксироваться, когда выражения были заменены во внутренних абстракциях.
- Альфа-переименование устранило проблему, изменив имена x и y во внутренней абстракции так, чтобы они отличались от имен x и y в фактическом параметре.
- Свободные переменные:
- Связанные переменные:
- Затем β-редекс приступил к намеченному значению.
n-редукция
[ редактировать ]η-редукция выражает идею экстенсиональности , которая в данном контексте заключается в том, что две функции одинаковы тогда и только тогда, когда они дают одинаковый результат для всех аргументов.
η-редукцию можно использовать без изменений в лямбда-выражениях, которые не переименованы канонически.
Проблема с использованием η-редекса, когда f имеет свободные переменные, показана в этом примере:
Снижение | Лямбда-выражение | β-восстановление |
---|---|---|
Наивное n-редукция |
Это неправильное использование η-редукции меняет смысл, оставляя x в незамещенный.
Ссылки
[ редактировать ]- ^ Барендрегт, Хендрик Питер (1984), Лямбда-исчисление: его синтаксис и семантика , Исследования по логике и основам математики, том. 103 (пересмотренная редакция), Северная Голландия, Амстердам., ISBN. 978-0-444-87508-2 , заархивировано из оригинала 23 августа 2004 г. — Исправления
- ^ «Пример правил ассоциативности» . Lambda-bound.com . Проверено 18 июня 2012 г.
- ^ Селинджер, Питер (2008), Конспекты лекций по лямбда-исчислению (PDF) , том. 0804, факультет математики и статистики, Оттавский университет, с. 9, arXiv : 0804.3434 , Bibcode : 2008arXiv0804.3434S
- ^ «Пример правила ассоциативности» . Lambda-bound.com . Проверено 18 июня 2012 г.
- ^ Jump up to: а б Барендрегт, Хенк; Барендсен, Эрик (март 2000 г.), Введение в лямбда-исчисление (PDF)
- ^ Jump up to: а б де Кейро, Рюи ЖГБ « Теоретико-доказательное описание программирования и роли правил редукции » . Dialectica 42 (4), страницы 265–282, 1988.
- ^ Jump up to: а б Турбак, Франклин; Гиффорд, Дэвид (2008), Концепции дизайна в языках программирования , MIT Press, стр. 251, ISBN 978-0-262-20175-9
- ^ «Заметки по оценке терминов λ-исчисления и абстрактных машин» . ученый.google.ca . Проверено 14 мая 2024 г.
- ^ Пейтон Джонс, Саймон Л. (1987). Реализация функциональных языков программирования . Энглвуд Клиффс, Нью-Джерси: Prentice/Hill International. ISBN 978-0-13-453333-9 .