Исчисление лямбды | ОАО Российская Авиакомпания «ЭРЛЕН»®

Исчисление лямбды

 
Новые знания!

Исчисление лямбды

 

Исчисление лямбды (также письменный как λ-calculus) является формальной системой в математической логике для того, чтобы выразить вычисление посредством переменного закрепления и замены. Это было сначала сформулировано Алонзо Черчем как способ формализовать математику через понятие функций, в отличие от области теории множеств. Хотя не очень успешный в этом отношении, исчисление лямбды нашло ранние успехи в области теории исчисляемости, такие как отрицательный ответ на Entscheidungsproblem Хилберта.

Из-за важности понятия переменного закрепления и замены, нет всего одной системы исчисления лямбды. Исторически, самая важная система была ненапечатанным исчислением лямбды. В ненапечатанном исчислении лямбды у применения функции нет ограничений (таким образом, понятие области функции не встроено в систему). В Church–Turing Тезис, ненапечатанное исчисление лямбды, как утверждают, способно к вычислению всех эффективно измеримых функций. Напечатанное исчисление лямбды - разнообразие, которое ограничивает применение функции, так, чтобы функции могли только быть применены, если они способны к принятию "типа" данного входа данных.

Сегодня, у исчисления лямбды есть применения во многих различных областях в математике, философии и информатике. Это все еще используется в области теории исчисляемости, хотя машины Turing - возможно привилегированная модель для вычисления. Исчисление лямбды играло важную роль в развитии теории языков программирования. Самые видные копии исчислению лямбды в информатике - функциональные языки программирования, которые по существу осуществляют исчисление (увеличенный с некоторыми константами и datatypes). Вне языков программирования у исчисления лямбды также есть много применений в теории доказательства. Главный пример этого Curry–Howard корреспонденция, которая дает корреспонденцию между различными системами напечатанных исчислений лямбды и системами формальной логики.

Исчисление лямбды в истории математики

Исчисление лямбды было введено церковью математика Алонзо в 1930-ых как часть расследования фондов математики. Оригинальная система, как показывали, была логически непоследовательна в 1935, когда Стивен Клин и Дж. Б. Россер развились Kleene–Rosser парадокс.

Впоследствии, в 1936 церковь изолировала и издала просто часть, относящуюся к вычислению, что теперь называют ненапечатанным исчислением лямбды. В 1940 он также ввел в вычислительном отношении более слабую, но логически последовательную систему, известную как просто напечатанное исчисление лямбды.

Неофициальное описание

Побуждение

Рекурсивные функции - фундаментальное понятие в пределах информатики и математики. λ-calculus обеспечивает простую семантику для вычисления, позволяя свойствам вычисления быть изученным формально.

Рассмотрите следующий двум примерам. Функция идентичности

:

берет единственный вход, и немедленно возвращается (то есть идентичность ничего не делает со своим входом), тогда как функция

:

берет пару входов, и и возвращает сумму их квадратов. Используя эти два примера, мы можем сделать некоторые полезные наблюдения, которые мотивируют главные идеи в исчислении лямбды.

Первое наблюдение состоит в том, что функции нельзя явно назвать. Таким образом, функция

:

может быть переписан в анонимной форме как

:

(читайте как “пара, и нанесен на карту к”). Точно так же

:

может быть переписан в анонимной форме как, где вход просто нанесен на карту к себе.

Второе наблюдение состоит в том, что определенный выбор названия аргументов функции в основном не важен. Таким образом,

: и

:

выразите ту же самую функцию: идентичность. Точно так же

: и

:

также выразите ту же самую функцию.

Наконец, любая функция, которая требует двух входов, например перед упомянутой функцией, может быть переделана в эквивалентную функцию, которая принимает единственный вход, и поскольку продукция возвращает другую функцию, которая в свою очередь принимает единственный вход. Например,

:

может быть переделан в

:

Это преобразование называют, приправляя карри, то есть преобразовывая функцию, которая берет многократные аргументы таким способом, которым это можно назвать как цепь функций каждый с единственным аргументом (частичное применение). Это может быть обобщено к функциям, принимающим произвольное число аргументов.

Приправление карри может быть лучше всего схвачено интуитивно с помощью примера. Сравните функцию

