我一直在研究依赖类型,我理解以下内容:
∀(x:A).B(x)
表示“适用于所有x
类型A
,其值为B(x)
”。因此,它表示为一个函数,当给出类型x
的任何值A
时,返回类型B(x)
的值。∃(x:A).B(x)
表示“存在x
类型A
,其值为B(x)
”。因此,它表示为一对,其第一个元素是类型x
的特定值A
,其第二个元素是类型B(x)
的值。旁白:值得注意的是,通用量化始终与material implication一起使用,而存在量化始终与logical conjunction一起使用。
无论如何,关于dependent types的维基百科文章指出:
依赖类型的反面是依赖对类型,依赖和类型或 sigma类型。它类似于副产品或不相交的联合。
对类型(通常是产品类型)是如何类似于不相交的联合(它是和类型)?这一直困扰着我。
此外,依赖函数类型如何与产品类型类似?
答案 0 :(得分:30)
混淆源于对Σ类型的结构使用类似的术语以及它的值如何。
Σ(x:A)的值 B(x)是对 (a,b)其中a∈A和b∈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次注入。