На фото грустный Арсений, потому что он предпочёл сделать интерпретатор “вовремя”, а не расписать билет
Сегодня мы отправимся в Африку и побольше узнаем о том, чем занимаются любители [верблюдов](<https://www.youtube.com/shorts/fd6yI2HwS0k>)
ДелательТрасс3000: https://github.com/toadharvard/Lambada/
ДелательТрасс3001: https://capra.cs.cornell.edu/lambdalab/
ДелательТрасс3002: https://github.com/kinokotakenoko9/fp-practice
<aside> 💀 Понятие исчисления(не лямбда). Аксиомы и правила вывода
Допустим у нас есть какой-то язык(не важно какого порядка) $L$ и с помощью него можно записать, некоторые выражения $P_i$ и $C$. Выражение $C$ можно вывести при помощи определенного количества $P_i$ или вообще без их использования, тогда это будет называться аксиомой.
Количество $P_i$ необходимых для вывода $C$ + 1 определяет “место” правила. Таким образом, $(n + 1)$-местные правила вывода имеют формулу
$$ \displaystyle \dfrac {P_1\ ... \ P_n} C\ название $$
Название позволяет как-то именовать правило(спасибо кэп)
Всё это выражение, описанное выше, называется правилом вывода
Таким образом, исчисление состоит из:
<aside> 💀 Посылки и заключения
В выражении, описанном выше, то, что поверх черты называется посылками, а то что снизу заключением
$P_i$ – посылки (premises) $C$ – заключение (conclusion)
Это можно интерпретировать, как “Если всё то, что выше черты, то можно вывести то, что ниже черты”
</aside>
<aside> 💀 Доказательство
Очень абстрактное понятие. По сути на сам вывод можно смотреть, как на доказательство того, что заключение верно.
Можно провести аналогию, как следуя из аксиом в математике, можно доказать любую теорему
Из примера выше можно также представить правило вывода, как дерево:
Естественно, листья и узлы могут повторяться в пределах дерева
<aside> 💀 Язык лямбда-выражений
Для определения языка лямбда выражений необходимо определить язык переменных $\nu$. Обычно используются два варианта
Но в сущности язык переменных может представлять из себя чё угодно, это не суть важно, главное чтоб был
Когда мы определили язык переменных мы можем построить алфавит для $\Lambda$. Он будет представлять из себя следующий набор $\left\{),\ (,\ .,\ \lambda\right\}\cup \nu$
Определив алфавит, мы можем составить слова на языке $\Lambda$. Они имеют следующий вид
$$ \langle expr \rangle := \langle varname \rangle\ |\ \langle \lambda \langle varname \rangle.\langle expr \rangle \rangle \ |\ \langle expr \rangle \langle expr \rangle $$
где $\langle varname \rangle \in \nu$
Таким образом, слова делятся на три группы:
Из этих слов можно строить предложения, то есть какие-то осмысленные(ну или не очень) конструкции с кучей вот таких вот выражений
В язык входят скобки, но они часто опускаются из-за чего в этом пиздеце ещё сложнее разобраться
$$ E_1E_2E_3 \equiv (E_1E_2)E_3 $$
Выражения, в которых только лишь переименованы переменные и их вхождения называют синонимами(они $\alpha$-эквивалентны, об этом далее)
$$ (\lambda x.x) \equiv (\lambda y.y) \equiv (\lambda z.z) $$
Подстановка(об этом поподробнее тоже далее) может записываться разными способами
$$ [A/x]B = B[x \rarr A] = [x \rarr A]B = B[x := A] $$
Формально это означает подставить $A$ вместо всех вхождений $x$ в тело $B$. То есть слева от слеша в скобках, что подставить, справа от слеша в скобках вместо чего подставить и за скобками куда подставить. Наглядный пример
$$ (\lambda x.x)y = [y/x]x = y $$
</aside>
<aside> 💀 Три правила (α, β, η) преобразования лямбда-выражений
Все лямбда выражения можно разбить на $\alpha\beta\gamma$ классы эквивалентности соответственно
<aside> 💀 Свободные и связные вхождения
Да, этого нет в билете, но нужным будет понять механику
Формально про свободные:
На слайде есть одна штука, я если честно её вообще не понял мб кто-то умный объяснит
N.B. В одном λ-выражении одно и то же имя может входить и свободно, и связанно
<aside> 💀 Редексы и стратегии
Редекс – это подвыражение (подтерм) вида $((\lambda x.e1)e2)$. Ну то есть залупа, которую можно вычислить($\beta$-редуцировать, упростить). По сути, применение к $\lambda$ -абстракции
Стратегия вычисления - способ, по которому мы выбираем какие редексы и в каком порядке будем упрощать (вычислять, β-редуцировать).
То есть у нас есть предложение, в нем куча этих вот редексов, их можно вычислять в разном порядке. Например, сначала средуцировать, всё что внутри или идти снаружи внутрь. Подробнее об этом далее
Будем $\beta$-редукцию обозначать следующим образом $e \longmapsto _{\beta} e'$. Редукция $e$ в $e'$
Каноничные определения:
<aside> 💀 Классификация стратегий
</aside>
<aside> 💀 Call By Name(aka weak head normal form, aka CBN)
</aside>