我看到几个不同的研究小组,以及至少一本书,都在谈论使用 Coq 来设计认证程序。对于认证项目的定义是否有共识?据我所知,它真正的意思是程序被证明是完全的并且类型正确。现在,程序的类型可能是非常奇特的东西,例如证明它是非空的、已排序的、所有元素 >= 5 等的列表。但是,最终,它是一个经过认证的程序,只有 Coq 显示的是完全的和类型安全的,所有有趣的问题都归结为最终类型中包含的内容?
编辑 1
根据 wjedynak 的回答,我查看了 Xavier Leroy 的论文“Formal Verification of a Realistic Compiler”,该论文链接在下面的答案中。我认为这包含了一些很好的信息,但我认为可以在Sandrine Blazy 和 Xavier Leroy的论文Mechanized Semantics for the C 语言的 Clight 子集中找到更多信息。这是“形式验证”论文添加优化的语言。在其中,Blazy 和 Leroy 介绍了 Clight 语言的语法和语义,然后在第 5 节讨论这些语义的验证。在第 5 节中,列出了用于验证编译器的不同策略,. 这些是:
- 人工审核
- 证明语义的性质
- 已验证的翻译
- 测试可执行语义
- 与替代语义等价
无论如何,可能有几点可以补充,我当然想了解更多。
回到我最初的问题,即认证程序的定义是什么,我仍然有点不清楚。Wjedynak 提供了一个答案,但实际上 Leroy 的工作涉及在 Coq 中创建一个编译器,然后在某种意义上对其进行验证。理论上,现在证明关于 C 程序的事情成为可能,因为我们现在可以进行 C->Coq->proof。从这个意义上说,似乎有这个工作流程我们可以
- 用X语言编写程序
- Coq 或其他证明辅助工具中步骤 1 中程序模型的形式。这可能涉及在 Coq 中创建编程语言模型,也可能涉及直接创建程序模型(即在 Coq 中重写程序本身)。
- 证明模型的一些性质。也许这是对价值观的证明。也许这是陈述等价性的证明(诸如 3=1+2 或 f(x,y)=f(y,x) 之类的东西。)
- 然后,根据这些证明,调用认证的原始程序。
或者,我们可以在证明辅助工具中创建程序的规范,然后证明关于该规范的属性,而不是程序本身。
无论如何,如果有人有替代定义,我仍然有兴趣听到它们。