Зависимые типы: как зависимые пары типа аналог непересекающемся множестве?
я изучал зависимые типы, и я понимаю следующее:
- почему универсальная количественная оценка представляется как зависимый тип функции.
∀(x:A).B(x)
означает "для всехx
типаA
есть значение типаB(x)
". Следовательно, он представлен как функция, которая при задании любой стоимостьюx
типаA
возвращает значение типаB(x)
. - почему экзистенциальное определение представляется как зависимый тип пары.
∃(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 в Σ.