认证计划的定义

时间:2014-01-23 21:54:01

标签: coq isabelle agda idris

我看到了几个不同的研究小组,至少有一本关于使用Coq设计认证程序的书。是否就认证计划的定义达成了共识?从我所知道的,它真正意味着该程序被证明是完整的并且类型正确。现在,程序的类型可能是非常奇特的东西,例如列表,其中包含非空的证明,排序,所有元素> = 5等等。但是,最终,是一个经过认证的程序,Coq显示的是总计和类型安全,所有有趣的问题归结为最终类型中包含的内容?


编辑1

根据wjedynak的回答,我看了Xavier Leroy的论文“现实编译器的形式验证”,它在下面的答案中有所联系。我认为这包含了一些很好的信息,但我认为这一系列研究中提供的信息更多的信息可以在Sandrine Blazy和Xavier Leroy的论文Mechanized Semantics for the Clight Subset of the C Language中找到。这是“形式验证”论文添加优化的语言。在其中,Blazy和Leroy介绍了Clight语言的语法和语义,然后在第5节讨论了这些语义的验证。在第5节中,列出了用于验证编译器的不同策略,这在某种意义上提供了概述创建认证计划的不同策略这些是:

  1. 手动评论
  2. 证明语义的属性
  3. 已验证的翻译
  4. 测试可执行语义
  5. 与备用语义的等效性
  6. 在任何情况下,都有可能添加点,我当然希望听到更多。

    回到我关于认证程序定义的原始问题,对我来说仍然有点不清楚。 Wjedynak提供了一个答案,但Leroy的工作实际上涉及在Coq中创建编译器,然后在某种意义上证明它。理论上,它现在可以证明有关C程序的事情,因为我们现在可以进行C-> Coq->证明。从这个意义上说,似乎有这样的工作流程,我们可以

    1. 用X语言编写程序
    2. Coq中的步骤1中的程序模型的形式或其他一些证明助手工具。这可能涉及在Coq中创建编程语言模型,或者可能涉及直接创建程序模型(即在Coq中重写程序本身)。
    3. 证明有关模型的一些属性。也许这是关于价值观的证明。也许它是语句等价性的证明(例如3 = 1 + 2或f(x,y)= f(y,x)等等。)
    4. 然后,根据这些证明,将原始程序称为认证。
    5. 或者,我们可以在校对助手工具中创建程序规范,然后证明规范的属性,而不是程序本身。

      无论如何,如果有人有这些定义,我仍然有兴趣听取替代定义。

5 个答案:

答案 0 :(得分:6)

我同意这个概念看起来很模糊,但据我所知,认证程序是一个程序,配备正确的证据。现在,通过使用丰富且富有表现力的类型签名,您可以实现它,因此不需要单独的证明,但这通常只是为了方便。真正的问题是我们所说的正确性:这是一个规范问题。你可以看看例如Xavier Leroy。 Formal verification of a realistic compiler

答案 1 :(得分:5)

首先请注意,“认证”一词略有法语偏见:在其他地方经常使用“已验证”或“已证实”的表达。

无论如何,要问这实际意味着什么是很重要的。 X.Leroy和CompCert是一个非常好的起点:它是一个关于C编译器验证的大项目,而Leroy总是热衷于向他的听众解释为什么验证很重要。特别是在与“认证机构”的人交谈时,他们通常意味着测试,而不是证明。

另一个使用Isabelle / HOL的大型验证项目是L4.verifiedexposition的这一部分解释了实际陈述和证明的内容,以及后果。不幸的是,实际的证据是绝密的,因此无法公开检查。

答案 2 :(得分:2)

认证程序是与程序满足其规范的证明(即证书)配对的程序。关键是存在一个证明对象,可以独立于产生证明的工具进行检查。

已验证的程序已经过验证,在此上下文中通常可能意味着其规范已在Coq等系统中正式化并证明正确,但证明不一定经过外部工具认证。

这种区别在科学文献中得到了很好的证明,并不是法语国家特有的。 Xavier Leroy在A formally verified compiler back-end的第2.2节中非常清楚地描述了这一点。

答案 3 :(得分:1)

我的理解是"认证"在这个意义上,as Makarius pointed out是法语国家选择的英语单词,母语使用者可能会使用"正式验证"。 Coq是在法国开发的,有很多法语国家的开发者和用户。

关于什么"正式验证"意味着维基百科notes(许可证:CC BY-SA 3.0)它:

  

是使用正式的数学方法证明......系统所针对的某些正式规范或属性的预期算法的正确性。

(我知道你想要一个比这个更精确的定义。我希望将来更新这个答案,如果我找到的话。)

Wikipedia特别注意验证验证之间的区别:

  
      
  • 验证:"我们是否正在努力做出正确的事情?",即是根据用户的实际需求指定的产品?
  •   
  • 验证:"我们制作了我们想要制作的产品吗?",即产品是否符合规格?
  •   

landmark论文seL4: Formal Verification of an OS Kernel(Klein等,2009)证实了这种解释:

  一个愤世嫉俗者可能会说实施证明只显示了   实现与规范完全相同的错误   包含的内容。这是事实:证明不保证   规范描述了用户期望的行为。该   差异[在经过验证的方法中与未经验证的方法相比]   是抽象的程度和缺乏整类错误。

那些类别的错误是什么? Agda教程gives some idea

  
      
  • 没有运行时错误(处理I / O错误等不可避免的错误;其他错误被设计排除)。
  •   
  • 没有非生产性的无限循环。
  •   

答案 4 :(得分:0)

这可能意味着没有运行时错误(数字溢出,无效引用......),这与大多数开发的软件相比已经很好了,但仍然很弱。根据域形式化证明其他含义是正确的;也就是说,它不仅必须正式摆脱运行时错误,还必须证明它可以做它预期要做的事情(必须已经精确定义)。