为什么在举证代码中需要举证检查器


9

在Necula的经典PLDI'98论文“认证编译器的设计和实现”中,高级验证程序使用:

  1. VCGen生成验证条件(安全谓词)
  2. 一阶逻辑定理证明者证明条件
  3. LF打样检查器检查步骤(2)中的打样

我对步骤(3)感到有些困惑。为什么根本需要它?仅(1)和(2)是否足够?我们为什么不仅仅相信定理证明者生成的证明呢?

Answers:


19

证明检查器的目的是使可信计算基础最小化。

通过具有证明检查器,编译器和定理证明器都不需要正确。本文在第3页上指出了这一点:

Neither the compiler nor the prover need to be correct in order to be guaranteed to   
detect incorrect compiler output. This is a significant advantage since the VCGen and  
the  proof checker are significantly simpler than the compiler and the prover.

证明检查器仅是几行代码,并且可以手动检查其正确性。相反,表现良好的自动化证明者极其复杂,不太可能正确,尽管经过了充分测试和广泛使用的证明者,这些错误将出现在可能不容易触发的极端情况下。看看组成Lingeling的30k LOC C代码,这是一个先进的SAT求解器,以了解自动定理证明有多复杂。没有证明检查器,您将必须证明该定理证明器正确无误。这超出了我们在2015年在经济上可以做的事情。


我很惊讶ATP构造的证据可能有错误。(我认为ATP可能是不完整的,但不是健全/笨拙的)。我很高兴知道ATP产生的证明中是否存在昂贵错误的已知实例。
2015年

3
@Ram在任何严肃的自动定理证明者的历史中,都有成千上万个微小的缺陷。参见例如stackoverflow.com/questions/12281085/…或github上任何此类工具的修订历史。
科迪

@Ram除了Cody的出色建议之外,我建议您从经验中学习:写一些ATP,例如基本的SAT求解器。这可以用几行代码来完成。然后尝试通过添加例如子句学习,监视文字或有趣的变量选择试探法来使其表现良好。然后考虑一下经验……
Martin Berger 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.