:

с его формой с приправой карри,

:

Применяя функцию к аргументам (5, 2), мы имеем:

:

:

Однако, используя приправление карри, мы имеем:

:

:

:

и мы видим, что формы с приправой карри и нес приправой карри вычисляют тот же самый результат. Заметьте, что x*x стал константой после первого назначения аргумента.

Исчисление лямбды

Исчисление лямбды состоит из языка условий лямбды наряду с эквациональной теорией (который может также быть понят оперативно).

Так как названия функций - в основном удобство, у исчисления лямбды нет средств обозначения функции. Так как все функции, ожидающие больше чем один вход, могут быть преобразованы в эквивалентные функции, принимающие единственный вход (через Приправление карри), у исчисления лямбды нет средств для того, чтобы создать функцию, которая принимает больше чем один аргумент. Так как названия аргументов в основном не важны, родное понятие равенства на условиях лямбды - альфа-эквивалентность (см. ниже), который шифрует этот принцип.

Условия лямбды

Синтаксис условий лямбды особенно прост. Есть три пути, которыми можно получить их:

  • термин лямбды может быть переменной;
  • если термин лямбды, и переменная, то термин лямбды (названный абстракцией лямбды);
  • если и условия лямбды, то термин лямбды (названный применением).

Ничто иное не термин лямбды, хотя заключение в скобки может использоваться и может быть необходимо, чтобы снять неоднозначность условий. Например, и обозначьте различные условия.

Интуитивно, абстракция лямбды представляет анонимную функцию, которая берет единственный вход и сказанного, чтобы связать в, и применение представляет применение входа к некоторой функции. В исчислении лямбды функции взяты, чтобы быть ценностями первого класса, таким образом, функции могут использоваться в качестве входов к другим функциям, и функции могут возвратить функции как свои продукции.

Например, представляет функцию идентичности, и представляет функцию идентичности, к которой относятся. Далее, представляет постоянную функцию, функция, которая всегда возвращается </tt> y </tt>, независимо от того вход. Нужно отметить, что применение функции лево-ассоциативно, таким образом.

Условия лямбды самостоятельно не особенно интересны.

Что делает их интересными, различные понятия эквивалентности и сокращения, которое может быть определено по ним.

Альфа-эквивалентность

Каноническая форма эквивалентности, определимой на условиях лямбды, является альфа-эквивалентностью. Это захватило интуицию, что особый выбор связанной переменной, в абстракции лямбды, (обычно) не имеет значения.

Например, и эквивалентные альфе условия лямбды, представляя ту же самую функцию идентичности.

Обратите внимание на то, что условия и не эквивалентны альфе, потому что они не связаны в абстракции лямбды.

Во многих представлениях обычно идентифицировать эквивалентные альфе условия лямбды.

Следующие определения необходимы, чтобы быть в состоянии определить бету-редукцию.

Свободные переменные

Свободные переменные термина - те переменные, не связанные абстракцией лямбды.

Таким образом, свободные переменные справедливы; свободные переменные являются свободными переменными с удаленным, и свободные переменные являются союзом свободных переменных и.

Например, у термина лямбды, представляющего идентичность, нет свободных переменных, но у постоянной функции есть единственная свободная переменная.

Избегающие захвата замены

Используя определение свободных переменных, мы можем теперь определить избегающую захвата замену.

Предположим, и условия лямбды и и переменные.

Мы пишем для замены для в в избегающей захвата манере.

Это:

  • ;
  • если;
  • ;
  • ;
  • если и не находится в свободных переменных (иногда говорил, "новое для").

Например, и.

Условие свежести (требующий этого не находится в свободных переменных) крайне важно, чтобы гарантировать, что замена не изменяет значение функций.

Например, предположите, что мы определяем другое действие замены без условия свежести.

Тогда, и постоянная функция превращается в идентичность заменой.

Если наше условие свежести не соблюдают, то мы можем, просто альфа - переименовывает с соответственно новой переменной.

Например, переключение назад на наше правильное понятие замены, в абстракции лямбды может быть переименовано с новой переменной, чтобы получить, и значение функции сохранено заменой.

Бета-редукция

Бета-редукция заявляет, что применение формы уменьшает до термина (мы пишем, когда удобная стенография для “беты уменьшает до”).

