Answers:
在编程语言意义上和“罗素”意义上的“类型论”是密切相关的,实际上,依存类型论的现代领域旨在为数学提供建设性的基础,与集合论不同,大多数基于类型论的研究都是基于数学是在Coq,NuPRL或Agda等证明助手中完成的,因此,在这些系统中完成的证明不仅可以“形式化”,而且实际上是完全形式化的并经过机器检查的,我们尝试使用战术和其他证明自动化技术来进行证明系统“高级”,因此类似于非正式数学,但是由于所有内容都经过检查,因此我们对正确性有更好的保证。
看这里
普通编程语言中的类型往往更受限制,但是元理论是相同的。
在依赖类型理论中,类似于拉塞尔悖论的东西是一个主要问题。特别是
Type : Type
通常会导致矛盾。嵌套宇宙的Coq和类似工作
Type_0 : Type_1
但是默认情况下,在Coq中,这些数字是隐式的,因为它们通常对于程序员而言无关紧要。
在某些系统(Agda,Idris)中,通过编译标志启用类型输入规则。它使逻辑不一致,但通常使探索性编程/验证更加容易。
即使使用更主流的语言,罗素的悖论偶尔也会出现。例如,在Haskell中,可以对罗素悖论进行混合编码和开放式大小写的编码,从而允许即使在类型级别上也无需递归即可构建发散项。 Haskell是“不一致的”(当以通常的方式解释为逻辑时),因为它同时支持类型和值级别的递归,更不用说例外了,尽管如此,这个结果还是很有趣的。
你对罗素的动机是正确的。他的悖论困扰着所有接受无限制理解公理的集合理论,其结果是:任何命题功能都决定了一个集合,即所有满足该功能的实体的集合。确实存在这种缺陷的集合论或基于集合论的理论包括Cantor的天真集合论和Frege的Grundgesetze系统(特别是:公理5)。
由于类型被认为是特殊类型的集合,因此如果不加注意,类似的悖论可能会渗入类型系统中,也就是说,我不知道任何遭受这种命运的类型系统。我只能回想起丘吉尔在30年代早期提出的lambda演算的早期尝试,结果却是不一致的(Kleene-Rosser悖论),但是那既不是由于类型,也不是与罗素的悖论有关。
更新:有关您问题的实际答案,请参见Philip的答复。
自从您提到Python以来,这个问题并不是纯粹的类型理论。因此,我尝试对类型进行更广泛的介绍。对于不同的人来说,类型是不同的事情。我至少收集了5种不同的(但相关的)类型概念:
类型系统是逻辑系统和集合论。
类型系统将类型与每个计算值相关联。通过检查这些值的流,类型系统试图证明或确保不会发生类型错误。
类型是一种分类,用于标识各种数据类型(例如实值,整数或布尔值)中的一种,它确定该类型的可能值;可以对该类型的值执行的操作;数据的含义;以及该类型值的存储方式
抽象数据类型允许使用高级语言进行数据抽象。ADT通常被实现为模块:模块的接口声明与ADT操作相对应的过程。这种信息隐藏策略允许在不干扰客户端程序的情况下更改模块的实现。
编程语言实现使用值的类型来选择值所需的存储以及对值进行操作的算法。
引文来自维基百科,但如有需要,我可以提供更好的参考。
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定理证明器证明这些属性。