我可以重播Z3中的证明吗?

时间:2018-04-17 09:28:52

标签: z3

是否可以让Z3序列化为某些断言提供证据,并在以后的调用中重放证明而不是再次运行证明搜索?我知道Z3可以输出unsat的反例,但是它能为sat的模型提供证明吗?

1 个答案:

答案 0 :(得分:2)

术语说明:Z3(以及一般的SAT / SMT求解器)输出sat的模型和unsat的证明。

证明生成实际上是SMT-Lib功能。请参阅http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf

的第56页

Z3确实支持它,这是最简单的例子:

(set-option :produce-proofs true)
(declare-fun a () Bool)
(assert (= a (not a)))
(check-sat)
(get-proof)

Z3说:

unsat
((proof
(mp (asserted (= a (not a))) (rewrite (= (= a (not a)) false)) false)))

格式是特定于解算器的。 SMTLib文件说:

  

(get-proof)要求求解器提供不可满足性证明   当前上下文中所有公式的集合。该命令可以发出   仅当最近的检查命令具有一组空假设时。   解算器通过在常规上打印反驳证据来做出响应   输出通道。证明的格式是特定于求解器的。该   唯一的要求是,像所有回复一样,它是一个成员   s_expr。

据我所知,没有"公众"切换告诉Z3回读这个证据并用它做任何事情。但是,我不会惊讶于他们可能有内部工具来消耗这个输出。

重播定理证明器

Isabelle定理证明者可以回读Z3的证明并在内部重放它们以构建相应的证明。这可能更接近您的要求。这是一篇描述这项工作的论文:http://www21.in.tum.de/~boehmes/proofrec.pdf当然,支持哪些逻辑以及是否主动维护连接是一个不同的问题!你可能会发现"相关的工作"该文章的部分非常有用。