Martin-Löf类型理论简介


36

什么是PerMartin-Löfs关于类型理论的最佳介绍?我看过俄勒冈PL暑期学校的一些讲座,但仍然对以下问题感到困惑:

什么是类型?

我知道集合是什么,因为您可以通过常规的ZF公理定义它们,并且它们具有非常直观的具体模型;试想一下装满东西的篮子。但是,我还没有看到类型的合理定义,并且我想知道是否有某些来源可以将这种想法提炼为假人。


4
HoTT书中的介绍比较了类型和集合,也许会有所帮助,请参见homotopytypetheory.org/book的 1.1节。但更重要的是,您希望我们将正确的类型观念直接植入您的头脑,而对于集合,您很乐意用公理描述它们,而不必坚持知道“它们的真实含义”。好吧,类型由类型的推理规则描述。他们知道,它们有一个非常直观的具体模型,里面装满了乐高积木。您可以从中构建的内容就是类型。
Andrej Bauer

我认为让我的大脑摆脱集合论是最大的问题。但是,我不确定乐高类比的效果如何。有什么障碍?如果x:A和y:A通常无法使用它们构建任何东西,除非A是某种递归箭头类型。当然,我经常可以混合使用不同类型的东西来构建第三种东西……
dst 2013年

4
乐高积木是类型构造函数。因此,例如从和可以构建和以及和和。您还可以构建新的类型,例如和等等。人们对类型有不同的直觉。集是其中之一,但很粗糙。类型也像拓扑空间。它们也像编程中的结构化数据。它们也像 -groupoids。那就是它的美,可能性的丰富。选择一种可能性并运行它。x:Ay:A(x,y)(x,x)inl(x)relfxλz:A.xId(x,y)z:AId(x,z)ω
Andrej Bauer

Answers:


31

类型是计算的属性。这就是您在冒号右侧写的内容。

让我详细说明一下。请注意,术语并不是完全标准的:某些文章或书中某些概念可能使用不同的词。

术语是旨在表示计算抽象语法的元素。直观地讲,它是一棵解析树。形式上,这是一棵有限树,其中的节点属于某个字母。无类型演算定义术语的语法。例如,(无类型的)lambda演算包含从三种类型的节点构建的项(写为,等):MN

  • 变量为0的变量(其可数化的集合),写为,等;xy
  • 变量1的变量的应用(变量的双射,其可数的集合),用等;λx.M
  • 类别2的申请书,写成。MN

术语是句法结构。甲语义涉及计算项。语义有很多类型,最常见的是可操作的(描述术语如何转换为其他术语)或否定的(描述术语是通过转换为另一个空间,通常是从集合论构建的)。

是术语的属性。甲型系统用于无类型演算描述了术语具有哪些类型。在数学上,类型系统的核心是术语和类型之间的关系。更准确地说,类型系统是这样的关系的一个族,由上下文索引—通常,上下文至少提供变量的类型(即,上下文是从变量到类型的部分函数),因此术语可能仅具有类型在为其所有自由变量提供类型的上下文中。类型是哪种数学对象取决于类型系统。

某些类型系统使用集合理论(例如交集,并集和理解)将集合称为类型。这具有基于熟悉的数学基础的优点。这种方法的局限性在于它不允许推理等效类型。

许多类型系统将类型本身描述为类型演算中的术语。根据类型系统,这些术语可以是相同的术语,也可以是不同的术语。我将使用短语基本术语来指代微积分中描述计算的术语。例如,简单键入的lambda演算使用以下类型的演算(写为等):τ

  • 基本类型,arity 0(其有限或可数的集合),写为,等;AB
  • 功能2,写成。τ0τ1

