我看到了几个不同的研究小组,至少有一本书谈论了使用Coq设计认证程序。关于认证程序的定义是什么,有共识吗?从我所知道的情况来看,它的真正含义是该程序被证明是完整的并且类型正确。现在,程序的类型可能是一些非常奇特的东西,比如列表中有一个非空的证明,所有元素大于等于5,等等。然而,最终,这是一个认证的程序,只是Coq显示的程序是完整的和类型安全的,所有有趣的问题都归结为最终类型中包含的内容?认证程序的定义
编辑1
基于wjedynak的回答,我看了一下泽维尔·勒罗伊的论文,这在下面的答案链接“现实主义的编译器的形式化验证”。我认为这包含了一些很好的信息,但我认为在这个研究序列中更多的信息可以在Sandrine Blazy和Xavier Leroy的论文Mechanized Semantics for the Clight Subset of the C Language中找到。这是“正式验证”文件增加优化的语言。在其中,Blazy和Leroy展示了Clight语言的语法和语义,然后在第5节中讨论了这些语义的验证。在第5节中,列出了用于验证编译器的不同策略,这在某种意义上提供了概述用于创建认证程序的不同策略。它们是:
- 手册评论
- 证明
- 恪翻译
- 测试可执行语义
- 等价语义的性质与替代语义
在任何情况下,有可能可以添加的点,我当然想知道更多。
回到我原来对于认证程序的定义是什么的问题上,对我来说还是有点不清楚。 Wjedynak提供了一个答案,但实际上Leroy的工作包括在Coq中创建一个编译器,然后在某种意义上证明它。从理论上讲,它现在可以证明C程序的一些事情,因为我们现在可以进行C-> Coq->证明。在这个意义上,好像有这样的工作流程,我们可以
- 在X语言写程序的程序从勒柯克步骤1中或者一些其他证据的辅助工具模型的
- 形式。这可能涉及在Coq中创建编程语言的模型,或者可能涉及直接创建程序模型(即,在Coq中重写程序本身)。
- 证明模型的一些性质。也许这是对价值的证明。也许这是证明声明的等价性(例如3 = 1 + 2或f(x,y)= f(y,x)等等)
- 然后,根据这些证明,将原始程序。
或者,我们可以在证明助手工具中创建一个程序的规范,然后证明规范的属性,但不是程序本身。
无论如何,如果任何人有他们,我仍然有兴趣听取其他定义。
你正在提出一个非常有效的问题。如果你已经证明函数的结果总是奇怪的,这是否意味着这个函数是正确的?我觉得不是。从我所知道的规范没有描述问题的每个方面到最后一点。这意味着只有“某些方面是正确的”才更为正确。有人会反对吗? –