<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5</id>
	<title>Лямбда-исчисление - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;action=history"/>
	<updated>2026-07-18T23:11:06Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=9176&amp;oldid=prev</id>
		<title>~2026-19541-98: добавил забытую &lt;/tt&gt;</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=9176&amp;oldid=prev"/>
		<updated>2026-03-29T18:57:21Z</updated>

		<summary type="html">&lt;p&gt;добавил забытую &amp;lt;/tt&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Ля́мбда-исчисле́ние&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;λ-исчисление&amp;#039;&amp;#039;) — [[формальная система]], разработанная американским математиком [[Чёрч, Алонзо|Алонзо Чёрчем]] для [[формализация|формализации]] и анализа понятия [[вычислимость|вычислимости]].&lt;br /&gt;
&lt;br /&gt;
== Чистое λ-исчисление ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Чистое λ-исчисление&amp;#039;&amp;#039;&amp;#039;, [[Терм (логика)|термы]] которого, называемые также [[объект (программирование)|объектами]] («обами»), или [[Лямбда (буква)|λ]]-термами, построены исключительно из переменных применением аппликации и абстракции. Изначально наличие каких-либо констант не предполагается.&lt;br /&gt;
&lt;br /&gt;
== Аппликация и абстракция ==&lt;br /&gt;
В основу &amp;#039;&amp;#039;&amp;#039;λ-исчисления&amp;#039;&amp;#039;&amp;#039; положены две фундаментальные операции:&lt;br /&gt;
&lt;br /&gt;
* {{Якорь|Аппликация}}&amp;#039;&amp;#039;Аппликация&amp;#039;&amp;#039; ({{lang-lat|applicatio}} — прикладывание, присоединение) означает применение функции к заданному значению аргумента (то есть вызов функции). Её обычно обозначают &amp;lt;math&amp;gt;f\ a&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — функция, а &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; — аргумент. Это соответствует общепринятой в математике записи &amp;lt;math&amp;gt;f(a)&amp;lt;/math&amp;gt;, которая тоже иногда используется, однако для λ-исчисления важно то, что &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; трактуется как [[алгоритм]], вычисляющий результат по заданному входному значению. В этом смысле аппликация &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; может рассматриваться двояко: как результат применения &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; к &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, или же как процесс вычисления этого результата. Последняя интерпретация аппликации связана с понятием &amp;#039;&amp;#039;β-редукции&amp;#039;&amp;#039;.&lt;br /&gt;
* {{Якорь|Абстракция}}&amp;#039;&amp;#039;Абстракция&amp;#039;&amp;#039; или &amp;#039;&amp;#039;λ-абстракция&amp;#039;&amp;#039; ({{lang-lat|abstractio}} — отвлечение, отделение), в свою очередь, строит функции по заданным выражениям. Именно, если &amp;lt;math&amp;gt;t\equiv t[x]&amp;lt;/math&amp;gt; — выражение, {{не переведено 5|свободная переменная|свободно|en|Free variables and bound variables}} содержащее &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, тогда запись &amp;lt;math&amp;gt;(\lambda x.t[x])&amp;lt;/math&amp;gt; означает: λ функция от аргумента &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, которая имеет вид &amp;lt;math&amp;gt;t[x]&amp;lt;/math&amp;gt;, и обозначает функцию &amp;lt;math&amp;gt;x\mapsto t[x]&amp;lt;/math&amp;gt;. Здесь скобки не обязательны и использованы для ясности, так как точка является частью нотации и отделяет имя связанной переменной от тела функции. Таким образом, с помощью абстракции можно конструировать новые функции. Требование, чтобы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; свободно входило в &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, не обязательно — в этом случае &amp;lt;math&amp;gt;\ \lambda x.t&amp;lt;/math&amp;gt; обозначает функцию &amp;lt;math&amp;gt;x\mapsto t&amp;lt;/math&amp;gt;, то есть такую, которая игнорирует свой аргумент.&lt;br /&gt;
&lt;br /&gt;
== α-эквивалентность ==&lt;br /&gt;
Основная форма эквивалентности, определяемая в лямбда-термах, это альфа-эквивалентность. Например, &amp;lt;math&amp;gt;\lambda x.x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda y.y&amp;lt;/math&amp;gt; — это альфа-эквивалентные лямбда-термы, которые оба представляют одну и ту же функцию — а именно, функцию тождества &amp;lt;math&amp;gt;x\mapsto x&amp;lt;/math&amp;gt;. Термы &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; не являются альфа-эквивалентными, так как являются свободными переменными.&lt;br /&gt;
&lt;br /&gt;
Вообще говоря, &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;-преобразование — это переименование связанных переменных, не меняющее «смысла» терма. Структурно, два λ-терма &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;-эквивалентны если это один и тот же терм, либо если какие-либо их составляющие термы соответственно &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;-эквивалентны.&lt;br /&gt;
&lt;br /&gt;
Для абстракций, терм &amp;lt;math&amp;gt;\lambda y.t[y]&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;-эквивалентен &amp;lt;math&amp;gt;\lambda x.t[x]&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;t[y]&amp;lt;/math&amp;gt; это &amp;lt;math&amp;gt;t[x]&amp;lt;/math&amp;gt; в котором все свободные появления &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; заменены на &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, при условии, что 1.) &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; не входит свободно в &amp;lt;math&amp;gt;t[x]&amp;lt;/math&amp;gt;, и 2.) &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; не входит свободно ни в одну абстракцию &amp;lt;math&amp;gt;\lambda y&amp;lt;/math&amp;gt; внутри &amp;lt;math&amp;gt;t[x]&amp;lt;/math&amp;gt; (если такие есть).&lt;br /&gt;
&lt;br /&gt;
Требование, чтобы &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; не была свободной переменной в &amp;lt;math&amp;gt;t[x]&amp;lt;/math&amp;gt; — существенно, так как иначе она окажется «захваченной» абстракцией &amp;lt;math&amp;gt;\lambda y&amp;lt;/math&amp;gt; после &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;-преобразования, и из свободной переменной в &amp;lt;math&amp;gt;\lambda x.t[x]&amp;lt;/math&amp;gt; превратится в связанную переменную в &amp;lt;math&amp;gt;\lambda y.t[y]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Второе требование необходимо, чтобы предотвратить случаи, подобные тому, когда, например, &amp;lt;math&amp;gt;\lambda y.x&amp;lt;/math&amp;gt; является частью &amp;lt;math&amp;gt;t[x]&amp;lt;/math&amp;gt;. Тогда необходимо произвести &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;-преобразование такой абстракции, например, в данном случае, в &amp;lt;math&amp;gt;\lambda z.x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== β-редукция ==&lt;br /&gt;
Применение некой функции к некоему аргументу выражается в &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;-исчислении как &amp;#039;&amp;#039;аппликация&amp;#039;&amp;#039; &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;-терма, выражающего эту функцию, и &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;-терма аргумента. Например, применение функции &amp;lt;math&amp;gt;f(x) = 2x+1&amp;lt;/math&amp;gt; к числу 3 выражается аппликацией&lt;br /&gt;
: &amp;lt;math&amp;gt;(\lambda x. 2\cdot x + 1)\ 3,&amp;lt;/math&amp;gt;&lt;br /&gt;
в которой на первом месте находится соответствующая &amp;#039;&amp;#039;абстракция&amp;#039;&amp;#039;. Поскольку эта функция ставит в соответствие каждому &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; значение &amp;lt;math&amp;gt;2x+1&amp;lt;/math&amp;gt;, для вычисления результата необходимо [[подстановка|заменить]] каждое свободное появление переменной &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в терме &amp;lt;math&amp;gt;2\cdot x + 1&amp;lt;/math&amp;gt; на терм 3.&lt;br /&gt;
&lt;br /&gt;
В результате получается &amp;lt;math&amp;gt;2\cdot 3+1=7&amp;lt;/math&amp;gt;. Это соображение в общем виде записывается как&lt;br /&gt;
: &amp;lt;math&amp;gt;(\lambda x.t)\ a = t[x:=a]&amp;lt;/math&amp;gt;&lt;br /&gt;
и носит название &amp;#039;&amp;#039;β-редукция&amp;#039;&amp;#039;. Выражение вида &amp;lt;math&amp;gt;(\lambda x.t)\ a&amp;lt;/math&amp;gt;, то есть применение абстракции к некоему терму, называется &amp;#039;&amp;#039;редексом&amp;#039;&amp;#039; (redex). Несмотря на то, что β-редукция по сути является единственной «существенной» [[аксиома|аксиомой]] λ-исчисления, она приводит к весьма содержательной и сложной теории. Вместе с ней λ-исчисление обладает свойством [[полнота по Тьюрингу|полноты по Тьюрингу]] и, следовательно, представляет собой простейший [[язык программирования]].&lt;br /&gt;
&lt;br /&gt;
== η-преобразование ==&lt;br /&gt;
&amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt;-преобразование выражает ту идею, что две функции являются идентичными тогда и только тогда, когда, будучи применёнными к любому аргументу, дают одинаковые результаты.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt;-преобразование переводит друг в друга формулы &amp;lt;math&amp;gt;\lambda x.f\ x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, но только если &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; не появляется свободно в &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Иначе, свободная переменная &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; после преобразования стала бы связанной внешней абстракцией &amp;lt;math&amp;gt;\lambda x&amp;lt;/math&amp;gt;, и наоборот; и тогда применение этих двух выражений сводилось бы &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt;-редукцией к разным результатам.&lt;br /&gt;
&lt;br /&gt;
Перевод &amp;lt;math&amp;gt;\lambda x.f\ x&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; называют &amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt;-редукцией, а перевод &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;\lambda x.f\ x&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt;-экспансией.&lt;br /&gt;
&lt;br /&gt;
== Каррирование (карринг) ==&lt;br /&gt;
Функция двух переменных &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;f(x,y) = x + y&amp;lt;/math&amp;gt; может быть рассмотрена как функция одной переменной &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, возвращающая функцию одной переменной &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, то есть как выражение &amp;lt;math&amp;gt;\ \lambda x.\lambda y.x+y&amp;lt;/math&amp;gt;. Такой приём работает точно так же для функций любой [[арность|арности]]. Это показывает, что функции многих переменных могут быть выражены в λ-исчислении и являются «[[синтаксический сахар|синтаксическим сахаром]]». Описанный процесс превращения функций многих переменных в функцию одной переменной называется &amp;#039;&amp;#039;карринг&amp;#039;&amp;#039; (также: [[каррирование]]), в честь американского математика [[Карри, Хаскелл|Хаскелла Карри]], хотя первым его предложил [[Шейнфинкель, Моисей Эльевич|Моисей Шейнфинкель]] ([[1924]]).&lt;br /&gt;
&lt;br /&gt;
Соответственно, аппликация &amp;#039;&amp;#039;n&amp;#039;&amp;#039;-арных функций — это на самом деле аппликация вложенных унарных функций, одна за другой. Например, для бинарных функций:&lt;br /&gt;
&lt;br /&gt;
   (λxy.    ...x...y... )  a  b   =&lt;br /&gt;
   (λx.λy.  ...x...y... )  a  b   =&lt;br /&gt;
   (λx.(λy. ...x...y... )) a  b   =&lt;br /&gt;
  ((λx.(λy. ...x...y... )) a) b   =&lt;br /&gt;
       (λy. ...a...y... )     b   =&lt;br /&gt;
            ...a...b...&lt;br /&gt;
