是否可以让Z3序列化为某些断言提供证据,并在以后的调用中重放证明而不是再次运行证明搜索?我知道Z3可以输出unsat
的反例,但是它能为sat
的模型提供证明吗?
答案 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当然,支持哪些逻辑以及是否主动维护连接是一个不同的问题!你可能会发现"相关的工作"该文章的部分非常有用。