柯里-霍华德同构是指计算机程序和数学证明之间的紧密联系;即函数的类型相当于命题,函数的实现相当于证明。这种对应也叫做柯里-霍华德对应、公式为类型对应或命题为类型对应。这是对形式逻辑系统和公式计算(computational calculus)之间符号的相似性的推广。它被认为是由美国数学家哈斯凯尔·加里和逻辑学家William Alvin Howard独立发现的。
中文名
柯里-霍华德同构
外文名
Curry-Howard Isomorphism
学 科
计算机计算理论意 义
揭示计算机程序和数学证明联系
别 名
公式为类型对应或命题为类型对应
发现者
哈斯凯尔·加里
柯里-霍华德同构简介
编辑
语音
Curry-Howard 同构显示了推理系统和程序语言之间的相似性[1]
,类型即命题,程序即证明。或表示了计算机程序与数理逻辑之间的直接联系(逻辑上的等价关系),即我们可以利用数理逻辑中的某些东西来去表示程序中的特定逻辑。
在此框架下:程序语言的语言构造同构为推理系统的推理规则、程序的类型同构为逻辑命题、闭合程序(不依赖环境的程序)可以同构为一条定理的证明过程,其类型就是一条定理以及逻辑上下文同构为自由变量类型指派。例如Lambda 演算同构为 Gentzen 的自然演绎:
函数调用就是蕴含消除
函数抽象就是蕴含介入
参数多态就是全称量化
模板类型就是谓词
结构类型就是合取
联合类型就是析取
收参数但不返回就是否定
高洋上的 call/cc 就是双重否定消除
柯里-霍华德同构对应的起源、范围和结论
编辑
语音
对应可以在两个层面上看到,首先是类比层次,它声称对一个函数计算出的值的类型的断言可类比于一个逻辑定理,计算这个值的程序可类比于这个定理的证明。在理论计算机科学中,这是连接λ演算和类型论的毗邻领域的一个重要的底层原理。它被经常以下列形式陈述为“证明是程序”。一个可选择的形式化为“命题为类型”。其次,更加正式的,它指定了在两个数学领域之间的同构,就是以一种特定方式形式化的自然演绎和简单类型λ演算之间是双射,首先是证明和项,其次是证明归约步骤和beta归约。
有多种方式考虑柯里-霍华德对应。在一个方向上,它工作于“把证明编译为程序”级别上。这里的“证明”最初被限定为在构造性逻辑中—典型的是直觉逻辑系统中的证明。而“程序”是在常规的函数式编程的意义上的;从语法的观点上看,这种程序是用某种λ演算表达的。所以柯里-霍华德同构的具体实现是详细研究如何把来自直觉逻辑的证明写成λ项。(这是霍华德的贡献;柯里贡献了组合子,它是相对于是高级语言的λ演算是能写所有东西的机器语言)。最近,同样处理经典逻辑的柯里-霍华德对应的扩展可被公式化了,通过对经典有效规则比如双重否定除去和皮尔士定律关联上明确的用续体比如call/cc处理的一类项。
还有一个相反的方向,对一个程序的正确性关联上“证明提取”的可能性。这在非常丰富的类型论环境中是可行的。实际上理论家对推进非常丰富类型的函数式编程语言的开发的动机,已经部分地混合了希望带给柯里-霍华德对应更加显著的地位的因素。
柯里-霍华德同构程序语言与证明
编辑
语音
程序语言
程序语言是用来定义计算机指令执行流程的形式化语言。每种程序语言都包含一整套词汇和语法规范。这些规范通常包括数据类型和数据结构、指令类型和指令控制、调用机制和库函数以及不成文的规定(如递进书写、变量命名等)[2]
。每一种程序设计语言可以被看作是一套包含语法、词汇和含义的正式规范。这些规范通常包括:数据和数据结构、指令及流程控制、引用机制和重用以及设计哲学。语法是说明编程语言中,哪些符号或文字的组合方式是正确的,语义则是对于编程的解释。
数学证明
数学上的证明包括两个不同的概念。首先是非形式化的证明:一种以自然语言写成的严密论证,用来说服听众或读者去接受某个定理或论断的真确性。由于这种证明使用了自然语言,因此对于非形式化证明在严谨性上的标准,将取决于听众或读者对课题的理解程度。非形式化证明在大多数的应用场合中出现,例如科普讲座、口头辩论、初等教育或高等教育的某些部分。有时候非形式化的证明被称作“正式的”,但这只是强调其中论证的严谨性。而当逻辑学家使用“正式证明”一词时,指的是另一种完全不同的证明——形式化证明。
在数理逻辑中,形式化证明并不是以自然语言书写,而是以形式化的语言书写:这种语言包含了由一个给定的字母表中的字符所构成的字符串。而证明则是一种由该些字符串组成的有限长度的序列。这种定义使得人们可以谈论严格意义上的“证明”,而不涉及任何逻辑上的模糊之处。研究证明的形式化和公理化的理论称为证明论。尽管理论上来说,每个非形式化的证明都可以转化为形式化证明,但实际中很少会这样做。对形式化证明的研究主要应用在探讨关于可证明性的一般性质,或说明某些命题的不可证明性等等。
柯里-霍华德同构类型
编辑
语音
依据 演算,我们将使用
来指示带有形式参数x和函数体
的函数。在应用于参数比如
的时候,这个函数生成E,并带有x的所有自由出现都被替换为
。有效的
演算表达式有如下形式之一:
1、 (这里的
是个变量)
2、 (这里的是
个变量,而E是个演算表达式)
3、( )(这里的
和F是
演算表达式)
通常我们将缩写( )为(
),缩写
为
。一个表达式被称为是“闭合的”,如果它不包含自由变量。
类型确定规则
类型可以依赖于类型变量,它被指示为小写的希腊字母 ,
等等。在我们概念中类型变量是被隐含的全称量化的,就是说,如果一个值有包括类型变量的一个类型,则它必须由这个类型变量的所有可能实例组成。我们可以定义任意表达式的类型为如下:
1、一个变量比如 可以有任意类型。
2、如果变量有类型 ,而表达式
有类型
,则
有指示为的类型;就是说,它是取类型
的值,并映射到类型
的值。
3、在表达式( )中,如果F有类型
,则E必须有类型
(就是说它必须是期望类型的参数的函数)并且这个表达式有类型
。
例如,考虑函数 。假定
有类型
而b有类型
。则
有类型
,而
有类型
(
)。我们接受→是右结合的约定,所以这个类型也可以写为
。这意味着K函数接受类型α的参数并返回一个函数,它接受类型β的参数并返回类型
的值。
类型居留问题
很明显 -表达式可以有非常复杂的类型。你可能要问是否有带有给定类型的
-表达式。找到带有特定类型的
-表达式的问题叫做类型居留问题。
答案是非常引人注目的:有带有特定类型的闭合 -表达式,当且仅当这个类型对应于一个逻辑定理,在这里的→符号再次解释为意味着逻辑蕴涵的时候。
例如,考虑恒等函数 ,它接受类型ξ的参数并返回类型ξ的结果,所以有类型
。
当然是逻辑定理:给定一个公式
,你可以结论出
。
K函数的类型 也是一个定理。如果已知
为真,则你可以结论出如果
为真就能推出
。这有时也叫做重复规则。B的类型是 (
)→(
)
。你可类似的把它解释为逻辑重言式;如果已知(
)为真,则如果已知(
)为真,你就能推出
蕴涵
。
柯里-霍华德同构相继式演算
编辑
语音
在证明论和数理逻辑中,相继式演算(又译矢列演算、矢列式演算)是众所周知的一阶逻辑(和作为它的特殊情况的命题逻辑)的演绎系统。这个系统也叫做 系统,用以区别于后来建立的有时也叫做相继式演算的类似风格的各种其他系统。另一个给这种系统的术语是Gentzen系统。相继式演算
由Gerhard Gentzen介入为研究自然演绎的工具。它已经变成构造逻辑推导的非常有用的演算。它的名字得来自德语的Logischer Kalkül,意思是"逻辑演算"。相继式演算是关于这个主题的很多研究所选择的方法。
证明逻辑定理的更加直觉的方式是根岑的相继式演算。相继式演算以同希尔伯特式证明对应于组合子表达式一样的方式对应于λ-表达式程序。直觉逻辑的蕴涵片段的相继式演算规则是:
Γ表示上下文,它是假设的集合。 指示假定上下文Γ我们可以证明
。逻辑定理完全由其证明不需要假设的那些公式t组成的;就是说,t是一个定理,当且仅当我们可以证明
。
在相继式演算中的证明是树,它的根是我们要证明的定理,而它的叶子是公理模式实例;每个内部节点必须标记为要么 要么
,并且必须包含依据指定规则从子节点推出的一个公式。
相继式演算证明紧密的对应于λ-演算表达式。断言 可以被解释为意味着,给定带有在Γ中列出类型的值,我们可以制造带有类型
的一个值。公理对应于带有新的无约束的类型的新变量介入。
规则对应于函数抽象:
什么时候我们能结论出某个程序Γ包含类型
的函数?在Γ加上类型
的一个值的时候,包含了足够的机械来允许我们制造类型
的一个值。
规则对应于函数应用:
如果我们可以制造类型α的一个值,并且如果给出类型β的一个值,我们还可以制造
类型的一个值,则类型
的一个函数将允许我们制造类型
的一个值:首先我们可以制造
,接着应用
函数于它,并接着使用结果的β值来制造类型
的一个值。
参考资料
1.
Curry H B. Functionality in Combinatory Logic[J]. Proceedings of the National Academy of Sciences of the United States of America, 1934, 20(11):584-590.
2.
唐良荣,唐建湘,范丰仙,易建勋编著.计算机导论:计算思维和应用技术:清华大学出版社,2015