简单地说,Curry-Howard correspondence表明一个类型是一个定理,并且返回这个类型的程序是对应定理的证明。
这种对应关系是基于数学证明的形式化,在谓词演算等语言中,局限于直觉逻辑。但是,当用这些正式语言编写数学证明时,计算机就可以检测到它们的错误。例如,Mizar是一种相对高级的数学语言,加上编译器可以检查其中的证明。
因此,Curry-Howard将程序与数学证明无关。因此,Curry-Howard如何在数学世界中翻译程序错误的概念?通过上面的内容,它不是证明中的逻辑错误。
答案 0 :(得分:2)
带有错误的程序对应于正确的证据,这些证据与程序在没有错误的情况下对应的证明不同。换句话说,带有错误的程序对应于正确的证据,但不同的证据。通过类比,路径是您从前门取出的特定步骤序列。您可能打算走通往杂货店的路。也许你走错了路,最后到了理发店。你还走了一条路,而不是你想要的路。
证明中的逻辑错误更类似于编程语言中的运行时或语法错误。在这种情况下,并不是说你已经计算,证明或走错了事;但是你没有计算,证明或行走任何东西。在我们的比喻中,这可能就像忘记如何走路,并试图只用你的左肘和下巴几步。你将无法完成你的道路 - 任何正确或错误的道路 - 因为你试图做一些不算作踩踏的事情。
您可能会考虑的一个有趣的挑战 - 编写一个对任何可能的问题都不正确的正确有效算法。
答案 1 :(得分:1)
不幸的是,我认为Patrick87并不完全正确。重要的是要理解问题中“错误”的含义。我认为“错误”包括影响类型的错误和不影响类型的错误。
基本要注意的是,在对应关系下,定理仅与程序的类型特征有关,而与值特征无关。因此,从定理来看,诸如x := x + 1
和x := x + 2
之类的程序语句是完全等效的。必须认识到,在通常的解释中,这些只是抽象定理,而不是有关程序的定理(例如,关于程序的正确性)。
因此,很容易看出很多(也许大多数)错误根本不会影响相应的定理。例如,如果我们有一个财务程序,并且想从毛利润中计算净利润,那么写NetProfit := GrossProfit * 0.8
可能是正确的。但是我们可能会输入一个错误并计算税额NetProfit := GrossProfit * 0.2
。它对类型没有影响,因此对对应关系也没有影响。许多真正的错误都是这样的:一次性错误,溢出错误,对子例程行为的误解,数字和字符串错别字...
对于确实影响对应关系的错误,这取决于它们是否导致有效的定理。如果得出有效的定理,则程序很可能会编译,运行而不会崩溃等。但是,这意味着您弄错了一种类型,例如,如果要将2个数字放在一起,例如1和3 ->13。但是您忘了将它们转换为字符串,因此得到1和3->4。另一方面,如果它没有产生有效的定理,则意味着您可能遇到了严重的错误,并且程序将无法编译,否则将陷入无限循环或类似的情况。
总而言之,如果您的某个程序的有效定理是有效的,那说明不多。该程序仍可能存在错误。另一方面,如果您试图制作一个没有相应定理的程序,那么这很好地表明您可能会出错。因此,这取决于错误的种类,大多数错误根本不会出现。