Например, для каждого мы имеем, демонстрируя, который действительно является идентичностью.

Точно так же, демонстрация, которая действительно является постоянной функцией.

Исчисление лямбды может быть замечено как идеализированный функциональный язык программирования, как Хаскелл или Стэндард МЛ.

Под этим представлением бета-редукция соответствует вычислительному шагу, и в ненапечатанном исчислении лямбды, как представлено здесь, сокращение не должно закончиться.

Например, рассмотрите термин.

Здесь, мы имеем.

Таким образом, термин уменьшает до себя в единственной бете-редукции, и поэтому сокращение никогда не будет заканчиваться.

Другая проблема с ненапечатанным исчислением лямбды - неспособность различить различные виды данных.

Например, мы можем хотеть написать функцию, которая только воздействует на числа.

Однако, в ненапечатанном исчислении лямбды, нет никакого способа препятствовать тому, чтобы наша функция была применена к ценностям правды или последовательностям, например.

У

напечатанных исчислений лямбды, которые будут введены позже в статье, есть собственность что, если термин хорошо напечатан, то это никогда не вовлекает (где нет никакого правила оценки для термина), и что, если у термина есть особый тип, и, то имеет тот же самый тип.

Формальное определение

Определение

Выражения лямбды составлены из

:variables v, v..., v...

Символы абстракции:the λ и.

:parentheses ()

Набор выражений лямбды, Λ, может быть определен рекурсивно:

  1. Если x - переменная, то x ∈ Λ
  2. Если x - переменная и M ∈ Λ, то (λx. M) ∈ Λ
  3. Если M, N ∈ Λ, то (M N) ∈ Λ

Случаи правила 2 известны как абстракции, и случаи правила 3 известны как заявления.

Примечание

Чтобы сохранять примечание выражений лямбды незагроможденным, следующие соглашения обычно применяются.

  • Уронены наиболее удаленные круглые скобки: M N вместо (M N).
  • Заявления, как предполагается, оставляют ассоциативными: M N P может быть написан вместо ((M N) P).
  • Тело абстракции расширяет максимально далекое право: λx. M N означает λx. (M N) и не (λx. M) N.
  • Последовательность абстракций законтрактована: λx.λy.λz. N сокращен как λxyz. N.

Свободные и связанные переменные

Оператор абстракции, λ, как говорят, связывает ее переменную везде, где это происходит в теле абстракции. Переменные, которые находятся в пределах области лямбды, как говорят, связаны. Все другие переменные называют свободными. Например, в следующем выражении y связанная переменная, и x свободен:. также обратите внимание на то, что переменная связывает с ее "самой близкой" лямбдой. В следующем выражении одно единственное возникновение x связано второй лямбдой:

Набор свободных переменных выражения лямбды, M, обозначен как FV (M) и определен рекурсией на структуре условий, следующим образом:

  1. FV (x) = {x}, где x - переменная
  1. FV (λx. M) = FV (M) \{x}
  1. FV (M N) = FV (M) ∪ FV (N)

Выражение, которое не содержит свободных переменных, как говорят, закрыто. Закрытые выражения лямбды также известны как combinators и эквивалентны условиям в комбинаторной логике.

Сокращение

Значение выражений лямбды определено тем, как могут быть уменьшены выражения.

Есть три вида сокращения:

  • α-conversion: изменение связанных переменных;
  • β-reduction: применение функций к их аргументам;
  • η-conversion: который захватил понятие extensionality.

Мы также говорим о получающихся эквивалентностях: два выражения - β-equivalent, если они могут быть β-converted в то же самое выражение, и α/η-equivalence определены так же.

Термин redex, короткий для приводимого выражения, относится к подусловиям, которые могут быть уменьшены по одному из правил сокращения. Например, бета-redex; если не свободно в, эта-redex. Выражение, до которого redex уменьшает, называют его перетрубочкой; используя предыдущий пример, перетрубочки этих выражений соответственно и.

α-conversion

Альфа-преобразование, иногда известное как переименование альфы, позволяет именам связанной переменной быть измененными. Например, альфа-преобразование могло бы уступить. Условия, которые отличаются только альфа-преобразованием, называют α-equivalent. Часто в использовании исчисления лямбды, α-equivalent условия, как полагают, эквивалентны.

