Непейвода. Прикладная логика
.PDF14.1. ОСНОВЫ λ-ЯЗЫКА |
391 |
(если результат — объект). Сейчас они чаще всего называются функ- |
||||
ционалами (высших типов). В λ-языке и те, и другие чаще всего назы- |
||||
ваются просто функциями. Но лишь Л. Я. Шейнфинкель и Х. Б. Карри |
||||
(H.B. Curry) начали разработку их систематической теории. И сразу же |
||||
они натолкнулись на важное преобразование, позволяющее уменьшить |
||||
количество сущностей. |
|
|
|
|
Для описания функций многих переменных хочется ввести много- |
||||
местный квантор типа |
λx1 . . . xn. t(x1 |
, . . . , xn). Карри2 |
подметил ис- |
|
ключительно важное преобразование, |
базирующееся на том, что у нас |
|||
функции систематически трактуются как значения. Вместо f(x, y) он |
||||
рассмотрел функционал f, перерабатывающий x в функцию от y. f(x)(y) = |
||||
f(x, y). Таким образом, без ограничения общности достаточно рассма- |
||||
тривать функции от одного аргумента. Такое преобразование называ- |
||||
ется преобразованием Карри (Currying). Оно соответствует также пред- |
||||
ставлению λx1 . . . xn в форме λx1 |
. . . λxn. (Проверьте!) |
|
||
Преобразование Карри имеет важные аналогии в программирова- |
||||
нии. Оно соответствует |
частичной параметризации процедур. Если име- |
|||
ется процедура P(x1, x2, . . . , xn), а известно лишь значение x1 = a, мож- |
||||
но тем не менее проделать внутри P |
вычисления, зависящие лишь от |
|||
x1, и получить частичную процедуру P1(x2, . . . , xn) = P(a, x2, . . . , xn). |
||||
Если не требовать оптимизации частичной процедуры, то частичная па- |
||||
раметризация становится удобным, легко реализуемым и не портящим |
||||
эффективность программ методом программирования, который, к не- |
||||
счастью, был осознан вскоре после того, как было фиксировано опреде- |
||||
ление наиболее популярных языков программирования — |
C и Pascal. У |
|||
себя в примерах будем обозначать частичную параметризацию P (a, . . . , z). |
||||
Отметим один тонкий момент. |
Пусть дана процедура P(x, y). Произ- |
|||
ведя частичную параметризацию |
P (a, b), мы с точки зрения програм- |
|||
мирования получаем не значение |
P(a, b), а процедуру без параметров, |
|||
вычисляющую это значение. |
|
|
|
|
Упражнения к § 14.1 |
вычисляющая расстояние между дву- |
|||
14.1.1. Пусть f(x, y) — |
функция, |
мя действительными числами. Что такое λx. f(0, x)? 14.1.2. Запишите определенный интеграл Rb f(x) dx на λ-языке.
a
2 На самом деле это преобразование рассматривалось еще Шейнфинкелем и фон Ней маном. -
392 |
|
ГЛАВА 14. |
ОСНОВЫ λ-ИСЧИСЛЕНИЯ |
|||||||||||||
14.1.3. |
Если f(x, y) = ex · sin(y), то что такое λxy. f(y, π/2 − x)? |
|
|
|
||||||||||||
14.1.4. |
Вычислить λx. Dλy (y3 · x + y)(1)(3). |
|
|
|
|
|
|
|
|
|
|
|
||||
14.1.5. |
Студентка Тупицына спросила: “ |
А зачем вообще все многочи- |
||||||||||||||
сленные кванторы? Почему не писать, например, λx A(x) вместо |
||||||||||||||||
x A(x), где понимается как логическая операция над функция- |
||||||||||||||||
ми с логическими значениями, и обходиться одним квантором λ?” |
||||||||||||||||
Ваше отношение к этому предложению: приносит ли оно какие-то |
||||||||||||||||
удобства либо неудобства, либо совсем некорректно, и почему? |
|
|
|
|||||||||||||
14.1.6. |
Студентка Примерная записала утверждение |
λx. x2+1 > λx. |
1 |
. |
||||||||||||
2+x2 |
||||||||||||||||
Что Вы скажете по этому поводу? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
14.1.7. |
Прокомментируйте запись x Max(a, b, f(x)) ≥ f(x), где Max |
|||||||||||||||
— |
функционал нахождения максимума функции на отрезке [a, b]. |
|||||||||||||||
14.1.8. |
Студент Чудаков предложил по аналогии с распространенным |
|||||||||||||||
в математике обозначением |
множеств в стиле |
{ |
f(x, y) |
| |
A(x, y) |
} |
|
|||||||||
|
|
2 |
|
|
2 |
|
|
|
|
|
||||||
использовать λ-обозначения типа λ(x |
|
+y |
|
). {sin(x)·cos(y)}. Что |
||||||||||||
можно сказать по данному поводу? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
§ 14.2. |
λ-КОНВЕРСИИ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пожалуй впервые общие свойства и преобразования пространств неко торых частных, видов операторов и функционалов начали исследовать- ся в линейной алгебре Матрицы были введены как представления про- странства линейных преобразований. еще более фундаментальное на- блюдение было сделано при рассмотрении; пространств линейных функ- ционалов из конечномерного пространства в скаляры Это пространство- оказалось имеющим столько же измерений и векторы. исходного про странства могут рассматриваться как линейные, функционалы на этом- сопряженном пространстве В выражении возникает двойствен ность между функциями и. аргументами fкотораяx = c является краеуголь- ным камнем при развитии языка можно, считать функцией а - ее аргументом, можно и наоборотλ- .3: f, x —
3 Двойственность не означает возможность путать аргументы и функции Она означа ет лишь право сделать глобальную замену функций и аргументов друг на. друга А уж- насколько она будет странно выглядеть, другое дело. .
14.2. λ-КОНВЕРСИИ |
393 |
Шейнфинкель предложил подчеркнуть двойственность следующей |
|||||
системой обозначений. Операция применения функции к аргументу за- |
|||||
писывается (fx), а не f(x), как обычно. Здесь важно то, что при помощи |
|||||
преобразования Карри все функции могут быть сделаны одноместными |
|||||
функционалами. Черч предложил важное упрощение языка Карри, ко- |
|||||
торое сейчас и принято называть языком λ-исчисления. |
|||||
Определение 14.2.1. λ-сигнатура — |
множество констант. λ-термы сиг- |
||||
натуры σ задаются следующим индуктивным определением. |
|||||
1. |
Константа сигнатуры σ есть λ-терм. |
|
|||
2. |
Переменная есть λ-терм. |
|
λ-терм. |
|
|
3. |
Если t и u — λ-термы, то (tu) — |
λ-терм. |
|||
4. |
Если x — |
переменная, t — |
λ-терм, то λx. t — |
||
Пример 14.2.1. |
Если D, f и 0 — |
константы, изображающие оператор |
|||
дифференцирования, функцию одной переменной и ноль, то значение |
|||||
dxdf (0) |
изображается ((Df)0). |
|
для λ-термов определяются поня- |
||
Так же, как в логике предикатов, |
|||||
тия свободной и связанной переменной и подстановки. Через подста- |
|||||
новку определяется важнейшее из преобразований над λ-термами — β- |
|||||
конверсия. Оно состоит в символьном вычислении результата вызова |
|||||
функции λx. t(x). Одинарная стрелка → читается |
“ за один шаг перехо- |
||||
дит в”. Большая стрелка читается |
“ преобразуется в”. |
||||
|
|
(λx. t r) → Subst(t, x, r) |
(14.4) |
Это преобразование называется β-конверсия.
Пример 14.2.2. λx. x есть тождественная функция. В самом деле,
(λx. x t) t
для любого Обозначив терм через можем записать это как (I t) t. В частностиt. , (I I) I.λx. x I,
термы позволяют определить предельно общее4 исчисление сим вольныхλ- вычислений функциональных выражений Оно называется ис- числением λ-конверсий. В этом исчислении выводятся. выражения вида-
4 Общее не значит что туда запихали все что можно и нельзя Это означает предельно простое выражение, широко применимой ,идеи которое может. быть легко конкретизи ровано для частных случаев. , -
394 |
ГЛАВА 14. ОСНОВЫ λ-ИСЧИСЛЕНИЯ |
r t. Аксиомы его — (14.4), |
переписанная через : |
(14.5)
и t Правилаt. вывода следующие.
t u u r (транзитивность) (14.6) t r
t u
(t r) (u r)
(14.7)
|
t u |
( |
|
|
|
) |
(14.8) |
|
|
|
|
преобразование аргумента |
|
|
|||
|
(r t) (r u) |
|
|
|||||
|
|
|
|
|
|
|
||
|
t u |
|
( |
|
ξ) |
|
|
(14.9) |
λx. t λx. u |
правило |
|
|
|
|
|||
Названия “ β-конверсия"и “ правило ξ"традиционны для обозначения |
||||||||
этих характерных преобразований |
λ-термов. Правда, |
их суть лучше от- |
||||||
ражали бы названия типа “ символьное вычисление"и ” преобразование |
||||||||
определения". Чаще всего не ставят, а просто выписывают последо- |
||||||||
вательность преобразуемых (конвертируемых) друг в друга термов. |
||||||||
Пример 14.2.3. Рассмотрим λ-термы |
|
|
|
|
||||
|
Ψ = λx. (x x); |
Ω = (Ψ Ψ) = (λx. (x x) λx. (x x)). |
|
|||||
По β-конверсии Ω преобразуется в |
|
|
|
|
|
|||
|
Subst(λx. (x x), x, Ψ) = (Ψ Ψ) = Ω. |
|
|
|
||||
Итак, Ω конвертируется сам в себя. |
|
|
|
|
||||
Отметим взаимосвязь Ω с парадоксом Расселла. Рассмотрим множе- |
||||||||
ство всех множеств, являющихся собственными элементами: Z = {x|x |
||||||||
x}. Тогда Z Z Z {x|x x} Z Z. Хотя здесь мы и не по- |
||||||||
лучили грубого противоречия, мы высветили логическую основу пара- |
||||||||
докса Расселла, парадокса лжеца и многих других парадоксов: ударяясь |
||||||||
в абстракции, слишком легко определить понятия, ничего не содержа- |
||||||||
щие, кроме самих себя.5 |
Карри дал интересную переформулировку та- |
ких “ рефлексивных парадоксов". Пусть A = {x|x x A}. Тогда
5 Некоторые философы и богословы определяли Бога как то что является причиной самого себя Анализ парадоксов показывает что это довольно“ , плоско причина самой себя скорее "ничто. , чем Бог. , :
14.2. λ-КОНВЕРСИИ |
395 |
A A (A A A). Пусть A A. Тогда A A A. Значит, из |
|||||
A A следует A. Но (A A A) A A. Следовательно, A A. |
|||||
Но A A A. Значит, A. Итак, имея неограниченные абстракции |
|||||
и пользуясь ими в рассуждениях, |
можно доказать все, что угодно. В λ- |
||||
конверсиях объекты, подобные Ω, относительно безобидны (в точности |
|||||
в той же степени, что “ зацикливание" в программах). |
|
|
|||
Подробней проанализируем роль различных правил в λ-конверсиях. |
|||||
β- конверсия является определением вызова процедуры, принятым в |
|||||
большинстве языков программирования. Транзитивность означает воз- |
|||||
можность выполнить целую последовательность вычислений. Единствен- |
|||||
ное разумное ограничение на нее — |
исчерпание ресурсов, которое обыч- |
||||
но игнорируется в семантике алгоритмического языка. Практически не- |
|||||
чего возразить и на правило преобразования аргумента. А вот преобра- |
|||||
зование функции уже несколько более сомнительно. Оно чаще всего |
|||||
просто избегается в языках программирования за счет того, что функ- |
|||||
ция не является полноправным значением. Правило ξ |
не может быть |
||||
просто проигнорировано, поскольку любой приличный язык включает |
|||||
описания процедур, но такое преобразование чаще всего прямо запре- |
|||||
щается в семантике языков программирования. В самом деле, чаще все- |
|||||
го процедура содержит операторы, рассчитанные на разные значения |
|||||
аргумента и при конкретном значении аргумента выполняются (за счет |
|||||
операторов типа if, case, while, repeat) лишь некоторые из них. Попыт- |
|||||
ка же вычислять, не разобравшись со значением аргумента, вполне мо- |
|||||
жет привести к ошибке. Например, если процедура для положительного |
|||||
x вычисляет его квадратный корень, а для отрицательного действует по- |
|||||
другому то попытка слишком рано вычислить |
|
приведет к ошибке |
|
||
Таким образом, анализ правила ξ |
привел нас к выявлению ограничений |
||||
, |
|
√x |
|
|
. |
на частичные вычисления в обычных языках программирования Даже если известны значения всех переменных входящих в выражение. но выражение находится внутри описания процедуры, либо внутри услов, ного оператора вычислять его нельзя А вот в конверсиях можно про- изводить вычисление, любого подтерма. где быλ- он ни стоял Докажем- это. , .
Определение 14.2.2. λ-терм с дырой. Пусть символ обозначает дыру. 1. — λ-терм с дырой.
Если терм терм с дырой то и термы
2. с дыройt — . λ- , r — λ- , (t r) (r t) — λ-
396 |
ГЛАВА 14. ОСНОВЫ λ-ИСЧИСЛЕНИЯ |
3. Если x — |
переменная, r — λ-терм с дырой, то λx. r — λ-терм с |
дырой. |
|
Через t[r] обозначим результат замены дыры в λ-терме t с дырой на λ- |
||
терм r. |
|
|
Предложение 14.2.1. 1. В λ-терме с дырой ровно одна дыра. |
||
2. |
Если t — |
λ-терм с дырой, r — λ-терм, то t[r] — λ-терм. |
3. |
Если r - подтерм λ-терма s, то найдется терм с дырой t, такой, |
|
|
что s ≡ t[r]6. |
|
4. |
Если t — |
λ-терм с дырой, r и s — λ-термы, r s, то t[r] t[s]. |
Доказательство. Пункты 1 и 2 тривиально доказываются индукцией |
||||
по построению терма с дырой. Пункт 3 опирается на единственность |
||||
дерева построения λ-терма и усиливает ее до следующей леммы. |
||||
Лемма о подтермах. Если r — |
вхождение подтерма в λ-терм t, то |
|||
дерево порождения r является поддеревом дерева t. |
||||
И, наконец, пункт 4. Действуем индукцией по длине терма с дырой, |
||||
используя пункт 1. Если терм состоит из одной дыры, то все очевидно. |
||||
В противном случае дыра находится в одном из его подтермов, который |
||||
сам, согласно 3, является λ-термом с дырой. Рассмотрим три возможных |
||||
случая. Если t имеет вид λx t1, то, по предположению индукции, t1[r] |
||||
t1[s]. Но тогда по правилу ξ t[r] t[s]. |
|
|||
Остальные случаи также разбираются прямым применением правил |
||||
конверсии. |
|
|
|
|
Рассмотрим некоторые конструкции λ-языка. Пусть f и g — функ- |
||||
ции. Тогда |
(f(gx)) применяет f к результату вычисления g на x, и терм |
|||
λx. (f(gx)) выражает функцию, являющуюся композицией f и g. С дру- |
||||
гой стороны, ((fx)y), если принять во внимание преобразование Карри, |
||||
выражает применение функции f к двум аргументам, а, соответственно, |
||||
((fg)y) — |
применение функционала f к функциональному аргументу |
|||
g и обычному x.7 |
|
|
||
|
графическое равенство выражений. |
|
||
6 ≡ означает |
предмет. Занимаясь λ- ис- |
|||
7 На самом деле нигде не сказано, что g — |
функция, а x — |
числением, необходимо помнить, что функция может быть подставлена в любом месте.
14.2. λ-КОНВЕРСИИ |
397 |
Исходя из содержательного смысла конверсий как символьных вы числений можно определить равенство термов и как существова- ние такого, что Но обосноватьλ- такоеt r определение не- слишком простоs, ведьt преждеs, r всегоs. отношение равенства должно быть отношением эквивалентности: рефлексивность и симметричность на шего определения очевидны но; с транзитивностью дело обстоит не так- просто Если , то откуда следу ет что .найдетсяt1 такоеs1, t2что s1, t2 s2, t3 Темsне2, менее временно- примем, такое сомнительноеs, определениеt1 s, t3 котороеs? обосновывается тео ремой Черча Россера доказываемой в следующей, главе -
Теперь рассмотрим- , преобразование впервые введенное. явно в исчислении и ставшее краеугольным камнем, современной теории проλ- граммирования. -
Предложение Лемма о неподвижной точке Для любого терма F найдется14.2.такой2 ( λ-терм X, что X = (F X).). λ-
Доказательство Определим как и пусть есть
Тогда легко показать. самим чтоW конвертируетсяλx. (F (xx)), в X 8 (W W ). , X (F X).
Данное предложение служит ярким примером важной и нетривиаль- |
|
ной теоремы, доказывающейся в три строчки, но такой, до которой не- |
|
легко было додуматься, и такой, которая имеет множество применений. |
|
В самом деле, поскольку создатели λ-языка с самого начала отдавали |
|
себе отчет в его универсальности (он годится для выражения любого |
|
функционала, встречающегося в математике, естественно, при подхо- |
|
дящем подборе исходных констант,) то их не могло не смущать, в част- |
|
ности, следующее рассуждение: |
|
Рассмотрим функцию натуральных чисел ϕ = |
|
λn n + 1. Она не имеет неподвижной точки, по- |
(14.10) |
скольку, если m — таковая, то m = m + 1. |
|
Здесь на помощь приходит то, что в λ-исчислении имеется, в частности, |
терм конвертирующийся сам в себя и не имеющий значения простоΩ,не имеет значения так же как и само и как И соответ. (ϕ Ω) ственно нет ничего удивительного, в том чтоΩ Ω + 1. , -
, , (ϕ Ω) = Ω = Ω + 1.
8 Здесь есть единственная но ехидная тонкость не преобразуется в а в него! , : (F X) X, X
398 ГЛАВА 14. ОСНОВЫ λ-ИСЧИСЛЕНИЯ
Поскольку приведенное нами преобразование очевидно само вы ражается в языке то имеется комбинатор неподвижной, точки, ко- торый можноλ- определить, , например, как Y, -
λF (λx (F (x x)) λx (F (x x))).
не является ни единственным ни даже наилучшим из комбинаторов неподвижнойY точки, но используется, он чаще всего. В, частности,
Yf → f(Yf)
не имеет места почему Поэтому часто( рассматривается?) комбинатор
Θ ≡ (λxy. y(xyy) λxy. y(xyy)).
Красивые примеры еще нескольких комбинаторов неподвижной точ ки см. в упражнениях. -
Упражнения к § 14.2
14.2.1.Покажите, что (ΘF ) → (F (θF )).
14.2.2.(Klop) Пусть
Ъ= λabcdefghijklmnopqstuvwxyzr.
(r(thisisafixedpointcombinator)),
$ = (ЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪ) Показать, что $ — комбинатор неподвижной точки.
Перевести пример Клопа на русский язык так чтобы в терме чи 14.2.3талась. русская фраза с аналогичным значением( , а алфавит в от- личие от латинского присутствовал бы в неизмененном, порядке, - , .)
14.2.4. Построить комбинатор A, такой, что (Afx) = (fx).
400 |
|
|
|
ГЛАВА 14. ОСНОВЫ λ-ИСЧИСЛЕНИЯ |
|
1. |
λx (s1s2), где t1 → s1, t2 → s2 |
. Тогда, по предположению индук- |
|||
|
ции, для r1, s1 можно найти q1, |
и, соответственно, для r2, s2 общее |
|||
|
q2. По лемме 14.3.5, в качестве q можно взять q1[x|q2]. |
||||
2. s1[x|s2]. Непосредственно применяем предположение индукции и |
|||||
|
лемму 14.3.5. |
|
|
|
|
Если теперь t есть (t1t2), а r есть (r1r2), то опять возникают два |
|||||
подслучая. |
|
|
|
||
1. |
(s1 s2). Непосредственно применяем предположение индукции. |
||||
2. |
t |
есть λx. (t11t2), s есть s1[x|s2], где t11 → s1, t2 → s2. Тогда по |
|||
|
предположению индукции, t11 |
и r1, t2 и r2 попарно приводятся к |
|||
|
общему терму. Применяем лемму 14.3.5. |
||||
А теперь, поскольку конверсия — |
транзитивное замыкание →, а → кон- |
||||
флюэнтно, теорема доказана. |
|
|
|
||
Упражнения к § 14.3 |
|
|
|
||
14.3.1. |
Студент Талантов предложил следующее расширение λ-конверсий. |
||||
|
Ввести термы вида [x y z] |
со следующими правилами конверсии: |
|||
|
[fab] (fa)(fb); [fga] (fa)(ga). Прокомментируйте это пред- |
||||
|
ложение. |
|
|
|
|
14.3.2. |
Студентка Невинная предложила следующий вариант λ-конверсий |
||||
|
для кортежей. Вводятся термы вида [t1 . . . tn] вместе со следующи- |
||||
|
ми правилами конверсии: |
|
|
|
|
|
|
([t1 . . . tn] r) [(t1 r) . . . (tn r)] |
|||
|
|
(t[r1 . . . rn]) [(t r1) . . . (t rn)] |
|||
|
Ваше мнение об этом предложении: разумно ли оно с точки зрения |
||||
|
истолкования и сохраняет ли оно свойство локальности конверсий |
||||
|
и свойство конфлюэнтности? |
|
|
||
§ 14.4. |
λ-ИСЧИСЛЕНИЕ |
|
|
|
Исчислению конверсий соответствует исчисление равенств термов конвертируемыхλ- в одно и то же выражение которое обычно называется,
λ- исчислением либо комбинаторной логикой, . Языком этого исчисления