通用/现有量化?


11

我正在努力理解类型的通用和存在量化的目的。我正在玩玩根据结构演算编写玩具语言的游戏。我一直在阅读有关Morte和Henk的信息,以帮助我更好地理解。

我不明白为什么CoC同时具有lambda和forall抽象。

(∀ X :甲。乙)

(λx:A.B)
(∀x:A.B)

在我看来,lambda包含了手动传递类型的系统中的所有功能。换句话说,以下

(∀x:∗.λa:x.a)

可以替换为

(λx:∗.λa:x.a)

如果是第一次将其应用于所使用的类型。

我想念什么?有哪些可以阅读的论文,博客或文章对我有帮助?

谢谢。

Answers:


12

记住(或有时会看到的)是一种类型。概括。因此,虽然说是很有意义的,但说却没有任何意义,因为只是一种类型。你不会说 becaues不是为每本身计算,它的存在对可应用于这样的分类lambda项。Π →交通(λ X :甲。中号)ñ (∀ X :甲。中号)ñ ∀ 。。。(A → B )N →∀Π→(λx:A.M) N(∀x:A.M) N∀...(A→B) N→

这也是令我震惊的事情,但这就是构造演算(以及任何其他依赖类型的系统的定义)的方式。

您编写的两个程序的意图完全不同,第一个程序的类型错误。说是没有意义的,因为需要按类型同时使用两个参数,这意味着如果要被正确键入,我们必须有。但是,不是类型,只能将其指定为,永远不会。另一方面,第二个几乎是(我想您要返回 not)是一个函数,并使用两个赋予类型。∀ ∀ X :一。乙乙:* λ X 。X ∀ X :一。B *∀x:A. λx. x∀∀x:A.BB:∗λx.x∀x:A.B∗X ∀ax∀


是的,我想回。a
— oconnor0

@ oconnor0这是否有意义:)
— Daniel Gratzer

不完全是。我还是有点困惑。我可能不得不考虑更多。因为尝试实现i d,所以我将两个示例程序都更改为返回而不是x。:)axid
— oconnor0,2016年

我认为,在某种程度上,我想使术语和类型相同。在您的答案和cs.stackexchange.com/questions/49531/…之间,我想我知道哪里出错了。我想在高度标准化的系统中执行此操作。
— oconnor0 2013年

5

请记住,存在性类型和通用类型非常不同。它是构造逻辑,不是古典逻辑,在构造逻辑和∃中不像在古典逻辑中那样重要。∀∃

是程序的类型,程序接收类型 A的对象并返回类型 B (x )的对象。这里最重要的是,该类型乙(X )依赖于 X,不都是一样的 X。它可以取决于 x是什么。对于一个输入 x,我们可能输出一个整数。对于另一个,我们可能输出一个实数。对于另一项,我们可能会输出一个实数函数。如果 B (x )∀x:A.B(x)AB(x)B(x) xxxxB(x)不会随变化而变化,那么您可以在适当的位置使用A → B,这是从A到B的函数类型。xA→BAB

是(建设性)析取的从属版本。你能想到的建设性脱节的一个∨ 乙两类一和乙为的不交一个和乙。 ∃ X :甲。B (x )是 由 x :A索引的 B (x )类型集合的不相交联合。B型(∃x:A.B(x)A∨BABAB∃x:A.B(x)B(x)x:A van取决于 x的值:A 使它成为从属类型。与案件比较,其中乙不依赖于 X :一: ∃ X :一。乙。我们为每个 x取一个相同 B的副本:A。这与 A × B同构。B(x)x:ABx:A∃x:A.BBx:AA×B

现在您可以问为什么我们需要依赖的乘积和总和类型?因为它们赋予我们更多表现力。现在我们可以完全忽略类型,并拥有无类型的类型理论/函数式编程。但这消除了首先拥有类型的好处,例如,您将不知道所有程序是否总是会终止(强规范化)。请参阅Lambda多维数据集和 相关类型。我认为,很好地理解从属类型的一种好方法是查看Martin-Lof类型理论中引入和消除从属类型的规则。

依赖类型的要点是:由于各种原因(例如避免错误,自动终止证明等),我们希望保留在良好的类型理论中。我们不想去像未类型化的lambda演算之类的东西,我们可以像您所说的那样进行表达,并提供更强大的功能。可以说,从属类型的发明是为了允许表达更多的东西,同时仍然保留在好的类型理论之内。


1
“∃x:AB(x)∃x:AB(x)是(构造)析取的从属版本”的作用。意思?
— oconnor0 '02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.