计算机导论易建勋,柯里-霍华德同构

柯里-霍华德同构是指计算机程序和数学证明之间的紧密联系;即函数的类型相当于命题,函数的实现相当于证明。这种对应也叫做柯里-霍华德对应、公式为类型对应或命题为类型对应。这是对形式逻辑系统和公式计算(computational calculus)之间符号的相似性的推广。它被认为是由美国数学家哈斯凯尔·加里和逻辑学家William Alvin Howard独立发现的。

中文名

柯里-霍华德同构

外文名

Curry-Howard  Isomorphism

学    科

计算机计算理论意    义

揭示计算机程序和数学证明联系

别    名

公式为类型对应或命题为类型对应

发现者

哈斯凯尔·加里

柯里-霍华德同构简介

编辑

语音

Curry-Howard 同构显示了推理系统和程序语言之间的相似性[1]

,类型即命题,程序即证明。或表示了计算机程序与数理逻辑之间的直接联系(逻辑上的等价关系),即我们可以利用数理逻辑中的某些东西来去表示程序中的特定逻辑。

在此框架下:程序语言的语言构造同构为推理系统的推理规则、程序的类型同构为逻辑命题、闭合程序(不依赖环境的程序)可以同构为一条定理的证明过程,其类型就是一条定理以及逻辑上下文同构为自由变量类型指派。例如Lambda 演算同构为 Gentzen 的自然演绎:

函数调用就是蕴含消除

函数抽象就是蕴含介入

参数多态就是全称量化

模板类型就是谓词

结构类型就是合取

联合类型就是析取

收参数但不返回就是否定

高洋上的 call/cc 就是双重否定消除

柯里-霍华德同构对应的起源、范围和结论

编辑

语音

对应可以在两个层面上看到,首先是类比层次,它声称对一个函数计算出的值的类型的断言可类比于一个逻辑定理,计算这个值的程序可类比于这个定理的证明。在理论计算机科学中,这是连接λ演算和类型论的毗邻领域的一个重要的底层原理。它被经常以下列形式陈述为“证明是程序”。一个可选择的形式化为“命题为类型”。其次,更加正式的,它指定了在两个数学领域之间的同构,就是以一种特定方式形式化的自然演绎和简单类型λ演算之间是双射,首先是证明和项,其次是证明归约步骤和beta归约。

有多种方式考虑柯里-霍华德对应。在一个方向上,它工作于“把证明编译为程序”级别上。这里的“证明”最初被限定为在构造性逻辑中—典型的是直觉逻辑系统中的证明。而“程序”是在常规的函数式编程的意义上的;从语法的观点上看,这种程序是用某种λ演算表达的。所以柯里-霍华德同构的具体实现是详细研究如何把来自直觉逻辑的证明写成λ项。(这是霍华德的贡献;柯里贡献了组合子,它是相对于是高级语言的λ演算是能写所有东西的机器语言)。最近,同样处理经典逻辑的柯里-霍华德对应的扩展可被公式化了,通过对经典有效规则比如双重否定除去和皮尔士定律关联上明确的用续体比如call/cc处理的一类项。

还有一个相反的方向,对一个程序的正确性关联上“证明提取”的可能性。这在非常丰富的类型论环境中是可行的。实际上理论家对推进非常丰富类型的函数式编程语言的开发的动机,已经部分地混合了希望带给柯里-霍华德对应更加显著的地位的因素。

柯里-霍华德同构程序语言与证明

编辑

语音

程序语言

程序语言是用来定义计算机指令执行流程的形式化语言。每种程序语言都包含一整套词汇和语法规范。这些规范通常包括数据类型和数据结构、指令类型和指令控制、调用机制和库函数以及不成文的规定(如递进书写、变量命名等)[2]

。每一种程序设计语言可以被看作是一套包含语法、词汇和含义的正式规范。这些规范通常包括:数据和数据结构、指令及流程控制、引用机制和重用以及设计哲学。语法是说明编程语言中,哪些符号或文字的组合方式是正确的,语义则是对于编程的解释。

数学证明

数学上的证明包括两个不同的概念。首先是非形式化的证明:一种以自然语言写成的严密论证,用来说服听众或读者去接受某个定理或论断的真确性。由于这种证明使用了自然语言,因此对于非形式化证明在严谨性上的标准,将取决于听众或读者对课题的理解程度。非形式化证明在大多数的应用场合中出现,例如科普讲座、口头辩论、初等教育或高等教育的某些部分。有时候非形式化的证明被称作“正式的”,但这只是强调其中论证的严谨性。而当逻辑学家使用“正式证明”一词时,指的是另一种完全不同的证明——形式化证明。

在数理逻辑中,形式化证明并不是以自然语言书写,而是以形式化的语言书写:这种语言包含了由一个给定的字母表中的字符所构成的字符串。而证明则是一种由该些字符串组成的有限长度的序列。这种定义使得人们可以谈论严格意义上的“证明”,而不涉及任何逻辑上的模糊之处。研究证明的形式化和公理化的理论称为证明论。尽管理论上来说,每个非形式化的证明都可以转化为形式化证明,但实际中很少会这样做。对形式化证明的研究主要应用在探讨关于可证明性的一般性质,或说明某些命题的不可证明性等等。

