Algorithm 形式化验证算法的正确性

Algorithm 形式化验证算法的正确性,algorithm,math,proof,correctness,formal-verification,Algorithm,Math,Proof,Correctness,Formal Verification,首先,这是否只适用于没有副作用的算法 第二,我在哪里可以了解这个过程,有什么好书、文章等吗?通常正确性的证明是针对手头的算法的 然而,有几个众所周知的技巧被反复使用。例如,您可以使用递归算法 另一个常见的技巧是将原始问题简化为更容易显示算法正确性证明的问题,然后将更容易的问题推广或显示更容易的问题可以转化为原始问题的解决方案。这是一个描述 如果你脑子里有一个特定的算法,你可以更好地询问如何构造该算法的证明,而不是一般的答案 是产生正确ocaml输出的证明助手。不过这很复杂。我从未抽出时间去看它,

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


第二,我在哪里可以了解这个过程,有什么好书、文章等吗?

通常正确性的证明是针对手头的算法的

然而,有几个众所周知的技巧被反复使用。例如,您可以使用递归算法

另一个常见的技巧是将原始问题简化为更容易显示算法正确性证明的问题,然后将更容易的问题推广或显示更容易的问题可以转化为原始问题的解决方案。这是一个描述

如果你脑子里有一个特定的算法,你可以更好地询问如何构造该算法的证明,而不是一般的答案

是产生正确ocaml输出的证明助手。不过这很复杂。我从未抽出时间去看它,但我的同事开始使用它,两个月后又停止使用。这主要是因为他想更快地完成任务,但如果你需要验证算法,这可能是个好主意

使用COQ并讨论证明算法。

关于用COQ写学术论文。

我认为验证算法的正确性就是验证它是否符合规范。理论计算机科学中有一个分支叫做,如果你需要尽可能接近证据,这可能就是你所寻找的。来自维基百科

形式化方法是一种特殊的方法 以数学为基础的技术 规范、开发与应用 软件和硬件的验证 系统

您可以从链接的Wikipedia页面上的大量链接以及从中找到许多学习资源和工具。

购买以下书籍:

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

  • 在没有副作用的情况下,验证/证明正确性通常要容易得多,但这不是绝对的要求
  • 您可能希望查看一些正式规范语言的文档,如。形式规范本身不是证明,但通常是证明的基础

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

    ACM计算调查第41卷第4期(2009年10月)是关于软件验证的特刊。通过搜索“正式方法:实践和体验”,您似乎可以在没有ACM帐户的情况下找到至少一篇论文。

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


    这是一个扩展教程,展示了实际C算法的指定和验证示例,并将无副作用的函数与有效函数分开(无副作用的函数被认为更容易,并且在教程中是第一个)。本文档也很有趣,因为它不是由它所描述的工具的设计者编写的,因此,如果你熟悉LISP,那么你应该明确地检查ACL2:

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

    PVS工具由Stanford guys开发,是一个规范和验证系统。我对它进行了研究,发现它对我的证明非常有用

    WRT(1),您可能必须创建一个算法模型,以在一个程序变量中“捕获”算法的副作用,该程序变量旨在对这种基于状态的副作用进行建模。

    我不确定您关于副作用的意思。请看:看看哪个有一些好的答案。这是一个非常实用的程序,可以进行验证(w/其他工具)是frama-c,观看视频演示“正式方法”包含您引用的所有目标。我在“证明程序正确”的子领域,我必须承认,到目前为止,大的工业成功来自其他子领域(只需等到明年!)。像FMWEEK这样的会议有些令人费解,因为它聚集了具有所有这些不同方法和目标的人,但我们确实有很多共同点和需要交流的地方。如果您喜欢Z,请相信您会找到工具,在编写正式正确算法的过程中将其纳入:算法简化(特别是在您提供的链接中描述的)是一种理论工具,用于证明一个问题至少和另一个问题一样难。这些证明通常在图灵机器计算模型中完成,是手波状的事情,与正式的(机器可检查的)证明完全不同。它们通常用于解决难以在实践中有用的问题(你链接中的例子是关于停顿问题;通过将已知的NP难问题简化为NP难问题来说明问题是NP难问题也很流行)