Curry-Howard 同构的错误相当于什么?
What's the equivalent of a bug by the Curry-Howard isomorphism?
简而言之,Curry-Howard correspondence 指出类型是定理,返回此类型的程序是相应定理的证明。
通信基于数学证明的形式化,使用谓词演算等语言,受限于直觉逻辑。但是,当用这些形式化语言编写数学证明时,它们的错误可以被计算机检测到。比如Mizar就是比较高级的数学语言,再加上一个编译器,用来检查写在里面的证明。
所以 Curry-Howard 将程序与数学证明关联起来没有错误。因此,Curry-Howard 如何在数学世界中翻译程序错误的概念?综上所述,这不是证明中的逻辑错误。
有错误的程序对应正确的证明,这与没有错误的程序对应的证明不同。换句话说,有错误的程序对应正确的证明,但不同的证明。打个比方,路径是您走出前门的一系列特定步骤。您可能打算步行去杂货店。也许你走错了路,最后去了理发店。你还是走了一条路,只是不是你想走的路。
证明中的逻辑错误更类似于编程语言中的运行时或语法错误。在这种情况下,并不是你计算、证明或走错了东西;但是你根本没有计算、证明或行走任何东西。在我们的类比中,这可能就像忘记了如何走路并试图只用左肘和下巴走几步一样。您将无法完成您的路径 - 任何路径,无论对错 - 因为您试图做一些不算是步进的事情。
您可能会考虑一个有趣的挑战 - 编写一个正确、有效的算法,该算法对任何可能的问题都不正确。
不幸的是,我认为 Patrick87 的说法并不完全正确。了解问题中 "bug" 的含义很重要。我假设 "bugs" 包括影响类型的错误和不影响类型的错误。
需要注意的是,在对应关系下,定理仅与程序的类型特征相关,与值特征无关。所以 x := x + 1
和 x := x + 2
这样的程序语句从定理的角度来看是完全等价的。重要的是要认识到,在正常的解释中,这些只是抽象定理,而不是关于程序的定理(例如关于它的正确性)。
所以从这里很容易看出很多(也许是大多数)错误根本不会影响相应的定理。例如,如果我们有一个财务程序,我们想从毛利中计算出净利润,那么写NetProfit := GrossProfit * 0.8
可能是正确的。但是我们可能会输入错误并计算税金 NetProfit := GrossProfit * 0.2
。它对类型没有影响,因此对对应关系没有影响。很多很多真正的错误都是这样的:差一错误、溢出错误、误解子程序的行为、数字和字符串错别字...
对于确实会影响对应关系的错误,这取决于它们是否会导致有效的定理。如果它得出一个有效的定理,那么您的程序更有可能编译 运行 而不会崩溃等。但是,这意味着您弄错了其中一种类型,例如,如果您想将 2 个数字放在一起,像 1 和 3 -> 13。但是你忘记将它们转换为字符串,所以你得到的是 1 和 3 -> 4。另一方面,如果它没有得出有效的定理,那么这意味着你可能得到了一些东西严重错误,程序将无法编译,或者陷入死循环,或类似的情况。
总而言之,如果您的程序具有有效的相应定理,那并不能告诉您太多。该程序仍然可能存在错误。另一方面,如果您试图编写一个没有相应定理的程序,那么这就是您可能出错的一个很好的迹象。所以这取决于错误的类型,大多数根本不会出现。
简而言之,Curry-Howard correspondence 指出类型是定理,返回此类型的程序是相应定理的证明。
通信基于数学证明的形式化,使用谓词演算等语言,受限于直觉逻辑。但是,当用这些形式化语言编写数学证明时,它们的错误可以被计算机检测到。比如Mizar就是比较高级的数学语言,再加上一个编译器,用来检查写在里面的证明。
所以 Curry-Howard 将程序与数学证明关联起来没有错误。因此,Curry-Howard 如何在数学世界中翻译程序错误的概念?综上所述,这不是证明中的逻辑错误。
有错误的程序对应正确的证明,这与没有错误的程序对应的证明不同。换句话说,有错误的程序对应正确的证明,但不同的证明。打个比方,路径是您走出前门的一系列特定步骤。您可能打算步行去杂货店。也许你走错了路,最后去了理发店。你还是走了一条路,只是不是你想走的路。
证明中的逻辑错误更类似于编程语言中的运行时或语法错误。在这种情况下,并不是你计算、证明或走错了东西;但是你根本没有计算、证明或行走任何东西。在我们的类比中,这可能就像忘记了如何走路并试图只用左肘和下巴走几步一样。您将无法完成您的路径 - 任何路径,无论对错 - 因为您试图做一些不算是步进的事情。
您可能会考虑一个有趣的挑战 - 编写一个正确、有效的算法,该算法对任何可能的问题都不正确。
不幸的是,我认为 Patrick87 的说法并不完全正确。了解问题中 "bug" 的含义很重要。我假设 "bugs" 包括影响类型的错误和不影响类型的错误。
需要注意的是,在对应关系下,定理仅与程序的类型特征相关,与值特征无关。所以 x := x + 1
和 x := x + 2
这样的程序语句从定理的角度来看是完全等价的。重要的是要认识到,在正常的解释中,这些只是抽象定理,而不是关于程序的定理(例如关于它的正确性)。
所以从这里很容易看出很多(也许是大多数)错误根本不会影响相应的定理。例如,如果我们有一个财务程序,我们想从毛利中计算出净利润,那么写NetProfit := GrossProfit * 0.8
可能是正确的。但是我们可能会输入错误并计算税金 NetProfit := GrossProfit * 0.2
。它对类型没有影响,因此对对应关系没有影响。很多很多真正的错误都是这样的:差一错误、溢出错误、误解子程序的行为、数字和字符串错别字...
对于确实会影响对应关系的错误,这取决于它们是否会导致有效的定理。如果它得出一个有效的定理,那么您的程序更有可能编译 运行 而不会崩溃等。但是,这意味着您弄错了其中一种类型,例如,如果您想将 2 个数字放在一起,像 1 和 3 -> 13。但是你忘记将它们转换为字符串,所以你得到的是 1 和 3 -> 4。另一方面,如果它没有得出有效的定理,那么这意味着你可能得到了一些东西严重错误,程序将无法编译,或者陷入死循环,或类似的情况。
总而言之,如果您的程序具有有效的相应定理,那并不能告诉您太多。该程序仍然可能存在错误。另一方面,如果您试图编写一个没有相应定理的程序,那么这就是您可能出错的一个很好的迹象。所以这取决于错误的类型,大多数根本不会出现。