Черч-кодирование зависимой пары

Такие пары можно легко кодировать по Черчу:

Definition prod (X Y:Set) : Set := forall (Z : Set), (X -> Y -> Z) -> Z.

Definition pair (X Y:Set)(x:X)(y:Y) : prod X Y := fun Z xy => xy x y.

Definition pair_rec (X Y Z:Set)(p:X->Y->Z) (xy : prod X Y) : Z := xy Z p.

Definition fst (X Y:Set)(xy:prod X Y) : X := pair_rec X Y X (fun x y => x) xy.

Definition snd (X Y:Set)(xy:prod X Y) : Y := pair_rec X Y Y (fun x y => y) xy.

Тогда заманчиво обобщить его на зависимые пары вроде этого:

Definition dprod (X:Set)(Y:X->Set) : Set :=
forall (Z : Set), (forall (x:X),Y x->Z)->Z.

Definition dpair (X:Set)(Y:X->Set)(x:X)(y:Y x) : dprod X Y :=
fun Z xy => xy x y.

Definition dpair_rec (X:Set)(Y:X->Set)(Z:Set)(p:forall (x:X),Y x->Z)
(xy : dprod X Y) : Z := xy Z p.

Definition dfst (X:Set)(Y:X->Set)(xy:dprod X Y) : X :=
dpair_rec X Y X (fun x y => x) xy.

Definition dsnd (X:Set)(Y:X->Set)(xy:dprod X Y) : Y (dfst X Y xy) :=
dpair_rec X Y (Y (dfst X Y xy)) (fun x y => y) xy.

Однако последнее определение завершается ошибкой с сообщением об ошибке:

In environment
X : Set
Y : X -> Set
xy : dprod X Y
x : X
y : Y x
The term "y" has type "Y x"
while it is expected to have type 
"Y (dfst X Y xy)".

Я понимаю проблему здесь. Но каково решение? Другими словами, как Черч-кодировать зависимые пары?


person Bob    schedule 17.03.2019    source источник


Ответы (2)


Прежде всего, давайте определимся с терминологией.

То, что вы называете dprod, на самом деле является «зависимой суммой», а «зависимый продукт» — это то, что у вас может возникнуть соблазн назвать «зависимой функцией». Причина этого в том, что зависимые функции обобщают обычные продукты, вам нужно только с умом использовать Bool:

prod : Set -> Set -> Set
prod A B = (b : Bool) -> case b of { True -> A; False -> B; }
{-
The type-theoretic notation would be:
prod A B = Π Bool (\b -> case b of { True -> A; False -> B; })
-}

mkPair : (A B : Set) -> A -> B -> prod A B
mkPair A B x y = \b -> case b of { True -> x; False -> y; }

elimProd : (A B Z : Set) -> (A -> B -> Z) -> prod A B -> Z
elimProd A B Z f p = f (p True) (p False)

В том же духе зависимые пары (обычно обозначаемые Σ) обобщают обычные суммы:

sum : Set -> Set -> Set
sum A B = Σ Bool (\b -> case b of { True -> A; False -> B; })

mkLeft : (A B : Set) -> A -> sum A B
mkLeft A B x = (True, x)

mkRight : (A B : Set) -> B -> sum A B
mkRight A B y = (False, y)

elimSum : (A B Z : Set) -> (A -> Z) -> (B -> Z) -> sum A B -> Z
elimSum A B Z f _ (True, x) = f x
elimSum A B Z _ g (False, y) = g y

Это может сбивать с толку, но, с другой стороны, Π A (\_ -> B) — тип обычных функций, а Σ A (\_ -> B) — тип обычных пар (см., например, здесь).

Итак, еще раз:

  • Зависимый продукт = тип зависимых функций
  • Зависимая сумма = тип зависимых пар

Ваш вопрос можно перефразировать следующим образом:

Существует ли Черч-кодирование для зависимых сумм через зависимые произведения?

Об этом уже спрашивали ранее на Math.StackExchange, и вот ответ, который дает практически ту же кодировку, что и ваша. .

Однако, читая комментарии к этому ответу, вы заметите, что в нем явно отсутствует ожидаемый принцип индукции. Существует также аналогичный вопрос, но относительно церковного кодирования натуральных чисел и этого ответа (в частности, комментариев) вроде объясняет, почему Coq или Agda недостаточно для вывода принципа индукции, вам нужны дополнительные предположения, такие как параметричность. Есть еще один похожий вопрос на MathOverflow, и хотя ответы не дают определенного «да» или «нет» для конкретного случая Agda/Coq, они подразумевают, что это, вероятно, невозможно.

