Кодировка Изоморфизмами
Специально для канала Формальная Философия. В статье не рассматривается ничего сложнее чем encode-decode XML <-> JSON вместе с правилами enc dec = id и dec enc = id. Просто вместо переменных XML/JSON мы рассматриваем несколько конкретных типов: Iso, Equiv, Pi, Interval. Другими словами, мы будем кодировать эти типы и транспорты между ними с помощью изоморфизмов.
Вступление
Как вы знаете все индуктивные типы (Nat, List и т.д.) могут быть представлены в Чёрч-кодировке которая есть упаковка категорной модели. Идея кодирования следующая, раз мы работаем в теории категорий, то всё сущности мы рассматриваем как объекты и связи между ними (везде одно и то же). Значит и индуктивные типы мы раскладываем в это же, т.е. другими словами мы строим категорную модель конкретных индуктивных инстансов data, или как говорят мы строим категории F-алгебр:
Здесь у нас unit-терминейтед record — это что-то типа null-терминейтед стринг. Я думаю идея понятна. Если взять лимит в этой категории получится штука изоморфная черч-кодировке. В HoTT это можно увидеть в параграфе Nat-алгебр (5.4.1) и Nat-гомоморфизмов (5.4.2). Полная кодировка должна включать не только зависимый элиминатор, через который уже выражается рекурсор и кейс анализ, но и правила связывающие фьюжин intro-elim двумя правилами beta и eta которые называются ещё ректракт и секция (enc dec = id, dec enc = id).
Постановка задачи
В этой статье мы покажем, что, во-первых, интернализация MLTT в сущности есть кодировкой изоморфизмами, и, во-вторых, покажем, что в кодировке Пи у нас функция равна своей аппликации (да да, вам не послышалось).
Ну, я думаю не нужно доказывать или показывать, что всё в MLTT есть тип, или всё в мире есть феномен. А раз так, то мы можем построить категорию этих объектов и морфизмов между ними (это у математиков что-то типа если есть гора, то на неё нужно взобраться, или как я называю в любой непонятной ситуации строй категорию). Т.е. тоеретически возможно засунуть любой тип в сигнатуру изоморфизма:
Давайте попробуем это сделать для сложных типов, чтобы доказать первую часть задачи, а потом попробуем закодировать самый базовый Пи-тип на котором строится вся теория MLTT, и докажем вторую часть задания.
Аксиома Унивалентности
Она не золотой грааль, а обычнейший тип, а значит для нее существует 5 правил теории типов Мартина-Лёфа. В сущности, чтобы не лукавить, надо сказать, что унивалентность вшивается в тайпчекеры обычно. В cubicaltt intro-правило типовой унивалентности называется Glue.
Превращаем аксиому унивалентности в енкодер-декодер или изоморфизм:
Неплохо, поехали дальше.
Изоморфизм Изоморфизма
Так как фибрационная эквивалентность есть одним из видов равенства и аксиома унивелентности это в сущности часть конструкции которая связывает фьюжин типов фибрационной эквивалентности Equiv и типа Path встроенного в кубический тайпчекер, то можно построить точно такой же изоморфизм между Path и типом Iso, который так же является одним из видов равенства, простой и поняный всем программистам encode/decode.
Заметьте как мы циклически встраиваемся в нижний уровень подсвовывая в сами изоморфизм сигнатуру с изоморфизмом
Пи-тип
Теперь давайте перейдем к самому простому и самому загадночному изоморфизму изоморфизму Пи-типов. Вспомним категорные догматы: чтобы закодировать что-то, нам надо построить категорию эндоморфизмов этого. В нашем случае, так как мы отложили учебник по теоркату и вышиваем на XML <-> JSON сигнатурах, мы просто строим изоморфизм между Пи и Пи:
Как видно мы тут немного подхачили, но вполне законно так как мы просто перенесли a : A из телескопа параметров в правую часть результата и протащили в путь: Path (B a) -> Path (Pi A B).
Теперь докажем вторую задачу и главный номер представления (то, что функция равна своей аппликации, ну бредятина же на звук!):
Любой из этих вариантов чекается!
На самом деле, такие тавтологии рождаются потому, что мы в isIso поставили равные типы, до этого в примерах мы делали транспорты из крайних точек пути, тут же у нас петля. Но, тем не менее, этот терм PiType в разных инкарнация вы можете встретить в любой статье про лямбда исчисление, так как он является вычислительной семантикой зависимого лямбда исчисления (для примера классическая запись в виде терма PTS):
Функциональная экстенсиональность
В качестве бонус трека, funext. В этом примере мы показываем, что терм funext — это все-лишь интро правило, формация же есть классические изоморфизм двух функций f и g, которые находятся в пространстве функций A -> B (в этом примере не зависимых, зависимые вам на домашку).
Еще в качестве упражнения функциональную экстенсиональность можно выразить через интервал.
В статье только сигнатуры, все пруфы в https://github.com/groupoid/cubical.