Математические модели вычислений
Нормальные алгорифмы Маркова. Язык программирования Рефал. Суперкомпиляция.
λ-исчисление Чёрча. Рекурсивные комбинаторы и парадоксы.
λ-исчисление с простыми типами. Свойство сильной нормализации.
Алгорифмы Маркова
Пусть задан конечный алфавит A, не содержащий символов «перевод строки» (γ), «→» и «→.». Нормальным алгорифмом назовём последовательность формул подстановки вида:
< строка A* > (образец) → < строка A* > (результат)
< строка A* > → . (останов) < строка A* >
На вход алгорифма подаётся строка A*. Далее для каждого правила по порядку выполняется поиск образца в строке слева.
Если образец найден, т.е. для правила L → D входная строка T представлена в виде T = R · L · S, то подстрока L заменяется на D и результатом шага объявляется строка T' = R · D · S. Если стрелка — стрелка останова, то выполнение завершается с результатом T', в противном случае выполняется следующий шаг (просмотр образцов сначала).
Если образец не найден, переходим к следующему правилу.
Если ни для одного правила образец не найден, выполнение завершается с результатом T.
Примеры
Алгоритм вычисления разности унарных чисел N, M. На вход подаётся строка N*M, где N и M — унарные числа в алфавите 1.
1 * 1 → *
* → .Алгоритм поиска наибольшего общего делителя чисел N*M. Пусть a, b, c – служебные символы.
1 a → a 1
1 * 1 → a *
1 * → * b
b → 1
a → c
c → 1
* → .
Визуализатор: http://cmcmsu.info/1course/alg.schema.nam.htm
Рефал
— [РЕкурсивных Функций АЛгоритмический] язык программирования, построенный на основе модели нормальных алгорифмов Маркова.
Функции задаются в терминах правил переписывания входных строк (деревьев) в выходные. Последовательность правил, разделённых символом ;
. Слева от знака =
записываются образцы, справа — результаты. После унификации входной строки с образцом выполняется подстановка полученных значений переменных в результат. Вызов функции — в угловых скобках, круглые скобки позволяют задавать и сопоставлять деревья и образцы на деревьях.
Для наглядности знак =
заменён на →
Beta {
(λ s.var '.' e.body) t.value e.rest →
Step <Subst s.var t.value e.body> e.rest ;
→ Stuck;
}
Турчин В. Ф. «Метаалгоритмический язык». Кибернетика, вып. 4 (1968 г.): 45–54.
Рефал
В образцах можно задавать переменные:
s.имя-переменной
принимает любой символ, не являющийся скобкойt.имя-переменной
(терм) принимает любой символ, или парные скобки с их содержимымe.имя-переменной
выполняет поиск. На первом шагеe
-переменная пуста. Если не удалось сопоставить образец,e
-переменная расширяется на следующий терм.
При успешном сопоставлении с образцом, значения переменных можно использовать при генерации результата.
Beta {
(λ s.var '.' e.body) t.value e.rest →
Step <Subst s.var t.value e.body> e.rest ;
→ Stuck;
}
Н.М. Нагорный: алгорифмы Маркова можно эквивалентным образом задавать в виде нескольких конечных наборов правил подстановок [«функций»], бесконечного количества [функций] и бесконечного набора бесконечных функций.
Расширения Базового Рефала
Условия: промежуточный результат сопоставляется с образцом (Рефал-5):
t.neutral e.rest,
<Beta e.rest> : s.state e.result =
s.state t.neutral e.result ;
Функции высшего порядка: функции передаются так же, как и данные (Рефал-7):
(e.1) e.rest,
<Beta e.1> : e.betaResult =
<{
Step e.result = Step (e.result) e.rest ;
Stuck e.result,
<Beta e.rest> : s.state e.result2 =
s.state (e.result) e.result2 ;
} e.betaResult>;
Рефал-5: В.Ф. Турчин. «Рефал-5. Руководство по программированию и справочник» http://refal.net/rf5_frm.htm
Рефал-7: С.Ю. Скоробогатов, А. М. Чеповский. «Разработка нового диалекта языка Refal». Информационные технологии, вып. 9 (2006 г.): 31–38.
Реализации языка Рефал
Интерпретатор Рефал-2 https://github.com/cmc-msu-ai/refal
Компилятор Рефал-7 в C (с поддержкой функций высшего порядка)
Метавычисления и суперкомпиляция
Метавычисления — это раздел теории и практики программирования, связанный с разработкой и использованием метапрограмм — конструктивных метасистем над программами.1
Суперкомпиляция — техника преобразования программ [в первую очередь — оптимизации], основанная на построении полной и самодостаточной модели программы.2
Две основные стадии суперкомпиляции:
- Прогонка программы на параметризованных входных данных (частичная специализация). Выполняется построение множества конфигураций машины; в общем случае — в форме ориентированного графа с циклами.
- Свёртка результата прогонки для получения конечной остаточной программы (выделение рекурсии).
1 С.М. Абрамов. Основы метавычислений. Курс НОУ ИНТУИТ. http://www.intuit.ru/studies/courses/1067/221/info
2 И.Г. Ключников. Суперкомпиляция: идеи и методы. Практика функционального программирования, № 7, 2011.
Примеры суперкомпиляции
Можно посмотреть здесь (для функционального языка программирования): http://spsc.appspot.com/all
Классический пример: суперкомпиляция наивного поиска постоянного образца P в строке S сложностью O(|P||S|) в поиск по алгоритму Кнута-Морриса-Пратта (KMP) сложностью O(|S|): http://spsc.appspot.com/view?key=agpzfnNwc2MtaHJkcjQLEgZBdXRob3IiGmlseWEua2x5dWNobmlrb3ZAZ21haWwuY29tDAsSB1Byb2dyYW0YzwEM
(для лучшего понимания: пример использования на практике близкой идеи ручной оптимизации сопоставления строки с набором образцов в конечный автомат на языке C: http://craftinginterpreters.com/scanning-on-demand.html#identifiers-and-keywords)
(и где-то натыкался около года назад на заметку об аналогичной оптимизации в компиляторе C/C++, но не нашёл)
Более простой пример: упрощение преобразования дерева в список: http://spsc.appspot.com/view?key=agpzfnNwc2MtaHJkcjULEgZBdXRob3IiG2pvaG5pY2hvbGFzQGpvaG5pY2hvbGFzLmNvbQwLEgdQcm9ncmFtGOkHDA
(Нетипизированное) λ-исчисление Чёрча (1932)
— изначально было предложено в качестве формальной системы для оснований математики.
Вычисления представлены в виде последовательности подстановок значений переменных в выражения.
Пример: f(x) = (x + 3)/x в «λ-исчислении»:
λx.(x + 3)/x — функция от аргумента x, значение которой равно (x + 3)/x.
Вызов f(2):
(λx.(x + 3)/x) · 2 — подставить 2 вместо x в выражение (x + 3)/x:
(λx.(x + 3)/x) · 2 ⟶ (2 + 3)/x ⟶ (2 + 3)/2
Строгое определение
Рассмотрим формулы, составленные из выражений вида:
- x, y, z, … — переменная
- λx.F — абстракция (x — имя переменной, которая может встречаться в формуле F)
- A · B — приложение (применение, аппликация), A, B — формулы. Оператор «·» левоассоциативен (A · B · C = (A · B) · C).
Правило подстановки (β-редукция): (λx.F) · G⟶βF[x := G]
Буква α зарезервирована для понятия α-эквивалентности — формулы, эквивалентные с точностью до переименования переменных:
λx.x=αλy.y
Переменная, перед которой стоит соответствующая абстракция называется связанной, в противном случае — свободной:
λx.x · y — x связана, y свободна.
Вычисление считается завершённым когда нет β-редексов (подформул, к которым применима β-редукция)
Индексы де Брёйна (de Bruijn, де Браун)
Чтобы избавиться от α-эквивалентности, вместо имён переменных можно использовать числа числа — глубину терма:
Примеры
- Нумералы Чёрча — представляем натуральное число n как n-кратное применение функции:
0 ≡ λf.λx.x
1 ≡ λf.λx.f · x
2 ≡ λf.λx.f · (f · x)
...
Композиция функций: f ∘ g ≡ g(f(x)) ≡ λf.λg.λx.g · (f · x)
Ω ≡ (λx.x · x) · (λx.x · x) — редукция этого терма уходит в бесконечный цикл.
Онлайн-интерпретаторы:
Свойства нетипизированного λ-исчисления
Теорема Чёрча-Россера
β-редукция конфлюэнтна.
Правила редукции можно применять в разном порядке (λ x . f · (g · x))
Формулировка: если x⟶*y и x⟶*z с помощью разной последовательности применения правил редукции, то существует терм w, для которого y⟶*w и z⟶*w.
Смысл: Результат не зависит от порядка вычисления.
«свойство ромба»
Схема доказательства теоремы Чёрча-Россера
(Tait, Takahashi; Komori, Matsuda, Yamakawa)
https://dx.doi.org/10.1007/s11225-013-9470-y
- Takahashi translation for β-reduction: term M ↦M* (однократное параллельное применение β-редукции везде, где это возможно):
- x* ≡ x
- ((λx. M₁) · M₂)* ≡ M₁* [x := M₂*]
- (M₁ · M₂)* ≡ M₁* M₂*
- (λ x. M)* ≡ λ x. M*
Здесь и далее правила считаются упорядоченными: если можно применить несколько правил, применяется правило с наименьшим номером.
Индуктивно определим n-кратное применение: Mⁿ*.
Далее используем обозначения:
- →ᵦ₁ однократная β-редукция;
- →ᵦₙ n-кратная β-редукция;
- →ᵦ транзитивное замыкание β-редукции
Схема доказательства теоремы Чёрча-Россера
- Свойства M* (леммы):
- FV(M*) ⊆ FV(M)
- M →ᵦ M*
- M →ᵦ₁ N ⇒ N →ᵦ M*
- ((λx.M) N)* β→ (M [x:=N])*
- M →ᵦ₁ N ⇒ M* →ᵦ N*
- M →ᵦ N ⇒ M* →ᵦ N*
- M →ᵦ N ⇒ Mⁿ* →ᵦ Nⁿ*
Теорема 1. M →ᵦₙ N ⇒ N →ᵦ Mⁿ*
Теорема 2 (Чёрча-Россера). Если M →ᵦ M₁ и M →ᵦ M₂, то существует такой терм N, что:
M₁ →ᵦ N и M₂ →ᵦ N
Нормализация
Редекс — терм удаления, к которому можно применить правило редукции.
Нормальная форма терма относительно редукции — это такой вид, при котором к нему неприменимы правила редукции.
Головная нормальная форма терма — если в головной позиции (корне дерева) не стоит редекс.
Нормализация — свойство формальной системы: если у терма есть нормальная форма, то она единственная.
Сильная нормализация — у всех термов есть единственная нормальная форма (= нет термов, редукция которых не завершается).
Комбинаторная логика
M. Schönfinkel (1924), H. Curry (1930) Формальная система, синтаксис которой состоит из переменных, парных скобок и комбинаторов (правил преобразования строк символов). Эквивалентна машине Тьюринга, близко связана с λ-исчислением (может считаться «синтаксическим сахаром» для λ-исчисления)
- S x y z = x z (y z) — распределение
- K x y = x — отмена
- (S, K — базис, из них можно получить остальные комбинаторы)
- I x = x — идентичность
- D x = x x — дублирование
- C x y z = x z y — перестановка
- B x y z = x (y z) — композиция
- W x y = x y y — копирование
- Y x = x (Y x) — неподвижная точка
Y-комбинатор
Y-комбинатор — примитивный комбинатор рекурсии. Принимает на вход функцию двух аргументов, первый из которых — «рекурсивный вызов», а второй — входные данные для функции:
Y = λf.(λx.f(x · x)) · (λx.f(x · x)).
Если вместо переменных использовать λ-абстракцию и арифметические выражения, наивная реализация факториала могла бы выглядеть следующим образом:
Fact := Y (λ fact. λ x.
if (x == 0) return 1
else return x*fact(x - 1))
Yx = x · (Yx)
«Тип» Y-комбинатора: ((T → T) → T → T) → T → T.
Парадокс Карри
1935 (Клини, Россер), 1941 (Карри), 1942 (Карри) Если дана формальная система, удовлетворяющая следующим свойствам:
конечное число примитивных термов, единственная операция — бинарная операция применения, единственный унарный предикат — предикат выводимости «⊦ A»
определено равенство в терминах примитивного терма Q и применения (X = Y ≡ ⊦ Q · X · Y)
равенство симметрично, транзитивно, сохраняется при применении и подразумевает взаимную выводимость (A = B, A ⊦ B)
для любого терма M со свободными переменными X1, …, Xn существует терм M*, такой, что M* · X1 · … · Xn = M
может быть определён оператор импликации →, такой, что для любых термов M, N:
- ⊦ M → M
- ⊦ (M → (M → N)) → (M → N)
- ⊦ M и ⊦ M → N ⟹ ⊦ N ...
Парадокс Карри
...[Если дана формальная система, удовлетворяющая свойствам на предыдущем слайде,]
то любой терм ξ выводим с помощью следующего построения:
- Положим φ ≡ Y (λ x . x → (x → ξ))
- ⊦ φ = (φ → (φ → ξ)) по определению Y
- ⊦ φ = (φ → (φ → ξ)) → (φ → ξ) по определению Y
- п. 3 — аксиома импликации, поэтому ⊦ (φ → (φ → ξ)) → (φ → ξ)
- φ → (φ → ξ) (подставляем равенство из шага 2)
- ⊦ φ Опять подставляем равенство из шага 2
- По MP получаем φ → ξ и наконец ξ.
Основная идея — если формальная система допускает неограниченный оператор рекурсии (неподвижной точки), то она противоречива. Это справедливо для любой формальной системы, эквивалентной комбинаторной логике или λ-исчислению.
Principia Mathematica
B. Russel, A. Whitehead. 1910 – 1913 (3 тома). — фундаментальный труд по формализованным основаниям математики.
В книгах используется слегка отличающаяся от современной логическая нотация, но в целом их достаточно легко понять. Авторы (до результатов Гёделя) пытались описать математику с позиций формализма и в этом преуспели.
Для того, чтобы преодолеть парадокс Рассела, предлагалось рассматривать объекты как принадлежащие к некоторым типам. Типы определяются как область истинности некоторого утверждения.
При изучении функций комплексного переменного, мы не пытаемся подставить вместо аргумента, например, бесконечномерный оператор. Все утверждения формируются с подразумеваемым условием «x — комплексное число». Типы позволяют избавиться от циклических определений.
λ-исчисление с простыми типами
1940 (Чёрч); далее представлено определение ближе к современной записи.
http://plato.stanford.edu/entries/type-theory-church/
Пусть дано множество базовых типов B, * ∈ B
Допустимые типы: τ ≡ b | τ1 → τ2, b ∈ B.
Стрелка — правоассоциативна: α → β → γ ≡ α → (β → γ)
Сокращение: α' ≡ α → α
* — «тип типов», тип высказываний
У Чёрча — в обратном порядке и без стрелок (α → β → γ ≡ (γβα))
(тоже логичная запись: γβα · α, α взаимно-уничтожаются, остаёся γβ)
λ-исчисление с простыми типами
В оригинальной формулировке формулы:
- Символы λ, [, ] для описания абстракции
- Переменные aα, bα, … типа α
- Логические константы :
- ¬ * → * отрицание
- ∨ * → * → * дизъюнкция,
- Π(α → * ) → * универсальная квантификация,
- i(α → * ) → α оператор выбора
- Константы произвольных типов α
λ-исчисление с простыми типами
Современная формулировка исчисления (только вычислительная часть) не содержит логических констант и типа * (точнее, * — это «тип всех типов», но не входит в константу τ)
Грамматика:
- Абстракция (записывается как λxα[Aα])
- Применение
- Константы и переменные
У Чёрча индексы типов обязательны, но мы будем их пропускать, если это уместно, и использовать отношение типизации.
Отношение типизации
Окружение типизации Γ — конечный набор высказываний вида x : α (x имеет тип α), где x — символ переменной, а α — тип.
[] — пустое окружение, x : α ∈ Γ записывается как суждение Γ ⊦ x : α (из окружения выводимо, что x имеет тип α).
Γ, x : α — окружение Γ, расширенное суждением x : α.
Расширенная грамматика и правила вывода исчисления задаются в терминах таких суждений — правил типизации (и уже известного нам правила β-редукции)
τ≡ b | τ1 → τ2, b ∈ B.
Γ, x : α ⊦ x : α |
cα — постоянная типа α |
---|
Γ ⊦ c: α |
Γ, x : σ ⊦ e : τ |
---|
Γ ⊦ (λ xσ . e) : σ → τ |
Γ ⊦ x : σ → τ Γ ⊦ y : σ |
---|
Γ ⊦ x · y : τ |
Допустимы только типизируемые формулы, т.е. те, для которых из данного окружения можно вывести тип.
Аксиомы и правила вывода
- (λx.F) · G⟶βF[G/x]
- β-редукция
Если используются логические константы, то импликация, как в алгебре логики:
Ao ⊃ Bo ≡ (¬A) ∨ B и Modus Ponens (A ⊃ B, A ⟹ B)
- [p* ∨ p*] ⊃ p*
- p* ⊃ [p* ∨ q*]
- [p* ∨ q*] ⊃ [q* ∨ p*]
- [p* ⊃ q*] ⊃ [[r* ∨ p*] ⊃ [r* ∨ q*]]
(5α) Π(α → * ) → *fα → * ⊃ fα → *xα
(6α) ∀xα[p* ∨ fα → *xα] ⊃ [p* ∨ Πfα → *]
(и еще несколько аксиом в оригинале)
Естественная дедукция
τ ≡ b | α → β
Правила типизации, используемые для определения типов, можно структурировать (следующая структура носит название «естественная дедукция», natural deduction):
- формация (Formation) — как определяется конструктор типа
- α, β—типы ⟹ α → β—тип
- введение (Introduction) — как определяются элементы типа
- Γ, x : σ ⊦ e : τ ⟹ λxσ.e : σ → τ
- удаление (Elimination) — что можно делать с элементами типа, чтобы получить элементы некоторого другого типа
- Γ ⊦ x : σ → τ, Γ ⊦ y : σ ⟹ Γ ⊦ xσ → τ · yσ : τ, x — удаляемый терм
- редукция (Reduction) — взаимное уничтожение термов введения и удаления (не входит в обычное понятие естественной дедукции)
- [λx.F] · G⟶βF[G/x]
Безопасность типов
С позиций программирования, типы должны обеспечивать представленные далее свойства корректно типизированных программ.
- Определим множество «канонических» (простых) форм для типов. Каноническая форма — это значение, записанное в явном виде:
- 1 — это каноническая форма натурального числа;
- (λxℕ.x) · 1 — это не каноническая форма натурального числа;
- 1 · 1 — это некорректно типизированное выражение.
(Progress) Любой корректно типизированный терм t : T без свободных переменных или находится в канонической форме, или является редексом. Доказательство — по индукции вывода типа. Нетривиальный случай — применение T-App.
(Preservation) Редукция сохраняет тип, т.е. если t : T и t ⟶ t′, то t′ : T. Доказательство — по индукции по выводу типа. Для случая подстановки нужно доказать, что операция подстановки сохраняет типизацию. Для этого, в свою очередь, нужно показать, что типизация сохраняется при изменениях в контексте, которые не изменяют значения свободных переменных.
Безопасность типов: если вычисление любого корректно типизированного терма завершается, то результатом вычисления является каноническая форма.
Эквивалентность термов
Обычно определяется следующим образом: A эквивалентен B, если A и B приводятся β-редукцией к идентичному виду, с точностью до корректных (без конфликтов имён) переименований переменных. На индексах де Брёйна последнее замечание неактуально.
η-эквивалентность
Пусть f : α → β. Тогда λ(x : α).f · x интуитивно эквивалентен исходной f, но по указанному выше определению формально это разные термы.
η-эквивалентность включает такое понятие и, в случае просто типизированного λ-исчисления, не нарушает разрешимости эквивалентности типов.
Проверка типов разрешима — если есть алгоритм, который для любого терма определяет, корректно ли он типизирован. Эквивалентность термов разрешима — если есть алгоритм, который для любой пары термов определяет, эквивалентны ли они при заданных правилах.
Не все утверждения удобно представимы в λ-исчислении с простыми типами
В частности, для нумералов Чёрча представимый класс называется «расширенные полиномы» над ℕ:
- 0, 1, проекции
- сложение, умножение
- функция
ifzero
(n, m, p) =if
n = 0then
melse
p
В следующий раз мы рассмотрим различные способы расширения набора типов и постараемся убрать разделение между типами и термами.
Задачи
- Задача 5.1. *
- Определить умножение и сложение для нумералов Чёрча.
- Задача 5.2. **
- Показать, что, хотя для некоторого базового типа T нумералы Чёрча и их умножение и сложение типизируемо, нельзя определить операцию вычитания нумералов в λ-исчислении с простыми типами.
- Задача 5.3а. **
- Построить машину Тьюринга, которая делает β-редукцию.
- Задача 5.3б. **
- Предложить схему эмуляции работы универсальной машины Тьюринга в нетипизированном λ-исчислении (трансляции кода универсальной машины и входных данных в λ-исчисление).
- Задача 5.4а. **
- Построить нормальный алгорифм Маркова, который делает β-редукцию.
- Задача 5.4б. **
- Написать пошаговый эмулятор β-редукции на языке Рефал.