柯里-霍华德同构类型

编辑

语音

依据ec5d2b1b7bcc712657f64c526eb9baec.svg 演算,我们将使用0473ea9f73be0f53cc537f902a3c6ba2.svg 来指示带有形式参数x和函数体bd8a13babb1c1b0b2f512636e81585f7.svg 的函数。在应用于参数比如88d89ebf17fd0a8a054bb6820fb9bdbf.svg 的时候,这个函数生成E,并带有x的所有自由出现都被替换为88d89ebf17fd0a8a054bb6820fb9bdbf.svg 。有效的ec5d2b1b7bcc712657f64c526eb9baec.svg 演算表达式有如下形式之一:

1、fc39f411d298932b69fc5c227de15b0f.svg (这里的fc39f411d298932b69fc5c227de15b0f.svg 是个变量)

2、ec5d2b1b7bcc712657f64c526eb9baec.svg99981ee08bcef95090b875c0f86d51d3.svg (这里的是fc39f411d298932b69fc5c227de15b0f.svg 个变量,而E是个演算表达式)

3、(992e6e80f859ae9c5f71f4962b14d95c.svg )(这里的bd8a13babb1c1b0b2f512636e81585f7.svg 和F是ec5d2b1b7bcc712657f64c526eb9baec.svg 演算表达式)

通常我们将缩写(24e04fda88d7d7f0346aa7a06072fd7d.svg )为(bfa942a2d31482f4a9ee4f4c3529c1a8.svg ),缩写6052f036bebdbb501ed3a9e29f7c78b2.svgf515a8bca635b8dd09c8829a870f08af.svg 。一个表达式被称为是“闭合的”,如果它不包含自由变量。

类型确定规则

类型可以依赖于类型变量,它被指示为小写的希腊字母219e07cd6117a5150dd0d7aee4592aaa.svg ,ea027d6202a985007785bbb2f1642553.svg 等等。在我们概念中类型变量是被隐含的全称量化的,就是说,如果一个值有包括类型变量的一个类型,则它必须由这个类型变量的所有可能实例组成。我们可以定义任意表达式的类型为如下:

1、一个变量比如4675185d7b4028ecceae6b1456352cd4.svg 可以有任意类型。

2、如果变量有类型219e07cd6117a5150dd0d7aee4592aaa.svg ,而表达式bd8a13babb1c1b0b2f512636e81585f7.svg 有类型ea027d6202a985007785bbb2f1642553.svg ,则88ef621b01fc4f225ebebd017f3bf260.svg 有指示为的类型;就是说,它是取类型219e07cd6117a5150dd0d7aee4592aaa.svg 的值,并映射到类型ea027d6202a985007785bbb2f1642553.svg 的值。

3、在表达式(694b7c42dbbcce2854698ff913618c7d.svg )中,如果F有类型219e07cd6117a5150dd0d7aee4592aaa.svg ,则E必须有类型9878d82bc6d829a28791587613d25016.svg (就是说它必须是期望类型的参数的函数)并且这个表达式有类型ea027d6202a985007785bbb2f1642553.svg

例如,考虑函数029ef24f1278ab5f7c4eb0cf29f64da2.svg 。假定88d89ebf17fd0a8a054bb6820fb9bdbf.svg 有类型219e07cd6117a5150dd0d7aee4592aaa.svg 而b有类型ea027d6202a985007785bbb2f1642553.svg 。则ec5d2b1b7bcc712657f64c526eb9baec.svg7353c885d1c0c51bba03f911aa40c39d.svg 有类型c2b1b715347cbaac80036b3d1a8671a8.svg ,而ee88e445c7f855a5658d546ce4e6daf8.svg 有类型b8471dd3b632fb7aa85453653f633d21.svg (9878d82bc6d829a28791587613d25016.svg )。我们接受→是右结合的约定,所以这个类型也可以写为9878d82bc6d829a28791587613d25016.svg13b3965eb5f74eb6f000591ade15205c.svg 。这意味着K函数接受类型α的参数并返回一个函数,它接受类型β的参数并返回类型219e07cd6117a5150dd0d7aee4592aaa.svg 的值。

类型居留问题

很明显ec5d2b1b7bcc712657f64c526eb9baec.svg -表达式可以有非常复杂的类型。你可能要问是否有带有给定类型的ec5d2b1b7bcc712657f64c526eb9baec.svg -表达式。找到带有特定类型的ec5d2b1b7bcc712657f64c526eb9baec.svg -表达式的问题叫做类型居留问题。

答案是非常引人注目的:有带有特定类型的闭合ec5d2b1b7bcc712657f64c526eb9baec.svg -表达式,当且仅当这个类型对应于一个逻辑定理,在这里的→符号再次解释为意味着逻辑蕴涵的时候。

