罗素类型理论与类型系统之间的关系


12

我最近意识到,例如在Haskell中发现的,Russellian类型理论与类型系统之间存在某种联系。实际上,Haskell中的一些类型表示法似乎是类型理论的先驱。但是,恕我直言,Russell在1908年的动机是避免Russell的悖论,我不确定这与计算机科学中的类型系统有何关系。

罗素的悖论是一种形式还是另一种形式,我们是否需要担心,例如,如果我们在给定的语言中没有好的类型系统?

Answers:


8

在编程语言意义上和“罗素”意义上的“类型论”是密切相关的,实际上,依存类型论的现代领域旨在为数学提供建设性的基础,与集合论不同,大多数基于类型论的研究都是基于数学是在Coq,NuPRL或Agda等证明助手中完成的,因此,在这些系统中完成的证明不仅可以“形式化”,而且实际上是完全形式化的并经过机器检查的,我们尝试使用战术和其他证明自动化技术来进行证明系统“高级”,因此类似于非正式数学,但是由于所有内容都经过检查,因此我们对正确性有更好的保证。

这里

普通编程语言中的类型往往更受限制,但是元理论是相同的。

在依赖类型理论中,类似于拉塞尔悖论的东西是一个主要问题。特别是

Type : Type

通常会导致矛盾。嵌套宇宙的Coq和类似工作

Type_0 : Type_1

但是默认情况下,在Coq中,这些数字是隐式的,因为它们通常对于程序员而言无关紧要。

在某些系统(Agda,Idris)中,通过编译标志启用类型输入规则。它使逻辑不一致,但通常使探索性编程/验证更加容易。

即使使用更主流的语言,罗素的悖论偶尔也会出现。例如,在Haskell中,可以对罗素悖论进行混合编码和开放式大小写的编码,从而允许即使在类型级别上也无需递归即可构建发散项 Haskell是“不一致的”(当以通常的方式解释为逻辑时),因为它同时支持类型和值级别的递归,更不用说例外了,尽管如此,这个结果还是很有趣的。


感谢您的详细回答-就目前的证明而言,仍然没有工具可以证明使用C ++或Java这样的命令性语言对程序的正确性,对吗?我想把手放在其中之一上...我意识到这是一个完全切线。我知道Coq和Agda,但是它们似乎并不是证明用C ++或Java编写的程序正确性的正确工具。
弗兰克

3
有一些工具。C语言有一些,Java语言有很多,Ada语言有很多。例如,请参阅:为什么(Java,C,Ada),Krakatoa(Java)或SPARK(具有良好工具的Ada子集)。对于C ++,不是很多。您可能也对YNot(Coq DSL)感兴趣。
菲利普·JF

3

你对罗素的动机是正确的。他的悖论困扰着所有接受无限制理解公理的集合理论,其结果是:任何命题功能都决定了一个集合,即所有满足该功能的实体的集合。确实存在这种缺陷的集合论或基于集合论的理论包括Cantor的天真集合论和Frege的Grundgesetze系统(特别是:公理5)。

由于类型被认为是特殊类型的集合,因此如果不加注意,类似的悖论可能会渗入类型系统中,也就是说,我不知道任何遭受这种命运的类型系统。我只能回想起丘吉尔在30年代早期提出的lambda演算的早期尝试,结果却是不一致的(Kleene-Rosser悖论),但是那既不是由于类型,也不是与罗素的悖论有关。

更新:有关您问题的实际答案,请参见Philip的答复。


1
感谢您的回答。可能有替代a-la-Russell的类型,以避免Russell悖论。这些替代解决方案中的任何一种都会对计算机语言有所帮助吗?平凡的类型对于明确指定部分代码之间的约定非常有用,甚至在此之前,也可以为程序提供语义。除了类型以外,还能获得其他语义吗?(我不知道那会是什么:-)
弗兰克(Frank)

1
是的,有很多选择(Quine的NF,ZFC等),但是我看不到基础危机和编程语言之间有任何直接联系。如果您将马丁·洛夫的类型理论视为一种编程语言,那么可能会有某种联系可以追溯到直觉主义。关于编程语言的语义,有一些基本语言(例如PDL(命题动态逻辑))具有Kripke(或可能的世界)语义。但是在我看来,类型是如此基本,以至于它们可能只是在幕后:)
湖南罗斯通扬

