我正在尝试将正式软件验证状态的一般图片拼凑在一起,我有一个很好的麻烦。对于上下文,我来自大多数数学背景。我非常熟悉自动定理普通普通助理和证据助理的国家,以证明其良好形成的数学陈述(例如,在COQ,Isabelle,瘦等)。我遇到麻烦的理解是在实际CS应用中的“正式方法”发生的事情。

我发现,如微软和AWS等公司在他们的软件开发中使用了TLA +作为“正式方法”。但是,当我开始阅读Wayne的实用的TLA + 书时,我发现他考虑了一个正式检查的程序,如果我们只是在长度 $ ,带有1和 $ n $ 的条目,对于某些固定的 $ n $ ,即我们刚刚在许多情况下检查,因此该算法应该一般工作。这似乎看起来特别有趣;只是一个特别严格的单元测试的一个例子。值得注意的是,它不是正式的正确证明。

另一方面,我看到了关于Isabelle和Coq的杂音,可以像他们可以证明数学定理一样证明关于软件的东西。虽然当我看待似乎承诺的书时,但例如, Chlipala的通过依赖类型认证编程,我看到了很多抽象的东西似乎毫无疑问地与正式验证程序有关,但没有以广泛使用的语言编写的真实程序(例如C ++的实际程序的例子,python,java等)甚至只是伪码和“验证它”,无论是这意味着什么。

有人可以试图清除我的混乱吗?

有帮助吗?

解决方案

验证的程序是一种正式证明的程序,无论它在哪种语言中。只是因为程序是用COQ编写的,也许是提取到OCAML或Haskell,而不是用更多的”Enternicisy“语言,如C ++或Java,不会使其成为任何程序。

普通目的编程语言编写的程序,甚至像haskell这样的“驯服”,很难,因为这些语言通常包括大量便利功能,性能的黑色角落和与操作系统接口,而且很丰富图书馆。要证明程序的属性,您首先需要陈述这个属性,并且该声明嵌入了程序所写的语言的语义。当您尝试正式确定最初设计的语言而没有正式的语义(几乎所有这些),你很快击中了英文描述叶未指明的黑暗角落,或者在哪里暧昧,或者在哪里是彻头彻尾的自我矛盾,或者参考实施没有做描述所说的,这被认为是一个错误英语而不是实施。以预先存在的语言编写的程序的证明属性的最新状态是将程序限制到语言的子集。

中的哪个子集是高度变量。句法糖不是太难:语义只需要将其转化为更简单的构造。反射属性对于模型并不特别困难,但可以使模型更难以理解(例如,它使得诸如“这种代码片段的属性使得该代码没有任何方式引用此变量,因此不能更改其值“),这么多框架规则统治。与操作系统的交互(通常通过库)是有问题的,因为它们需要建模操作系统,这是非常复杂的。浮点操作很难,因为跟踪连续操作的近似导致巨大的爆炸。

f for c,具有正式模型的主要大型子集是compcert c, compcert的语言。 Compcert是一个正式验证的编译器(用COQ编写),所以如果您证明了C程序的属性,您还可以另外获得生成的机器代码的证明。 compcert c 是一个非常大的c99子集,但形式化不包括大部分标准图书馆和一些语言的怪癖。

证明以(合适的A)真实的编程语言编写的程序,程序需要以这样的方式构造,以便使验证易丢失。在实践中,这意味着在更高级别的语言(没有实际硬件上的实施)并使用该更高级别的语言作为最终程序的规范来编写和证明该程序。经常在可执行程序和规范之间存在多个级别的连续改进。

这是相当普遍的,最终计划不是手动写成的,而是从更高级别的语言机械地提取。例如,编写COQ,其被提取到OCAML,或写入 f * ,其被提取到C.但是相反的方法也是可能的,例如写入(“驯服”)C,用函数和其他代码细分的属性来注释它,并使用 Frama-C 证明这些属性(以及C程序没有未定义行为的隐含属性)。

当您有编程语言的正式语义和表达程序属性的方法时,证明这些属性是数学定理。通常,这些定理不涉及任何复杂的数学,如微积分(除非应用域中引入,例如跟踪物理对象的移动),但它们难以证明,因为涉及非常大的公式,并且包含算术语句( $ x ^ n + y ^ n= z ^ n $ 不是复杂的方程,但解决它不是基本的!)。它是无法编写一个可以证明所有程序的非琐碎语义属性的程序,实际上不可能编写一个可以证明典型计划的许多有趣属性的程序。正式验证涉及将问题分为足够小的步骤(写入小功能并向这些功能的足够精确属性表示,具有刀具自动证明一些这些属性(例如

作为一个 sat solver 对于命题逻辑),并且具有人员在计算机上写下证明做到这一点(但是电脑将检查人类的证据)。证明助手如COQ和Isabelle进来了这个最后一步。

正式证明真实世界的计划是一种巨大的努力,需要比典型的软件项目更大的时间和专业知识。它很少在高保证环境之外完成,主要是具有高安全性的环境,如运输(飞机,火车,不那么多车),有时是具有高空间或(非常很少)的高成本的环境,如智能的高安全性要求卡。

如果我们只是在长度

除非该计划限制其输入,否则不会是正式证明。我不知道这本书,但我怀疑你要么误读了什么。正式检查排序程序将涉及证明其所有n的正确性。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top