您如何从Lambda多维数据集的其他方面获得构造微积分?


21

据说CoC是Lambda Cube的所有三个维度的顶点。这一点对我来说一点都不明显。我想我了解各个方面,并且任何两个方面的结合似乎都导致相对简单的结合(也许我缺少了什么?)。但是,当我看CoC时,与其看起来像是这三者的结合,不如说是完全不同的事情。类型,属性和小型/大型字体来自哪个维度?依赖产品消失在哪里?为何为什么只关注命题和证明而不是类型和程序呢?是否有一些针对类型和程序的等效项?

编辑:如果不清楚,我要求解释CoC如何等效于Lambda Cube尺寸的直接结合。在我可以研究的某个地方是否存在所有这三个方面的实际结合(就程序和类型而言,而不是证明和命题)?这是对问题的评论,而不是当前的答案。


1
至少这应该是一个soft-question。我在这里没有看到实际的技术问题。也许您可以更具体地询问您的要求?
— Andrej Bauer

3
@AndrejBauer没问题:CoC的Barendregt-cube / PTS演示与Coquand&Huet的原始演示之间有什么关系?
— 马丁·伯杰

1
@AndrejBauer:这个问题似乎也是在询问CoC呈现方式的差异(以任何一种说法)以及在实践中对某些功能的强调。确实,面向PTS的CoC版本强调了某些重要功能,而Coq的实践则强调了其他功能。我确实同意它应该带有软问题标签。
— 雅克·卡莱特

1
我很高兴看到有人能够回答这个问题。
— Andrej Bauer

Answers:


28

首先,重申一下科迪的观点之一,归纳构造微积分(Coq的内核所基于)与构造微积分有很大不同。最好想到的是从具有宇宙的Martin-Löf类型理论开始,然后在类型层次结构的底部添加一个排序Prop。这是与原始CoC完全不同的野兽,最好将其视为F-omega的从属版本。(例如,CiC具有集合理论模型,而CoC没有。)

就是说,Lambda多维数据集(CoC是其成员)通常出于简化打字规则的原因而被视为纯类型系统。通过将种类,类型和术语视为同一句法类别的元素,您可以写下更少的规则,并且证明也少了很多冗余。

但是,为理解起见,明确地区分出不同的类别可能会有所帮助。我们可以介绍三种语法类别,种类(由metavariable覆盖k),类型(由metavariable覆盖A)和术语(由metavariable覆盖e)。然后,可以将所有八个系统理解为三个级别中每个级别所允许的变化。

λ→(简单型λ演算)

 k ::= ∗
 A ::= p | A → B
 e ::= x | λx:A.e | e e

这是基本的lambda演算。有一个单一的种类∗,即种类。类型本身是原子类型p和函数类型A → B。术语是变量,抽象或应用程序。

λω_(STLC +更高种类的运算符)

 k ::= ∗ | k → k
 A ::= a | p | A → B | λa:k.A | A B
 e ::= x | λx:A.e | e e

STLC仅允许在术语级别进行抽象。如果我们在类型级别添加它,那么我们将添加一种新类型k → k,即类型级别函数的类型,以及在类型级别上的抽象λa:k.A和应用程序A B。所以现在我们没有多态性,但是我们有类型运算符。

如果有内存,则该系统的计算能力不会超过STLC;它只是使您能够缩写类型。

λ2(系统F)

 k ::= ∗
 A ::= a | p | A → B  | ∀a:k. A 
 e ::= x | λx:A.e | e e | Λa:k. e | e [A]

代替添加类型运算符,我们可以添加多态性。在类型级别,我们添加∀a:k. A一个多态类型模型,在术语级别,我们添加对类型Λa:k. e和类型application的抽象e [A]。

该系统比STLC强大得多-它与二阶算术一样强大。

λω(系统F-ω)

 k ::= ∗ | k → k 
 A ::= a | p | A → B  | ∀a:k. A | λa:k.A | A B
 e ::= x | λx:A.e | e e | Λa:k. e | e [A]

如果我们同时拥有类型运算符和多态性,则可以得到F-omega。该系统或多或少是大多数现代功能语言(例如ML和Haskell)的内核类型理论。它也比系统F强大得多-强度等效于高阶算术。

