Определение лямбда-исчисления - Lambda calculus definition
Эта статья может быть слишком техническим для большинства читателей, чтобы понять. Пожалуйста помогите улучшить это к сделать понятным для неспециалистов, не снимая технических деталей. (Ноябрь 2014 г.) (Узнайте, как и когда удалить этот шаблон сообщения) |
Лямбда-исчисление - это формальная математическая система, основанная на абстракции лямбда и приложение-функция. Здесь даны два определения языка: стандартное определение и определение с использованием математических формул.
Стандартное определение
Это формальное определение было дано Церковь Алонсо.
Определение
Лямбда-выражения состоят из
- переменные , , ..., , ...
- символы абстракции лямбда ''и точка'. '
- скобки ( )
Набор лямбда-выражений, , возможно определяется индуктивно:
- Если переменная, то
- Если переменная и , тогда
- Если , тогда
Экземпляры правила 2 известны как абстракции, а экземпляры правила 3 - как приложения.[1]
Обозначение
Чтобы не загромождать нотацию лямбда-выражений, обычно применяются следующие соглашения.
- Крайние круглые скобки опускаются: вместо
- Предполагается, что приложения являются левоассоциативными: может быть написано вместо [2]
- Тело абстракции расширяется как можно правее: средства и нет
- Последовательность абстракций сокращается: сокращенно [3][4]
Свободные и связанные переменные
Оператор абстракции, , как говорят, связывает свою переменную везде, где она встречается в теле абстракции. Переменные, попадающие в область действия абстракции, называются граница. Все остальные переменные называются свободный. Например, в следующем выражении является связанной переменной и бесплатно: . Также обратите внимание, что переменная связана своей «ближайшей» абстракцией. В следующем примере единственное вхождение в выражении связана второй лямбдой:
Набор свободные переменные лямбда-выражения, , обозначается как и определяется рекурсией по структуре терминов следующим образом:
- , куда это переменная
- [5]
Выражение, не содержащее свободных переменных, называется закрыто. Замкнутые лямбда-выражения также известны как комбинаторы и эквивалентны терминам в комбинаторная логика.
Снижение
Значение лямбда-выражений определяется тем, как выражения могут быть сокращены.[6]
Есть три вида сокращения:
- α-преобразование: изменение связанных переменных (альфа);
- β-редукция: применение функций к их аргументам (бета);
- η-редукция: который отражает понятие протяженности (эта).
Мы также говорим о полученных эквивалентностях: два выражения β-эквивалент, если они могут быть β-преобразованы в одно и то же выражение, и α / η-эквивалентность определяется аналогично.
Период, термин редекс, Короче для сводимое выражение, относится к подтерминам, которые могут быть сокращены одним из правил сокращения. Например, является β-редексом, выражающим замену за в ; если не бесплатно в , является η-редексом. Выражение, к которому сводится редекс, называется его редукцией; используя предыдущий пример, сокращения этих выражений соответственно и .
α-преобразование
Альфа-преобразование, иногда известное как альфа-переименование,[7] позволяет изменять имена связанных переменных. Например, альфа-преобразование может дать . Термины, которые отличаются только альфа-преобразованием, называются α-эквивалент. Часто при использовании лямбда-исчисления α-эквивалентные термины считаются эквивалентными.
Точные правила альфа-преобразования не совсем тривиальны. Во-первых, при альфа-преобразовании абстракции переименовываются только вхождения переменных, которые связаны с той же абстракцией. Например, альфа-преобразование может привести к , но это могло нет результат в . Последний имеет значение, отличное от оригинала.
Во-вторых, альфа-преобразование невозможно, если оно приведет к захвату переменной другой абстракцией. Например, если мы заменим с в , мы получили , что совсем не одно и то же.
В языках программирования со статической областью видимости альфа-преобразование может использоваться для создания разрешение имени проще, гарантируя, что имя переменной маски имя в содержащем объем (видеть альфа-переименование, чтобы сделать разрешение имен тривиальным ).
Замена
Замена, письменная , - это процесс замены всех свободных вхождений переменной в выражении с выражением . Подстановка терминов лямбда-исчисления определяется рекурсией по структуре терминов следующим образом (примечание: x и y - только переменные, а M и N - любое выражение λ).
Чтобы заменить лямбда-абстракцию, иногда необходимо α-преобразовать выражение. Например, это неверно для привести к , потому что замененный должен был быть свободным, но оказался связанным. Правильная замена в этом случае - , с точностью до α-эквивалентности. Обратите внимание, что подстановка определена однозначно с точностью до α-эквивалентности.
β-редукция
β-редукция отражает идею применения функции. β-восстановление определяется в терминах замещения: β-восстановление является .
Например, предполагая некоторую кодировку , имеем следующую β-редукцию: .
η-редукция
η-редукция выражает идею протяженность, что в данном контексте состоит в том, что две функции одинаковы если и только если они дают одинаковый результат для всех аргументов. η-редукция преобразует и в любое время не кажется свободным в .
Нормализация
Цель β-редукции - вычислить значение. Значение в лямбда-исчислении - это функция. Таким образом, β-редукция продолжается до тех пор, пока выражение не будет выглядеть как абстракция функции.
Лямбда-выражение, которое не может быть уменьшено ни с помощью β-redex, ни η-redex, находится в нормальной форме. Обратите внимание, что альфа-преобразование может преобразовывать функции. Все нормальные формы, которые могут быть преобразованы друг в друга посредством α-преобразования, считаются равными. См. Основную статью о Бета нормальная форма для подробностей.
Обычный тип формы | Определение. |
---|---|
Нормальная форма | Никакие β- или η-редукции невозможны. |
Нормальная форма головы | В виде лямбда-абстракции, тело которой не сводится. |
Слабая голова нормальная форма | В виде лямбда-абстракции. |
Стратегия оценки
Является ли термин нормализующим или нет, и сколько работы необходимо сделать для его нормализации, если это так, в значительной степени зависит от используемой стратегии сокращения. Различие между сокращающими стратегиями связано с различием в языках функционального программирования между жадная оценка и ленивая оценка.
- Полные β-редукции
- Любой редекс можно уменьшить в любой момент. По сути, это означает отсутствие какой-либо конкретной стратегии сокращения - в отношении сводимости «все ставки выключены».
- Заявочный порядок
- Самый левый, самый внутренний редекс всегда сокращается первым. Интуитивно это означает, что аргументы функции всегда сокращаются до самой функции. Аппликативный порядок всегда пытается применить функции к нормальным формам, даже если это невозможно.
- Большинство языков программирования (включая Lisp, ML и императивные языки, такие как C и Ява ) описываются как "строгие", что означает, что функции, применяемые к ненормализующим аргументам, не являются нормализующими. По сути, это делается с использованием аппликативного порядка, вызывая уменьшение значения (Смотри ниже ), но обычно это называется «нетерпеливой оценкой».
- Нормальный порядок
- Самый левый, крайний редекс всегда уменьшается первым. То есть, когда это возможно, аргументы подставляются в тело абстракции до сокращения аргументов.
- Звоните по цене
- Уменьшаются только самые внешние редексы: редекс уменьшается только тогда, когда его правая часть уменьшена до значения (переменной или лямбда-абстракции).
- Звоните по имени
- В обычном порядке, но внутри абстракций сокращения не выполняются. Например, находится в нормальной форме в соответствии с этой стратегией, хотя и содержит редекс .
- Звоните по необходимости
- В обычном порядке, но приложения-функции, которые будут дублировать термины, вместо этого называют аргумент, который затем сокращается только «когда это необходимо». В практическом контексте называется «ленивым оцениванием». В реализациях это "имя" принимает форму указателя, причем редекс представлен thunk.
Аппликативный порядок - это не нормализующая стратегия. Обычный контрпример выглядит следующим образом: определить куда . Все это выражение содержит только один редекс, а именно все выражение; его редукция снова . Поскольку это единственное доступное сокращение, не имеет нормальной формы (при любой стратегии оценки). Используя аппликативный порядок, выражение уменьшается первым уменьшением к нормальной форме (так как это крайний правый редекс), но поскольку не имеет нормальной формы, аппликативный порядок не может найти нормальную форму для .
Напротив, нормальный порядок называется так потому, что он всегда находит нормализующее сокращение, если оно существует. В приведенном выше примере уменьшается в обычном порядке до , нормальная форма. Недостатком является то, что редексы в аргументах могут быть скопированы, что приведет к дублированию вычислений (например, сводится к используя эту стратегию; теперь есть два редекса, поэтому для полной оценки требуется еще два шага, но если бы аргумент был уменьшен первым, теперь не было бы ни одного).
Положительный компромисс использования аппликативного порядка состоит в том, что он не вызывает ненужных вычислений, если используются все аргументы, потому что он никогда не заменяет аргументы, содержащие редексы, и, следовательно, никогда не нужно их копировать (что может дублировать работу). В приведенном выше примере в аппликативном порядке сначала сводится к а затем в обычном порядке , делая два шага вместо трех.
Наиболее чисто функциональные языки программирования (особенно Миранда и его потомков, включая Haskell), а также языки доказательства средства доказательства теорем, использовать ленивая оценка, что по сути то же самое, что и вызов по необходимости. Это похоже на обычное сокращение порядка, но при вызове по необходимости удается избежать дублирования работы, присущего нормальному уменьшению порядка с использованием обмен. В приведенном выше примере сводится к , который имеет два редекса, но при вызове по необходимости они представляются с использованием одного и того же объекта, а не копируются, поэтому, когда один редексируется, другой тоже.
Определение синтаксиса в BNF
Лямбда-исчисление имеет простой синтаксис. Программа лямбда-исчисления имеет синтаксис выражения, где,
Имя | BNF | Описание |
---|---|---|
Абстракция | <выражение> ::= λ <список переменных> . <выражение> | Определение анонимной функции. |
Срок подачи заявки | <выражение> ::= <срок подачи заявления> | |
Заявление | <срок подачи заявления> ::= <срок подачи заявления> <элемент> | Вызов функции. |
Элемент | <срок подачи заявления> ::= <элемент> | |
Переменная | <элемент> ::= <Переменная> | Например. х, у, факт, сумма, ... |
Группировка | <элемент> ::= ( <выражение> ) | Выражение в скобках. |
Список переменных определяется как,
<список переменных> := <Переменная> | <Переменная>, <список переменных>
Синтаксис переменной, используемой учеными-компьютерщиками,
<Переменная> ::= <альфа> <расширение> <расширение> ::= <расширение> ::= <extension-char> <расширение> <extension-char> ::= <альфа> | <цифра> | _
Иногда математики ограничивают переменную одним буквенным символом. При использовании этого соглашения запятая в списке переменных опускается.
Лямбда-абстракция имеет более низкий приоритет, чем приложение, поэтому;
Приложения остаются ассоциативными;
Абстракция с несколькими параметрами эквивалентна нескольким абстракциям одного параметра.
куда,
- x - переменная
- y - список переменных
- z это выражение
Определение в виде математических формул
Проблема переименования переменных сложна. Это определение позволяет избежать проблемы, заменяя все имена каноническими именами, которые строятся на основе положения определения имени в выражении. Подход аналогичен тому, что делает компилятор, но адаптирован для работы в рамках математических ограничений.
Семантика
Выполнение лямбда-выражения происходит с использованием следующих редукций и преобразований:
- α-преобразование -
- β-восстановление -
- η-редукция -
куда,
- каноним - это переименование лямбда-выражения для присвоения стандартным именам выражений в зависимости от положения имени в выражении.
- Оператор замены, это подмена имени с помощью лямбда-выражения в лямбда-выражении .
- Бесплатный набор переменных - это набор переменных, не принадлежащих лямбда-абстракции в .
Выполнение заключается в выполнении β-редукции и η-редукции для подвыражений в канониме лямбда-выражения до тех пор, пока результатом не станет лямбда-функция (абстракция) в нормальная форма.
Все α-преобразования λ-выражения считаются эквивалентными.
Каноним - канонические имена
Каноним - это функция, которая принимает лямбда-выражение и канонически переименовывает все имена в зависимости от их положения в выражении. Это может быть реализовано как,
Где N - это строка «N», F - это строка «F», S - это строка «S», + - конкатенация, а «name» преобразует строку в имя.
Операторы карты
Сопоставьте одно значение с другим, если значение находится на карте. O - пустая карта.
Оператор подстановки
Если L - лямбда-выражение, x - это имя, а y - лямбда-выражение; означает заменить x на y в L. Правила таковы,
Обратите внимание, что правило 1 необходимо изменить, если оно будет использоваться в неканонически переименованных лямбда-выражениях. Видеть Изменения в операторе подстановки.
Свободные и связанные наборы переменных
Набор свободные переменные лямбда-выражения M обозначается как FV (M). Это набор имен переменных, экземпляры которых не связаны (не используются) в лямбда-абстракции внутри лямбда-выражения. Это имена переменных, которые могут быть связаны с переменными формальных параметров извне лямбда-выражения.
Набор связанные переменные лямбда-выражения M обозначается как BV (M). Это набор имен переменных, экземпляры которых связаны (используются) в лямбда-абстракции внутри лямбда-выражения.
Правила для двух наборов приведены ниже.[5]
- Бесплатный набор переменных | Комментарий | - Связанный набор переменных | Комментарий |
---|---|---|---|
где x - переменная | где x - переменная | ||
Свободные переменные M без x | Связанные переменные M плюс x. | ||
Объедините свободные переменные из функции и параметра | Объедините связанные переменные из функции и параметра |
Использование;
- Свободный набор переменных, FV используется выше в определение η-редукции.
- Набор связанных переменных, BV, используется в правиле для β-редекс неканонического лямбда-выражения.
Стратегия оценки
Это математическое определение построено таким образом, что оно представляет результат, а не способ его вычисления. Однако результат может отличаться от ленивого и нетерпеливого оценок. Эта разница описана в формулах оценки.
Приведенные здесь определения предполагают, что будет использоваться первое определение, соответствующее лямбда-выражению. Это соглашение используется, чтобы сделать определение более читаемым. В противном случае потребуются некоторые условия, чтобы определение было точным.
Запуск или оценка лямбда-выражения L является,
куда Q это префикс имени, возможно, пустая строка и оценка определяется как,
Тогда стратегия оценки может быть выбрана как:
Результат может отличаться в зависимости от используемой стратегии. Активная оценка применяет все возможные сокращения, оставляя результат в нормальной форме, в то время как ленивая оценка опускает некоторые сокращения параметров, оставляя результат в «нормальной форме слабой головы».
Нормальная форма
Были применены все возможные сокращения. Это результат применения энергичной оценки.
Во всех остальных случаях
Слабая голова нормальной формы
Были применены сокращения функции (головы), но не все сокращения параметра. Это результат, полученный в результате применения ленивых вычислений.
Во всех остальных случаях
Вывод стандарта из математического определения
Стандартное определение лямбда-исчисления использует некоторые определения, которые можно рассматривать как теоремы, которые могут быть доказаны на основе определение в виде математических формул.
Определение канонического именования решает проблему идентичности переменной путем создания уникального имени для каждой переменной на основе положения лямбда-абстракции для имени переменной в выражении.
Это определение вводит правила, используемые в стандартном определении, и объясняет их с точки зрения определения канонического переименования.
Свободные и связанные переменные
Оператор лямбда-абстракции λ принимает переменную формального параметра и выражение тела. При оценке переменная формального параметра идентифицируется со значением фактического параметра.
Переменные в лямбда-выражении могут быть «связанными» или «свободными». Связанные переменные - это имена переменных, которые уже прикреплены к переменным формальных параметров в выражении.
Говорят, что формальная параметрическая переменная связывает имя переменной везде, где оно встречается в теле. Переменные (имена), которые уже были сопоставлены с переменной формального параметра, называются граница. Все остальные переменные в выражении называются свободный.
Например, в следующем выражении y - связанная переменная, а x - свободная: . Также обратите внимание, что переменная привязана к своей «ближайшей» лямбда-абстракции. В следующем примере единственное вхождение x в выражении связано со второй лямбдой:
Изменения в операторе подстановки
В определении Оператор замены правило,
необходимо заменить на,
Это сделано для того, чтобы остановить замену связанных переменных с тем же именем. Этого бы не произошло в канонически переименованном лямбда-выражении.
Например, предыдущие правила были бы неправильно переведены,
Новые правила блокируют эту замену, поэтому она остается как,
Трансформация
Значение лямбда-выражений определяется тем, как выражения могут быть преобразованы или сокращены.[6]
Есть три вида трансформации:
- α-преобразование: изменение связанных переменных (альфа);
- β-редукция: применение функций к их аргументам (бета), вызывающие функции;
- η-редукция: который отражает понятие протяженности (эта).
Мы также говорим о полученных эквивалентностях: два выражения β-эквивалент, если они могут быть β-преобразованы в одно и то же выражение, и α / η-эквивалентность определяется аналогично.
Период, термин редекс, Короче для сводимое выражение, относится к подтерминам, которые могут быть сокращены одним из правил сокращения.
α-преобразование
Альфа-преобразование, иногда известное как альфа-переименование,[7] позволяет изменять имена связанных переменных. Например, альфа-преобразование может дать . Термины, которые отличаются только альфа-преобразованием, называются α-эквивалент.
При α-преобразовании имена могут быть заменены новыми именами, если новое имя не является свободным в теле, так как это приведет к захвату свободные переменные.
Обратите внимание, что подстановка не будет повторяться в теле лямбда-выражений с формальным параметром из-за изменения оператора подстановки, описанного выше.
См. Пример;
α-преобразование | λ-выражение | Канонически названный | Комментарий |
---|---|---|---|
Оригинальные выражения. | |||
правильно переименуйте y в k, (потому что k не используется в теле) | Нет изменений в каноническом переименованном выражении. | ||
наивно переименовать y в z (неправильно, потому что z свободен в ) | захвачен. |
β-редукция (предотвращение захвата)
β-редукция отражает идею применения функции (также называемую вызовом функции) и реализует замену фактического выражения параметра на формальную переменную параметра. β-восстановление определяется в терминах замещения.
Если имена переменных не указаны свободный в фактическом параметре и граница в теле бета-редукция может выполняться на лямбда-абстракции без канонического переименования.
Альфа-переименование может использоваться на переименовать имена, которые свободны в но связаны , чтобы выполнить предварительное условие для этого преобразования.
См. Пример;
β-редукция | λ-выражение | Канонически названный | Комментарий | ||||
---|---|---|---|---|---|---|---|
Оригинальные выражения. | |||||||
Наивная бета 1, |
| x (P) и y (PN) были захвачены при замене. | |||||
Альфа переименовать внутреннее, x → a, y → b | |||||||
Бета 2, |
| x и y не зафиксированы. |
В этом примере
- В β-редексе
- Свободные переменные:
- Связанные переменные:
- Наивный β-редекс изменил значение выражения, потому что x и y из фактического параметра были захвачены, когда выражения были подставлены во внутренние абстракции.
- Альфа-переименование устранило проблему, изменив имена x и y во внутренней абстракции, чтобы они отличались от имен x и y в фактическом параметре.
- Свободные переменные:
- Связанные переменные:
- Затем β-редекс продолжился с предполагаемым значением.
η-редукция
η-редукция выражает идею протяженность, что в данном контексте состоит в том, что две функции одинаковы если и только если они дают одинаковый результат для всех аргументов.
η-сокращение может использоваться без изменений для лямбда-выражений, которые не переименовываются канонически.
Проблема с использованием η-редекса, когда f имеет свободные переменные, показана в этом примере:
Снижение | Лямбда-выражение | β-редукция |
---|---|---|
Наивное η-сокращение |
Это неправильное использование η-редукции меняет смысл, оставляя Икс в незамещенный.
Рекомендации
- ^ Барендрегт, Хендрик Питер (1984), Лямбда-исчисление: его синтаксис и семантика, Исследования по логике и основам математики, 103 (Пересмотренное издание), Северная Голландия, Амстердам., ISBN 978-0-444-87508-2, заархивировано из оригинал на 2004-08-23— Исправления
- ^ «Пример правил ассоциативности». Lambda-bound.com. Получено 2012-06-18.
- ^ Селинджер, Питер (2008), Конспект лекций по лямбда-исчислению (PDF), 0804, Департамент математики и статистики Оттавского университета, стр. 9, arXiv:0804.3434, Bibcode:2008arXiv0804.3434S
- ^ «Пример правила ассоциативности». Lambda-bound.com. Получено 2012-06-18.
- ^ а б Барендрегт, Хенк; Барендсен, Эрик (март 2000 г.), Введение в лямбда-исчисление (PDF)
- ^ а б де Кейруш, Руй Ж. "Теоретико-доказательственный подход к программированию и роли правил редукции. " Диалектика 42(4), страницы 265-282, 1988.
- ^ а б Турбак, Франклин; Гиффорд, Дэвид (2008), Концепции дизайна на языках программирования, MIT press, стр. 251, ISBN 978-0-262-20175-9