依赖类型:依赖对类型如何类似于不相交联合?

时间:2014-10-24 06:02:08

标签: haskell agda dependent-type idris curry-howard

我一直在研究依赖类型,我理解以下内容:

  1. 为什么universal quantification表示为依赖函数类型。 ∀(x:A).B(x)表示“适用于所有x类型A,其值为B(x)。因此,它表示为一个函数,当给出类型x的任何A时,返回类型B(x)的值。
  2. 为什么existential quantification表示为从属对类型。 ∃(x:A).B(x)表示“存在x类型A,其值为B(x)。因此,它表示为一对,其第一个元素是类型x的特定A,其第二个元素是类型B(x)的值。
  3. 旁白:值得注意的是,通用量化始终与material implication一起使用,而存在量化始终与logical conjunction一起使用。

    无论如何,关于dependent types的维基百科文章指出:

      

    依赖类型的反面是依赖对类型依赖和类型 sigma类型。它类似于副产品或不相交的联合。

    对类型(通常是产品类型)是如何类似于不相交的联合(它是和类型)?这一直困扰着我。

    此外,依赖函数类型如何与产品类型类似?

6 个答案:

答案 0 :(得分:30)

混淆源于对Σ类型的结构使用类似的术语以及它的值如何。

Σ(x:A)的 B(x) (a,b)其中a∈Ab∈B(a)。第二个元素的类型取决于第一个元素的值。

如果我们看一下Σ(x:A)B(x)结构,那就是不相交的联合(联合产品)所有可能的x∈A B(x)

如果 B(x)是常数(独立于 x ),那么Σ(x:A)B 将只是 | A | B 的副本,即A⨯B(2种类型的产品)。


如果我们查看Π(x:A)B(x)结构,它是 B的产品 (x)表示所有可能的x∈A。其可以被视为 | A | -tuples,其中 -th组件的类型为 B(a)

如果 B(x)是常数(独立于 x ),那么Π(x:A)B 将只是 A→B - 从 A B 的功能,即Bᴬ B > A )使用集合理论符号 - | A | 的产品 B


所以Σ(x∈A)B(x)是由 A 的元素索引的 | A | -ary副产品,而Π(x∈A)B(x) | A | - 由 A 元素索引的产品。

答案 1 :(得分:12)

使用类型和函数键入从属对,从该类型的值到另一种类型。从属对具有第一类值的对的值和应用于第一类的第二类的值。

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

我们可以通过展示Either规范表达为sigma类型的方式来重新获取和类型:它只是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

答案 2 :(得分:10)

在PetrPudlák的回答的基础上,另一个以纯粹非依赖方式看待这一点的角度是注意Either a a类型与(Bool, a)类型是同构的。虽然后者乍一看是一种产品,但有理由说它是一种和型,因为它是a的两个实例的总和。

我必须使用Either a a代替Either a b执行此示例,因为后者表示为产品,我们需要 - 依赖于良好的类型。

答案 3 :(得分:9)

好问题。这个名字可能来源于Martin-Löf,后者使用“一系列套装的笛卡尔积”这一术语作为pi类型。请参阅以下注释,例如:   http://www.cs.cmu.edu/afs/cs/Web/People/crary/819-f09/Martin-Lof80.pdf 关键是虽然pi类型原则上类似于指数,但您总是可以将指数看作n-ary乘积,其中n是指数。更具体地,非依赖性函数A - > B可以看作是指数型B ^ A或无穷乘积Pi_ {a in A} B = B x B x B x ... x B(A次)。在这种意义上,从属产品是潜在的无限乘积Pi_ {a in A} B(a)= B(a_1)x B(a_2)x ... x B(a_n)(A中每a_i一次)。 / p>

依赖和的推理可能类似,因为您可以将产品视为n元和,其中n是产品的因素之一。

答案 4 :(得分:2)

这可能是其他答案的冗余,但这是问题的核心:

  

对类型(通常是产品类型)是如何类似于不相交的联合(它是和类型)?这一直困扰着我。

但是什么是产品而是相等数量的总和?例如4×3 = 3 + 3 + 3 + 3。

对于类型,集合或类似事物,同样的关系也适用。实际上,非负整数只是有限集的去范畴。选择数字加法和乘法的定义,使得不相交的集合联合的基数是集合的基数之和,集合乘积的基数等于集合的基数的乘积。事实上,如果你用“羊群”代替“set”,这可能就是算法的发明。

答案 5 :(得分:0)

首先,看看联产品是什么。

联产品是所有对象B_i的终端对象A,使得对于所有箭头B_i - > X有一个箭头B_i - > A,和独特的A - > X使得相应的三角形通勤。

您可以将其视为带有B_i的Haskell数据类型A - > A是一堆具有B_i类型的单个参数的构造函数。很明显,对于每个B_i - > X可以从A - >提供箭头。 X使得通过模式匹配可以将该箭头应用于B_i以获得X.

与sigma类型的重要联系是B_i中的索引i可以是任何类型,而不仅仅是一种自然数。

与上述答案的重要区别在于,它不必为该类型的每个值i都有一个B_i:一旦你定义了B_i∀i,你就有了一个总函数。

从Petr Pudlak的回答中可以看出,Π和Σ之间的差异在于,对于Σ,元组中的某些值B_i可能会丢失 - 对于某些i,可能没有相应的B_i。

Π和Σ之间的另一个明显区别是Π通过提供从乘积Π到每个B_i的第i个投影来表征B_i的乘积(这是函数i - > B_i的意思),但是Σ提供了相反的箭头 - 它提供从B_i到Σ的第i次注入。