Точные правила для альфа-преобразования не абсолютно тривиальны. Во-первых, когда преобразование альфы, абстракция, единственные переменные возникновения, которые переименованы, являются теми, которые связаны с той же самой абстракцией. Например, альфа-преобразование могло привести к, но оно не могло привести к. У последнего есть различное значение из оригинала.

Во-вторых, альфа-преобразование не возможно, если оно привело бы к переменной, захваченной различной абстракцией. Например, если мы заменяем в, мы добираемся, который нисколько не является тем же самым.

На языках программирования со статической областью альфа-преобразование может использоваться, чтобы принять решение имени, более простое, гарантируя, что никакое имя переменной не маскирует имя в содержании области (см., что альфа переименовывает, чтобы принять тривиальное решение имени).

Замена

Замена, письменная, является процессом замены всех свободных возникновений переменной по выражению.

Замена на условиях λ-calculus определена рекурсией на структуре условий, следующим образом.

:

:

:

:

:

Чтобы занять место в абстракцию лямбды, это иногда необходимо для α-convert выражение. Например, это не правильно для привести к, потому что замененный, как предположилось, был свободен, но закончил тем, что был связан. Правильная замена в этом случае до α-equivalence. Заметьте, что замена определена уникально до α-equivalence.

&beta;-reduction

Бета-редукция захватила идею применения функции. Бета-редукция определена с точки зрения замены: бета-редукция.

Например, принимая некоторое кодирование, у нас есть следующий β-reductions: →.

&eta;-conversion

Преобразование эты выражает идею extensionality, который в этом контексте является, что две функции - то же самое, если и только если они дают тот же самый результат для всех аргументов. Преобразование эты преобразовывает между и всякий раз, когда не кажется свободным в.

Нормальные формы и слияние

Для ненапечатанного исчисления лямбды β-reduction, поскольку правило переписывания ни сильно не нормализует, ни слабо нормализует.

Однако, можно показать, что β-reduction - приток реки. (Конечно, мы работаем до α-conversion, то есть мы полагаем, что две нормальных формы равны, если это возможно к α-convert один в другой.)

Поэтому, у и сильно нормализующих условий и слабо нормализующих условий есть уникальная нормальная форма. Для того, чтобы сильно нормализовать условия, любая стратегия сокращения, как гарантируют, приведет к нормальной форме, тогда как для того, чтобы слабо нормализовать условия, некоторые стратегии сокращения могут не найти его.

Кодирование datatypes

Основное исчисление лямбды может использоваться, чтобы смоделировать booleans, арифметику, структуры данных и рекурсию, как иллюстрировано в следующих подразделах.

Арифметика в исчислении лямбды

Есть несколько возможных способов определить натуральные числа в исчислении лямбды, но безусловно наиболее распространенными являются церковные цифры, которые могут быть определены следующим образом:

:

:

:

:

и так далее. Или использование дополнительного синтаксиса, представленного выше в Примечании:

:

:

:

:

Церковная цифра - функция высшего порядка — она берет функцию единственного аргумента и возвращает другую функцию единственного аргумента. Церковная цифра - функция, которая берет функцию в качестве аргумента и возвращает-th состав, то есть функция, составленная с собой времена. Это обозначено и является фактически-th властью (рассмотренный как оператор); определен, чтобы быть функцией идентичности. Такие повторные составы (единственной функции) повинуются законам образцов, который является, почему эти цифры могут использоваться для арифметики. (В оригинальном исчислении лямбды церкви формальный параметр выражения лямбды потребовался, чтобы происходить, по крайней мере, однажды в теле функции, которое сделало вышеупомянутое определение невозможных.)

Мы можем определить функцию преемника, которая берет число и возвращается, добавляя дополнительное приложение:

:

Поскольку-th состав составленных с-th составом дает-th состав, дополнение может быть определено следующим образом:

:

может считаться функцией, берущей два натуральных числа в качестве аргументов и возвращающей натуральное число; это может быть проверено это

:

и

:

эквивалентные выражения лямбды. Начиная с добавления к числу может быть достигнут, добавляя 1 раз, эквивалентное определение:

