什么是PerMartin-Löfs关于类型理论的最佳介绍?我看过俄勒冈PL暑期学校的一些讲座,但仍然对以下问题感到困惑:
什么是类型?
我知道集合是什么,因为您可以通过常规的ZF公理定义它们,并且它们具有非常直观的具体模型;试想一下装满东西的篮子。但是,我还没有看到类型的合理定义,并且我想知道是否有某些来源可以将这种想法提炼为假人。
什么是PerMartin-Löfs关于类型理论的最佳介绍?我看过俄勒冈PL暑期学校的一些讲座,但仍然对以下问题感到困惑:
什么是类型?
我知道集合是什么,因为您可以通过常规的ZF公理定义它们,并且它们具有非常直观的具体模型;试想一下装满东西的篮子。但是,我还没有看到类型的合理定义,并且我想知道是否有某些来源可以将这种想法提炼为假人。
Answers:
类型是计算的属性。这就是您在冒号右侧写的内容。
让我详细说明一下。请注意,术语并不是完全标准的:某些文章或书中某些概念可能使用不同的词。
甲术语是旨在表示计算抽象语法的元素。直观地讲,它是一棵解析树。形式上,这是一棵有限树,其中的节点属于某个字母。无类型演算定义术语的语法。例如,(无类型的)lambda演算包含从三种类型的节点构建的项(写为,等):
术语是句法结构。甲语义涉及计算项。语义有很多类型,最常见的是可操作的(描述术语如何转换为其他术语)或否定的(描述术语是通过转换为另一个空间,通常是从集合论构建的)。
一类是术语的属性。甲型系统用于无类型演算描述了术语具有哪些类型。在数学上,类型系统的核心是术语和类型之间的关系。更准确地说,类型系统是这样的关系的一个族,由上下文索引—通常,上下文至少提供变量的类型(即,上下文是从变量到类型的部分函数),因此术语可能仅具有类型在为其所有自由变量提供类型的上下文中。类型是哪种数学对象取决于类型系统。
某些类型系统使用集合理论(例如交集,并集和理解)将集合称为类型。这具有基于熟悉的数学基础的优点。这种方法的局限性在于它不允许推理等效类型。
许多类型系统将类型本身描述为类型演算中的术语。根据类型系统,这些术语可以是相同的术语,也可以是不同的术语。我将使用短语基本术语来指代微积分中描述计算的术语。例如,简单键入的lambda演算使用以下类型的演算(写为等):
定义简单类型的lambda演算的术语和类型之间的关系通常通过键入规则来定义。键入规则不是定义类型系统的唯一方法,但是它们很常见。它们适用于组合类型系统,即根据子项的类型构建术语类型的类型系统。键入规则归纳地定义了一个类型系统:每个键入规则都是一个公理,指出对于水平规则上方的公式的任何实例化,规则下方的公式也适用。请参阅如何阅读输入规则?更多细节。是否存在图灵完全类型的lambda演算?可能也很有趣。
对于简单类型的lambda演算,类型判断 表示在上下文具有类型。我已经省略了上下文的正式定义。
例如,如果和是基于类型的,则在任何情况下都具有(从下至上,两次应用,然后再应用,最后是每个分支上的)。
可以将简单类型的λ演算的类型解释为集合。这相当于为类型提供了指称语义。基本术语的良好指称语义将为每个基本术语分配其所有类型表示的成员。
直觉类型理论(也称为Martin-Löf类型理论)比简单地键入lambda演算更为复杂,因为它在类型的演算中具有更多元素(并且还在基本项中添加了一些常数)。但是核心原则是相同的。Martin-Löf类型理论的一个重要特征是类型可以包含基本术语(它们是从属类型):基本术语的宇宙和类型的宇宙是相同的,尽管它们可以通过简单的语法规则加以区分(通常称为排序,即在重写理论中为术语分配排序)。
有些类型系统可以更进一步,完全混合类型和基本术语,因此两者之间没有区别。这种类型的系统据说是高阶的。在这样的结石,类型具有类型-一个类型可以的左手侧出现。的结构的演算是高阶依赖性类型的范例。所述的λ立方体(也称为Barendregt立方体)进行分类的类型系统在它们是否允许方面依赖于类型术语(多态性 -一些基地术语包含有类型为subterms),类型取决于术语(取决于类型),或类型依赖关于类型(类型运算符 - 类型的演算具有计算的概念)。
大多数类型系统都具有集合论语义,可以将它们与数学的通常基础联系起来。 编程语言和数学基础如何关联?而 什么是函数类型的语义和句法上的差异?在这里可能引起您的兴趣。使用类型理论作为数学基础也有工作-集合论是历史基础,但不是唯一的选择。同态类型理论是该方向上的一个重要里程碑:它用同伦理论描述了有意直觉类型理论的语义,并在此框架内构建了集合理论。
我推荐本杰明·皮尔斯(Benjamin Pierce)的书籍《类型和编程语言》以及《类型和编程语言的高级主题》。除了对形式数学推理有基本了解外,任何本科生都无需先决条件即可访问它们。TAPL描述了许多类型系统。依赖类型是ATTAPL第2章的主题。
对于那些来自集合论并努力解决集合论与马丁-洛夫类型论之间的差异的人来说,一个更好的问题是反思什么是集合。您对集合论和数学基础的直觉会被毫无疑问的集合论假设所感染,而这些假设都是理所当然的。阿拉斯·马丁·洛夫类型理论并不认同这些假设。
与传统理解相反,集合论是两个 关系的理论:平等和集合成员关系,而不仅仅是集合成员关系。这两个关系是在实质上不同的阶段建立的。
我们建立一阶逻辑作为任意事物(不只是集合)相等性的理论。一阶逻辑使用非正式的证明概念。概念证明本身不能单独用一阶逻辑形式表示。
然后,我们基于一阶逻辑将集合理论作为集合和集合成员的理论。
然后,集合成员资格和相等性通过可扩展性公理进行关联,该公称性表示两个集合具有相同成员时正好相等。
最后,来自(1)的非正式证明概念得到了某些集合(证明树)的事后合理化。
重要的是要意识到,证明的概念 因此是集合论中的第二等公民。
这种设置适用于常规的中小型数学,但是由于我们现在要处理大规模证明,例如所有有限简单组的分类或非平凡计算机程序的验证,因此它分崩离析,因为它不会导致容易机械化。
Martin-Löf类型理论是不同的:它以一次失败的概率建立了证明和类型概念(对于Martin-Löf类型理论而言,集合是集合理论)。这意味着证明是该理论的一等公民。尽管集合是由其成员给出的,但是集合理论省略了正式指定哪些东西可以证明某物是集合成员的证据。相反,一种类型是通过其居住证明给出的。所以,你明白一个类型什么时候你明白什么算作一个证明。Ť
这些居住类型有哪些证据?简化了一点(并省略了身份类型),它们是功能程序,更确切地说是 -calculus中可键入的术语 。这被称为库里-霍华德对应。它为建设性数学奠定了美丽而新颖的基础。对于经典的数学难题,它的效果不是很好。
我不了解进入Martin-Löf类型理论的简便途径。我想以下内容可以作为介绍。
但是,如果您对“什么是类型”这个问题感到困惑,我建议先进入简单得多的类型理论。任何类型的编程语言都可以,但是例如Ocaml,F#和Haskell尤其有用。简而言之,可以说Martin-Löf类型理论以两种方式扩展了上述语言的类型:
依赖类型背后的关键思想很简单:类型可以通过程序进行参数化。在更常规的打字系统(如上面提到的系统)中,这是不可能的(简化一点)。尽管简单,但后果却是深远的:从属类型将Curry-Howard对应关系提升为一阶构造逻辑。身份类型有点不寻常。如果/当您熟悉Haskell这样的语言时,您可以学习Agda,它基本上是具有Martin-Löf类型理论的Haskell。我觉得对于程序员而言,Agda比阅读上述书籍容易得多。