定义简单类型的lambda演算的术语和类型之间的关系通常通过键入规则来定义。键入规则不是定义类型系统的唯一方法,但是它们很常见。它们适用于组合类型系统,即根据子项的类型构建术语类型的类型系统。键入规则归纳地定义了一个类型系统:每个键入规则都是一个公理,指出对于水平规则上方的公式的任何实例化,规则下方的公式也适用。请参阅如何阅读输入规则?更多细节。是否存在图灵完全类型的lambda演算?可能也很有趣。

对于简单类型的lambda演算,类型判断 表示在上下文具有类型。我已经省略了上下文的正式定义。 ΓM:τMτΓ

x:τΓΓx:τ(Γ)Γ,x:τ0M:τ1Γλx.M:τ0τ1(I)ΓM:τ0τ1ΓN:τ0ΓMN:τ1(E)

例如,如果和是基于类型的,则在任何情况下都具有(从下至上,两次应用,然后再应用,最后是每个分支上的)。ABλx.λy.xy(AB)AB(I)(E)(Γ)

可以将简单类型的λ演算的类型解释为集合。这相当于为类型提供了指称语义。基本术语的良好指称语义将为每个基本术语分配其所有类型表示的成员。

直觉类型理论(也称为Martin-Löf类型理论)比简单地键入lambda演算更为复杂,因为它在类型的演算中具有更多元素(并且还在基本项中添加了一些常数)。但是核心原则是相同的。Martin-Löf类型理论的一个重要特征是类型可以包含基本术语(它们是从属类型):基本术语的宇宙和类型的宇宙是相同的,尽管它们可以通过简单的语法规则加以区分(通常称为排序,即在重写理论中为术语分配排序)。

有些类型系统可以更进一步,完全混合类型和基本术语,因此两者之间没有区别。这种类型的系统据说是高阶的。在这样的结石,类型具有类型-一个类型可以的左手侧出现。的结构的演算是高阶依赖性类型的范例。所述的λ立方体(也称为Barendregt立方体)进行分类的类型系统在它们是否允许方面依赖于类型术语(多态性 -一些基地术语包含有类型为subterms),类型取决于术语(取决于类型),或类型依赖关于类型(类型运算符 - 类型的演算具有计算的概念)。:

大多数类型系统都具有集合论语义,可以将它们与数学的通常基础联系起来。 编程语言和数学基础如何关联?什么是函数类型的语义和句法上的差异?在这里可能引起您的兴趣。使用类型理论作为数学基础也有工作-集合论是历史基础,但不是唯一的选择。同态类型理论是该方向上的一个重要里程碑:它用同伦理论描述了有意直觉类型理论的语义,并在此框架内构建了集合理论。

我推荐本杰明·皮尔斯(Benjamin Pierce)的书籍《类型和编程语言》以及《类型和编程语言的高级主题》。除了对形式数学推理有基本了解外,任何本科生都无需先决条件即可访问它们。TAPL描述了许多类型系统。依赖类型是ATTAPL第2章的主题。


+1为TAPL。通过阅读这本书,我可以对自己的类型进行很多自学。
Guy Coder

我不确定ATTAPL是学习依赖类型的好起点。
Martin Berger

15

对于那些来自集合论并努力解决集合论与马丁-洛夫类型论之间的差异的人来说,一个更好的问题是反思什么是集合。您对集合论和数学基础的直觉会被毫无疑问的集合论假设所感染,而这些假设都是理所当然的。阿拉斯·马丁·洛夫类型理论并不认同这些假设。

与传统理解相反,集合论是两个 关系的理论:平等集合成员关系,而不仅仅是集合成员关系。这两个关系是在实质上不同的阶段建立的。

  1. 我们建立一阶逻辑作为任意事物(不只是集合)相等性的理论。一阶逻辑使用非正式的证明概念。概念证明本身不能单独用一阶逻辑形式表示。

  2. 然后,我们基于一阶逻辑将集合理论作为集合和集合成员的理论。

  3. 然后,集合成员资格和相等性通过可扩展性公理进行关联,该公称性表示两个集合具有相同成员时正好相等。

  4. 最后,来自(1)的非正式证明概念得到了某些集合(证明树)的事后合理化。

