ДУШКИН Роман Викторович
[email protected] http://roman-dushkin.narod.ru/
ФП 02005-05 01 Майк Гордон (Mike Gordon)
Взам. инв. № Инв. № дубл.
Подп. и дата
ВВЕДЕНИЕ В ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ
University of Cambridge
[email protected]
Инв. № подл.
Подп. и дата
http://www.cl.cam.ac.uk/users/mjcg/
2006
Копирова
Формат
АННОТАЦИЯ
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Ключевые слова:
ФП 02005-05 01 ИзмЛист № докум. Разраб. Душкин Р. Пров. Н. контр. Утв.
Подп. Дата
Лит. Функциональное программирование Копирова
Лист Листов 2 79
Формат
ФП 02005-05 01
СОДЕРЖАНИЕ 1. ЗАГОЛОВОК 1 .......................................... ОШИБКА! ЗАКЛАДКА НЕ ОПРЕДЕЛЕНА. 1.1. Заголовок 2 .............................................................Ошибка! Закладка не определена. 1.1.1. Заголовок 3 .................................................................. Ошибка! Закладка не определена.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
ПРИЛОЖЕНИЕ A .......................................... ОШИБКА! ЗАКЛАДКА НЕ ОПРЕДЕЛЕНА.
Лист
ФП 02005-05 01 ИзмЛист № докум.
3
Подп. Дата Копирова
Формат
ФП 02005-05 01
СПИСОК СОКРАЩЕНИЙ
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
—
Лист
ФП 02005-05 01 ИзмЛист № докум.
4
Подп. Дата Копирова
Формат
ФП 02005-05 01
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
1. ВВЕДЕНИЕ В λ-ИСЧИСЛЕНИЕ λ-исчисление ( или лямбда-исчисление) – это теория функций, первоначально разработанная логиком Алонзо Чёрчем для обоснования математики. Работа проводилась в 1930х годах, за несколько лет до появления цифровых вычислительных машин. Немного раньше, в 1920х годах, Мосес Шонфинкель разработал другую теорию функций, основанную на “комбинаторах”. В 1930х годах, Хаскел Карри доработал и расширил теорию Шонфинкеля и доказал её эквивалентность λ-исчислению. Приблизительно в это же время, Клин показал что λ-исчисление является универсальной вычислительной системой. Она была одной из первых среди подобных систем, подвергшихся тщательному анализу. В 1950х годах λ-исчисление подвигло Джона Маккарти на создание языка программирования LISP. В начале 1960х годов Питер Ландин показал, как можно описать императивные языки программирования, переведя их в λ-исчисление. Кроме того, им был разработан важный прототип языка программирования ISWIM. Эта работа ввела основные нотации функционального программирования и повлияла на разработку как императивных, так и функциональных языков программирования. Основываясь на этой работе, Кристофер Страчей заложил основы для такой важной области как денотационная семантика . Техническая сторона работы Страчей, сподвигла логика Дана Скотта на создание теории доменов, которая в настоящее время является одним из самых важных разделов теоретических компьютерных наук. В 1970-х годах Петер Хендерсон и Джим Моррис продолжили работу Ландина и написали несколько важных статей о преимуществах использования функционального программирования для разработки программного обеспечения. Приблизительно в это же время Девид Тёрнер предложил использовать комбинаторы Карри и Шонфинкеля в качестве машинного кода компьютеров для реализации функциональных языков программирования. Такие компьютеры могут использовать математические свойства λ-исчисления для параллельного выполнения программ. В 1980х годах несколько исследовательских групп использовали идеи Хендерсона и Тёрнера для практической реализации функционального программирования, разработав специальную архитектуру для его поддержки (некоторые из которых содержали несколько процессоров). Таким образом, мы видим, что эта неприметная ветвь математической логики лежит в основе важных разработок в теории языков программирования, таких как: 1)Изучение фундаментальных вопросов обработки данных. 2)Разработка языков программирования. 3)Семантика языков программирования. 4)Архитектура компьютеров.
Лист
ФП 02005-05 01 ИзмЛист № докум.
5
Подп. Дата Копирова
Формат
ФП 02005-05 01
1.1 Синтаксис и семантика λ-исчисления. λ-исчисление – это нотация для определения функций. Выражения в этой нотации называются λ-выражениями, и каждое такое выражение обозначает функцию. В дальнейшем будет понятно как можно использовать функции для представления большого разнообразия данных и структур данных, таких как числа, пары, списки и т.п. В частности, будет показано как можно представить случайную пару чисел (х,y) с помощью λ-выражения. Примем следующие соглашения об обозначениях: мнемонические названия, соответствующие λ-выражениям, будем обозначать жирным шрифтом, или подчёркнутым текстом; например, 1 – это λ-выражение (см. 2.3), используемое для обозначения числа 1.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Существуют 3 вида λ-выражений: 1. Переменные: x, y, z и т.д. Функции, соответствующие переменным, определяются тем, какие переменные связаны в этой окрестности. Связывание производится абстракциями(см. ниже). Мы будем использовать V, V1, V2 для обозначения произвольных переменных. Апликации функций или комбинации: Если Е1 и Е2 – λ-выражения, то (Е1 Е2) – также λ-выражение; это означает результат приложения функции, обозначенной Е1 к функции, обозначенной Е2. Е1 называется “ратором” ( от английского operator), а Е2 называется “рендом” ( от английского operand). Например, если ( m, n ) функция представленная парой чисел m и n ( см. 2.2 ), а sum – дополнительная функция λ-исчисления ( см. 2.5 ), тогда приложение (sum(m,n)) означает m+n . ( Необходимо заметить, что sum – это λ-выражение, тогда как “+” – математический символ “метаязыка”( в нашем случае – русского), который мы используем в λ-исчислении). 3. Абстракции: Если V – переменная, а Е - λ-выражение, то λV.E – это абстракция со связанной переменной V и телом Е. Такая абстракция представляет собой функцию с аргументом a, которая в качестве результата возвращает функцию Е, в окружение, где связанная переменная V означает а. Или, другими словами, абстракция λV.E представляет собой функцию, которая преобразовывает аргумент E’ в E[E’/V] ( результат замены E’ на V в Е, см. 1.8). Например , λx. Sum (x,1) является функцией добавления единицы.
Лист
ФП 02005-05 01 ИзмЛист № докум.
6
Подп. Дата Копирова
Формат
ФП 02005-05 01
Используя БНФ, синтаксис λ-выражений можно представить следующим образом: < λ-выражение> ::= <переменная> | (<λ-выражение>< λ-выражение>) | ( λ<переменная>.< λ-выражение>) Если V принадлежит синтаксическому классу <переменная> и Е, Е1, Е2 и т.д. принадлежат синтаксическому классу < λ-выражение >, тогда БНФ-нотация упрощается до : E ::= V|(E1 E2)| λV.E, Где V- переменные, ( Е1 Е2 ) – апликации, λV.E – абстрации.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Приведенное описание значения λ-выражений, является нечетким и интуитивным. Логикам (см. Дана Скотт[32]) понадобилось 40 лет для того, чтобы составить строгое описание. Мы не будем углубляться в этот вопрос. Пример:
( λx.x ) представляет собой “тождественную функцию” : (( λx.x)E) = E.
Пример: ( λx. (λf. (f x))) является функцией, которая , будучи применена к Е , даёт (λf. (f x))[E/x], т.е. (λf.(f E)). Последняя, будучи в свою очередь применена к E’ даёт (f E)[E’/f] т.е. (E’ E). Таким образом: ((λx. ( λf. (f x))) E) = (λf. (f E)) и ((λf. (f E)) E') = (E' E). Упражнение 1 Дайте описание функции (λx. ( λy. y)). Пример: В 2.3 дано описано как числа можно представить λ-выражениями. Предположим это уже сделано и 0, 1, 2 , … - λ-выражения, которые соответственно представляют 0, 1, 2 , … . Предположим также , что add - λвыражение, удовлетворяющее условию: ((add m) n) = m+n.
Лист
ФП 02005-05 01 ИзмЛист № докум.
7
Подп. Дата Копирова
Формат
ФП 02005-05 01
Тогда (λx. ((add 1) x)) является λ-выражением, представляющем собой функцию, которая преобразует n в 1+n , а (λx. (λy. ((add x) y))) представляет собой λ-выражение, которое переводит m в функцию, которая, будучи применена к n , даёт m+n , т.е. λy. (add m)y)). Связь между функцией sum, описанной в начале раздела, и функцией add в предыдущем примере будет объяснена в 2.5.
1.2 Соглашение об обозначениях Следующие соглашения призваны минимизировать количество скобок в выражениях: 1. Применение функций начинается слева, т.е. Е1 Е2 … Еn означает (( … ( E1 E2) … ) En). Например:
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
E1 E2 E1 E2 E3 E1 E2 E3 E4
означает ( E1 E2) означает ((E1 E2) E3) означает (((E1 E2) E3) E4)
2. λV.E1 E2 … En означает (λV. (E1 E2 … En)). Таким образом, границы “ λV” уходят вправо так далеко , насколько это возможно. 3. λV1 … Vn. E означает (λV1. ( … . (λVn. E) … )). Например: λx y. E λx y z. E λx y z w. E
означает (λx. ( λy. E)) означает (λx. ( λy. (λz. E))) означает (λx. ( λy. (λz. (λw. E))))
Пример: λx y. add y x означает (λx. (λy. ((add y) x))).
1.3 Свободные и связанные переменные Вхождения переменной V в λ-выражение называется свободным если она не входит в “λV” , иначе оно называется связанным. Например: ( λx. y x) ( λy. x y) 1
1
Инв. № подл.
2
2
1- свободная, 2- связанная
Лист
ФП 02005-05 01 ИзмЛист № докум.
8
Подп. Дата Копирова
Формат
ФП 02005-05 01
1.4 Правила конверсии
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
В Главе 2 будет объяснено как можно использовать λ-выражения для представления объектов данных, таких как числа, строки и т.п. Например, арифметическое выражение (2 + 3) х 5, также как и его “значение” 25 , может быть представлено как λ-выражение. Процесс “упрощения” (2 + 3) х 5 до 25 будет представлен процессом, который мы назовём “конверсией” (или редукцией). Правила λ-конверсии, описанные ниже, несмотря на то, что они носят весьма общий характер, будучи применены к λ-выражениям, которые представляют арифметические выражения, моделируют арифметические вычисления. Существуют 3 типа конверсии : α-конверсия, β-конверсия и η-конверсия ( почему они получили такие названия – неизвестно). Согласно правилам конверсии, нотация E[E'/V] используется для обозначения замены E' на каждое свободное вхождение V в Е. Замена называется эффективной , тогда и только тогда, когда ни одна из свободных переменных в E' не становится связанной в E[E'/V]. Более подробно замена описывается в 1.8. Правила λ-конверсии. • α-конверсия. Любая абстракция вида λV.E может быть преобразована в λV'. E [V'/V] при условии , что замена V' на V является эффективной. • β-конверсия. Любая аппликация вида (λV. E1) E2 может быть преобразована в E1[ E2/V] , при условии, что замена E2 на V в E1 является эффективной. • η-конверсия Любая абстракция вида λV. ( E V ) , в которой нет свободных вхождений V в E, может быть преобразована в E. Мы будем использовать следующие нотации:
Лист
ФП 02005-05 01 ИзмЛист № докум.
9
Подп. Дата Копирова
Формат
ФП 02005-05 01
• E1 → E2, означает α-конверсию E1 в E2. α
• E1 → E2, означает β-конверсию E1 в E2. β
• E1 → E2, означает η-конверсию E1 в E2. η
В 1.4.4 эти нотации будут расширены. Самым важным типом конверсии является β-конверсия; именно её можно использовать для моделирования механизма случайных вычислений.
Взам. инв. № Инв. № дубл.
Подп. и дата
α-конверсия используется для технической манипуляции связанными переменными, η-конверсия иллюстрирует тот факт, что две функции которые при одинаковых аргументах всегда выдают одни и тоже результаты, являются эквивалентными. ( см. 1.7). Следующие три подраздела, дают более развернутое описание и примеры всех трёх типов конверсий ( обратите внимание, что “конверсия” и ”редукция” используются как синонимы).
1.4.1 α-конверсия λ-выражение ( обязательно абстракция ), к которому может быть применена α-конверсия, называется α-редексом. “Редекс” расшифровывается как “ выражение, допускающее уменьшение ” ( от английского “reducible expression”). Правило α-конверсии утверждает, что связанные переменные могут быть переименованы при отсутствии “коллизий”. Пример:
λx. x → λy. y α
λx. f x → λy. f y α
Инв. № подл.
Подп. и дата
Неверно , что λx. λy. add x y → λy. λy. add y y α
потому что замена (λy. add x y) [y/x] не является эффективной, т.к. у, который заменяет х, становится связанным. Лист
ФП 02005-05 01 ИзмЛист № докум.
10
Подп. Дата Копирова
Формат
ФП 02005-05 01
1.4.2 β-конверсия λ-выражение ( обязательно аппликация ), к которому можно применить βконверсию, называется β-редексом. Правила β-конверсии аналогично вызову функции в языках программирования: тело Е1 функции λV.E1 вычисляется в окружении, в котором “формальный параметр ” V привязан к “фактическому параметру” E2. Пример:
(λx. f x ) E → f E β
(λx. (λy. add x y)) 3 → λy. add 3 y β
(λy. add 3 y) 4 → add 3 4 β
Неверно что
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
(λx. (λy. add x y)) ( square y) → λy. add (square y) y потому что замена ( λy. add x y )[( square y)/x] не является эффективной т.к. y свободна в (square y) ,но становится связанной после замены на х в (λy. add x y ). Требуется практика, для того что правильно проанализировать λ-выражение, следуя соглашениям, приведенным в 1.2, для того чтобы определить β-редексы. Например, рассмотрим аппликацию: (λx. λy. add x y) 3 4. расстановка скобок, согласно соглашениям, приводит выражение к такому виду: (((λx. (λy. (( add x) y ))) 3) 4) Это выражение можно переписать в виде: ((λx. E) 3) 4 ,
где E = (λy. add x y)
(λx. E) 3 является β-редексом и может быть приведено к E[3/x].
Лист
ФП 02005-05 01 ИзмЛист № докум.
11
Подп. Дата Копирова
Формат
ФП 02005-05 01
1.4.3 η-конверсия λ-выражения ( обязательно абстракция ) , к которым может быть применена η-редукция называются η-редексами. В правилах η-конверсии говорится, что две функции являются эквивалентными, если они, будучи применены к одинаковым аргументам, дают одинаковые результаты. Это свойство называется экстенсиональностью и будет обсуждаться в 1.7. Например, η-конверсия, обеспечивает, что λx. (sin x) и sin соответствуют одной и той же функции. В общем виде, λV. (E V) представляет собой функцию, которая будучи применена к аргументу E' , даёт (E V)[E'/V]. Если у V нет свободных вхождений в E, тогда (E V)[E'/V] = (E E'). Таким образом, λV. E V и E дают один и тот же результат – E E' , когда применяются к одинаковым аргументам, из этого следует , что они соответствуют одной функции. Пример:
λx. add x → add
Подп. и дата
η
λy. add x y → add x η
Неверно что λx. add x x → add x
Подп. и дата
Взам. инв. № Инв. № дубл.
η
потому что переменная х – свободна в add x.
1.4.4 Обобщенные конверсии Определения → , → и → могут быть сведены к следующему: α
β
η
• E1 → E2 , если Е2 можно получить из Е1, α-конверсией какого- либо α подвыражения . • E1 → E2 , если Е2 можно получить из Е1, β-конверсией какого- либо β подвыражения . • E1 → E2 , если Е2 можно получить из Е1, η-конверсией какого- либо η подвыражения .
Инв. № подл.
Примеры
Лист
ФП 02005-05 01 ИзмЛист № докум.
12
Подп. Дата Копирова
Формат
ФП 02005-05 01
((λх. λy. add х у) 3) 4 → (λy. add 3 y) 4 β
(λy. add 3 y) 4 → add 3 4 β
Первое из этих выражений представляет собой β-конверсию в обобщенном виде, т.к. (λy. add 3 y) 4 получено из выражения ((λx. λy. add x y) 3 4 (которое само по себе не является β-редексом), сокращением подвыражения (λx. λy. add x y) 3 . Иногда мы будем записывать последовательность конверсий. Тогда пример, описанный выше будет выглядеть так: ((λx. λy. add x y) 3) 4 → (λy. add 3 y) 4 → add 3 4 β
β
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Упражнение 2 Какие из трех данных β-конверсий являются обобщенными конверсиями ( т.е. редукциями подвыражений ) и какие являются конверсиями, по определению данному в 1.4? (i)
(λx. x ) 1 → 1 β
(ii)
(λy. y) ((λx. x ) 1 ) → (λy. y) 1 → 1 β
(iii)
β
(λy .y) ((λx. x) 1 ) → (λx. x) 1 → 1 β
β
В редукциях (ii) и (iii) в данном упражнении, несмотря на то ,что они начинаются с одного и того же λ-выражения, редукция происходит в разных последовательностях. Важным свойством β-редукций является то, что неважно в какой последовательности их проводить – результат всегда будет один и тот же. Если есть несколько отдельных редексов в выражении , редукцию можно выполнять параллельно. Необходимо заметить, что некоторые последовательности редукций, могут никогда не завершиться. Это будет обсуждаться в связи с Теоремой Нормализации в 2.9. В настоящее время, разработка процессора, используещего параллельные вычисления для ускорения работы функциональных программ
Лист
ФП 02005-05 01 ИзмЛист № докум.
13
Подп. Дата Копирова
Формат
ФП 02005-05 01
является важной научно-исследовательской задачей в “вычислительной технике пятого поколения”.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
1.5 Эквивалентность λ-выражений Три правила конверсии определяют значение λ-выражений, т.е. если Е1 можно преобразовать в Е2, то Е1 и Е2 соответствуют одной и той же функции. Это свойство конверсий должно быть интуитивно понятно. Можно дать математическое определение функции соответствующей λ-выражению и затем доказать, что она остаётся неизменной при α-, β- и η-конверсиях. Как показала практика, сделать это оказалось достаточно трудно [33] и мы оставим это за рамками данной книги. Мы просто определим, что два λ-выражения являются эквивалентными, если они могут преобразованы друг в друга последовательностью λ-конверсий. Важно понимать разницу между эквивалентностью и тождественностью. Два λ-выражения тождественны , если они состоят из одних и тех же символов в одинаковой последовательности; выражения эквивалентны, если их можно преобразовать одно в другое. Например, λx. x эквивалентно λy. y, но не тождественно. Будем использовать следующие обозначения: • E1 ≡ E2, означает тождественность E1 и E2. • E2 = E2, означает эквивалентность E1 и Е2. Эквивалетность (=) можно определить в терминах тождественности (≡) и конверсий ( → , → и → ) следующим образом. α
β
η
Эквивалентность λ-выражений
Если Е и Е' – λ-выражения, тогда Е = Е' , если Е ≡ Е' или существуют выражения Е1, Е2 , … , Еn такие что: 1. Е ≡ Е1 2. Е' ≡ En 3. Для каждого i либо (а) Ei →Ei+1 или Ei →Ei+1 или Ei → Ei+1 , либо α
(b)
β
η
Ei+1 → Ei или Ei+1 → Ei или Ei+1 → Ei α
β
η
Инв. № подл.
Примеры
Лист
ФП 02005-05 01 ИзмЛист № докум.
14
Подп. Дата Копирова
Формат
ФП 02005-05 01
(λx. x) 1 = 1 (λx. x) (( λy. y) 1) = 1 (λx. λy. add x y) 3 4 = add 3 4 Из определения (=) следует, что:
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
(i) Для любого Е, верно что Е = Е (эквивалентность рефлексивна). (ii) Если Е = Е' , тогда E' = E (эквивалентность симметрична). (iii) Если Е = Е' и E' = E'' , тогда E = E'' (эквивалентность транзитивна). Если отношение рефлексивно, симметрично и транзитивно, то оно называется отношением эквивалентности. Таким образом, (=) – отношение эквивалентности. Другое важное свойство (=) состоит в том, что если Е1 = Е2 и если Е1′ и E2′– два λвыражения, которые отличаются только тем, что в той части где E1′ содержит E1, у E2′ содержится E2, тогда E1′ = E2′. Данное свойство получило название свойства Лейбница. Это свойство выполняется, поскольку можно использовать одинаковую последовательность редукций как для перехода от Е1 к Е2 , так и для перехода от Е1′ к E2′. Например, если E1 = E2 , тогда по правилу Лейбница λV. E1 = λV. E2. Необходимо, чтобы замена в α- и β-редукциях была эффективной. Требование эффективности не выполняется, например, при α-редукции λx. (λy. x) к λy. (λy. y) (т.к . y становится связанной после замены на x в λy. x). Если была бы произведена такая “некорректная” замена, тогда из определения (=) следовало бы, что: λx. λy. x = λy. λy. y Но тогда так как (λx. (λy. x)) 1 2 → (λy. 1) 2 → 1 β
β
и (λy. (λy. y)) 1 2 → (λy. y) 2 → 2 β
β
и получается , что 1 = 2. В общем случае, если подставить вместо 1 и 2 любые два выражения, можно доказать, что они равны! Упражнение 3 Показать на примере, что если допустить неэффективную замену в βредукции , то тогда следует что любые два λ-выражения равны.
Лист
ФП 02005-05 01 ИзмЛист № докум.
15
Подп. Дата Копирова
Формат
ФП 02005-05 01
Пример : Если V1, V2 , … , Vn не равны друг другу и не имеют свободных вхождений в E1, E2, … , En , тогда (λV1 V2 … Vn. E) E1 E2 … En = (( λV1. (λV2 … Vn. E)) E1) E2 … En → (( λV2 … Vn. E)[E1/V1])E2 … En β
= ( λV2 … Vn. E [E1/V1]) E2 … En . . .
= E[E1/V1] [E2/V2] … [En/Vn]
Где было, в последнем примере, сделано предположение что V1, V2, … , Vn различны не имеют свободных вхождений в E1, E2, … , En ? Упражнение 5 Покажите на примере, что если V1= V2, то тогда даже если V2 имеет свободные вхождения в E1, необязательно будет выполняться (λV1V2. E) E1 E2 = E [E1/V1][E2/V2] Упражнение 6 Покажите на примере, что если V1 ≠ V2, но V2 имеет свободные вхождения в E1 , необязательно будет выполняться
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Упражнение 4
(λV1V2. E) E1 E2 = E [E1/V1][E2/V2]
Лист
ФП 02005-05 01 ИзмЛист № докум.
16
Подп. Дата Копирова
Формат
ФП 02005-05 01
1.6 Отношение → В предыдущем разделе, было определено , что при Е1 = Е2 , Е2 можно получить из Е1 последовательностью прямых или обратных конверсий. Особый случай этого отношения – когда Е2 можно получить из Е1 только последовательностью прямых конверсий. Записывается это как Е1 → Е2. Определение → Если Е и E’ – λ-выражения, тогда Е → E' , если E ≡ E' или существуют выражения Е1, Е2, … , En такие что: 1. Е ≡ Е1 2. Е′ ≡ En 3. Для каждого i либо Ei → Ei+1 , либо Ei → Ei+1 , либо Ei → Ei+1 .
Взам. инв. № Инв. № дубл.
Подп. и дата
α
β
η
Обратите внимание, что определение (→) аналогично определению (=), отличие лишь в отсутствии части (b). Упражнение 7 Найти Е, Е′ , такие что Е=E′ , но не E → E′. Упражнение 8(повышенной сложности) Показать, что если Е1 = Е2 , тогда существует такое Е, что Е1 → Е и Е2 → Е. ( Это свойство называется теоремой Чёрча – Россера. Некоторые из следствий из этой теоремы будут обсуждаться в 2.9.)
Инв. № подл.
Подп. и дата
1.7 Экстенсиональность Предположим, что V не имеет свободных вхождений в Е1 или Е2 и Е1 V = E2 V Тогда по правилу Лейбница
Лист
ФП 02005-05 01 ИзмЛист № докум.
17
Подп. Дата Копирова
Формат
ФП 02005-05 01
λV. E1 V = λV. E2 V И после применения η-редукции к обеим частям выражения получаем Е1 = Е2 Часто бывает удобным, используя это свойство, доказать, что два λвыражения эквивалентны, т.е. доказать что Е1 = Е2. Это можно сделать доказав, что Е1 V = E2 V для какого-либо V, не имеющего свободных вхождений в Е1 или Е2. Это свойство называется экстенсиональностью. Упражнение 9 Показать что (λf g x. f x (g x )) (λx y. x) (λx y. x) = λx. x
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
1.8 Замена В начале 1.4 , мы определили E[E′/V] как результат замены E′ на каждое свободное вхождение V в E. Было сказано , что такая замена будет эффективной, если ни одно из свободных E′ не становится связанным в E[E′/V]. В определениях α- и β-конверсий было оговорено, что замены должны быть эффективными. Так, например ( λV. E1) E2 → E1[E2/V] β
остаётся верным, пока замена E1[E2/V] остаётся эффективной. Было бы удобно расширить значение E[E′/V] , таким образом, чтобы нам не надо было заботиться об эффективности замены. Этого можно достигнуть введением следующих свойств для всех выражений Е, Е1 и Е2 и всех переменным V и V' : (λV. E1) E2 → E1[E2/V] и λV. E → λV′. E[V′/V] Для того, чтобы обеспечить выполнение этого свойства, E[E′/V] определяется рекурсивно на основе структуры E следующим образом:
Лист
ФП 02005-05 01 ИзмЛист № докум.
18
Подп. Дата Копирова
Формат
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
ФП 02005-05 01
E
E[E'/V]
V V′ E1 E2 λV. E1
E′ V′ E1[E'/V] E2[E′/V] λV. E1
( где V ≠ V′)
λV′.E1
( где V ≠ V′ и V′ не λV′. E1[E′/V] имеет свободных вхождений в E′)
λV′.E1
(где V ≠ V′ и V′ не λV′′. E1[V′′/V′] [E′/V′] , где V′′ – имеет свободных переменная, не имеет вхождений в E′) свободных вхождений в E′ или E1
Такое подробное определение E[E′/V] основано (но не совпадает ) с определением из Appendix C [2]. Для того, чтобы показать как это работает, рассмотрим (λy. y x)[y/x]. Т.к. y свободна в y, применяется последний случай из таблицы. Т.к. z не встречается в y x или y имеем: (λy. y x)[y/x] ≡ λz. (y x)[z/y][y/x] ≡ λz. (z x) [y/x] ≡ λz. z y
В последнем случае из таблицы, выбор V′′ не определен. Подойдет любая переменная, не имеющая свободных вхождений E′ или Е1. Замена хорошо освещена в книге Хиндей и Селдина[19], где приведены формулировки и доказательства различных технических свойств. Следующее упражнение взято из этой книги. Упражнение 10 Используйте таблицу для решения
Лист
ФП 02005-05 01 ИзмЛист № докум.
19
Подп. Дата Копирова
Формат
ФП 02005-05 01
(i) (λy. x (λx. x)) [( λy.y x) /x]. (ii) (y (λz. x z)) [(λy. z y) /x].
Довольно очевидно ( хотя и несколько утомительно ), доказательство того , что из определения E[E’/V], приведенного выше, действительно : (λV. E1) E2 → E1 [E2/V] и (λV.E → λV′. E[ V′/V]
Подп. и дата
для всех выражений E, E1 и E2 и для всех переменных V и V′. В Главе 3 будет показано, как теорию комбинаторов можно использовать для разложения достаточно сложных замен на более простые операции. Вместо комбинаторов можно использовать так называемые безымянные элементы Де Брейна[6]. Его идея состоит в том, что переменные можно представить как “указатели” на λ , которые связывают их. Вместо того, чтобы “помечать” λ именами (т.е. связанными переменными) и затем указывать на них через эти имена, можно указывать на соответствующую λ , определяя количество уровней “вверх” которых нужно пройти, чтобы достичь их. Например, λx. λy. x y будет представлено как λλ2 1. В качестве более сложного примера, рассмотрим следующее выражение, в котором мы определяем количество уровней, разделяющих переменную и λ, к которой она привязана.
Подп. и дата
Взам. инв. № Инв. № дубл.
3 2
λx. λy. x y (λy. x y y) 1
В нотации Де Брейна
1
λλ2 1 λ3 1 1.
Свободная переменная в выражении, представляется числом, большим, чем глубина λs над ней; различные свободные переменные задаются различными числами. Например, λx. (λy. y x z) x y w будет представлено как
Инв. № подл.
λ (λ1 2 3) 1 2 4 Лист
ФП 02005-05 01 ИзмЛист № докум.
20
Подп. Дата Копирова
Формат
ФП 02005-05 01
Т.к. есть лишь две λ, над вхождением 3, это число обозначает свободную переменную; похожим образом, есть лишь одна λ над вторым вхождением 2 и вхождением 4, значит они тоже должны соответствовать свободным переменным. Заметим, что 2 нельзя использовать для отображения w , т.к. оно уже было использовано для отображения свободной переменной y; таким образом, мы выбираем первое свободное число больше чем 2 ( 3 уже используется для отображения z). Следует быть внимательным, и назначать достаточно большие числа свободным переменным. Например, первое вхождение z в λx. z (λy. z) можно представить 2, но второму вхождению нужно 3 ; так как, это одна и та же переменная, мы должны использовать 3. Пример : По схеме Де Брейна λx. x (λy. x y y) будет представлено λ1(λ2 1 1).
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Упражнение 11 Каким λ-выражением представляется λ2(λ2) ? Упражнение 12 Опишите алгоритм вычисления по Де Брейну представления выражения E[E′/V] из представления E и E′.
Глава 2 Различные представления в λ-исчислении. На первый взгляд, λ-исчисление может показаться очень примитивным языком. Но его можно использовать для представления большинства объектов и структур нужных в современном программировании. Для этого следует задать эти объекты и структуры таким способом, чтобы у них были необходимые свойства. Например, для того чтобы представить значения истинности true и false булевской функции ¬ (“не”), λ-выражения true, false и not наделены такими свойствами: not true = false not false = true
Лист
ФП 02005-05 01 ИзмЛист № докум.
21
Подп. Дата Копирова
Формат
ФП 02005-05 01
Для того, чтобы представить булевскую функцию ∧ (“и”) , λ-выражения and наделены такими свойствами: and true true = true and true false = false and false true = false and false false = false Для того, чтобы представить булевскую функцию ∨ (“или”) , λ-выражения or наделены такими свойствами:
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
or true true = true or true false = true or false true = true or false false = true λ-выражения , используемые для представления вещей могут показаться на первый взгляд абсолютно немотивированными. Но определения выбираются таким образом, чтобы они работали согласованно. Мы будем писать LET ~ = λ-выражение
для того, чтобы ввести ~ как новую нотацию. Обычно ~ будет просто именем, как tru или and. Такие имена написаны жирным шрифтом или подчёркнуты, чтобы отличать их от переменных. Так, например, true – переменная, а true это λ-выражение λx. λy. x (см. 2.1), а 2 – число , в то время как 2 это λ-выражение λf x. f (f x) ( см. 2.3). Иногда ~ будет использована как более сложная форма, как условная нотация ( Е → E1 | E2 ).
2.1 Значения истинности и условные высказывания. В этом параграфе λ-выражения true, false, not и ( E → E1 | E2 ) наделены такими свойствами: not true = false not false = true (true → E1| E2 ) = E1 (false → E1 | E2 ) = E2
Лист
ФП 02005-05 01 ИзмЛист № докум.
22
Подп. Дата Копирова
Формат
ФП 02005-05 01
λ-выражения true и false представляют значения истинности true и false , not представляет функцию ¬ “не”, а ( E → E1 | E2 ) представляют условное высказывание, “Если Е , тогда Е1, иначе Е2”. Существует бесконечное множество работающих способов представления значений истинности и отрицания; те, которые мы приведем являются традиционными и выработаны логиками за длительное время. LET true = λx. λy. x LET false = λx. λy. y LET not = λt. t false true
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Легко использовать правила λ-конверсии для того, чтобы показать что эти определения обладают нужными свойствами. Например: not true = (λt. t false true ) true = true false true = (λx. λy. x) false true = (λy. false) true = false
(по определению not) ( β-конверсия) ( по определению true) ( β-конверсия ) ( β-конверсия )
Подобным образом, not false = true . Условные выражения ( E → E1 | E2 ) можно определить следующим образом: LET ( E → E1 | E2 ) = ( E E1 E2 ) Это означает , что для любого λ-выражения Е , Е1 и Е2 , ( E → E1 | E2 ) означает ( E E1 E2 ). Условные высказывания работают корректно: ( true → E1 | E2 ) = true E1 E2 = (λx y. x) E1 E2 = E1 и ( false → E1 | E2 ) = false E1 E2 = (λx y. y) E1 E2 = E2
Инв. № подл.
Упражнение 13
Лист
ФП 02005-05 01 ИзмЛист № докум.
23
Подп. Дата Копирова
Формат
ФП 02005-05 01
Предположим, and – λ-выражение λx y. ( x → y | false ). Показать что: and true true = true and true false = false and false true = false and false false = false
Упражнение 14 Придумайте такое λ-выражение or что:
2.2 Пары и кортежи Следующие аббревиатуры представляют пары и n-кортежи в λ-исчислении. LET fst = λp. p true LET snd = λp. p false LET ( E1 E2 ) = λf. f E1 E2 (E1 E2 ) – λ-выражения представляющие упорядоченную пару, чей первый компонент ( т.е. Е1 ) доступен из функции fst , а второй из snd. Следующие вычисления показывают, как взаимодействуют различные описания для получения правильного ответа.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Or true true = true Or true false = true Or false true = true Or false false = false
fst ( E1, E2 ) = (λp . p true ) (E1 E2) = (E1, E2 ) true = (λf. f E1 E2 ) true = true E1 E2 = (λx y.x ) E1 E2
Лист
ФП 02005-05 01 ИзмЛист № докум.
24
Подп. Дата Копирова
Формат
ФП 02005-05 01
= E1 Упражнение 15 Показать, что snd ( E1, E2 ) = E2 Пара представляет собой структуру данных из двух компонент. Обобщение на n компонент называется n-кортежом и легко определяется с помощью пар. LET ( E1, E2 , … , En ) = ( E1, ( E2, ( … ( En-1, En) … ))) (E1, … , En) – n-кортеж с компонентами E1, … ,En и длиной n. Пары – это 2кортежи. Аббревиатуры определенные ниже, предоставляют способ извлечения компонент из n-кортежей. n
LET E ↓ 1 = fst E LET E ↓ 2 = fst ( snd E) . . . n LET E ↓ i = fst ( snd(snd( … ( snd E) … ))) ------------------------
(если i < n )
i-1 snds
. . . n LET E ↓ snd(snd( … (snd E) … ))) -------------------i-1 snds
Легко показать, что эти определения работают, например: n
n
(E1,E2, … , En)↓ = (E1,(E2,(…)))↓1 = fst (E1,(E2,(…))) = E1 n
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
n
n
(E1,E2, … En)↓2 = (E1,(E2,(…)))↓2 = fst (snd ( E1,(E2,(…)))) = fst (E2,(…)) = E2
Инв. № подл.
n
Лист
ФП 02005-05 01 ИзмЛист № докум.
25
Подп. Дата Копирова
Формат
ФП 02005-05 01
В общем случае (E1, E2, … ,En)↓i =Ei для любого i такого, что 1 ≤ i ≤ n.
Соглашение n
Обычно мы будем писать просто Е ↓ i вместо E ↓ i , когда очевидно что n необходимо. Например: (E, … , En) ↓ i = Ei ( где 1 ≤ i ≤ n).
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
2.3 Числа
Есть множество способов представления чисел с помощью λ-выражений, каждый со своими достоинствами и недостатками [38,22]. Задача состоит в том, чтобы определить λ-выражение n для представления каждого числа n. Нам также необходимо определить λ-выражения для представления простейших арифметических операций. Например, нам понадобятся функции suc , pre , add и iszero , которые соответственно представляют функцию наследования ( n → n + 1 ), предшествования ( n → n – 1 ), сложения и проверки равенства нулю. Эти λвыражения будут правильно представлять числа, если они будут обладать следующими свойствами: suc n = n+1
(для всех чисел n)
pre n = n-1
(для всех чисел n)
add m n = m+n
(для всех чисел m и n)
iszero 0 = true iszero ( suc n) = false Здесь описано классическое представление чисел по Черчу. Для того чтобы объяснить его, удобно определить f n x как n аппликаций f к x. Например, f 5 x = f (f (f (f (f x )))) По соглашению, f 0 x означает x. В общем случае:
Лист
ФП 02005-05 01 ИзмЛист № докум.
26
Подп. Дата Копирова
Формат
ФП 02005-05 01
LET E0 E′ = E′ LET En E′ = E(E( … (E E′)…)) -----------n штук Е
Обратите внимание, что En (EE′) = En+1 E′ = E(En E′) … )) ; этот факт мы будем использовать в дальнейшем. Пример:
f4x = f (f (f (f x))) = f (f3x) = f3(f x)
Используя введенные обозначения, мы теперь можем определить числа Черча. Заметьте, как следующее λ-выражение n кодирует унарное представление n.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
LET 0 = λf x. x LET 1 = λf x. fx LET 2 = λf x. f(f x) . . .
LET n = λf x. fn x . .
Теперь могут быть получены представления suc , add и iszero. Чтобы понять как они работают, лучше всего представлять, что они работают с унарными представлениями чисел. Упражнения, следующие ниже, должны помочь. LET suc = λn f x. n f (f x) LET add = λm n f x. m f (n f x) LET iszero = λn. n (λx. false) true Упражнение 16 Показать, что Лист
ФП 02005-05 01 ИзмЛист № докум.
27
Подп. Дата Копирова
Формат
ФП 02005-05 01
(i) (ii) (iii) (iv) (v) (vi)
suc 0 = 1 suc 5 = 6 iszero 0 = true iszero 5 = false add 0 1 = 1 add 2 3 = 5
Упражнение 17 Для любого m и n показать, что:
Взам. инв. № Инв. № дубл.
Подп. и дата
(i) (ii) (iii) (iv) (v)
suc n = n+1 iszero ( suc n) = false add 0 n = n add m 0 = m add m n = m+n
Функцию предшествования определить труднее, чем другие простейшие функции. Идея состоит в том, что предшественник n определяется n используя λf x. f x (т.е. n), для получения функции, которая применяется только n-1 раз. “Выбросим” первое f в fn . Для того, чтобы это сделать, нужно сперва определить функцию prefn которая оперирует с парами и имеет свойства: (i)
prefn f (true,x) = (false,x)
(ii)
prefn f (false,x) = (false, f x)
Из этого следует :
Инв. № подл.
Подп. и дата
(iii) (prefn f)n (false, x) = (false, fn x) (iv) (prefn f)n (true,x) = (false, fn-1 x)
(если n > 0)
Лист
ФП 02005-05 01 ИзмЛист № докум.
28
Подп. Дата Копирова
Формат
ФП 02005-05 01
Таким образом, n применений prefn к (true,x) дают n-1 применений f к x. Используя эту идею, определение функции предшествования pre очевидно. Но, прежде чем дать его , дадим определение prefn LET prefn = λf p. (false, (fst p → snd p | (f(snd p)))) Упражнение 18
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Показать, что prefn f (b,x) = (false,(b → x | f x )) , и, следовательно, (i)
prefn f (true,x) = false,x)
(ii)
prefn f (false,x) = (false, f x)
(iii)
(prefn f)n (false,x) = (false, fn x)
(iv)
(prefn f)n (true,x) = (false, fn-1 x) (если n>0)
Теперь можно определить функцию предшествования pre: LET pre = λn f x. snd (n ( prefn f) (true,x))
Из этого следует, что если n>0 тогда pre n f x = snd (n (prefn f)( true x)) = snd ((prefn f)n (true,x)) = snd((false, fn-1 x) = fn-1 x
Следовательно, из экстенсиональности ( см. 1.7) : pre n = λf x. fn-1 x = n-1
(по определению n-1)
Упражнение 19 Используя результаты предыдущего упражнения показать, что (i)
Инв. № подл.
(по определению pre) (по определению n) (по (v) описанному выше)
pre (suc n) = n Лист
ФП 02005-05 01 ИзмЛист № докум.
29
Подп. Дата Копирова
Формат
ФП 02005-05 01
(ii)
pre 0 = 0
Система чисел в следующем упражнении, используется в [2] и имеет ряд преимуществ над системой Черча (например легче определить функцию предшествования). Упражнение 20 ^
LET 0 = λx.x ^
^
LET 1 = (false, 0) ^
^
LET 2 = (false, 1) . .
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
--^--
^
LET n+1 = (false,n) . . . --^-- --^----^-Придумайте такие λ-выражения suc, iszero, pre , чтобы для всех n выполнялось: --^---
(i)
^
---^--
suc n = n+1 --^----
^
---^----
(ii)
iszero 0 = true
(iii)
iszero (suc n) = false
---^----^--
(iv)
-^--
-^-- ^ ^
^
pre (suc n) = n
2.4 Рекурсивные определения Чтобы представить функцию умножения в λ-исчислении, нам нужно определить λ-выражение ( скажем mult ), такое что: mult m n = add n (add n (… (add n 0 ) … ))
Лист
ФП 02005-05 01 ИзмЛист № докум.
30
Подп. Дата Копирова
Формат
ФП 02005-05 01
m adds
Этого можно достигнуть, если mult образом, чтобы выполнялось равенство :
будет
определено
таким
mult m n = ( iszero m → 0│add n ( mult ( pre m) n ))
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Если это равенство выполняется, тогда, например: Mult 2 3 = (iszero 2 → 0 | add 3 (mult (pre 2) 3)) ( из равенства ) = add 3 (mult 1 3) ( из свойств iszero, условного высказывания и pre ) = add 3 (iszero 1 → 0 | add 3 ( mult ( pre 1) 3)) (из равенства) = add 3 ( add 3 (mult 0 3)) ( из свойств iszero, условного высказывания и pre ) = add 3 ( add 3 (iszero 0 → 0 | add 3 (mult (pre 0) 3))) ( из равенства ) = add 3(add 3 0) ( из свойств iszero и условного высказывания ) Равенство, приведенное выше, предполагает, что mult должно быть определено следующим образом: Mult = λm n. (iszero m → 0 | add n ( mult (pre m) n )) ↑ N.B. К сожалению, данное выражение нельзя использовать как определение mult , потому что, как показано стрелкой, mult должно быть уже определено, чтобы λ-выражение имело смысл. К счастью, существует способ создания λ-выражения, которое удовлетворяет произвольным равенствам. Когда этот способ применяется к описанному выше равенству, он даёт желаемое определение mult. Сначала определим λвыражение Y так, чтобы для любого выражения Е, оно имело такое свойство: YE=E(YE)
Лист
ФП 02005-05 01 ИзмЛист № докум.
31
Подп. Дата Копирова
Формат
ФП 02005-05 01
Это значит, что выражение Y E остаётся неизменным, когда к нему применяется функция Е. В общем случае, если E E′ = E′ , тогда E′ называется неподвижной точкой Е . λ-выражение Fix со свойством Fix E = E(Fix E) для любого Е, называется оператором неподвижной точки.
Существует бесконечное множество различных операторов неподвижной точки [28] Y – самый известный из них. Он определяется следующим способом: LET Y = λf. (λx. f(x x)) (λx. f(x x))
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Легко показать, что Y на самом деле – оператор неподвижной точки : Y E = (λf. (λx. f(x x)) (λx. f(x x))) E ( по определению Y ) = (λx. E(x x)) (λx. E(x x)) ( β-конверсия ) = (λx. E(x x)) (λx. E(x x)) ( β-конверсия ) = (λx. E(x x)) (λx. E(x x)) ( β-конверсия ) = E (Y E) (предпоследняя строчка) Эти вычисления показывают, что у любого λ-выражения E есть неподвижная точка. Вооружившись Y , мы теперь можем вернуться к проблеме решения уравнения для mult. Предположим, что multfn определяется так: LET multfn = λf m n. ( iszero m → 0 ) | add n ( f (pre m) n)) ↑ и multfn определяется так: LET mult = Y multfn
↑
Тогда: mult m n = (Y multfn ) m n ( по определению mult ) = multfn ( Y multfn ) m n (свойство неподвижной точки Y) = multfn mult m n ( по определению mult ) = (λf m n, ( iszero m → 0 | add n ( f (pre m ) n))) mult m n ( по определению multfn ) = (iszero m → 0 | add n (mult ( pre m) n )) ( β-конверсия )
Уравнение вида f x1 … xn = E называется рекурсивным, если f имеет свободные вхождения в E. Y даёт общий способ решения таких уравнений. Начнем с уравнения вида:
Лист
ФП 02005-05 01 ИзмЛист № докум.
32
Подп. Дата Копирова
Формат
ФП 02005-05 01
f x1 … xn = ~ f ~ , где ~f~ - λ-выражение, содержащее f. Чтобы получить f , при условии корректности данного уравнения, определим: LET f = Y (λf x1 … xn . ~ f ~ ) Тот факт, что равенство выполняется, может быть показано следующим образом: f x1 … xn = Y (λf x1 … xn . ~ f ~ ) x1 … xn ( по определению f ) = (λf x1 … xn . ~ f ~ ) ( Y ((λf x1 … xn . ~ f ~ )) x1 … xn ( свойство неподвижной точки) = (λf x1 … xn . ~ f ~ ) f x1 … xn ( по определению f ) =~f~ ( β-конверсия ) Упражнение 21 Придумайте такое λ-выражение eq , чтобы выполнялось:
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
eq m n = ( iszero m → iszero n | (iszero n → false | eq (pre m)(pre n)))
Упражнение 22 Показать , что если Y1 определяется так: LET Y1 = Y (λy f. f(y f)) Тогда Y1 – оператор неподвижной точки, т.е. для любого Е : Y1 E = E (Y1 E)
Оператор неподвижной точки в следующем упражнении определен Тьюрингом ( Барендрехт [2]). Упражнение 23 Показать, что (λx y. y (x x y)) (λx y. y ( x x y )) – оператор неподвижной точки.
Лист
ФП 02005-05 01 ИзмЛист № докум.
33
Подп. Дата Копирова
Формат
ФП 02005-05 01
Следующее упражнение также из книги Барендрехта, где оно приписывается Клопу.
Упражнение 24 Показать, что Y2 , оператор неподвижной точки, где LET£ = λabcde f ghijklmnopqstuvwxyzr.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
r(thisisa fixedpointcombinator) LET Y2 = ££££££££££££££££££££££££££
Упражнение 25 Верно ли, что Y f → f ( Y f)? Если да, то докажите это; если нет - найдите такое λ-выражение Ŷ, что Ŷ f → f (Ŷ f). В чистом λ-исчислении , λ-выражения могут быть применены только к одному аргументу; однако этот аргумент может быть и кортежом. Таким образом, можно написать : E (E1, … , En) Что фактически обозначает: E(E1,(E2,( …(En-1,En)…))) Например, E(E1,E2) означает E(λf. f E1 E2).
2.5 Функции нескольких аргументов Традиционно, в математике применение функции n-аргументов f к аргументам x1 … xn записывается так: f(x1 … xn). Существуют два способа представления таких аппликаций в λ-исчислении: (i) (ii)
как (f x1 … xn) , или как применение f к n-кортежу (x1 … xn).
В первом случае, функция f применяется к аргументам по одному, и называется каррированной, по имени логика Карри ( впервые идея каррирования была создана Шонфинкелем[31]). Функции and, or и add ,
Лист
ФП 02005-05 01 ИзмЛист № докум.
34
Подп. Дата Копирова
Формат
ФП 02005-05 01
определенные выше, все являются каррированными функциями. Одно из преимуществ каррированных функций, это то, что они могут быть “частично применены”; например, add 1 – результат частичного применения add к 1 и соответствует функции n → n+1. Несмотря на то, что часто бывает удобно представлять функции nаргументов каррировнными, бывает также полезно представить их как во втором случае (ii), описанном выше, λ-выражением, предполагающим единственный аргумент n-кортеж. Например, вместо представления “ +” и ''х'' λ-выражениями add и mult скажем так :
может быть более удобно представить их функциями sum и prod , например такими: sum (m,n) = m+n prod (m,n) = mxn Это уже больше похоже на традиционные математические обозначения, и имеет применения, которые мы рассмотрим позже. Можно сказать, что sum и prod – некаррированные версии add и mult соответственно. Определим:
мы видим, что sum и prod обладают желаемыми свойствами; например: sum(m,n) = uncurry add (m,n) = (λf p. f (fst p) (snd p)) add (m,n) = add(fst (m,n))(snd (m,n)) = add m n = m+n
Инв. № подл.
Взам. инв. № Инв. № дубл.
LET curry = λf x1 x2. f (x1,x2) LET uncurry = λf p. f (fst p)(snd p)
Подп. и дата
Подп. и дата
add m n = m+n mult m n = mxn
затем, если мы определим sum = uncurry add prod = uncurry mult
Лист
ФП 02005-05 01 ИзмЛист № докум.
35
Подп. Дата Копирова
Формат
ФП 02005-05 01
Упражнение 26 Показать, что для любого E: curry ( uncurry E) = E uncurry ( curry E) = E и что отсюда следует: add = curry sum mult = curry prod Теперь мы можем определить любую n-арную функцию как каррированную и некарриванную. Для n>0 определим: LET curryn = λf x1 … xn. f (x1 … xn) n
n
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
LET uncurryn = λf p. f ( p↓1) … ( p↓n) Если Е представляет функцию с n-кортежом в качестве аргумента, тогда curryn E представляет каррированную функцию, которая применяется к аргументам по одному. Если Е – каррированная функция n аргументов, тогда uncurryn E представляется собой некаррированную версию , предполагающую единственный аргумент : n-кортеж. Упражнение 27 Показать, что (i) (ii)
curryn (uncurryn E) = E uncurryn (curryn E) = E
Упражнение 28 Придумайте λ-выражения En1 и En2 на основе curry и uncurry такие что, curryn = En1 и uncurryn = En2. Следующая нотация предоставляет удобный способ записи λ-выражений, в которых в качестве аргумента ожидаются n-кортежи. Обобщенные λ-абстракции
Лист
ФП 02005-05 01 ИзмЛист № докум.
36
Подп. Дата Копирова
Формат
ФП 02005-05 01
LET λ(V1, … , Vn). E = uncurryn (λV1 … Vn.E) Пример :
λ (x,y). mult x y означает: 2
2
uncurry2 (λx y. mult x y ) = (λf p. f (p↓1)(p↓2))( λx y. mult x y) = (λf p. f ( fst p)(snd p)) (λx y. mult x y) = λp.mult (fst p)(snd p) Таким образом: (λ(x,y). mult x y)(E1,E2) = (λp. mult (fst p) (snd p)) (E1,E2) = mult (fst(E1,E2))(snd(E1,E2)) = mult E1 E2
Обобщенная β-конверсия
где E[E1, … , En/V1, … ,Vn] – одновременная подстановка E1, … , En на V1, … , Vn соответственно, и ни одна из этих переменных не имеет свободных вхождений в E1, … , En .
Пример: λf (x,y). f x y означает λf. (λ(x,y). f x y) , что в свою очередь значит λf. uncurry (λx y. f x y) равное λf. (λp. f (fst p)(snd p)).
Инв. № подл.
Взам. инв. № Инв. № дубл.
(λ(V1, … , Vn) . E)(E1, … , En) = E[E1, … , En/V1, … ,Vn]
Подп. и дата
Подп. и дата
Этот пример показывает правило обобщенной β-конверсий, приведенное ниже в таблице. Это правило можно получить из оригинальной β-конверсии, определения картежей и обобщенной λ-абстракции. Идея состоит в том, что кортеж аргументов последовательно подходит к каждой позиции аргументов в теле обобщенной абстракции; затем каждый отдельный аргумент может быть извлечен из кортежа не затрагивая остальные.
Удобно расширить нотацию λV1 V2… Vn . Е , описанную в начале книги, так чтобы каждое Vi было либо идентификатором, либо кортежем идентификаторов. λV1 V2… Vn . Е всё ещё значит λV1.( λV2.(…( λVn . E) … )), но теперь если Vi – кортеж идентификаторов, тогда выражение является обобщенной абстракцией.
Упражнение 29
Лист
ФП 02005-05 01 ИзмЛист № докум.
37
Подп. Дата Копирова
Формат
ФП 02005-05 01
Показать, что если единственные свободные переменные в E это x1 , … , xn и f, тогда, если f = Y (λf ( x1 , … , xn).E) тогда f(x1 , … , xn) = E[f/f] Упражнение 30 Определить λ-выражение div со свойством: div (m,n) = (q,r) где q и r – частное и остаток деления n на m.
Взам. инв. № Инв. № дубл.
Подп. и дата
2.6 Взаимная рекурсия Для решения набора взаимно рекурсивных выражений таких как следующие: f1 = F1 f1 … fn f2 = F2 f1 … fn . . . fn = Fn f1 … fn мы просто определим для 1 ≤ i ≤ n fi = Y (λ(f1, … fn).(F1 f1, … fn, … , Fn f1, … fn))↓ i Это выполняется, поскольку если →
Подп. и дата
→
f = Y (λ(f1, … fn).(F1 f1, … fn, … , Fn f1, … fn))
тогда fi = f↓i , и отсюда следует что: →
→
f = (λ(f1, … fn).(F1 f1, … fn, … , Fn f1, … fn)) f →
→
→
→
= (F1(f↓1)…(f↓n), … , Fn(f↓1) … (f↓n))
Инв. № подл.
→
Лист
ФП 02005-05 01 ИзмЛист № докум.
38
Подп. Дата Копирова
Формат
ФП 02005-05 01
Отсюда:
= (F1 f1 … fn, … , Fn f1 … fn)
(т.к. f↓i = fi).
fi = Fi f1 … fn
2.7 Представление рекурсивных функций
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Важный класс числовых функций – рекурсивные функции. Вскоре после того, как Чёрч придумал λ-исчисление, Клин доказал ,что в λ-исчислении может быть представлена любая рекурсивная функция. Это послужило доказательством тезиса Чёрча – гипотезы о том, что любая интуитивно вычислимая функция может быть представлена λ-исчислением. Было показано , то другие вычислительные модели определяют тот же класс функций, что и λ-исчисление.
В этом разделе будет описано что означает представление арифметических функций λ-исчислением. Будут определены два класса функций, примитивно- рекурсивные функции и рекурсивные функции, и будет показано, что все функции этих классов могут быть представлены λ-исчислением. В разделе 2.3 было объяснено, как число n представляется с помощью λ-выражения n. Говорят, что λ-выражение f представляет математическую функцию f , если для всех чисел x1 , … , xn : f (x1 , … , xn) = y если f (x1 , … , xn) = y
2.7.1 Примитивно-рекурсивные функции Функция называется примитивно рекурсивной, если её можно создать из 0 и функций S и Uin (определенные ниже) конечной последовательностью применений операторов подстановки и примитивной рекурсии ( также определенных ниже). Функция наследования S и функция проектирующая Uin ( где все n и i – числа), определяются следующим образом: (i) (ii)
S(x) = x + 1 Uin(x1 , … , xn) = xi
Подстановка Предположим, g – функция r аргументов , а h1, … , hr – r -функций с n аргументами каждая. Мы считаем, что f определяется из g и h1, … , hr подстановкой, если : f (x1 , … , xn) = g ( h1(x1 , … , xn), … , hr (x1 , … , xn)) Лист
ФП 02005-05 01 ИзмЛист № докум.
39
Подп. Дата Копирова
Формат
ФП 02005-05 01
Примитивная рекурсия Предположим, g – функция n-1 аргумента и h – функция n+1 аргументов. Мы считаем , что f определяется из g и h примитивной рекурсией, если: f(0, x2 , … , xn) = g (x2 , … , xn) f(S(x1), x2 , … , xn) = h (f(x1 , … , xn), x1 , x2, … , xn) g называется базовой функцией , а h – ступенчатой функцией. Можно доказать, что для любых базовой и ступенчатой функции всегда существует уникальная функция , определенная из них примитивной рекурсией. Этот результат называется рекурсивной теоремой; доказательство теоремы можно найти в книгах по математической логике.
Взам. инв. № Инв. № дубл.
Подп. и дата
Пример Функция сложения sum – примитивно рекурсивная, поскольку: sum(0, x2) = x2 sum(S(x1), x2) = S(sum(x1, x2)) Теперь покажем, что любая примитивно рекурсивная функция может быть представлена λ-выражениями. n
Очевидно, что λ-выражения 0, suc, λp. p↓i представляют исходные функции 0, S и Uin соответственно. Предположим, что функции g r- переменных представляется как g ,а функции hi ( 1 ≤ i ≤ r ) n- переменных представляются как hi . Тогда, если функция f n- переменных определятся подстановкой : f(x1 , … , xn) = g(h1(x1 , … , xn), … , hr(x1 , … , xn)) тогда f представляется f, где :
Инв. № подл.
Подп. и дата
f = λ(x1 , … , xn). g(h1(x1 , … , xn), … , hr(x1 , … , xn)). Предположим функция f n- переменных индуктивно определяется из базовой функции g n-1- переменных и из индуктивного шага функции h n+1переменной. Тогда
Лист
ФП 02005-05 01 ИзмЛист № докум.
40
Подп. Дата Копирова
Формат
ФП 02005-05 01
f(0, x2 , … , xn) = g(x2 , … , xn) f(S(x1), x2 , … , xn) = h (f (x1 , … , xn), x1 , … , xn) Таким образом, если g представляет g , а h представляет h , тогда f будет представлять f если f(x1,x2, … , xn) = (iszero x1 → g(x2 , … , xn)| h(f(pre x1,x2, … , xn), pre x1,x2, … , xn)) Используя метод неподвижной точки, функция f , чтобы удовлетворять этому уравнению ,должна быть создана следующим способом : Y (λf. λ (x1,x2, …, xn ). ( iszero x1 → g ( x2, …, xn) | h (f (pre x1, x2, …, xn), pre x1, x2, …, xn )))
Таким образом, любая примитивно рекурсивная функция может быть представлена λ выражением.
Подп. и дата
Предположим функция g – функция n -аргументов. Мы считаем, что f определяется из g минимизацией, если : f(x1 , … , xn) = “наименьшее y, такое что g(y, x2 , … , xn ) = x1”
Инв. № подл.
Подп. и дата
Функция называется рекурсивной , если она может быть создана из 0, функции наследования и проектирующей функции последовательностью подстановок, примитивных рекурсий и минимизаций.
Взам. инв. № Инв. № дубл.
2.7.2 Рекурсивные функции
Минимизация
Обозначение MIN(f) используется для обозначения минимизации функции f. Функции , определенные минимизацией, могут быть неопределенны при некоторых аргументах. Например, если one есть функция которая всё время возвращает 1, т.е. one(x) = 1 для любого x, тогда MIN(one) определена только для аргумента со значением 1. Это очевидно потому, что если f (x) = MIN(one)(x), тогда : f(x) = “наименьшее y , такое что one(y) = x” и очевидно что это выражение определено только для x= 1 . Таким образом: MIN(one)(x) =
0
если x = 1
Лист
ФП 02005-05 01 ИзмЛист № докум.
41
Подп. Дата Копирова
Формат
ФП 02005-05 01
иначе неопределенно Чтобы показать, что любую рекурсивную функцию можно представить в λ-исчислении, необходимо показать как представить минимизацию произвольной функции. Предположим g представляется функцию g n- переменных , а f определятся так : f = MIN(g) Тогда, если можно придумать такое λ-выражение min , что min x f (x1 , … , xn) представляет собой наименьшее число y больше чем x такое, что f(y, x2 , … , xn) = x1 тогда g представляет g, где : g = λ( x1 , … , xn). min 0 f (x1 , … , xn)
min x f (x1 , … , xn) = (eq (f(x, x2 , … , xn)) x1 ) → x | min (suc x) f (x1 , … , xn))
Таким образом, любая рекурсивная функция может быть определена λ-выражением.
Существуют рекурсивные функции, которые не являются примитивно рекурсивными. Ниже представлена одна из версий функции Акермана ψ, определённая так : ψ(0,n) = n+1 ψ(m+1,0) = ψ(m,1) ψ(m+1,n+1) = ψ(m,ψ(m+1,n))
Инв. № подл.
Взам. инв. № Инв. № дубл.
где eq m n принимает значение true, если m = n, иначе - false. Таким образом min можно просто определить так:
Подп. и дата
Подп. и дата
min будет точно обладать желаемым свойством если:
Y(λm. λx f (x1 , … , xn). (eq (f(x, x2 , … , xn)) x1 → x | m ( suc x ) f (x2 , … , xn)))
Примитивные рекурсии старших порядков
Лист
ФП 02005-05 01 ИзмЛист № докум.
42
Подп. Дата Копирова
Формат
ФП 02005-05 01
Однако, если позволить функциям принимать роль аргументов, тогда гораздо больше рекурсивных функций можно определить с помощью примитивной рекурсии. Например, если функция старшего порядка rec определяется примитивной рекурсией следующим образом: rec(0, x2, x3) = x2 rec (S (x1), x2, x3) = x3 (rec (x1 , x2 , x3)) тогда ψ определяется так:
ψ (m,n) = rec (m, S, f → ( x → rec ( x,f(1),f))) (n)
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
где x → θ(x) соответствует функции ( обратите внимание, что λx.θ(x) – λ-выражение , где x → θ(x) – обозначение неформализованной математики) , которая отображает x в θ(x). Обратите внимание на то , что третий аргумент функции rec , а именно x3 должен быть функцией. В определении ψ мы также использовали x2 как функцию , т.е. S. Упражнение 31 Показать, что определение ψ через rec работает, т.е. что с определением ψ, данным выше: ψ(0,n) = n+1 ψ(m+1,0) = ψ(m,1) ψ(m+1,n+1) = ψ(m,ψ(m+1,n))
Функция, которая использует другие функции в качестве аргументов, или возвращает другую функцию в качестве результата, называется функцией старшего порядка. Пример ψ показывает, что примитивная рекурсия старшего порядка сильнее, чем обычная примитивная рекурсия ( примитивная рекурсия, определенная в 2.7.1 называется примитивной рекурсией первого порядка). Использование операторов наподобие rec делает функциональное программирование могучим инструментом.
Лист
ФП 02005-05 01 ИзмЛист № докум.
43
Подп. Дата Копирова
Формат
ФП 02005-05 01
2.7.3 Частично рекурсивные функции Частичные функции - функции, определенные не для всех аргументов. Например, функция MIN(one), описанная выше – частичная. Другим примером может служить функция деления, поскольку деление на 0 неопределенно. Функции, определенные для всех аргументов называются полными. Частичная функция называется частично рекурсивной если она может быть создана из 0, функции наследования и функции отображения с помощью последовательности подстановок, примитивных рекурсий и минимизаций. Таким образом, рекурсивные функции – это частично рекурсивные функции, оказавшиеся полными. Можно показать, что любая частично рекурсивная функция f может быть представлена λ-выражением f таким что:
Взам. инв. № Инв. № дубл.
Подп. и дата
(i) (ii)
f(x1 , … , xn) = y , если f (x1 , … , xn) = y если f (x1 , … , xn) неопределена, тогда f (x1 , … , xn) не имеет нормальной формы.
Обратите внимание на то ,что несмотря на (ii) , в общем случае неверно считать “неопреденными” выражения без нормальной формы. Упражнение 32 Напишите λ-выражение которое представляет MIN(f) , где f(x)= 0 для всех x.
2.8 Расширенное λ-исчисление. Несмотря на возможность представления объектов данных и структур данных с
Подп. и дата
помощью λ-выражений, часто это бывает неэффективно. Например, большинство компьютеров приспособлены для арифметических вычислений, и
будет разумнее
использовать для вычисления чисел именно их, нежели
Инв. № подл.
λ-конверсию. Математически ясный способ представления правил в
Лист
ФП 02005-05 01 ИзмЛист № докум.
44
Подп. Дата Копирова
Формат
ФП 02005-05 01
λ-исчислении – это представление с помощью так называемых δ-правил. Идея заключается в том ,чтобы добавить набор новых констант и потом определить так называемые δ-правила для того, чтобы редуцировать выражения с этими константами. Например, можно было бы добавить числа и “ +“ как новые константы и , вместе с δ-правилом, было бы:
+ m n → m+n δ
(E1→E2 означает, что Е2 – результат применения δ-правил к подвыражению Е1) δ
Взам. инв. № Инв. № дубл.
Подп. и дата
Добавляя такие константы и правила в λ-исчисления, следует быть внимательным, чтобы не нарушить прекрасные свойства этого исчисления, например Теорему Чёрча-Россера.
Можно показать, что δ-правила безопасны, если они представлены в форме: c1 c2 … cn → e δ
где c1 ,c2 …, cn – константы, а e – либо константа, либо закрытая абстракция ( такие λ-выражения иногда называют значениями). Например, можно добавить Suc, Pre, IsZero, ∆0, ∆1, ∆2, … как константы
Инв. № подл.
Подп. и дата
с помощью δ-правил: Suc ∆n → ∆n+1 δ
Лист
ФП 02005-05 01 ИзмЛист № докум.
45
Подп. Дата Копирова
Формат
ФП 02005-05 01
Pre ∆n+1 → ∆n δ
IsZero ∆0 → true δ
IsZero ∆n+1 → false δ
Здесь ∆n представляет число n, Suc, Pre , IsZero это новые константы ( неопределенные λ-выражения наподобие suc, pre , iszero ), а true и false – ранее определенные выражения (оба – закрытые абстракции).
Если Е1 → Е2, тогда можно говорить, что Е2 получена из Е1 “вычислением Если в Е2 нет( β- или η-) редексов, тогда Е2 – “полностью вычисленное”.
Говорят, что λ-выражение находится в нормальной форме если в нем нет β или η- редексов ( т.е. единственная конверсия, которая может быть применена – эт α-конверсия). Таким образом, λ-выражение в нормальной форме являетс “полностью вычисленным”.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
2.9 Теоремы λ-исчисления.
Лист
ФП 02005-05 01 ИзмЛист № докум.
46
Подп. Дата Копирова
Формат
ФП 02005-05 01
2. ПРИМЕРЫ
(i) (ii)
Представление чисел находится в нормальной форме. ( λx.x) 0 – не является нормальной формой.
Предположим, что λ-выражение вычисляется двумя разными способам применением двух различных последовательностей редукций до получения дву нормальных форм Е1 и Е2. Теорема Чёрча-Россера , приведенная ниже, показывае что Е1 и Е2 будут одинаковыми, за исключением того, что у них могут быт различные имена связанных переменных.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Из-за того, что результат редукций не зависит от последовательности их
выполнения, отдельные редексы могут быть вычислены параллельно. В настоящее время различные исследовательские проекты направлены на то, чтобы использовать этот факт путём создания мультипроцессорной архитектуры для вычисления λ-выражений. Сейчас ещё слишком рано говорить, насколько успешны эти разработки. Может оказаться, что проблемы, связанные с распределением редексов на разные процессоры и последующим сбором результатов, сведут на нет все теоретические преимущества данного подхода. Всё же будем надеяться, что эти пессимистичные прогнозы не оправдаются. Замечательным фактом является то, что теорема Чёрча-Россера, являющаяся чисто математическим результатом и сформулированная ещё до того как были созданы компьютеры, может привести к созданию нового поколения компьютеров. Ниже приведена формулировка теоремы Чёрча-Россера. На её примере хорошо видно, что есть весьма очевидные вещи, которые тем не менее очень трудно доказать. Многие свойства λ-исчисления имеют схожую природу.
2.1.
Теорема Чёрча-Россера
Если Е1 = Е2 , тогда существует Е, такая что Е1 → Е и Е2 → Е.
Лист
ФП 02005-05 01 ИзмЛист № докум.
47
Подп. Дата Копирова
Формат
ФП 02005-05 01
2.1.1. 2.1.2. Теперь видно, каким образом теорема Чёрча-Россера показывает, что λ-выражения могут быть вычислены в любом порядке. Предположим, что выражение Е вычисляется двумя разными способами применением двух
разных последовательностей редукций до получения двух нормальных форм Е и Е2. Т.к. Е1 и Е2 получены из Е последовательностью конверсий, из определения = следует что Е = Е1 и Е = Е2 и , следовательно, Е1 = Е2. Из теоремы Чёрча-Россер следует, что существует такое выражение Е′ , что
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Е1 →Е′ и Е2 → Е′. Теперь, если Е1 и Е2 находятся в нормальной форме,тогд единственными редексами, которые в них содержатся будут α-редексами и поэтом единственным способом , которым Е1 и Е2 можно свести к E′, будет изменение име связанных переменных (т.е. α-конверсия).
С помощью теоремы Чёрча-Россера также можно показать, что если m ≠ n, тог λ-выражения, соответствующие m и n не эквивалентны, т.е. m ≠ n . Предположим, ч m ≠ n, но m = n. Тогда по теореме Чёрча-Россера m → E и n → E для какого-нибудь Е. Но это очевидно из определений m и n ,то есть m = λf x. fm x n = λf x. fn x
очевидно,что такое Е не может существовать. Единственными конверсиям которые могут быть применены к m и n являются α-конверсии, а они не мог изменить число аппликаций в выражении (m содержит m аппликаций, а n содержит аппликаций).
λ-выражение Е имеет нормальную форму, если Е = Е′ для какой либо Е′ нормальной форме. Следствие, приведенное ниже, показывает отношени выражений в нормальной форме и имеющих нормальную форму. Оно обобщае утверждения приведенные выше.
Лист
ФП 02005-05 01 ИзмЛист № докум.
48
Подп. Дата Копирова
Формат
ФП 02005-05 01
Следствие из теоремы Чёрча-Россера
(i)
Если Е имеет нормальную форму, тогда Е → Е′ , для Е′ в нормальной форме.
(ii)
Если Е имеет нормальную форму и Е = Е′ , тогда Е′ имеет нормальную форму. (iii)
Если Е = Е' и Е и Е′ оба находятся в нормальной форме, тогда Е и Е′ идентичны вплоть до α-конверсии.
Доказательство
Если Е имеет нормальную форму, тогда Е = E′ для какого- то Е′ в нормальной форме. По теореме Чёрча-Россера существует E′′ , такое что Е → E′′ и E′ → E′ Т.к. E′ находится в нормальной форме, единственные редексы которые оно может содержать - α-редексы, а отсюда следует что редукция E′ → E′′ должна состоять из последовательности α-конверсий. Таким образом, E′′ должно быть идентично с E′ , за исключением имен некоторых связанных переменных; также оно должно быть в нормальной форме, как и E′.
(ii)
Предположим что Е имеет нормальную форму и Е = E'. Т.к. Е имеет нормальную форму, Е = E′′, где Е′′ находится в нормальной форме. Следовательно, Е′ = E′′ в следствии транзитивности = , и значит Е′ имеет нормальную форму. Доказано выше.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
(i)
(iii)
2.2. Упражнение 33
Для каждого из следующих λ-выражений найдите либо его нормальную форму, либо покажите что оно не имеет нормальной формы.
Лист
ФП 02005-05 01 ИзмЛист № докум.
49
Подп. Дата Копирова
Формат
ФП 02005-05 01
(i) (ii) (iii) (iv) (v) (vi) (vii)
add 3 add 3 5 (λx. x x) (λx.x) (λx. x x) (λx.x x) Y Y (λy. y) Y (λf x. ( iszero x → 0 | f ( pre x))) 7
Необходимо отметить, что λ-выражение Е может иметь нормальную форму даже если существует бесконечная последовательность Е → Е1 → Е2 … . Например, (λx. 1)(Y f) имеет нормальную форму 1 , хотя и :
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
(λх. 1) (Y f) → (λx. 1 ) (f (Y f)) → … (λx. 1 ) (fn (Y f)) → …
Теорема нормализации , приведенная ниже, утверждает, что можно избежат таких слепых переходов, редукцией крайних слева β- или η- редексов, где крайний слева” означает редекс у которого начало λ находится так далеко слев насколько это возможно.
Другой важный момент, который следует отметить – это то, что Е1 может иметь нормальную форму, даже если Е1 Е2 имеет нормальную форму.
Например, Y не имеет нормальной формы, но Y (λx. 1 ) → 1. Частой ошибко считать, что λ-выражения без нормальной формы означают “неопределенны функции. Y не имеет нормальной формы, но означает вполне определенну функцию( математическую характеристику функции Y можно найти в книге Сто Анализ, оставшийся за рамками данной работы ( [37]), показывает, что λ-выражен соответствует неопределенной функции тогда и только тогда, когда оно не мож быть обращено в выражение в головной нормальной форме , где Е находится головной нормальной форме, если оно имеет форму
Лист
ФП 02005-05 01 ИзмЛист № докум.
50
Подп. Дата Копирова
Формат
ФП 02005-05 01
λV1 … Vm. V E1 … En
где V1 … Vm и V переменные, а Е1, …, Еn - λ-выражения (V может быть либ эквивалентно Vi для какого-то i, либо отличаться от всех). Следовательно операто неподвижной точки Y не является неопределенным, потому что он может быт обращен в λf. f ((λx. f(x x)) (λx. f(x x))) ,
а это –головная нормальная форма.
Взам. инв. № Инв. № дубл.
Подп. и дата
Можно показать, что выражение Е имеет головную нормальную форму тогда и только тогда когда существуют выражения E1, … , En такие что E E1 … En имеют нормальную форму. Этот факт также поддерживает интерпретацию выражений без головной нормальной формы как неопределенные функции: если Е неопределенно, это означает, что Е Е1 … Еn никогда не завершится для любых Е1, …, Еn. Полную информацию насчет головных нормальных форм и их отношений с определенностью можно найти в книге Баредгрета [2].
Теорема нормализации
Инв. № подл.
Подп. и дата
Если Е имеет нормальную форму, тогда повторяя редукцию крайних слева β- или η- редексов ( если возможно после α-конверсии для того чтобы избежать неправильных замен) можно превратить исходное выражение в выражение в нормальной форме.
Лист
ФП 02005-05 01 ИзмЛист № докум.
51
Подп. Дата Копирова
Формат
ФП 02005-05 01
Пояснение насчет α-конверсий в формулировке теоремы призвано покрыть случаи подобные следующему : (λx. (λy. x y)) y → λy′ . y y′ где была произведена α-конверсия λy. x y → λy′. x y′ исбежать неправильной замены (λy. x y)[y/x] = λy. y y.
для того, чтобы
Подп. и дата
Последовательность редукций, в которых производится редукция крайнего слева редекса называется нормальной последовательностью редукций. В теореме нормализации говорится о том, что если Е имеет нормальную форму ( т.е. для какого-то Е′ в нормальной форме Е = E′), тогда она может быть найдена нормальной последовательностью редукций. Но зачастую это не самый эффективный способ её нахождения. Например, для последовательности нормальных редукций требуется редуцировать
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
(λx. ~~x~~x~~)E к ~~E~~E~~
Если Е не находится в нормальной форме, тогда будет более эффективно сперва редуцировать Е к , скажем, Е′ (где Е′ находится в нормальной форме) , а затем редуцировать (λx . ~~ x ~~ x~~ ) E′
к
Лист
ФП 02005-05 01 ИзмЛист № докум.
52
Подп. Дата Копирова
Формат
ФП 02005-05 01
~~E′~~E′~~
таким образом избежав необходимости редуцировать Е дважды.
Необходимо заметить, что так называемая схема “вызова-по-значению” не работает в случаях вроде такого: (λx. 1) ((λx. x x)( λx. x x))
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Нахождение оптимального алгоритма для выбора следующего редекса для редукции является сложной проблемой. Последние разработки в этой области изложены в работе Ли [25].
Из-за того, что нормальная последовательность редукций неэффективной, некоторые языки программирования основанные на
оказалась
λ-исчислении, например LISP, используют вызов по значению, даже не смотря на то, что он не всегда выполняется. Вообще говоря, кроме эффективности, у вызова по значению имеется ряд других преимуществ, особенно когда язык “нечист”, т.е. имеет конструкции со сторонними эффектами (напр. присваиваниями). С другой стороны, в последних разработках предпологается, что вычисление нормальной последовательности редукций может оказаться не настолько неэффективным, как представлялось раньше, если использовать хитрые
приёмы, наподобие редукции по графу (см. далее). Вопрос о том, следует ли в функциональных языках программирования использовать нормальную последовательность или вызов по значению до сих пор остаётся открытым.
2.10 Вызов по значению и Y
Лист
ФП 02005-05 01 ИзмЛист № докум.
53
Подп. Дата Копирова
Формат
ФП 02005-05 01
Произведем вызов Y: LET Y = λf. (λx. f(x x))( λx. f(x x))
К сожалению, с Y не работает вызов по значению, потому что получается цикл из-за порядка аппликаций. Y f → f (Y f) → f (f (Y f)) → f (f (f (Y f)))
Взам. инв. № Инв. № дубл.
Подп. и дата
. .
. Для того, чтобы это избежать, определим: ∧
LET Y = λf. (λx. f(λy. x x y)) (λx. f(λy. x x y)) ∧
Обратите внимание, что Y это Y, в котором произведена η- конверсия ∧
“x x” в
“λy. x x y”. Y не входит в цикл при вызове по значению: ∧
∧
Инв. № подл.
Подп. и дата
Y f → f (λy. Y f y) Вызов по значению не вычисляет λs, и , таким образом, удаётся избежать цикличности.
Лист
ФП 02005-05 01 ИзмЛист № докум.
54
Подп. Дата Копирова
Формат
ФП 02005-05 01
Глава 3. Комбинаторы.
Комбинаторы лежат в основе альтернативной к λ-исчислению теори функций. Первоначально, они были введены логиками как способ изучения замен Позднее, Тёрнер показал, что комбинаторы дают хороший “машинный код”, который можно компилировать функциональные программы [34]. На основании иде Тёрнера были построены несколько эксперементальных компьютеров (например см [8]), и результаты обнадёживают. Как работают эти машины, объяснено в разделе 3. Комбинаторы также дают хороший промежуточный код для конверсионны машин; некоторые из лучших компиляторов для функциональных языко основаны именно на нём
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
( например см. [11,1]). Также существуют комбинаторов: (i) (ii)
два
эквивалентных
способа формулирования теории
через λ-исчисление, как отдельная теория.
В данной работе используется первый подход, т.к. он немного проще, но исторически сначала был использован второй подход1. Будет показано, что любое λ-выражение эквивалентно выражению, построенному из переменных и двух определенных выражений ,K и S , используя только аппликацию функций. Это делается имитацией λ-абстракций с помощью комбинаторов K и S. Будет показано, как β-редукции могут быть произведены с помощью более простых операций , используя K и S. Именно эти более простые операции комбинаторная машина передаёт непосредственно в компьютер.
Инв. № подл.
Опредения K и S таковы: Лист
ФП 02005-05 01 ИзмЛист № докум.
55
Подп. Дата Копирова
Формат
ФП 02005-05 01
LET K = λx y. x LET S = λf g x.(f x) (g x)
Из этих определений очевидно, что β-редукция для всех Е1, Е2 и Е3:
K E1 E2 = E1
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
S E1 E2 E3 = ( E1 E3) (E2 E3)
Любое выражение, построенное аппликацией (т.е. комбинацией) из K и S называется комбинатором, K и S – примитивные комбинаторы.
__________ 1
Наиболее полный курс это двухтомник Комбинаторной Логики [9,10].
Но лучше начать с более поздних учебников [19, 2] В БНФ, комбинаторы имеют следующий синтаксис:
<комбинатор> : = K | S | (<комбинатор> <комбинатор>)
Комбинаторное выражение – это выражение, построенное из K и S и нуля ил других переменных. Таким образом, комбинатор – это комбинаторное выражение, н содержащее переменных. В БНФ, синтаксис комбинаторных выражений следующий
<комбинаторное выражение>
Инв. № подл.
:: = K | S
Лист
ФП 02005-05 01 ИзмЛист № докум.
56
Подп. Дата Копирова
Формат
ФП 02005-05 01
| <переменная> | (<комбинаторное выражение> <комбинаторное выражение>)
2.3. Упражнение 34 Определим I как : LET I = λx. x Показать, что I = S K K.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Функция идентичности I , определенная в последнем упражнении, часто берется как примитивный комбинатор, но, как показано в упражнении, это не является необходимым, поскольку её можно определить через K и S.
3.1 Редукция комбинаторов Если Е и Е′ – комбинаторные выражения тогда обозначение E → E′ с
используется, если E ≡ E′ или если E′ можно получить из Е последовательностью переписываний вида:
(i)
K E1 E2 → E1 c
(ii)
S E1 E2 E3 → (E1 E3) (E2 E3) c
(iii)
IE→E c
Лист
ФП 02005-05 01 ИзмЛист № докум.
57
Подп. Дата Копирова
Формат
ФП 02005-05 01
Обратите внимание, что редукция I E → E получается из (i) и (ii).
2.4. Пример S K K x → K x (K x)
из (ii)
c
→x
из (i)
c
Этот пример показывает, что для любого Е :
I E → E.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
c
Любая последовательность комбинаторных редукций, т.е. редукций вида → , может быть расширена в последовательность β-конверсий. с
Этот факт очевиден, т.к. K E1 E2 и S E1 E2 E3 редуцируетс последовательностью β-конверсий к E1 и E1 E3) (E2 E3) соответственно.
3.2 Функциональная полнота.
Неожиданным является тот факт, что любое λ-выражение может быть переведено в эквивалентное комбинаторное выражение. Результат такого приведения называется функциональной полнотой комбинаторов и является основой для компиляции функциональных языков в машинный код комбинаторных машин.
Лист
ФП 02005-05 01 ИзмЛист № докум.
58
Подп. Дата Копирова
Формат
ФП 02005-05 01
Сперва определим, что для произвольной переменной V и комбинаторног выражения E, существует другое комбинаторное выражение λ*V. E имитирующе λV. E так что λ*V.E = λV. E. Это даёт способ использования K и S для имитации добавляя ‘λV’ к выражению.
Если V переменная , а Е – комбинаторное выражение , тогда комбинаторное выражение λ*V. E индуктивно определяется на основе следующим образом:
(i) (ii) (iii) (iv)
λ*V. V = I λ*V. V′ = K V′ ( если V ≠ V′ ) λ*V. C = K C ( если C комбинатор) λ*V.(E1 E2) = S (λ*V.E1) (λ*V.E2)
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Обратите внимание на то, что λ*V.E – комбинаторное выражение, не содержащее V.
2.5. Пример Если f и x переменные, и f ≠ x, тогда λ*x. f x = S (λ*x. f) (λ*x. x) = S (K f) I
Следующая теорема показывает, что λ*V. E имитирует λ-абстракцию.
Лист
ФП 02005-05 01 ИзмЛист № докум.
59
Подп. Дата Копирова
Формат
ФП 02005-05 01
2.5.1.1.1. Теорема
(λ*V. E) = λV. E
2.5.1.1.1.1.1.1. Доказательство
Покажем, что (λ*V. E) V = E. Отсюда следует, что λV. (λ*V. E) V = λV. E и по η-редукции получим , что λ*V. E = λV. E.
Доказательство того, что (λ*V. E) V = E осуществляется математической индукцией на основе “размера” Е. Доказательство построим следующим образом:
(i)
Если E = V тогда:
Подп. и дата
(ii)
Если E= V′ , где V′ ≠ V , тогда: (λ*V. E) V = K V′ V = (λx y. x) V′ V = V′ = E
(iii)
Если Е = С, где С – комбинатор, тогда: (λ*V. E) V = K C = (λx y. x) C V = C = E
Взам. инв. № Инв. № дубл.
(λ*V. E) V = I V = (λx. x) V = V = E
(iv)
Если Е = (Е1 Е2), тогда по индукции можно предположить, что: (λ*V. E1) V = E1 (λ*V. E2) V = E2 и , следовательно : (λ*V. E) V = (λ*V. ( E1 E2)) V = (S (λ*V. E1) (λ*V. E2)) V
Инв. № подл.
Подп. и дата
= (λf g x. f x (g x)) (λ*V. E1) (λ*V. E2) V = (λ* V.E1) V ((λ*V. E2) V) = E1 E2
( по индуктивному допущению)
= E
Лист
ФП 02005-05 01 ИзмЛист № докум.
60
Подп. Дата Копирова
Формат
ФП 02005-05 01
2.5.1.1.1.2. 2.5.1.1.1.3. Запись
λ*V1 V2 … Vn. E обычно значит λ*V1. λ*V2. … λ*Vn. E
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Теперь определим переход комбинаторному выражению (Е)с: (i) (ii) (iii)
от
произвольного
λ-выражения
Е
(V)c = V (E1 E2)c = (E1)c (E2)c (λV. E)c = λ*V. (E)c
2.5.1.1.2. Теорема
Для любого λ-выражения Е верно, что Е = (Е)с
Доказательство. Доказательство производится по индукции на основе размера Е.
(i) (ii)
Если Е= V , тогда (Е)с = (V)c = V Если Е = (Е1 Е2) по индукции мы может предположить, что Е1 = (Е1)с Е2 = (Е2)с и следовательно: (Е)с = (Е1 Е2)с = (Е1)с (Е2)с = Е1 Е2 = Е
(iii)
Если Е = λV. E′
тогда по индукции можно предположить, что:
Лист
ФП 02005-05 01 ИзмЛист № докум.
61
Подп. Дата Копирова
Формат
к
ФП 02005-05 01
(E′)c = E′ и следовательно: (E)c = (λV. E′)c = λ*V. (E′)c
( по правилам перехода)
= λ*V. E′
( по индуктивному допущению)
= λV. E′
(из предыдущей теоремы)
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
=E
Эта теорема показывает, что любое λ-выражение эквивалентно λ-выражени построенному аппликацией из K , S и переменных, т.е. класс λ-выражений определенный на БНФ следующим образом: E :: = V | K | S | E1 E2 эквивалентен полному λ-исчислению.
Множество n комбинаторов С1, …, Сn называется базисом n элементов
( Барендрехт [2], Часть 8) , если любое λ-выражение Е эквивалентно выражению построенному аппликацией функций из Ci и переменных. Теорема описанная выше, показывает что K и S формируют 2-х элементный базис Следующие упражнение ( из раздела 8.1.5 книги Бахендрехта ) показывает, что существует одно-элементный базис .
2.5.1.1.3. Упражнение 35 2.5.1.1.4. Найдите комбинатор, предположим Х, такой, что λ-выражение эквивалентно выражению построенному из Х и переменных аппликацией. Подсказка: Пусть < E1, E2, E3> = λp. p E1 E2 E3 и предположим, что
Инв. № подл.
2.5.1.1.5. < K, S, K > < K, S, K > < K, S, K > и
< >
Лист
ФП 02005-05 01 ИзмЛист № докум.
62
Подп. Дата Копирова
Формат
ФП 02005-05 01
2.5.1.1.6. 2.5.1.1.7. Примеры
λ*f. λ*x. f (x x) = λ*f. (λ*x. f (x x)) = λ*f. ( S (λ*x. f) (λ*x. x x)) = λ*f. ( S ( K f) (S(λ*x. x) (λ*x. x))) = λ*f. (S (K f) ( S I I)) = S (λ*f. S (K f)) (λ*f. S I I) = S ( S (λ*f. S) (λ*f. K f)) ( K ( S I I)) = S ( S (K S) (S (λ*f. K) (λ*f. f))) ( K ( S I I)) = S ( S ( K S) ( S (K K) I)) (K (S I I))
(Y)c = (λf. (λx. f(x x)) (λx. f(x x)))c
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
= λ*f. ((λx. f(x x)) (λx. f(x x)))c = λ*f. ((λx. f(x x))c (λx. f(x x))c ) = λ*f. (λ*x. (f( x x))c) (λ*x. (f(x x))c) = λ*f. (λ*x. f(x x)) (λ*x. f(x x)) = S (λ*f. λ*x. f(x x)) (λ*f. λ*x. f(x x)) = S(S(S(KS)(S(KK)I))(K(SII)))(S(S(KS)(S(KK)I))(K(SII)))
3.3 Машины редукций
До публикации труда Дэвида Тёрнера [34], комбинаторы оставались чист теоретическим аспектом математики. В своей работе Тёрнер доказал , что трансляци функциональных языков, т.е. языков основанных на
Лист
ФП 02005-05 01 ИзмЛист № докум.
63
Подп. Дата Копирова
Формат
ФП 02005-05 01
λ-исчислении, в комбинаторы и последующая редукция полученног выражения используя перепись, алгоритм которой приведен выше, даю практический способ применения этих языков. Идея Тёрнера – представление комбинаторов деревьями. Например, S ( f x) ( K y) z может быть представлена так:
111
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
111
В памяти такие деревья отображаются как структуры указателей. Могут быть применены спецальные аппаратные и программно-аппаратные средства и определив →, можено добиться преобразования таких деревьев c
в соответствие правилам комбинаторной редукции.
Например, дерево, приведенное выше, может быть преобразовано в:
Лист
ФП 02005-05 01 ИзмЛист № докум.
64
Подп. Дата Копирова
Формат
ФП 02005-05 01
11
используя следующее преобразование:
Взам. инв. № Инв. № дубл.
Подп. и дата
3
2 1
2
S
3
2
3
1
Которое соответствует редукции S E1 E2 E3 → (E1 E3) (E2 E3). c
Подп. и дата
2.5.1.1.8. Упражнение 36
Какое преобразование дерева соответствует K E1 E2 → E1 ? с
Инв. № подл.
2.5.1.1.8.1. Как это преобразование изменит приведенное выше дерево?
Лист
ФП 02005-05 01 ИзмЛист № докум.
65
Подп. Дата Копирова
Формат
ФП 02005-05 01
Заметьте, что только что приведенное преобразование дерева для S
дублирует поддерево. Это приводит к расходу места; переход луч осуществлять генерируя одно поддерево с двумя указателями, т.е:
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
3
2
3.
1
2
1
3
Этот способ создаёт граф, а не дерево. Для более детального анализа такой редукции по графу, рекомендуется работа Тёрнера [34].
Из теоремы, описанной выше, следует, что эффективный способ редукции λвыражения состоит в следующем: (i) (ii)
Преобразование к комбинаторам (т.е. E → (E)c). Применение переписи K E1 E2 → E1 c
S E1 E2 E3 → (E1 E3) (E2 E3)
Лист
ФП 02005-05 01 ИзмЛист № докум.
66
Подп. Дата Копирова
Формат
ФП 02005-05 01
с
пока это возможно.
Интересный вопрос – будут ли выражения в результате этого процесса “полностью вычисляться”? Если какое-то выражение Е преобразуется в комбинаторы, а затем редуцируется используя →, будет ли результат с
выражения настолько же “полностью вычисленным” как и результат прямого λ-редуцирования Е, или будет частично вычисленным? Удивительно, но этот важный вопрос не рассмотрен в литературе
Подп. и дата
(наиболее важная работа – это работа Хиндлей [18]. Там производится сравнен λ-редукции с комбинаторной редукцией, но не тем способом, который на перв взгляд важен для работы комбинаторных машин). Но несмотря на э комбинаторные машины были построены и работают [8]! Известно, что если Е1 → Е2 в λ-исчислении, тогда не обязательно, что (Е1)с → (Е2)с. Например, возьмем:
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
с
Е1 = λy. (λz. y) (x y) E2 = λy. Y
2.5.1.1.9. Упражнение 37
С Е1 и Е2, определенными выше, показать, что Е1 → Е2 в λ-исчислении, но неверно что (Е1)с → (Е2)с. с
Лист
ФП 02005-05 01 ИзмЛист № докум.
67
Подп. Дата Копирова
Формат
ФП 02005-05 01
Комбинаторное выражение называется комбинаторной нормальной формой если не содержит подвыражений вида K E1 E2 или S E1 E2 E3. Тогда теорема нормализации выполняется для комбинаторных выражений, т.е. редукции крайнего слева комбинаторного редекса приведет к нахождению комбинаторной нормальной формы, если она существует. Заметьте, что если Е комбинаторная нормальная форма, необязательно следует , что это λ-выражение в нормальной форме.
тогда
2.5.1.1.10. 2.5.1.1.11.
Пример
S K находятся в нормальной комбинаторной форме , но содержит β-редекс, т.е.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
(λf. (λg x. (f x (g x))) (λx y. x)
2.5.1.1.12.
Упражнение 38
Придумайте комбинаторное выражение Е в комбинаторной норальной форме но не имеет нормальной формы.
3.4 Улучшенная трасляция в комбинаторы
Примеры, приведенные выше, показывают, что простые λ-выражения могут быть транслированы в достаточно сложные комбинаторные выражения с помощью правил из пункта 3.2. Применяются различные оптимизации для того, чтобы исполняемый машинами редукции более компактным.
сделать “код”
Лист
ФП 02005-05 01 ИзмЛист № докум.
68
Подп. Дата Копирова
Формат
ФП 02005-05 01
Примеры
(i)
Пусть E комбинаторное выражение , а х – переменная не имеющая вхождений в Е. Тогда: S ( K E) I x → (K E x) (I x) → E x c
c
и, следовательно S ( K E) I x = E x ( потому что E1 → E2 подразумевает с
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Е1 → Е2), и по экстенсиональности (см. пункт 1.7):
S(KE)I=E
(ii)
Пусть Е1 и Е2 комбинаторные выражения и x - переменная не имеющая вхождений ни в одно из выражений. Тогда : S ( K E1) (K E2) x → K E1 x (K E2) x → E1 E2 c
c
Таким образом:
S ( K E1) (K E2) x = E1 E2
Теперь:
Инв. № подл.
K ( E1 E2) x → E1 E2 Лист
ФП 02005-05 01 ИзмЛист № докум.
69
Подп. Дата Копирова
Формат
ФП 02005-05 01
c
и, следовательно K (E1 E2) x = E1 E2. Таким образом
S ( K E1) (K E2) x = E1 E2 = K (E1 E2) x
Из экстенсиональности следует, что:
Подп. и дата
S ( K E1) (K E2) = K (E1 E2)
Т.к. S (K E) I = E для любого Е, каждый раз когда генерируется комбинаторное выражение вида S ( K E) I , оно может быть оптимизировано просто к Е. Похожим образом, каждый раз когда генерируется выражение вида S ( K E1) (K E2) оно может быть оптимизировано к K (E1 E2).
2.5.1.1.13.
Пример
λ*f. λ*x. f (x x) = S ( S (K S) (S (K K) I)) (K (S I I)) Использование оптимизации S (K E) I = E упрощает выражение до: λ*f. λ*x. f(x x) = S (S (K S) K) (K (S I I))
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Выше было показано (раздел 3.2), что
Лист
ФП 02005-05 01 ИзмЛист № докум.
70
Подп. Дата Копирова
Формат
ФП 02005-05 01
3.5 Комбинаторы
Легче распознать применимость оптимизации S ( K E ) I = E , если I не была расширена до S K K , т.е. I берется как примитивный комбинатор. Другие комбинаторы также могут быть полезны. Например B и C, определенные так:
LET B = λf g x. f (g x) LET C = λf g x. f x g
имеют следующие правила редукции: B E1 E2 E3 → E1 (E2 E3)
Взам. инв. № Инв. № дубл.
Подп. и дата
c
C E1 E2 E3 → E1 E3 E2 c
2.5.1.1.14.
Упражнение 39
Показать, что с B и C определенными выше, верно что:
S ( K E1) E2 = B E1 E2 S E1 (K E2) = C E1 E2
Инв. № подл.
Подп. и дата
( где Е1 и Е2 – любые два комбинаторных выражения ).
Используя B и C можно провести дальнейшую оптимизацию трансляции λ-выражений в комбинаторы заменой выражений вида S ( K E1) E2 и
Лист
ФП 02005-05 01 ИзмЛист № докум.
71
Подп. Дата Копирова
Формат
ФП 02005-05 01
S E1 (K E2) на B E1 E2 и C E1 E2.
3.6
Алгоритм Карри
Комбинирование различных оптимизаций, описанных в предыдущем разделе ведет к Алгоритму Карри для трасляции λ-выражений в комбинаторные выражения Этот алгоритм состоит из использования определения (Е) с (данного в разделе 3.2) но каждый раз когда генерируется выражение формы S E1 E2 требуется применить следующие правила переписи:
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
1. 2. 3. 4.
S ( K E1) (K E2) → K (E1 E2) S( K E) I → E S (K E1) E2 → B E1 E2 S E1 (K E2) → C E1 E2
Если применимо больше чем одно правило, то используется правило с меньшим порядковым номером. Например , S (K E1) (K E2) транслируется в K (E1 E2) , а не в B E1(K E2).
2.5.1.1.15.
Упражнение 40
Показать, что используя алгоритм Карри, Y траслируется в комбинатор :
S(C B(S I I)) (C B (S I I))
2.5.1.1.16.
Упражнение 41
Показать, что S (S (K S) (S (K K) I)) (K (S I I)) = C B (S I I)
Лист
ФП 02005-05 01 ИзмЛист № докум.
72
Подп. Дата Копирова
Формат
ФП 02005-05 01
3.7
Алгоритм Тёрнера.
В своей второй работе Тёрнер предложил расширить алгоритм Карри используя другой новый примитивный комбинатор S′ [35]. Он определяется следующим образом:
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
LET S′ = λc f g x. c(f x) (g x
И имеет такое правило редукции: S′ C E1 E2 E3 → C (E1 E3) (E2 E3)
где С, Е1, Е2, Е3 произвольные комбинаторные выражения. “C” используется потому что S′ имеет такое свойство, что если С- это комбинатор (т.е. не содержит переменных) тогда для любого E1 и E2: λ*x. С E1 E2 = S′ C (λ*x. E1) (λ*x. E2)
Это можно показать используя экстенсиональность. Очевидно, что xэто переменная, не имеющая вхождений в
λ*x. C E1 E2
или
Лист
ФП 02005-05 01 ИзмЛист № докум.
73
Подп. Дата Копирова
Формат
ФП 02005-05 01
S′ C (λ*x. E1) (λ*x.E2) показать:
(как вы думаете, почему?)
и
значит достаточно
( λ*x. C E1 E2) x = (S′ C (λ*x. E1) (λ*x. E2)) x Из определения λ*х следует, что: λ*x. C E1 E2 = S ( S (K C) (λ*x. E1)) (λ*x. E2)
и следовательно
(λ*x. C E1 E2) x = (S (S (K C) (λ*x. E1)) (λ*x. E2)x
Подп. и дата
= S( K C)( λ*x. E1) x ((λ*x. E2)) x) = K C x ((λ*x. E1) x) ((λ*x. E2) x) = C ((λ*x. E1) x) ((λ*x. E2)) x) (S’ C (λ*x. E1) (λ*x. E2) x = C ((λ*x. E1) x) ((λ*x. E2)) x)
Но
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
и поэтому : (λ*x. C E1 E2) x = ( S’ C(λ*x. E1)( λ*x. E2)) x
2.5.1.1.17.
Упражнение 42
Где в описанном доказательстве мы использовали допущение, что С – комбинатор?
Комбинатор Тёрнера S′ полезен при трансляции λ-выражений вида
Лист
ФП 02005-05 01 ИзмЛист № докум.
74
Подп. Дата Копирова
Формат
ФП 02005-05 01
λVn … V2 V1. E1 E2 (скоро будет показано, почему удобно нумеровать связанные переменные в убывающем порядке). Для того, чтобы это показать определим по Тёрнеру [35]: E′ означает λ*V1. E E′′ означает λ*V2. (λ*V1. E) E′′′ означает λ*V3. (λ*V2. (λ*V1. E)) Напомним, что: (λVn … V2 V1. E1 E2) c = λ*Vn. ( … (λ*V2. (λ*V1. (E1 E2)c))) … ) Следующее упражнение показывает, что выражение
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
λ*Vn. … λ*V2. λ*V1. (E1 E2) становится очень сложным при увеличении n.
2.5.1.1.18.
Упражнение 43
Показать, что:
(i) (ii) (iii) (iv)
λ*x1. E1 E2 = S E1′ E2′ λ*x2. (λ*x1. E1 E2) = S (B S E1′′) E2′′ λ*x3. (λ*x2. (λ*x1. E1 E2)) = S ( B S ( B ( B S) E1′′′)) E2′′′ λ*x4. (λ*x3. (λ*x2. (λ*x1. E1 E2))) = S ( B S ( B ( B S) (B (B (B S))) E1′′′′)) E2′′′′
Размерность λ*Vn. … λ*V2. λ*V1. (E1 E2) пропорциональна квадрату n Используя S′ можно добиться линейной зависимости между размерностью и n :
Лист
ФП 02005-05 01 ИзмЛист № докум.
75
Подп. Дата Копирова
Формат
ФП 02005-05 01
λ*x2.( λ*x1. E1 E2) = λ*x2. S E1′ E2′ = S’ S (λ*x2. E1′) (λ*x2. E2′) = S’ S E1′′ E2′′ λ*x3.(λ*x2.( λ*x1. E1 E2)) = λ*x3. S′ S E1′′ E2′′ = S′ ( S′ S) (λ*x3. E1′′)((λ*x3. E2′′) = S′ ( S′ S) E1′′′ E2′′′ λ*x4(λ*x3.(λ*x2.( λ*x1. E1 E2))) = λ*x4. S′ ( S′ S) E1′′′ E2′′′ = S′ (S′ ( S′ S)) (λ*x4. E1′′′) ( λ*x4. E2′′′)
Также как B и С были введены чтобы упростить комбинаторные выражения вида S ( K E1 ) E2 и S E1 (K E2) соответственно, Тёрнер ввел B′ и С′ для той же цели что и S′ . Требуются такие свойства S′ C (K E1) E2 = B′ C E1 E2 S′ C E1 ( K E2) = C′ C E1 E2
(где С – произвольный комбинатор, а Е1 и Е2 произвольные комбинаторные выражения). Это достигается если B′ и C′ определены следующим образом: LET B′ = λc f g x. c f (g x) LET C′ = λc f g x. c(f x) g
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
= S′ (S′ ( S′ S)) E1′′′′ E2′′′′
Лист
ФП 02005-05 01 ИзмЛист № докум.
76
Подп. Дата Копирова
Формат
ФП 02005-05 01
Очевидно, что B′ и C′ будут иметь следующие свойства для произвольных λвыражений С, Е1, Е2 и Е3: B′ C E1 E2 E3 → C E1 (E2 E3) c
C′ C E1 E2 E3 → C ( E1 E3) E2 c
2.5.1.1.19.
Упражнение 44
(i) (ii) (iii) (iv) (v)
S′ E1 (K E2) E3 = B′ E1 E2 E3 S′ E1 E2 (K E3) = C′ E1 E2 E3 S ( B E1 E2) E3 = S′ E1 E2 E3 B ( E1 E2) E3 = B′ E1 E2 E3 C ( B E1 E2) E3 = C′ E1 E2 E3
Алгоритм Тёрнера для трансляции λ-выражений в комбинаторные выражения описан им [35] следующим образом:
В общем случае используйте алгоритм Карри, но каждый раз когда формируется терм начинающийся с S, B и C , используйте одну из следующий трансформаций, если возможно:
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Показать, что для произвольных λ-выражений Е1, Е2 и Е3:
S ( B K A) B → S′ K A B , B (K A) B → B′ K A B ,
Инв. № подл.
C (B K A ) B → C′ K A B. Лист
ФП 02005-05 01 ИзмЛист № докум.
77
Подп. Дата Копирова
Формат
ФП 02005-05 01
Со времени появления трудов Тёрнера, множество людей работало над улучшением его базовой идеи. Например, Джон Хагес ввел схему для динамической генерации оптимального набора примитивных комбинаторов ( суперкомбинаторов ) для каждой программы [20]. Идея состоит в том, что компилятор будет генерировать комбинаторные выражения построенные на суперкомбинаторах для компилируемой программы. Он будет также динамически генерировать микрокод для применения правил редукции для этих суперкомбинаторов. В результате каждая программа работает на редукционной машине, созданной специально под неё Большинство современных высокопроизводительных применений языков функционального программирования используют суперкомбинаторы [1, 11] Другой способ – использовать комбинаторы основанные на нотации Де Брейна краткое описание которой приводилось в разделе 1.8 . “ Категориальная абстрактная машина “ [26] использует именно этот подход.
Инв. № подл.
Подп. и дата
Взам. инв. № Инв. № дубл.
Подп. и дата
Здесь А и B обозначают произвольные термы как обычно, а К – любой терм, созданный из констант. Правильность нового алгоритма может быть доказана из правильности алгоритма Карри демонстрацией того, что в каждой из вышеприведенных трансформаций левые и правые части экстенсионально равны. В каждом случае это напрямую следует из определений соответствующих комбинаторов.
Лист
ФП 02005-05 01 ИзмЛист № докум.
78
Подп. Дата Копирова
Формат
Лист регистрации изменений Номера листов (страниц) Изм. изменённых
заменённых
новых
аннулированных
Всего листов (страниц) в докум.
№ документа
Входящий № сопроводительного докум. и дата
Подп.
Дата