403
правки
Изменения
Нет описания правки
{{В разработке}}
Алонзо Чёрчем. Лямбда-функция является, по сути, анонимной функцией.
Эта концепция показала себя удобной и сейчас активно используется во многих
языках программирования.
Более формально, \emph{''лямбда-функцию} '' (или, \emph{''лямбда-терм}'') можно задать
следующей грамматикой:
{{Определение$$|definition=<tex>
\begin{array}{r c l}
\langle Term \rangle & ::= & \langle Variable \rangle \\
\langle Variable \rangle & ::= & \langle Char \rangle *\\
\end{array}
В первом случае функция является просто переменной.
Во втором происходит \emph{''аппликация} '' (\emph{''применение}'') одной функции к другой.
Это аналогично вычислению функции-левого операнда на аргументе-правом операнде.
В третьем~{{--- \emph{}} ''абстракция} '' по переменной. В данном случае происходит
создание функции одного аргумента с заданными именем аргумента и телом функции.
Рассмотрим, например, функцию |<tex>id = \lambda x \to x -</tex> x|. Эта функция принимает аргумент и
возвращает его неизменённым. Например,
Ещё один пример функции: |<tex>sum = \lambda x -> \to \lambda y -> \to x + y|. Эта функция двух аргументов,
которая возвращает их сумму. Правда, здесь мы немного вышли за написанную выше грамматику.
Ну да ладно. |<tex>sum 2 3 == 5|</tex>
дереве разбора были абстракции. Все остальные переменные называются свободными.
Например, в |<tex>\lambda x -> \to \lambda y -\to x</tex> x|, |<tex>x| </tex> связана, а |<tex>y|~</tex>{{--- }} свободна. А в |<tex>\lambda y -> \to x (\lambda x -> \to x)|</tex>в своём первом вхождении переменная |<tex>x| </tex> свободна, а во втором~{{--- }} связана.
Рассмотрим функции |<tex>\lambda y -\to y</tex> y| и |<tex>\lambda x -\to y</tex> y|. В первой из них при взгляде на |<tex>y|</tex>
понятно, что она имеет отношение к переменной, по которой производилась
абстракция. Если по одной и той же
переменной абстракция производилась более одного раза, то переменная связана
с самым поздним (самым нижним в дереве разбора) абстрагированием. Например, в
Рассмотрим функции |<tex>(\lambda x -> \to x) z| </tex> и |<tex>(\lambda y -> \to y) z|</tex>. Интуитивно понятно, что они
являются одинаковыми.
Функции, получающиеся одна из другой с помощью $<tex>\alpha$</tex>-конверсий, называются \emph{$''<tex>\alpha$</tex>-эквивалентными} '' и обозначаются $<tex>f \equiv_\alpha g$</tex>.
Функции |<tex>\lambda x -> \to \lambda y -> \to x y z| </tex> и |<tex>\lambda a -> \to \lambda x -> \to a x z| </tex> являются $<tex>\alpha$</tex>-эквивалентными,а |<tex>\lambda x -> \to \lambda y -> \to y z| </tex> и |<tex>\lambda y -> \to \lambda x -> \to y z|~</tex> {{--- }} нет.
\subsection{$\beta$-редукция}