重要的是要意识到,证明的概念 因此是集合论中的第二等公民

这种设置适用于常规的中小型数学,但是由于我们现在要处理大规模证明,例如所有有限简单组的分类或非平凡计算机程序的验证,因此它分崩离析,因为它不会导致容易机械化。

Martin-Löf类型理论是不同的:它以一次失败的概率建立了证明和类型概念(对于Martin-Löf类型理论而言,集合是集合理论)。这意味着证明是该理论的一等公民。尽管集合是由其成员给出的,但是集合理论省略了正式指定哪些东西可以证明某物是集合成员的证据。相反,一种类型是通过其居住证明给出的。所以,你明白一个类型什么时候你明白什么算作一个证明。ŤTT

这些居住类型有哪些证据?简化了一点(并省略了身份类型),它们是功能程序,更确切地说是 -calculus中可键入的术语 。这被称为库里-霍华德对应。它为建设性数学奠定了美丽而新颖的基础。对于经典的数学难题,它的效果不是很好。λ


这非常有用。我认为,任何进入构造数学的人的主要问题是要学习很多东西。
dst

我同意。要花一些时间才能学会一个人的未被认可的集合论假设。进行大量的Agda编程对我有帮助,如果您来自计算机科学背景,那么可能对您也有用。
Martin Berger 2013年

10

我不了解进入Martin-Löf类型理论的简便途径。我想以下内容可以作为介绍。

但是,如果您对“什么是类型”这个问题感到困惑,我建议先进入简单得多的类型理论。任何类型的编程语言都可以,但是例如Ocaml,F#和Haskell尤其有用。简而言之,可以说Martin-Löf类型理论以两种方式扩展了上述语言的类型:

  1. 具有依赖类型。您会以各种编程语言以驯服的形式找到它们。
  2. 具有身份类型。这是Martin-Löf相对于以前的依存类型理论的主要创新。

依赖类型背后的关键思想很简单:类型可以通过程序进行参数化。在更常规的打字系统(如上面提到的系统)中,这是不可能的(简化一点)。尽管简单,但后果却是深远的:从属类型将Curry-Howard对应关系提升为一阶构造逻辑。身份类型有点不寻常。如果/当您熟悉Haskell这样的语言时,您可以学习Agda,它基本上是具有Martin-Löf类型理论的Haskell。我觉得对于程序员而言,Agda比阅读上述书籍容易得多。


我实际上认识Haskell。我的问题是,任何教程都只会告诉您如何定义类型,而从不告诉它们实际的含义。它似乎只是附加在所有数据上的魔术标签,以便类型检查器可以选择多态函数的正确版本,并检查是否以没有意义的方式混合了内容。他们仍然不知道类型是什么。我对此特别感到困惑,因为Voevodsky&co试图以此为基础进行所有数学运算,但是,我从未见过确切的定义。
dst 2013年

2
在Haskell中,您具有键入判断,其中是程序,是的类型,假定的自由变量的键入方式与键入环境。首先,Haskell类型本身就是“斑点”(句法标记)。这在马丁·洛夫类型理论中是完全相同的。碰巧的情况是,Martin-Löf类型理论的类型,“斑点”,句法标记比Haskell更为复杂。中号α 中号中号ΓΓM:αMαMMΓ
Martin Berger 2013年

在Haskell,Martin-Löf类型理论和Voevodsky的同伦类型理论中非常精确地定义了类型。没有任何歧义。例如,附录A.2给出了关于同伦类型理论的所有术语和类型的证明系统。如果您想更加严格,可以查看CoqAgda形式化。
Martin Berger 2013年

2
也许您需要吞咽类型除了定义方式外没有其他本质。这与集合没有什么不同,它们是由集合论的公理给出的。(这不是很正确,但是理解仍然很重要。)
Martin Berger 2013年
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.