&lt;br /&gt;
== Семантика бестипового λ-исчисления ==&lt;br /&gt;
Тот факт, что термы λ-исчисления действуют как функции, применяемые к термам λ-исчисления (то есть, возможно, к самим себе), приводит к сложностям построения адекватной семантики λ-исчисления. Чтобы придать λ-исчислению какой-либо смысл, необходимо получить множество &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, в которое вкладывалось бы его пространство функций &amp;lt;math&amp;gt;D \to D&amp;lt;/math&amp;gt;. В общем случае такого &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; не существует по соображениям ограничений на мощности этих двух множеств, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; и функций из &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;: второе имеет бо́льшую мощность, чем первое.&lt;br /&gt;
&lt;br /&gt;
Эту трудность в начале 1970-х годов преодолел [[Скотт, Дана Стюарт|Дана Скотт]], построив понятие [[Область Скотта|области]] &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; (изначально на [[Полная решётка|полных решётках]]&amp;lt;ref&amp;gt;&amp;#039;&amp;#039;Scott D.S.&amp;#039;&amp;#039; The lattice of flow diagrams.-- Lecture Notes in Mathematics, 188, Symposium on Semantics of Algorithmic Languages.-- Berlin, Heidelberg, New York: Springer-Verlag, 1971, pp. 311—372.&amp;lt;/ref&amp;gt;, в дальнейшем обобщив до полного частично упорядоченного множества со [[топология Скотта|специальной топологией]]) и урезав &amp;#039;&amp;#039;&amp;lt;math&amp;gt;D \to D&amp;lt;/math&amp;gt;&amp;#039;&amp;#039; до [[Непрерывность по Скотту|непрерывных в этой топологии функций]]&amp;lt;ref&amp;gt;&amp;#039;&amp;#039;Scott D.S.&amp;#039;&amp;#039; Lattice-theoretic models for various type-free calculi. — In: Proc. 4th Int. Congress for Logic, Methodology, and the Philosophy of Science, Bucharest, 1972.&amp;lt;/ref&amp;gt;. На основе этих построений была создана {{iw|Денотационная семантика|денотационная семантика|en|Denotational semantics}} [[Язык программирования|языков программирования]], в частности, благодаря тому, что с помощью них можно придать точный смысл таким двум важным конструкциям языков программирования, как [[Рекурсия#Рекурсия в программировании|рекурсия]] и [[Тип данных|типы данных]].&lt;br /&gt;
&lt;br /&gt;
== Связь с рекурсивными функциями ==&lt;br /&gt;
{{Main|Комбинатор неподвижной точки}}&lt;br /&gt;
&lt;br /&gt;
[[Рекурсия]] — это определение функции через саму себя; на первый взгляд, лямбда-исчисление не позволяет этого, но это впечатление обманчиво. Например, рассмотрим рекурсивную функцию &amp;lt;math&amp;gt;fact&amp;lt;/math&amp;gt;, вычисляющую [[факториал]]:&lt;br /&gt;
&lt;br /&gt;
::: &amp;lt;math&amp;gt;fact(n) \triangleq \{ 1, \text{ if } n = 0; \text{ else } n \times fact(n - 1) \} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция не может быть выражена λ-термом &amp;lt;tt&amp;gt;λn.{ 1, if n = 0; else n × (fact (n-1)) }&amp;lt;/tt&amp;gt;, так как в нём переменная &amp;lt;tt&amp;gt;fact&amp;lt;/tt&amp;gt; является свободной, т.е. нигде не определённой. Эквивалентное выражение &amp;lt;tt&amp;gt;(G fact)&amp;lt;/tt&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;G := λr.λn.{ 1, if n = 0; else n × (r (n-1)) }&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
оставляет открытым вопрос, что такое &amp;lt;tt&amp;gt;fact&amp;lt;/tt&amp;gt;. Чтобы найти ответ на этот вопрос, необходимо прежде всего понять что &amp;lt;tt&amp;gt;G&amp;lt;/tt&amp;gt; выражает собой один шаг вычисления факториала в парадигме &amp;quot;открытой рекурсии&amp;quot;, вызывая полученную функцию &amp;lt;tt&amp;gt;r&amp;lt;/tt&amp;gt; для выполнения &amp;quot;остатка вычислений&amp;quot;. Рекурсивная функция — это, по определению, такая, которая использует саму себя для проведения остатка вычислений. То есть, должно выполняться: &lt;br /&gt;
&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Fact = G Fact = G (G Fact) = G (G (G (...)))&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tt&amp;gt;Fact&amp;lt;/tt&amp;gt; является &amp;quot;неподвижной точкой&amp;quot; функционала &amp;lt;tt&amp;gt;G&amp;lt;/tt&amp;gt;: вся работа выполняется повторением &amp;quot;шага вычислений&amp;quot; &amp;lt;tt&amp;gt;G&amp;lt;/tt&amp;gt; неограниченное количество раз, как это продиктовано значением аргумента &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Fact n = G Fact n = G (G Fact) n = G (G (G (...))) n&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;math&amp;gt;fact&amp;lt;/math&amp;gt; ссылается на саму себя посредством ссылки на своё имя, но в лямбда-исчислении у λ-термов имен нет. Разрешение ссылки по имени достигается в программировании посредством лексического связывания через глобальный контекст, но в лямбда исчислении он является неизменяемым. В отсутствие изменяемого глобального контекста, &amp;#039;&amp;#039;локальный&amp;#039;&amp;#039; контекст создаётся использованием дополнительных аргументов:&lt;br /&gt;
&amp;lt;!-- \text{≝} \triangleq &lt;br /&gt;
В отсутствие изменяемого глобального контекста такой же эффект достигается созданием локального контекста при передаче необходимой информации в параметрах функции:&lt;br /&gt;
&lt;br /&gt;
Absent the mutable global scope, the &amp;#039;&amp;#039;local&amp;#039;&amp;#039; scope can be used instead, &lt;br /&gt;
that is being provided by the function&amp;#039;s parameters. This is reminiscent&lt;br /&gt;
of the State Passing programming paradigm: &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 fact\text{′}(n)\ &amp;amp;\triangleq f(f,n) \\&lt;br /&gt;
       &amp;amp;where \\&lt;br /&gt;
       &amp;amp; f(h,n) \triangleq \{ 1, \text{ if } n = 0; \text{ else } n \times h(h, n - 1) \} \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь функция &amp;lt;math&amp;gt;f(h,n)&amp;lt;/math&amp;gt; использует аргумент &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; и как функцию для вызова, в качестве &amp;quot;следующего шага вычислений&amp;quot;, и передаёт его как дальнейший аргумент для последующего использования самой же вызванной фунцкцией &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;.  Вызов функции-аргумента для выполнения остатка вычислений называется &amp;quot;открытой рекурсией&amp;quot;, потому что &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; гипотетически может быть чем угодно.  Вызов функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; с &amp;#039;&amp;#039;самой собой&amp;#039;&amp;#039; в качестве аргумента на самом верхнем уровне, &amp;lt;math&amp;gt;f(f,n)&amp;lt;/math&amp;gt;, &amp;quot;замыкает кольцо&amp;quot; и позволяет функции ссылаться на &amp;#039;&amp;#039;саму себя&amp;#039;&amp;#039; внутри своего тела, таким образом создавая функцию &amp;lt;math&amp;gt;fact\text{′}&amp;lt;/math&amp;gt; полностью эквивалентную оригинальной рекусивной функции &amp;lt;math&amp;gt;fact&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Действительно, &amp;#039;&amp;#039;рекурсивная&amp;#039;&amp;#039; функция вызывает саму себя, и само-применяемая функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; вызывает саму себя путём само-применения, передавая себя в качестве следующего шага вычислений, так же повторяя это и дальше снова и снова, сколько необходимо. Так как функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; описывает один шаг вычисления факториала, повторное использование её снова и снова, по мере необходимости, описывает весь процесс вычисления факториала целиком. &lt;br /&gt;
&lt;br /&gt;
В таком виде это синтаксически не-рекурсивное определение &amp;lt;math&amp;gt;fact\text{′}&amp;lt;/math&amp;gt; напрямую выражается как λ-терм:&lt;br /&gt;
&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;F := λh. λn. { 1, if n = 0; else n × ((h h) (n-1)) }&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt; &amp;amp;nbsp; = λh. (λr.λn.{ 1, if n = 0; else n × (r (n-1)) }) (h h)&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt; &amp;amp;nbsp; = λh. G (h h)&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Fact := F F&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак &amp;lt;tt&amp;gt;F h = G (h h)&amp;lt;/tt&amp;gt;, и следовательно &amp;lt;tt&amp;gt;F F = G (F F)&amp;lt;/tt&amp;gt;.  λ-терм &amp;lt;tt&amp;gt;(F F)&amp;lt;/tt&amp;gt; является неподвижной точкой λ-терма &amp;lt;tt&amp;gt;G&amp;lt;/tt&amp;gt;, т.е. представлением рекурсивной функции &amp;lt;math&amp;gt;fact&amp;lt;/math&amp;gt;, и G ссылается на него через параметр &amp;lt;tt&amp;gt;r&amp;lt;/tt&amp;gt;, выполняя тождество:&lt;br /&gt;
&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Fact := F F = G (F F) = G Fact = G (G (G (...)))&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp; = U F = &amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp; U (λh. G (h h))&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; = (λg. U (λh. g (h h))) G =: Y G&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;U := λh. h h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; — это комбинатор самоприменения (самоаппликации), &amp;lt;math&amp;gt;U h = h\ h&amp;lt;/math&amp;gt;. Так несколькими элементарными само-очевидными преобразованиями сам собой получается т.н. &amp;quot;комбинатор неподвижной точки&amp;quot; (см. ниже), &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Y := λg. U (λh. g (h h))&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Fact := Y G = G (Y G)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Комбинатор &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; создает рекурсивную функцию из аргумента, являющегося закрытым (то есть в котором нет свободных переменных) λ-термом исходного выражения функции (то есть без удвоения параметра). То есть &amp;lt;math&amp;gt;\operatorname{Y}&amp;lt;/math&amp;gt; — это комбинатор неподвижной точки: он вычисляет неподвижную точку своего аргумента. Для закрытого λ-терма с соответствующей арностью, его неподвижная точка выражает рекурсивную функцию, так как &amp;lt;math&amp;gt;Y\ g\ n = g\ (Y\ g)\ n&amp;lt;/math&amp;gt;, то есть аргумент который здесь создаётся для вызова внутри &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; — это та же самая функция &amp;lt;math&amp;gt;Y\ g\ &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Y g = U λh. g (h h) = g (U λh. g (h h)) = g (Y g)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Действительно,&lt;br /&gt;
&lt;br /&gt;
 Fact = Y (λr. λn. {1, if n = 0; else n × (r (n-1))})&lt;br /&gt;
      = Y G&lt;br /&gt;
      = G (Y G)&lt;br /&gt;
      = (λr. λn. {1, if n = 0; else n × (r (n-1))}) (Y G)&lt;br /&gt;
      = (    λn. {1, if n = 0; else n × ((Y G) (n-1))})&lt;br /&gt;
      = (    λn. {1, if n = 0; else n × (Fact  (n-1))})&lt;br /&gt;
      = G Fact&lt;br /&gt;
&lt;br /&gt;
Итак, &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; — это закрытый функционал, то есть λ-терм, вызывающий свой аргумент в качестве функции; его неподвижная (зафиксированная, &amp;#039;&amp;#039;неизменяемая&amp;#039;&amp;#039;) точка — это функция (здесь, &amp;lt;math&amp;gt;Y G =: Fact&amp;lt;/math&amp;gt;), которая передаётся ему в качестве аргумента; а вызов &amp;#039;&amp;#039;той же самой&amp;#039;&amp;#039; функции и есть &amp;#039;&amp;#039;рекурсивный&amp;#039;&amp;#039; вызов.&lt;br /&gt;
&lt;br /&gt;
Используя &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, выписывать &amp;lt;tt&amp;gt;F&amp;lt;/tt&amp;gt; явным образом становится излишним. Все что нужно это &amp;quot;функционал одного шага&amp;quot; &amp;lt;tt&amp;gt;G&amp;lt;/tt&amp;gt;, и его повторение неограниченное число раз достигается автоматически:&lt;br /&gt;
&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Fact n = Y G n = G (Y G) n = G (G (G (...))) n&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; = { 1, if n = 0; else n × (Y G (n-1)) } = ...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы определить факториал как рекурсивную функцию, мы можем просто написать &amp;lt;math&amp;gt;\operatorname{Y} G\ n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — число, для которого вычисляется факториал. Пусть &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;, получаем (подразумевая [[каррирование]], &amp;lt;tt&amp;gt;(a b c) = ((a b) c)&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 Y G 4&lt;br /&gt;
 Y (λrn.{1, if n = 0; else n×(r (n-1))}) 4&lt;br /&gt;
 (λrn.{1, if n = 0; else n×(r (n-1))}) (Y G) 4&lt;br /&gt;
 (λn.{1, if n = 0; else n×(Y G (n-1))}) 4&lt;br /&gt;
 {1, if 4 = 0; else 4×(Y G (4-1))}&lt;br /&gt;
 4×(Y G 3)&lt;br /&gt;
 4×(G (Y G) 3)&lt;br /&gt;
 4×((λrn.{1, if n = 0; else n×(r (n-1))}) (Y G) 3)&lt;br /&gt;
 4×{1, if 3 = 0; else 3×(Y G (3-1))}&lt;br /&gt;
 4×(3×(G (Y G) 2))&lt;br /&gt;
 4×(3×{1, if 2 = 0; else 2×(Y G (2-1))})&lt;br /&gt;
 4×(3×(2×(G (Y G) 1)))&lt;br /&gt;
 4×(3×(2×{1, if 1 = 0; else 1×(Y G (1-1))}))&lt;br /&gt;
 4×(3×(2×(1×(G (Y G) 0))))&lt;br /&gt;
 4×(3×(2×(1×{1, if 0 = 0; else 0×(Y G (0-1))})))&lt;br /&gt;
 4×(3×(2×(1× 1 )))&lt;br /&gt;
 24&lt;br /&gt;
&lt;br /&gt;
Итак, каждое определение рекурсивной функции может быть представлено как неподвижная точка соответствующего закрытого функционала, описывающего «один вычислительный шаг» рекурсивной функции. Следовательно, используя &amp;lt;math&amp;gt;\operatorname{Y}&amp;lt;/math&amp;gt;, любое рекурсивное определение может быть выражено как лямбда-выражение (λ-терм). В частности, мы можем определить вычитание, умножение, сравнение натуральных чисел и другие арифметические операции, используя рекурсию по необходимости, и выразить эти операции как λ-термы.&lt;br /&gt;
&lt;br /&gt;
Комбинатором называют замкнутое лямбда-выражение, не содержащее свободных переменных и ссылающееся исключительно на свои аргументы. При этом оно может использовать комбинаторы из ограниченного набора базовых, считающихся примитивными. Существуют различные базисы комбинаторной логики, среди которых наиболее известны &amp;lt;math&amp;gt;S,K,I&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;B,C,W,K&amp;lt;/math&amp;gt;. Эти базисы являются взаимно выразимыми, то есть любой комбинатор из одного базиса можно представить через комбинаторы другого. В частности, комбинаторы &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, как и любые другие, могут быть выражены в обеих системах.&lt;br /&gt;
&lt;br /&gt;
Существует несколько (и вообще-то, бесконечно много) определений комбинаторов неподвижной точки. Вышеуказанное — одно из самых простых:&lt;br /&gt;
&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Y := λg. (λh. h h) (λh. g (h h))&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя стандартные комбинаторы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 Y g = U (λh. g (U h)) = U (λh. B g U h)&lt;br /&gt;
     = U (B g U) = BU (CBU) g&lt;br /&gt;
     = S(KU)(SB(KU)) g&lt;br /&gt;
     = SS(S(S(KS)K))(K(SII)) g&lt;br /&gt;
&lt;br /&gt;
В самом деле:&lt;br /&gt;
&lt;br /&gt;
 U (B g U) = B g U (B g U)&lt;br /&gt;
           = g (U (B g U))&lt;br /&gt;
           = g (Y g)&lt;br /&gt;
&lt;br /&gt;
Примерaми других комбинаторов неподвижной точки являются, например, комбинатор Тьюринга &amp;lt;math&amp;gt;\Theta&amp;lt;/math&amp;gt; и комбинатор &amp;lt;math&amp;gt;Y\text{′}&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Θ &amp;amp;nbsp;:= (λhg. h h g) (λhg. g (h h g))&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp; = U(B(SI)U) = SII(S(K(SI))(SII))&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt;Y′ := (λhg. h g h) (λgh. g (h g h))&amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;amp;nbsp;&amp;lt;tt&amp;gt; &amp;amp;nbsp;&amp;amp;nbsp; = WC(SB(C(WC))) = SSK(S(K(SS(S(SSK))))K)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== В языках программирования ==&lt;br /&gt;
В языках программирования под «λ-исчислением» зачастую{{Нет АИ|11|2|2025}} понимается механизм «[[анонимная функция|анонимных функций]]» — [[Callback (программирование)|callback]]-функций, которые можно определить прямо в том месте, где они используются, и которые имеют доступ ко всем [[Переменная (программирование)|переменным]], видимым в месте их вызова в текущей функции ([[Замыкание (программирование)|замыкание]]).&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Кодирование Чёрча]]&lt;br /&gt;
* [[Типизированное лямбда-исчисление|Типизированное λ-исчисление]]&lt;br /&gt;
* [[Комбинаторная логика]]&lt;br /&gt;
* [[Функциональное программирование]]&lt;br /&gt;
* [[Теорема Чёрча — Россера]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
 |автор         = [[Барендрегт, Хенк]]&lt;br /&gt;
 |заглавие      = Ламбда-исчисление. Его синтаксис и семантика&lt;br /&gt;
 |место         = М.&lt;br /&gt;
 |издательство  = [[Мир (издательство)|Мир]]&lt;br /&gt;
 |год           = 1985&lt;br /&gt;
 |страниц       = 606&lt;br /&gt;
 |тираж         = 4800&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{rq|&lt;br /&gt;
{{оформить формулы|дата=2023-09-11}}&lt;br /&gt;
{{стиль статьи|дата=2023-09-11}}&lt;br /&gt;
{{проверить факты|дата=2023-09-11}}&lt;br /&gt;
{{нет сносок|дата=2023-09-11}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теория алгоритмов]]&lt;br /&gt;
[[Категория:Лямбда-исчисление]]&lt;br /&gt;
[[Категория:Модели вычислений]]&lt;br /&gt;
[[Категория:Формальные методы]]&lt;/div&gt;</summary>
		<author><name>~2026-19541-98</name></author>
	</entry>
</feed>