正式验证算法的正确性

时间:2010-01-27 19:01:36

标签: algorithm math proof correctness formal-verification

首先,这是否只适用于没有副作用的算法?

其次,我在哪里可以了解这个过程,任何好书,文章等?

11 个答案:

答案 0 :(得分:7)

COQ是一个产生正确ocaml输出的证明助手。但这很复杂。我从来没有去看过它,但我的同事开始了,然后在两个月后停止使用它。这主要是因为他希望更快地完成任务,但如果你需要验证算法,这可能是一个好主意。

Here is a course使用COQ并谈论证明算法 并且here is a tutorial关于在COQ中撰写学术论文。

答案 1 :(得分:4)

  1. 当没有任何副作用时,验证/证明正确性通常很容易 ,但这不是绝对的要求。
  2. 您可能希望查看一些正式规范语言(如Z)的文档。正式规范本身并不是证据,但通常是一个证据的基础。

答案 2 :(得分:2)

通常,正确性证明对于手头的算法非常具体。

然而,有几个众所周知的技巧被再次使用和重复使用。例如,使用递归算法,您可以使用loop invariants

另一个常见的技巧是将原始问题减少到您的算法的正确性证明更容易显示的问题,然后概括更容易的问题或显示更容易的问题可以转换为原始问题的解决方案。 Here是一种说明。

如果你有一个特定的算法,你可能会更好地询问如何构建该算法的证明而不是一般的答案。

答案 3 :(得分:2)

我认为验证算法的正确性将验证其与规范的一致性。理论计算机科学的一个分支称为Formal Methods,如果您需要尽可能接近证据,可能就是您正在寻找的。来自维基百科,

  

正式方法是一种特殊的方法   基于数学的技术   规范,发展和   验证软件和硬件   系统

您可以从链接的维基百科页面和Formal Methods wiki上的众多链接中找到许多学习资源和工具。

答案 4 :(得分:2)

购买这些书籍:http://www.amazon.com/Science-Programming-Monographs-Computer/dp/0387964800

格里斯的书,科学编程是很棒的东西。耐心,彻底,完整。

答案 5 :(得分:1)

Huth和Ryan撰写的“计算机科学逻辑”给出了用于验证系统的现代系统的可读性概述。曾几何时人们谈论证明程序是正确的 - 编程语言可能有也可能没有副作用。我从本书和其他地方得到的印象是,真正的应用程序是不同的 - 例如证明协议是正确的,或者芯片的浮点单元可以正确划分,或者用于操作链表的无锁例程是正确的。

ACM Computing Surveys Vol 41 Issue 4(2009年10月)是一个关于软件验证的特殊问题。通过搜索“形式方法:实践和经验”,您可以在没有ACM帐户的情况下查看至少一篇论文。

答案 6 :(得分:1)

Elazar在评论中建议演示视频的工具Frama-C为您提供了一种规范语言ACSL,用于编写函数契约和各种分析器,用于验证C函数是否满足其合同和安全属性,例如没有运行时错误。

扩展教程ACSL by example显示了指定和验证的实际C算法的示例,并将无副作用的函数与有效函数分开(无副作用的函数被认为更容易并且来了首先在教程中)。该文档也很有趣,因为它不是由它描述的工具的设计者编写的,所以它给出了更新鲜,更具说服力的外观。

答案 7 :(得分:1)

如果您熟悉LISP,那么您一定要查看ACL2:http://www.cs.utexas.edu/~moore/acl2/acl2-doc.html

答案 8 :(得分:1)

Dijkstra的编程学科和他的EWD为正式验证作为编程科学奠定了基础。一个更简单的工作是Wirth的系统编程,它从使用验证的简单方法开始。 Wirth使用pre-ISO Pascal语言; Dijkstra使用类似Algol-68的形式主义,称为Guarded(GCL)。自Dijkstra和Hoare以来,正式验证已经成熟,但这些较旧的文本可能仍然是一个很好的起点。

答案 9 :(得分:0)

斯坦福大学开发的PVS工具是一个规范和验证系统。我对它进行了研究,发现它对于Theoram Proving非常有用。

答案 10 :(得分:0)

WRT(1),您可能必须以“捕获"”的方式创建算法模型。算法在程序变量中的副作用,旨在模拟这种基于状态的副作用。