1
但是类型有点无聊:您想要并需要它们,但是您不必指定它们(因此,恕我直言,为什么我们在Haskell或Ocaml等语言中拥有类型推断系统(我喜欢那些语言))。另一方面,Python感到非常直观,并且不必为该语言的类型担心太多,这是令人愉快的(并且在编码时间方面很有效)。也许类型推断是两全其美的方法-但这就是工程师的话题。我只是在做白日梦,数学可以为计算机科学贡献另一个重要的概念(如类型):-)
弗兰克(Frank

1
@Frank每次我使用不带静态类型的语言(主要是Ruby)时,都会讨厌这种体验,因为我讨厌可以避免的运行时错误。因此,这似乎主要是一个品味问题。我同意强大的类型推断可以让您两全其美。这也许就是为什么我如此喜欢Scala。
拉斐尔

我不相信没有“自动”类型会导致运行时错误,就像您似乎暗示的那样:-)我在Python中从未遇到过问题。
弗兰克(Frank)

3

自从您提到Python以来,这个问题并不是纯粹的类型理论。因此,我尝试对类型进行更广泛的介绍。对于不同的人来说,类型是不同的事情。我至少收集了5种不同的(但相关的)类型概念:

  1. 类型系统是逻辑系统和集合论。

  2. 类型系统将类型与每个计算值相关联。通过检查这些值的流,类型系统试图证明或确保不会发生类型错误。

  3. 类型是一种分类,用于标识各种数据类型(例如实值,整数或布尔值)中的一种,它确定该类型的可能值;可以对该类型的值执行的操作;数据的含义;以及该类型值的存储方式

  4. 抽象数据类型允许使用高级语言进行数据抽象。ADT通常被实现为模块:模块的接口声明与ADT操作相对应的过程。这种信息隐藏策略允许在不干扰客户端程序的情况下更改模块的实现。

  5. 编程语言实现使用值的类型来选择值所需的存储以及对值进行操作的算法。

引文来自维基百科,但如有需要,我可以提供更好的参考。

Types-1源于Russel的著作,但如今它们已不再受悖论的保护:同型类型理论的类型化语言是一种用一种形式化的,机器可理解的语言对数学进行编码的新方法,也是人类理解基础的一种新方式数学。(“旧”方式是使用公理集理论进行编码)。

类型2-5在编程中产生于多种不同的需求:分别避免错误,对设计人员和程序员使用的数据进行分类,设计大型系统以及有效地实现编程语言。

C / C ++,Ada,Java,Python中的类型系统并不是出于Russel的工作或避免错误的愿望而产生的。他们的出现是出于描述各种不同类型的数据(例如“姓氏是字符串而不是数字”),模块化软件设计以及为数据选择低级表示的需求。这些语言没有类型1或类型2。Java不会通过使用类型系统来证明程序的正确性,而是通过对语言的设计(无指针算术)和运行时系统(虚拟机,字节码验证)进行精心设计来确保相对安全的Bug。Java中的类型系统既不是逻辑系统也不是集合论。

但是,Agda编程语言中的类型系统是Russel的类型系统的现代变体(基于后来的工作或Per Martin-Lof和其他数学家)。Agda中的类型系统旨在表达程序的数学属性和这些属性的证明,它是一个逻辑系统和一个集合论。

这里没有黑白的区别:多种语言都适用。例如,Haskell语言的类型系统扎根于Russel的著作,可以看作是简化的Agda的系统,但是从数学的角度来看,如果将其视为逻辑系统或集合论则是不一致的(自相矛盾的)。

但是,作为保护Haskell程序免受错误影响的理论工具,它的效果很好。您甚至可以使用类型对某些属性及其证明进行编码,但并非所有属性都可以进行编码,并且如果程序员使用不鼓励的脏话,程序员仍然可以违反已证明的属性。

Scala的类型系统离Russel的作品和Agda的完美证明语言还很远,但仍然植根于Russel的作品。

至于证明其类型系统不是为此目的而设计的工业语言的特性,有许多方法和系统。

有关有趣但又不同的方法,请参阅Coq和Microsoft Boogie研究项目。Coq依靠类型理论从Coq程序生成命令式程序。Boogie依靠带有属性的命令式程序的注释,并使用与Coq完全不同的方法通过Z3定理证明器证明这些属性。

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.