Math 为什么可以';程序不能被证明吗?

Math 为什么可以';程序不能被证明吗?,math,theory,proof,axiom,formal-verification,Math,Theory,Proof,Axiom,Formal Verification,为什么计算机程序不能像数学陈述一样被证明?数学证明是建立在其他证明的基础上的,这些证明是建立在更多的证明和公理之上的——这些我们认为是不言而喻的真理 计算机程序似乎没有这样的结构。如果你写了一个计算机程序,你怎么能把以前的作品拿出来,用它们来展示你程序的真实性呢?你不能,因为根本不存在。此外,编程的公理是什么?这个领域的原子真理 对于上述问题,我没有很好的答案。但软件似乎无法被证明,因为它是艺术而不是科学。你如何证明自己是毕加索 尽管如此……这有什么意义?你想证明什么简单化的“真理”?你想从这些

为什么计算机程序不能像数学陈述一样被证明?数学证明是建立在其他证明的基础上的,这些证明是建立在更多的证明和公理之上的——这些我们认为是不言而喻的真理

计算机程序似乎没有这样的结构。如果你写了一个计算机程序,你怎么能把以前的作品拿出来,用它们来展示你程序的真实性呢?你不能,因为根本不存在。此外,编程的公理是什么?这个领域的原子真理


对于上述问题,我没有很好的答案。但软件似乎无法被证明,因为它是艺术而不是科学。你如何证明自己是毕加索

尽管如此……这有什么意义?你想证明什么简单化的“真理”?你想从这些真理中得到什么?虽然我可以接受这些话……实用性在哪里?

这方面有很多研究。。正如其他人所说,程序语言中的结构是复杂的,当试图验证或证明任何给定的输入时,这只会变得更糟

然而,许多语言都允许规范、哪些输入是可接受的(先决条件),还允许指定最终结果(后决条件)

这些语言包括:B、事件B、Ada、fortran

当然,有很多工具是用来帮助我们证明程序的某些属性的。例如,为了证明死锁自由,可以通过SPIN来处理程序

还有许多工具也可以帮助我们检测逻辑错误。这可以通过静态分析(goanna、satabs)或实际执行代码(gnu-valgrind?)来实现

然而,并没有一种工具能够真正让人证明一个完整的程序,从开始(规范)、实现到部署。B方法很接近,但是它的实现检查非常弱。(它假设人类在将特殊性转化为具体实施过程中是不可磨灭的)



作为旁注,当使用B方法时,您经常会发现自己从较小的公理构建复杂的证明。(这同样适用于其他呼气假设定理证明者)。

请阅读(这是关于证明程序是否完成这样简单的事情的困难)。从根本上讲,这个问题与哥德尔的不完全性定理有关。

程序的某些部分是可以证明的。例如,如果编译成功,C#编译器将静态验证并保证类型安全。 但我怀疑你问题的核心是证明一个程序正确运行。许多(我不敢说大多数)算法可以被证明是正确的,但由于以下原因,整个程序可能无法静态证明:

  • 验证需要遍历所有可能的分支(调用、ifs和中断),这在高级程序代码中具有超立方时间复杂性(因此它永远不会在合理的时间内完成)
  • 某些编程技术,无论是通过制作组件还是使用反射,都无法静态预测代码的执行(即,您不知道其他程序员将如何使用您的库,并且编译器很难预测使用者中的反射将如何调用功能)
那些只是一些

此外,编程的公理是什么?这个领域的原子真理是什么

操作码是“原子真理”吗?例如,在看到

mov ax,1
…难道一个程序员不可以不假思索地断言,除非出现硬件问题,否则在执行此语句后,CPU的
ax
寄存器现在将包含
1

如果你写了一个计算机程序,你怎么能把以前的作品拿出来,用它们来展示你程序的真实性呢

“以前的工作”可能是新程序运行的运行时环境

新的程序可以被证明:除了正式的证明外,还可以通过“检查”和各种形式的“测试”(包括“验收测试”)来证明

你如何证明自己是毕加索


如果软件更像工业设计或工程而不是艺术,那么更好的问题可能是“你如何证明桥梁或飞机?”

如果程序有明确的目标和初始假设(忽略Godel…),它可以被证明。找到6个证明程序的所有素数x

项目的管理是一个巨大的研究领域


许多复杂的程序已经过验证;例如,请参见此。

如果您真的对本主题感兴趣,请允许我首先推荐David Gries的《编程科学》,这是一本关于本主题的经典入门著作

实际上,在某种程度上可以证明程序是正确的。您可以编写前置条件和后置条件,然后证明给定满足前置条件的状态,执行后的结果状态将满足后置条件

然而,最棘手的是循环。对于这些循环,你还需要找到一个循环不变量,并且为了显示正确的终止,你需要在每个循环后剩余的最大可能迭代次数上找到一个上界函数。你还必须能够显示,在每个循环后,这至少会减少一次e环


一旦你对一个程序有了所有这些,证明是机械的。但不幸的是,没有办法自动导出循环的不变函数和有界函数。人类的直觉足以满足小循环的琐碎情况,但实际上,复杂的程序很快变得难以处理。

停止问题只表明有p无法验证的程序。一个更有趣、更实用的问题是什么类程序可以被正式验证。也许每个人都关心