λP(低频)

 k ::= ∗ | Πx:A. k 
 A ::= a | p | Πx:A. B | Λx:A.B | A [e]
 e ::= x | λx:A.e | e e

代替多态性,我们本来可以从简单类型的lambda演算转向依赖关系。如果允许函数类型在返回类型中使用其参数(即,写Πx:A. B(x)而不是A → B),则得到λP。为了使它真正有用,我们必须使用以术语作为参数的类型运算符来扩展种类集Πx:A. k,因此我们也必须在类型级别添加相应的抽象Λx:A.B和应用程序A [e]。

该系统有时称为LF或爱丁堡逻辑框架。

它具有与简单型Lambda微积分相同的计算强度。

λP2(无特殊名称)

 k ::= ∗ | Πx:A. k 
 A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e]
 e ::= x | λx:A.e | e e | Λa:k. e | e [A]

我们还可以将多态性添加到λP中,以获得λP2。该系统不经常使用,因此没有特定名称。(我读过的一篇使用它的论文是Herman Geuvers的归纳法在二阶从属类型理论中不可推导。)

该系统具有与系统F相同的强度。

λPω_(无特殊名称)

 k ::= ∗ | Πx:A. k | Πa:k. k'
 A ::= a | p | Πx:A. B | Λx:A.B | A [e] | λa:k.A | A B 
 e ::= x | λx:A.e | e e 

我们还可以在λP中添加类型运算符,以获得λPω_。这涉及Πa:k. k'为类型运算符添加一种,以及相应的类型级别的抽象Λx:A.B和应用程序A [e]。

由于再次没有超越STLC的计算能力,因此该系统也应该为逻辑框架奠定良好的基础,但没人能做到。

λPω(构造演算)

 k ::= ∗ | Πx:A. k | Πa:k. k'
 A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e] | λa:k.A | A B 
 e ::= x | λx:A.e | e e | Λa:k. e | e [A]

最后,通过取λPω_并添加一个多态类型的模型∀a:k.A和术语级抽象Λa:k. e及其应用,来获得构造微积分λPω e [A]。

该系统的类型比F-omega更具表现力,但是具有相同的计算强度。


3
当然,从技术上讲,CoC(没有公理)至少具有与CiC一样多的集合理论模型,它们并不能很好地建模我们想要的情况,这就是具有自然数公理的CoC(例如)。0≠1
— 科迪

2
我也很欣赏上的conservativity参考在STLC。这似乎并不明显。λω_
— 科迪

3
@cody:我不知道参考文献–凯文·沃特金斯(Kevin Watkins)在白板上为我绘制了证明!想法是,您输入一个以λω_键入的术语,将所有类型放入beta-normal eta-long形式,然后通过在原始程序中为每种不同的正常形式引入新的原子类型,将其嵌入到STLC中。那么很明显,还原顺序必须一对一地排列。
— Neel Krishnaswami

1
@ user833970的事实,是不可派生其实比你提到的其他事实更简单,并具有无关的编码ñ 一个牛逼:它来自一个事实,即有一个证明无关 CC模式,其中类型最多具有一个元素。如果您想要一个逻辑,其中一个类型具有多个元素(例如nat),则这是一个不好的属性。一个参考是:由Miquel和Werner撰写的,并非如此简单的CC证明无关模型。0≠1nat
— 科迪

1
您说Fw比System F“强大得多”。为此您有参考吗?特别是在自然数上是否存在可证明为Fw而不是F证明的自然函数?
— Thorsten Altenkirch

21

我经常想尝试总结多维数据集的每个维度及其表示的内容,因此我将对此进行一下介绍。λ

但是首先,人们可能应该尝试解决各种问题。Coq互动定理证明者基于一种基础类型理论,有时也被称为具有宇宙的归纳结构的演算。您会注意到,这不仅仅是简单的“构造演算”,而且确实有很多东西,而不仅仅是CoC。特别是,我认为您对CoC固有的确切功能感到困惑。特别是,集合/属性区别和Universe不会出现在CoC中。