例如,考虑恒等函数ec5d2b1b7bcc712657f64c526eb9baec.svgee2ec5a6df1587866425cbc462d2e5e2.svg ,它接受类型ξ的参数并返回类型ξ的结果,所以有类型8c56c8ecafa7525460d7b46c225a1f0c.svg8c56c8ecafa7525460d7b46c225a1f0c.svg 当然是逻辑定理:给定一个公式959ad200f9fb074d206b223d046b88ba.svg ,你可以结论出959ad200f9fb074d206b223d046b88ba.svg

K函数的类型ced937e58f3aa64df2cc140d2918b411.svg 也是一个定理。如果已知219e07cd6117a5150dd0d7aee4592aaa.svg 为真,则你可以结论出如果ea027d6202a985007785bbb2f1642553.svg 为真就能推出219e07cd6117a5150dd0d7aee4592aaa.svg 。这有时也叫做重复规则。B的类型是 (c2b1b715347cbaac80036b3d1a8671a8.svg )→(3bf0fa7bae7f84477dd52446218d916d.svg )03efd3edd38c2e42c8d0f0d6ed707ef8.svg 。你可类似的把它解释为逻辑重言式;如果已知(c2b1b715347cbaac80036b3d1a8671a8.svg )为真,则如果已知(3bf0fa7bae7f84477dd52446218d916d.svg )为真,你就能推出74822649bb220e0bdde84e9532b80130.svg 蕴涵219e07cd6117a5150dd0d7aee4592aaa.svg

柯里-霍华德同构相继式演算

编辑

语音

在证明论和数理逻辑中,相继式演算(又译矢列演算、矢列式演算)是众所周知的一阶逻辑(和作为它的特殊情况的命题逻辑)的演绎系统。这个系统也叫做d20b8ba1a1259c5c0dfcd9f322e3bf50.svg 系统,用以区别于后来建立的有时也叫做相继式演算的类似风格的各种其他系统。另一个给这种系统的术语是Gentzen系统。相继式演算6322d6b56721635a5a4a6911998304d9.svg 由Gerhard Gentzen介入为研究自然演绎的工具。它已经变成构造逻辑推导的非常有用的演算。它的名字得来自德语的Logischer Kalkül,意思是"逻辑演算"。相继式演算是关于这个主题的很多研究所选择的方法。

证明逻辑定理的更加直觉的方式是根岑的相继式演算。相继式演算以同希尔伯特式证明对应于组合子表达式一样的方式对应于λ-表达式程序。直觉逻辑的蕴涵片段的相继式演算规则是:

8c916f4bc3810c207ebd189078ccbdbb.svg

f9959cf2d44d2a0af3b3aaa1e45de7f0.svg

a945404e71f1d2222ead04c1d79d5922.svg

Γ表示上下文,它是假设的集合。2d86297522a9436cfea1797cc0018aa7.svg 指示假定上下文Γ我们可以证明88d89ebf17fd0a8a054bb6820fb9bdbf.svg 。逻辑定理完全由其证明不需要假设的那些公式t组成的;就是说,t是一个定理,当且仅当我们可以证明10e7825ee78ca2c8fd55277dd6b9c498.svg

在相继式演算中的证明是树,它的根是我们要证明的定理,而它的叶子是公理模式实例;每个内部节点必须标记为要么bedb58ae173dbd7205d2d27fabc90979.svg 要么d94386c98532ba1d8fe70e67fb312f97.svg ,并且必须包含依据指定规则从子节点推出的一个公式。

相继式演算证明紧密的对应于λ-演算表达式。断言4ba17cf45fba82758e9d5da02b702cfa.svg 可以被解释为意味着,给定带有在Γ中列出类型的值,我们可以制造带有类型88d89ebf17fd0a8a054bb6820fb9bdbf.svg 的一个值。公理对应于带有新的无约束的类型的新变量介入。bedb58ae173dbd7205d2d27fabc90979.svg 规则对应于函数抽象:

6356792a4361b2b0b08bbbcb5fbc9220.svg 什么时候我们能结论出某个程序Γ包含类型9878d82bc6d829a28791587613d25016.svg 的函数?在Γ加上类型219e07cd6117a5150dd0d7aee4592aaa.svg 的一个值的时候,包含了足够的机械来允许我们制造类型ea027d6202a985007785bbb2f1642553.svg 的一个值。d94386c98532ba1d8fe70e67fb312f97.svg 规则对应于函数应用:

e1e46566abee59262196e9ef947085a1.svg 如果我们可以制造类型α的一个值,并且如果给出类型β的一个值,我们还可以制造74822649bb220e0bdde84e9532b80130.svg 类型的一个值,则类型9878d82bc6d829a28791587613d25016.svg 的一个函数将允许我们制造类型74822649bb220e0bdde84e9532b80130.svg 的一个值:首先我们可以制造219e07cd6117a5150dd0d7aee4592aaa.svg ,接着应用9878d82bc6d829a28791587613d25016.svg 函数于它,并接着使用结果的β值来制造类型74822649bb220e0bdde84e9532b80130.svg 的一个值。

参考资料

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值