通用/现有量化?


11

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

我不明白为什么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...(AB) N

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

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

是(建设性)析取的从属版本。你能想到的建设性脱节的一个两类为的不交一个X B x 是 由 x A索引的 B x 类型集合的不相交联合。Bx:A.B(x)ABABABx:A.B(x)B(x)x:A van取决于 x的值A 使它成为从属类型。与案件比较,其中不依赖于 X X 。我们为每个 x取一个相同 B的副本A。这与 A × B同构。B(x)x:ABx:Ax: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.