Наконец, я должен упомянуть, что, как и многие другие вопросы теории типов в наши дни, по-видимому, HoTT — это ответ. Процитирую начало сообщения в блоге Майка Шульмана:

В этом посте я буду утверждать, что, улучшая предыдущую работу Аводи-Фрея-Спейта, (более высокие) индуктивные типы могут быть определены с использованием непредикативных кодировок с их принципами полной зависимой индукции - в частности, исключая во все семейства типов без каких-либо гипотез усечения - в обычном (непредикативном) Book HoTT без дополнительных наворотов.

(Хотя (непредикативное) кодирование, которое вы получите, вряд ли можно назвать кодированием Черча.)

person kirelagin    schedule 17.03.2019
comment
Упомянутый вами ответ неверен. Смотрите мой комментарий там. - person Bob; 17.03.2019
comment
На мой взгляд, довольно хорошо пропечатано (хотя, признаюсь, сам не проверял тщательно). - person kirelagin; 17.03.2019
comment
Ну, это точно не так, как вы там окончательно договорились. Таким образом, ваш ответ здесь не отвечает на мой вопрос. - person Bob; 17.03.2019
comment
Это действительно так: в Agda/Coq это невозможно. - person kirelagin; 17.03.2019
comment
Что мы узнали из этого другого вопроса, так это то, что даже такая простая функция, как proj2, требует, чтобы элиминатор был зависимым, поэтому вы не можете иметь proj2 в Agda/Coq. - person kirelagin; 17.03.2019
comment
Действительно, согласен. - person Bob; 17.03.2019

В Coq или Agda невозможно закодировать зависимые пары по Черчу.

Хорошо, когда мы думаем об однородных кортежах AxA, это также можно понимать как функцию 2 -> A. Это также работает для разнородных кортежей, таких как AxB, с использованием зависимых функций Pi x:2.if x then A else B. Однако следующим логическим шагом является Sigma x:A.B x, которые не имеют хороших представлений в виде функций (если только мы не принимаем очень зависимые функции, что, на мой взгляд, противоречит духу теории типов). По этой причине мне кажется, что обобщение от -> до Pi и от x до Sigma первично, а тот факт, что кортежи могут быть представлены как функции, вторичен. -- Д-р Торстен Альтенкирх, где-то в списке рассылки Agda

Кодирование очень зависимых функций, о которых упоминает Торстен, можно найти здесь (примечание что это не действительный Agda, просто Agda-подобный синтаксис «безумно зависимой» теории типов).

person user3237465    schedule 17.03.2019
comment
Здесь нет ничего похожего на Черч-кодирование здесь. Кстати, возможно Черч-кодирование зависимого типа: см. здесь например. - person Bob; 17.03.2019
comment
Там нет ничего похожего на кодировку Черча — правильно, это другая кодировка. Возможна церковная кодировка зависимого типа - нет, то что у вас по ссылке - это индексированный рекурсор, а не элиминатор. Другими словами, у вас нет принципа индукции с зависимыми типами, закодированными по Черчу, что означает, что эти закодированные типы не изоморфны своим некодированным аналогам, т. е. это не истинное кодирование. - person user3237465; 17.03.2019
comment
Я не согласен. Как и в случае с числительными церкви (см. 30924">ответ), вы получите принцип индукции, если допустите параметричность. - person Bob; 17.03.2019
comment
@Bob, правда, но я говорил в контексте теорий ванильных типов (Coq или Agda), и я не уверен, что вы все еще можете вызывать кодировку, использующую параметрическую кодировку Черча. - person user3237465; 17.03.2019
comment
Здесь должно быть недоразумение. Поскольку числительные Черча не основаны на принципе индукции, вы утверждаете, что числительные Черча не являются кодировкой Черча? - person Bob; 17.03.2019
comment
@ Боб, технически говоря, цифры Черча - единственное, что составляет числа, закодированные Черчем. Но вы можете получить индукцию для закодированных (не закодированных по Черчу) чисел, только если вы используете представление, которое довольно отличается от кодирования по Черчу (хотя кодирование по Черчу является его частью). См. раздел 5.3 «Индукция натуральных чисел» в Internalizing Реляционная параметричность в экстенсиональном исчислении конструкций. - person user3237465; 17.03.2019
comment
У меня есть код здесь, который показывает, как можно использовать, чтобы получить принцип индукции списков. В теории наблюдаемых типов постулируемые равенства не нарушают каноничность, поэтому мы можем иметь в ОТТ элиминаторы с надлежащими вычислительными свойствами (но я не смог заставить его работать, потому что типы огромны, потому что равенство функций в ОТТ — причудливое). - person user3237465; 17.03.2019