我可以用Z3重放一个证据吗?

我可以用Z3重放一个证据吗?,z3,Z3,有没有可能让Z3序列化某个断言的证明,并在以后的调用中重播该证明,而不是再次运行证明搜索?我知道Z3可以输出unsat的反例,但它能为sat的模型提供证据吗 术语注释:Z3(以及通常的SAT/SMT解算器)用于SAT的输出模型,以及unsat的证明 证明生成实际上是SMT库的一个特性。见第56页,共页 Z3确实支持它,下面是最简单的例子: (set-option :produce-proofs true) (declare-fun a () Bool) (assert (= a (not a))

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

术语注释:Z3(以及通常的SAT/SMT解算器)用于
SAT
的输出模型,以及
unsat
的证明

证明生成实际上是SMT库的一个特性。见第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文件说:

(获取证明)要求解算器提供不可满足性的证明 当前上下文中所有公式的集合。可以发出命令 仅当最近的check命令有一组空的假设时。 解算器通过在其正则表达式上打印反驳证明进行响应 输出通道。证明的格式是特定于解算器的。这个 唯一的要求是,像所有的回复一样,它必须是 s_expr

据我所知,没有“公共”开关来告诉Z3读回这张校样并用它做任何事情。然而,他们可能有内部工具来使用这些输出,这并不奇怪

定理证明器中的重放 Isabelle定理证明者可以读回Z3的证明,并在内部重放它们以构造相应的证明。这可能更接近你所要寻找的。这里有一篇文章描述了这项工作:当然,确切地说,支持哪些逻辑以及是否积极维护连接是另一个问题!你可能会发现那篇文章的“相关工作”部分很有帮助