有人试过用Z3本身证明Z3吗?

有人试过用Z3本身证明Z3吗?,z3,theorem-proving,theorem,Z3,Theorem Proving,Theorem,有人试过用Z3本身证明吗 甚至有可能用Z3证明Z3是正确的吗 从理论上讲,是否有可能用X本身来证明工具X是正确的?简短的回答是:“没有,没有人试图用Z3本身来证明Z3”:-) “我们证明了程序X是正确的”这句话很容易引起误解。 主要问题是:正确意味着什么。 在Z3的情况下,可以说Z3是正确的,至少对于不可满足的问题,它从不返回“sat”,对于可满足的问题,它从不返回“unsat”。 此定义可以通过包括其他属性来改进,例如:Z3不应崩溃;Z3API中的函数X具有属性Y等 在我们同意我们应该证明什么

有人试过用Z3本身证明吗

甚至有可能用Z3证明Z3是正确的吗


从理论上讲,是否有可能用X本身来证明工具X是正确的?

简短的回答是:“没有,没有人试图用Z3本身来证明Z3”:-)

“我们证明了程序X是正确的”这句话很容易引起误解。 主要问题是:正确意味着什么。 在Z3的情况下,可以说Z3是正确的,至少对于不可满足的问题,它从不返回“sat”,对于可满足的问题,它从不返回“unsat”。 此定义可以通过包括其他属性来改进,例如:Z3不应崩溃;Z3API中的函数X具有属性Y等

在我们同意我们应该证明什么之后,我们必须创建运行时模型、编程语言语义(在Z3的情况下是C++等)。 然后,使用一个工具(也称为验证器)将实际代码转换为一组公式,我们应该使用定理证明器(如Z3)检查这些公式。 我们需要验证器,因为Z3不理解C++。 验证C编译器()就是这种工具的一个例子。 注意,使用这种方法证明Z3是正确的并不能提供Z3确实正确的明确保证,因为我们的模型可能不正确,验证器可能不正确,Z3可能不正确,等等

要使用诸如VCC之类的验证器,我们需要用我们想要验证的属性、循环不变量等对程序进行注释。一些注释用于指定代码片段应该做什么。其他注释用于“帮助/指导”定理证明者。在某些情况下,注释的数量大于正在验证的程序。因此,这个过程不是完全自动的

另一个问题是成本,这个过程会非常昂贵。这将比实现Z3耗费更多的时间。 Z3有300k行代码,其中一些代码基于非常微妙的算法和实现技巧。 另一个问题是维护,我们定期添加新功能并提高性能。这些修改将影响证据

尽管成本可能非常高,但VCC已被用于验证诸如Microsoft Hyper-V虚拟机监控程序之类的重要代码片段

理论上,编程语言X的任何验证器如果也在语言X中实现,都可以用来证明自己。 验证器就是这种工具的一个例子。 Spec#在Spec#中实现,Spec#的几个部分使用Spec#进行了验证。 请注意,Spec#使用Z3并假设它是正确的。当然,这是一个很大的假设

有关这些问题和Z3应用程序的更多信息,请参阅:

不,不可能用工具本身来证明一个非平凡的工具是正确的。这基本上是在:

对于任何形式有效生成的理论T,包括基本的算术真理和关于形式可证明性的某些真理,如果T包含其自身一致性的陈述,则T是不一致的

由于Z3包含算术,它无法证明自己的一致性

因为上面的评论中提到了这一点:即使用户提供了不变量,哥德尔定理仍然适用。这不是可计算性的问题。该定理表明,在一致系统中不可能存在这样的证明

但是,您可以使用Z3验证Z3的部分

5年后编辑

实际上,这个论证比哥德尔的不完全性定理更容易

假设Z3是正确的,如果它只返回不可满足公式的UNSAT

假设我们找到一个公式a,如果a是不可满足的,那么Z3是正确的(我们已经证明了这个关系)

我们可以给Z3这个公式,但是

  • 如果Z3返回UNSAT,可能是因为Z3是正确的,也可能是因为Z3中存在错误。所以我们没有核实任何事情
  • 如果Z3返回SAT和一个反模型,我们可以通过分析模型在Z3中找到一个bug
  • 否则我们什么都不知道

  • 因此,我们可以使用Z3来发现Z3中的错误,并提高对Z3的信心(达到极高的水平),但不能正式验证它。

    以后,请提供更多问题信息,以便人们能够理解您所说的内容。一方面,我知道你在问那些已经知道Z3的人,但是因为那些不知道Z3是什么的人会把这个问题标记为“什么是我甚至都不知道…”,那么你必须确保人们知道你在说什么,在这种情况下,至少要提供一个到该工具的链接,我不完全确定这个问题是否属于这里,我想也许是一个更合适的地方,但我会等着看社区怎么说。@Lasse更像。戈德尔启发我的猜测是,任何强大到足以引起兴趣的系统都无法证明自己的存在correctness@AakashM正如莱昂纳多·德莫拉在他的回答“证明Z3”中所概述的那样这意味着人类将提供不变量,然后参与验证条件的计算,其有效性将由Z3检查。虽然Z3是一个自动验证程序,但从某种意义上说,它只是检查不变量的选择,而不是自己进行验证。因此,这里绝对不存在戈德尔式的悖论。我们不应该把Z3与它实现的逻辑系统混淆:一阶逻辑+理论(如算术)。问题不在于我们能否证明这个逻辑系统的一致性,而在于Z3是否正确。这是两件不同的事情。如果Z3没有为一组可满足的断言返回
    unsat
    ,我们可以说Z3是正确的。另一点是Z3不支持不变量,不变量被发送到一个软件验证工具,该工具通常实现一个更强的逻辑系统。你如何证明Z3是一致的,而不显示其逻辑是一致的