:

Точно так же умножение может быть определено как

:

Альтернативно

:

начиная с умножения и совпадает с повторением добавить времен функции и затем применением его к нолю.

У

возведения в степень есть довольно простое предоставление в церковных цифрах, а именно,

:

Функция предшественника, определенная для положительного целого числа и, значительно более трудная. Формула

:

может быть утвержден, показывая индуктивно это, если T обозначает, то для. Два других определения даны ниже, условные предложения использования и другие пары использования. С функцией предшественника вычитание прямое. Определение

:,

урожаи, когда и иначе.

Логика и предикаты

В соответствии с соглашением, следующие два определения (известный как церковь booleans) используются для булевых ценностей и:

:

:

:: (Обратите внимание на то, что это эквивалентно церковному нолю цифры, определенному выше)

,

Тогда, с этими двумя λ-terms, мы можем определить некоторые логические операторы (это просто возможные формулировки; другие выражения одинаково правильны):

:

:

:

:

Мы теперь в состоянии вычислить некоторые логические функции, например:

:

::

::

и мы видим, что это эквивалентно.

Предикат - функция, которая возвращает булево значение. Самый фундаментальный предикат, который возвращается, если его аргумент - церковная цифра, и если его аргумент - какая-либо другая церковная цифра:

:

Следующий предикат проверяет, являются ли первым аргументом меньше, чем или равный второму:

:,

и с тех пор, если и, это прямо, чтобы построить предикат для числового равенства.

Доступность предикатов и вышеупомянутое определение и делают удобным тогда еще написать выражения "если" в исчислении лямбды. Например, функция предшественника может быть определена как:

:

который может быть проверен, показывая индуктивно, что это - добавление − 1 функция для> 0.

Пары

Пара (с 2 кортежами), может быть определена с точки зрения и, при помощи церковного кодирования для пар. Например, заключает в капсулу пару (), возвращает первый элемент пары и возвращает второе.

:

:

:

:

:

Связанный список может быть определен или как НОЛЬ для пустого списка, или как элемента и меньшего списка. Предикат проверяет на ценность. (Альтернативно, с, конструкция устраняет потребность в явном ПУСТОМ тесте).

Как пример использования пар, функция shift-and-increment, которая наносит на карту к, может быть определена как

:

который позволяет нам давать, возможно, самую прозрачную версию функции предшественника:

:

Рекурсия и фиксированные точки

Рекурсия - определение функции, используя саму функцию; на первый взгляд исчисление лямбды не позволяет это (мы не можем обратиться к ценности, которая должна все же быть определена в термине лямбды, определяющем ту же самую ценность, как все функции анонимные в исчислении лямбды). Однако, это впечатление вводит в заблуждение: in&ensp; &ensp;both x&thinsp; относятся к тому же самому термину лямбды, y, таким образом, это возможно для выражения лямбды – здесь y – быть устроенным, чтобы получить себя как его ценность аргумента, через самоприменение.

Считайте, например, функцию факториала рекурсивно определенной

:.

В выражении лямбды, которое должно представлять эту функцию, параметр (как правило первый), как будет предполагаться, получит само выражение лямбды как его ценность, так, чтобы, называя ее – применение его к аргументу – составит рекурсию. Таким образом, чтобы достигнуть рекурсии, намеченное как сам ссылку на аргумент (названный здесь) нужно всегда передавать к себе в пределах тела функции в пункте требования:

:

::: with&ensp; &ensp;to держатся, so&ensp; &ensp;and

:

Самоприменение достигает ответа здесь, передавая выражение лямбды функции на следующую просьбу как ценность аргумента, делая его доступным, чтобы быть сосланным и названным там.

Это решает определенную проблему функции факториала, но мы хотели бы иметь родовое решение, то есть не принуждение определенного переписывает для каждой рекурсивной функции:

:

::: with&ensp; &ensp;to держатся, so&ensp; &ensp;and

: &ensp;where&ensp;

::: так that&ensp;

