Зависимые типы: как зависимые пары типа аналог непересекающемся множестве?

я изучал зависимые типы, и я понимаю следующее:

  1. почему универсальная количественная оценка представляется как зависимый тип функции. ∀(x:A).B(x) означает "для всех x типа A есть значение типа B(x)". Следовательно, он представлен как функция, которая при задании любой стоимостью x типа A возвращает значение типа B(x).
  2. почему экзистенциальное определение представляется как зависимый тип пары. ∃(x:A).B(x) означает

6 ответов


путаница возникает из-за использования аналогичной терминологии для структуры типа Σ и для того, как выглядят его значения.

A стоимостью of Σ(x:A) B (x) это пара (a, b) здесь a∈a и b∈B (a). Тип второго элемента зависит от значения первого.

Если мы посмотрим на структура of Σ(x:A) B (x), это непересекающиеся Союз (побочный продукт) составляет B (x) для всех возможных х∈а.

Если B (x) является постоянным (независимо от x) то Σ (x:A) B будет просто / A/ копии B, что составляет A⨯B (продукт 2 типа).


Если мы посмотрим на структура of Π(x:A) B (x), это продукт of B (x) для всех возможных х∈а. Его значения можно рассматривать как / A/-кортежей, где a-й компонент имеет тип B (a).

Если B (x) является постоянным (независимо от x) то Π (x:A) B будет просто A→B - функции A to B, что составляет Bᴬ (B to A) использование нотации теории множеств-произведение / A/ копии B.


Так Σ(x∈A) B (x) это / A/ - ary coproduct индексируется элементами A, а Π(x∈A) B (x) это / A/ - ARY продукт индексируется элементами A.


зависимая пара набирается с типом и функцией от значений этого типа в другой тип. Зависимая пара имеет значения пар значения первого типа и значения второго типа, примененные к первому значению.

data Sg (S : Set) (T : S -> Set) : Set where
  Ex : (s : S) -> T s -> Sg S T

мы можем отбирать типы сумм, показывая, как Either канонически выражается как тип "Сигма": это просто Sg Bool (choice a b) здесь

choice : a -> a -> Bool -> a
choice l r True  = l
choice l r False = r

является каноническим элиминатором булевых.

eitherIsSg : {a b : Set} -> Either a b -> Sg Bool (choice a b)
eitherIsSg (Left  a) = Sg True  a
eitherIsSg (Right b) = Sg False b

sgIsEither : {a b : Set} -> Sg Bool (choice a b) -> Either a b
sgIsEither (Sg True  a) = Left  a
sgIsEither (Sg False b) = Right b

основываясь на ответе Петра Пудлака, еще один угол, чтобы увидеть это чисто независимым образом, - это заметить, что тип Either a a изоморфна типа (Bool, a). Хотя последнее, на первый взгляд, является продуктом, имеет смысл сказать, что это тип суммы, так как это сумма двух экземпляров a.

Я должен сделать этот пример с Either a a вместо Either a b, потому что для того, чтобы последний был выражен как продукт, нам нужны-хорошо зависимые типы.


хороший вопрос. Название может происходить от Мартина-Лефа, который использовал термин "декартово произведение семейства множеств" для типа pi. См. следующие Примечания, например: http://www.cs.cmu.edu/afs/cs/Web/People/crary/819-f09/Martin-Lof80.pdf Дело в том, что, хотя тип pi в принципе сродни экспоненте, вы всегда можете видеть экспоненту как n-арное произведение, где n-экспонента. Более конкретно, не зависимую функцию A - > B можно рассматривать как экспоненциальный тип B^A или бесконечное произведение Pi_{a в A} B = B x B x B x ... x B (A раз). Зависимый продукт в этом смысле является потенциально бесконечным продуктом Pi_{a в A} B(a) = B(a_1) x B (a_2) x ... x B (a_n) (один раз для каждого a_i в A).

рассуждение для зависимой суммы может быть аналогичным, так как вы можете видеть произведение как N-арную сумму, где n-один из факторов произведения.


Это, вероятно, избыточно с другими ответами на данный момент, но вот суть проблемы:

Как получилось, что пары типа (который обычно типа продукта) является аналогом Союза непересекающихся (тип сумма)? Это всегда меня смущало.

но что такое произведение, как не сумма равных чисел? например 4 × 3 = 3 + 3 + 3 + 3.

то же отношение выполняется для типов, или наборов, или подобных вещей. На самом деле, неотрицательное целые числа-это только decategorification конечных наборов. Определения сложения и умножения на числа подобраны так, что число элементов объединения непересекающихся множеств равна сумме мощностей множеств и количество элементов произведение множеств равна произведению мощностей множеств. На самом деле, если вы замените "набор" на "стадо овец", это, вероятно, так была изобретена арифметика.


во-первых, посмотрите, что такое со-продукт.

co-product является терминальным объектом A для всех объектов B_i таким, что для всех стрелок B_i -> X существует стрелка B_i -> A и уникальный A -> X такой, что соответствующие треугольники коммутируют.

вы можете просмотреть это как тип данных Haskell A с B_i - > a, являющийся кучей конструкторов с одним аргументом типа B_i. Понятно тогда, что для каждого B_i - > X можно поставить стрелку из A - > X такую, что через pattern-matching вы можете применить эту стрелку к B_i, чтобы получить X.

важная связь с типами Сигмы заключается в том, что индекс i в B_i может быть любого типа, а не только типа натуральных чисел.

важным отличием от ответов выше является то, что он не должен иметь B_i для значение i этого типа: как только вы определили B_i ∀ i, у вас есть общая функция.

разница между Π и Σ, как видно из Петра Пудлака ответ заключается в том, что для Σ некоторые значения B_i в кортеже могут отсутствовать - для некоторых i может не быть соответствующего B_i.

другое четкое различие между Π и Σ заключается в том, что Π характеризует произведение B_i, предоставляя i-ю проекцию из произведения Π каждому B_i (это то, что означает функция i -> B_i), но Σ предоставляет стрелки наоборот - он обеспечивает i-ю инъекцию из B_i в Σ.