在这里,我不会对Pure Type系统进行完整的概述,但是重要的规则(对于像CoC这样的功能性PTS)如下:

Γ⊢A:sΓ,x:A⊢B:kΓ⊢Πx:A.B : k (s,k)∈R

其中是一组固定的元件小号的种类,以及一对(小号,ķ )是在一组固定的- [R对的小号,叫做规则。s,kS(s,k)RS

关键的见解是,仔细选择和[R做出什么样的产品类型差异巨大Π X :一。B实际上代表!SRΠx:A.B

特别地,在构造的演算中,排序集为 { ∗ ,◻ }, 通常称为Prop and Type(尽管由于我稍后将要讨论的原因,该术语对Coq用户有点混乱),以及一组规则: R = { (* ,∗ ),(◻ ,◻ ),(◻ ,∗ ),(∗ ,◻ )}S

{∗,◻}
R={(∗,∗),(◻,◻),(◻,∗),(∗,◻)}

因此,我们有4条规则,分别对应4个不同的目的:

  • :功能类型(∗,∗)

  • (◻,◻)

  • (◻,∗)

  • (∗,◻)

我将更详细地解释每一个。


A→BΠx:A.BxB

∗natboolx=yxy∗

listlist:∗→∗listnat,listbool∗→∗(◻,◻)

Πt:∗. t→t
λ(t:∗)(x:t).xΠt:∗._(◻,∗)t→t(∗,∗)

一种∧乙:=ΠŤ:∗。 (一种→乙→Ť)→Ť
一种∨乙:=ΠŤ:∗。 (一种→Ť)→(乙→Ť)→Ť
⊥:=ΠŤ:∗。 Ť
⊤:=ΠŤ:∗。 Ť→Ť
∃x:A. P(x):=Πt:∗. (Πy:A. P(y)→t)→t
(∗,◻)

∗∗) has some restrictions: no large eliminations, and datatypes should live in Set or Type, which don't have the analogue of the (◻,∗) rule. Prop without large eliminations is consistent with the law of excluded middle.

Useful to note: in the presence of (◻,◻), you can even write things like:

Πc:∗→∗.  c nat→c nat
if you like, which is useful for, say, writing generic code over a monad, as often happens in Haskell.

Dependent types: This is how you get the propositions-as-types paradigm to work. Indeed, you want to have a type that represents all possible proofs of, say 0=1. To make sense of this, you want equality to be of type

= : nat→nat→∗
or you might want to be polymorphic
= : Πt:∗. t→t→∗
In any case, you can't write nat→nat→∗ without the rule (∗,◻).

Ok, but what about universes? It turns out that in the CoC, you can't actually write things like ◻→◻, because there are no types to give ◻ and a fortiori no rules involving those types. A pretty natural thing to do is to index ◻ by a natural number, getting ◻i for i=1,2,3,… and having ◻i:◻i+1.

What rules do we want for this? One natural rule is (◻i,◻i), but that rule isn't very useful in the absence of the subsumption rule

Γ⊢A:◻iΓ⊢A:◻j i≤j

With these extra sorts and rules, you get something that is not a PTS, but something close. This is (almost) the Extended Calculus of Constructions, which is closer to the basis of Coq. The big missing piece here is the inductive types, which I won't discuss here.

Edit: There's a rather nice reference that describes various features of programing languages in the framework of PTSes, by describing a PTS which is a good candidate for an intermediate representation of a functional programing language:

Henk: A Typed Intermediate Language, S. P. Jones & E. Meijer.


2
Advanced Topics in Types and Programming Languages, S2.6 and S2.7.
— Kaveh

2
BTW "Type families" are often also called higher-kinded types.
— Martin Berger

1
PTS were a good idea 20 years ago but things have moved on since.
— Thorsten Altenkirch

@ThorstenAltenkirch no need for exclusionism, Thorsten! There are still some fun things to consider involving PTSes, e.g. Bernardy's work on internalized parametricity comes to mind.
— cody

@cody No exclusionism intended but we shouldn’t get stuck in the past of syntactic type theory. Bernardi’s work is excellent and can be done better using universes.
— Thorsten Altenkirch
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.