Учитывая термин лямбды с первым аргументом, представляющим рекурсивный вызов (например, здесь), комбинатор неподвижной точки возвратит выражение лямбды самомультиплицирования, представляющее рекурсивную функцию (сюда). Функцию не должны явно передать к себе ни в каком пункте, поскольку самоответ устроен заранее, когда это создано, чтобы быть сделанным каждый раз, когда это называют. Таким образом оригинальное выражение лямбды обновлено в себе, в пункте требования, достигая самоссылки.

Фактически, есть много возможных определений для этого оператора, самого простого из них быть:

:

В исчислении лямбды, &thinsp; фиксированная точка, когда она расширяется до:

:

:

:

:

:

Теперь, чтобы выполнить наш рекурсивный вызов к функции факториала, мы просто звонили бы ,  где n - число, мы вычисляем факториал. Данный n = 4, например, это дает:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

Каждая рекурсивно определенная функция может быть замечена как фиксированная точка некоторой соответственно определенной функции, закрывающейся по рекурсивному вызову с дополнительным аргументом, и поэтому, использование, каждая рекурсивно определенная функция может быть выражена как выражение лямбды. В частности мы можем теперь чисто определить вычитание, умножение и предикат сравнения натуральных чисел рекурсивно.

Стандартные условия

Определенные условия обычно принимали имена:

:

:

:

:

:

:

Напечатанные исчисления лямбды

Вычислимые функции и исчисление лямбды

Функция F: NN натуральных чисел вычислимая функция, если и только если там существует выражение f лямбды, таким образом это для каждой пары x, y в N, F (x) =y если и только если f  = ,  где и церковные цифры, соответствующие x и y, соответственно и = значение эквивалентности с бетой-редукцией. Это - один из многих способов определить исчисляемость; см. церковный-Turing тезис для обсуждения других подходов и их эквивалентности.

Неразрешимость эквивалентности

Нет никакого алгоритма, который берет в качестве входа два выражения лямбды и продукции или в зависимости от того, эквивалентны ли эти два выражения. Это было исторически первой проблемой, для которой могла быть доказана неразрешимость. Как характерно для доказательства неразрешимости, доказательство показывает, что никакая вычислимая функция не может решить эквивалентность. Тезис церкви тогда призван, чтобы показать, что никакой алгоритм не может сделать так.

Доказательство церкви сначала уменьшает проблему до определения, есть ли у данного выражения лямбды нормальная форма. Нормальная форма - эквивалентное выражение, которое не может быть уменьшено дальше по правлениям, навязавшим формой. Тогда он предполагает, что этот предикат вычислим, и может следовательно быть выражен в исчислении лямбды. Здание ранее работает Kleene и строительством нумерации Gödel для выражений лямбды, он строит выражение лямбды, которое близко следует за доказательством первой теоремы неполноты Геделя. Если относится его собственное число Gödel, противоречие заканчивается.

Исчисление лямбды и языки программирования

Как указано газетой Питера Лэндина 1965 года, последовательные процедурные языки программирования могут быть поняты с точки зрения исчисления лямбды, которое обеспечивает основные механизмы для процедурной абстракции и процедуры (подпрограмма) применение.

Исчисление лямбды овеществляет "функции" и делает их первоклассными объектами, который поднимает сложность внедрения, когда это осуществлено.

Первоклассные функции

Например, в Шепелявости 'квадратная' функция может быть выражена как выражение лямбды следующим образом:

(лямбда (x) (* x x))

</источник>

или то же самое, выраженное в Хаскелле:

\x-> x*x - где \обозначает греческий λ

</источник>

Вышеупомянутый пример - выражение, которое оценивает к первоклассной функции. Символ создает анонимную функцию, учитывая список названий параметра, &mdash; просто единственный аргумент в этом случае и выражение, которое оценено как тело функции. Пример Хаскелла идентичен. Анонимные функции иногда вызываются выражения лямбды.

Например, Паскаль и много других обязательных языков долго поддерживали мимолетные подпрограммы как аргументы другим подпрограммам через механизм указателей функции. Однако, указатели функции не достаточное условие для функций, чтобы быть первым классом datatype, потому что, если и только если новые случаи функции могут быть созданы во время, которым управляют, функции - первый класс datatype. И это создание во время выполнения функций поддержано в C ++, Smalltalk, и позже в Скале, Eiffel ("агенты") и C# ("делегаты"), среди других.

Ниже пример, выраженный как Eiffel "действующий агент"

