TL;DR Импредикативные кодировки индуктивных типов в HoTT
Все, кто хоть раз писал по настоящему на LISP знакомы с кодировкой Черча, в CoC она тоже есть завтиповая, мощная (Morte, Om — языки СoC). В ней NAT = (X:U) -> (X -> X) -> X -> X, где первый аргумент (X -> X) — это succ, а второй X — zero, и результат — во вселенной кодируемого типа Х. Даже если мы закодируем тип с параметром LIST (A: U) = (X:U) -> X -> (A -> X) -> X, и параметр A будет во вселенной 42, а X во вселенной 2, то кодировка всегда будет лендить терм в Х, т.е. во вторую вселенную, в не зависимости от A. Такая зависимость термов называется импредикативной и не работает, например в предикативной или предикативно-кумулятивной иерархии вселенных.
В HoTT номера n-types кодируются n-групоидами, поэтому в кодировку нужно добавить предикат в каком n-типе лендить терм Х: NAT = (X: U) -> isSet X -> (X -> X) -> X -> X, тут появился предикат isSet. С его помощью можно реализовать пропозишинал транкешины ||-|| (лендинг в Prop) и даже HIT (лендинг в Groupoid, например, для окружности):
1) Truncation ||A|| parametrized by (A:U) type = (X: U) -> isProp X -> (A -> X) -> X
2) S^1 = (X:U) -> isGroupoid X -> ((x:X) -> Path X x x) -> X
3) Arbitrary (A:U) type = (X: U) -> isSet X -> (A -> X) -> X
На картике приведена кодировка Unit (кроме eta), которую написал Мельников, а я лишь слегонца упростил и убрал лишнее. Кодировка обычного Nat тянет на магистерский проект. Общая схема — PhD и открытый вопрос в теории типов.