агент (x: РЕАЛЬНЫЙ): РЕАЛЬНЫЙ действительно Закончитесь: = x * x конец

</источник>

Объект соответствует выражению лямбды λx.x*x (с вызовом по значению), потому что это может назначаться на переменную или раздаваться к рутинам, то есть рассматриваться как любое другое выражение.

Пример Питона этого использует форму лямбды функций:

func = лямбда x: x ** 2

</источник>

Это создает новую анонимную функцию и называет ее func, который можно передать к другим функциям, сохраненным в переменных, и т.д. Питон может также рассматривать любую другую функцию, созданную со стандартным заявлением определения как первоклассные объекты.

То же самое держится для выражения Smalltalk

[:x | x * x]

</источник>

Это - первоклассный объект (закрытие блока), который может быть сохранен в переменных, которые передают как аргументы, и т.д.

Подобное выражение, используя C ++ 11 анонимных функций, но определенно для целых чисел:

[] (интервал i)-> интервал {возвращаются i * я;}

</источник>

В JavaScript начиная с версии 1.8, примечания:

функционируйте (x) x*x;

</источник>

используется. В более старых версиях

функционируйте (x) {возвращают x*x;}

</источник>

В Скале:

(x:Int) => x*x

</источник>

В F#:

(забава x-> x * x)

</источник>

В D:

x => x * x//, когда тип параметра может быть выведен

(интервал x) => x * x//, когда тип параметра должен быть определен

</источник>

Стратегии сокращения

Нормализует ли термин или нет, и сколько работы должно быть сделано в нормализации его, если это, зависит в большой степени от используемой стратегии сокращения. Различие между стратегиями сокращения касается различия на функциональных языках программирования между нетерпеливой оценкой и ленивой оценкой.

Полная бета-редукции: В любое время может быть уменьшен любой redex. Это означает по существу нехватку любой особой стратегии сокращения — относительно reducibility, "все ставки прочь".

Применимый заказ: самый правый, самый внутренний redex всегда уменьшается сначала. Интуитивно это означает, что аргументы функции всегда уменьшаются перед самой функцией. Применимый заказ всегда пытается применить функции к нормальным формам, даже когда это не возможно.

Языки программирования:Most (включая Шепелявость, ML и обязательные языки как C и Ява) описаны как "строгие", означая, что функции, к которым относятся ненормализация аргументов, ненормализуют. Это сделано, по существу используя применимый заказ, сокращение вызова по значению (см. ниже), но обычно называемый "нетерпеливая оценка".

Нормальный заказ: крайний левый, наиболее удаленный redex всегда уменьшается сначала. Таким образом, всякий раз, когда возможный аргументами заменяют в тело абстракции прежде, чем аргументы будут уменьшены.

Вызов по имени: Как нормальный порядок, но никакие сокращения выполнены в абстракциях. Например, находится в нормальной форме согласно этой стратегии, хотя это содержит redex.

Вызов по значению: Только наиболее удаленные redexes уменьшены: redex уменьшен только, когда его правая сторона уменьшила до ценности (переменная или абстракция лямбды).

Вызов по необходимости: Как нормальный заказ, но приложения функции, которые дублировали бы условия вместо этого, называют аргумент, который тогда уменьшен только, "когда это необходимо". Названный в практических контекстах "ленивая оценка". Во внедрениях это "имя" принимает форму указателя с redex, представленным thunk.

Применимый заказ не стратегия нормализации. Обычный контрпример следующие: определите где. Это все выражение содержит только один redex, а именно, целое выражение; его перетрубочка снова. Так как это - единственное доступное сокращение, не имеет никакой нормальной формы (в соответствии ни с какой стратегией оценки). Используя применимый заказ, выражение уменьшено первым сокращением до нормальной формы (так как это - самый правый redex), но так как не имеет никакой нормальной формы, применимый заказ не находит нормальную форму для.

Напротив, нормальный заказ так называется, потому что он всегда находит сокращение нормализации, если Вы существуете. В вышеупомянутом примере, уменьшает согласно нормальному распоряжению до меня, нормальной форме. Недостаток состоит в том, что redexes в аргументах может быть скопирован, приводя к дублированному вычислению (например, уменьшает до использования этой стратегии; теперь есть два redexes, таким образом, полная оценка нуждается в еще двух шагах, но если бы аргумент был уменьшен сначала, теперь не было бы ни одного).

Положительный обмен использования применимого заказа состоит в том, что это не вызывает ненужное вычисление, если все аргументы используются, потому что это никогда не заменяет аргументами, содержащими redexes, и следовательно никогда не должно копировать их (который дублировал бы работу). В вышеупомянутом примере, в применимом заказе уменьшает сначала до и затем до нормального заказа, делая два шага вместо три.

Наиболее чисто функциональные языки программирования (особенно Миранда и его потомки, включая Хаскелла), и языки доказательства программ автоматического доказательства теоремы, используют ленивую оценку, которая является по существу тем же самым как вызовом по необходимости. Это походит на нормальное сокращение заказа, но вызову по необходимости удается избежать дублирования работы, врожденной от нормального разделения использования сокращения заказа. В примере, данном выше, уменьшает до, у которого есть два redexes, но в вызове по необходимости они представлены, используя тот же самый объект, а не скопированы, поэтому когда каждый уменьшен другой, также.

Примечание о сложности

В то время как идея беты-редукции кажется достаточно простой, это не атомный шаг, в котором у этого должна быть нетривиальная стоимость, оценивая вычислительную сложность. Чтобы быть точным, нужно так или иначе найти местоположение всех возникновений связанной переменной в выражении, подразумевая стоимость времени, или нужно отслеживать эти местоположения в некотором роде, подразумевая космическую стоимость. Наивный поиск местоположений в является O (n) в длине n. Это привело к исследованию систем, которые используют явную замену. Директор Синота натягивает, предлагают способ отследить местоположения свободных переменных в выражениях.

Параллелизм и параллелизм

Церковная-Rosser собственность исчисления лямбды означает, что оценка (β-reduction) может быть выполнена в любом заказе, даже параллельно. Это означает, что различные недетерминированные стратегии оценки релевантны. Однако, исчисление лямбды не предлагает явных конструкций для параллелизма. Можно добавить конструкции, такие как Фьючерс к исчислению лямбды. Другие исчисления процесса были развиты для того, чтобы описать коммуникацию и параллелизм.

Семантика

Факт, что акт условий исчисления лямбды как функции на других условиях исчисления лямбды, и даже на себе, привел к вопросам о семантике исчисления лямбды. Разумное значение могло быть назначено на условия исчисления лямбды? Естественная семантика должна была найти, что набор D изоморфный к функции делает интервалы между DD функций на себе. Однако, нет нетривиальный такой D может существовать ограничениями количества элементов, потому что у набора всех функций от D в D есть большее количество элементов, чем D.

В 1970-ых Дана Скотт показала, что, если только непрерывные функции рассмотрели, набор или область D с необходимой собственностью могли быть найдены, таким образом обеспечивая модель для исчисления лямбды.

Эта работа также сформировала основание для denotational семантики языков программирования.

См. также

  • Двойное Исчисление Лямбды – версия исчисления лямбды с двойным вводом / выводом, двойным кодированием условий и определяемой универсальной машиной.
  • Формула Harrop – Своего рода конструктивная логическая формула, таким образом, что доказательства - условия лямбды
  • Kleene–Rosser парадокс – демонстрация, что некоторая форма исчисления лямбды непоследовательна
  • Куб лямбды – структура для некоторых расширений напечатанного исчисления лямбды

</отделение>

Далее чтение

Монографии/учебники для аспирантов:

  • Мортен Хейн Сыренсен, Paweł Urzyczyn, Лекции по изоморфизму Карри-Howard, Elsevier, 2006, ISBN 0-444-52077-5 являются недавней монографией, которая затрагивает главные темы исчисления лямбды от разнообразия без типов, к наиболее напечатанным исчислениям лямбды, включая более свежие события как чистые системы типа и куб лямбды. Это не покрывает расширения подпечатания.
  • исчисления лямбды покрытий с практической системной точки зрения типа; некоторые темы как зависимые типы только упомянуты, но подпечатание - важная тема.

Некоторые части этой статьи основаны на материале от FOLDOC, используемого с.

Внешние ссылки