Z3证明中的命名断言

Z3证明中的命名断言,z3,Z3,是否可以在Z3(版本4.8.9)证明中获得断言名称? 作为一个简单的例子: (set-option :produce-proofs true) (assert (! false :named name)) (check-sat) (get-proof) 我希望得到以下输出: unsat ((proof (asserted name))) 但是,这是实际输出: unsat ((proof (asserted false))) 有可能让证据引用断言名称而不是实际公式吗 通过实验,我发现可以添加

是否可以在Z3(版本4.8.9)证明中获得断言名称? 作为一个简单的例子:

(set-option :produce-proofs true)
(assert (! false :named name))
(check-sat)
(get-proof)
我希望得到以下输出:

unsat
((proof (asserted name)))
但是,这是实际输出:

unsat
((proof (asserted false)))
有可能让证据引用断言名称而不是实际公式吗

通过实验,我发现可以添加
(设置选项:unsat core true)
。 然而,这使得证明更加复杂。设置选项后,输出为:

unsat
((proof
(let (($x27 (not name)))
(let ((@x30 (mp (asserted (=> name false)) (rewrite (= (=> name false) $x27)) $x27)))
(unit-resolution @x30 (asserted name) false)))))
此外,我不确定是否允许同时启用证明和unsat核心生成,在NikolajBjorner州:

Z3实际上不支持同时生成验证和核心


这是极不可能的。名称几乎只在unsat核心生成中使用。z3中的证明对象或多或少仍是一个黑匣子。然而,如果您仅将自己限制为位向量,那么它可能会工作得更好。见:


本文在这方面也非常相关:。简言之,BV解算器通常将问题简化为命题推理,因此可以通过外部工具轻松检查的解析式证明更容易构建。但对于其他逻辑,尤其是当涉及量词时,证明步骤可能相当不透明,重放将更加困难。

更复杂的证明字面上只包含名称绑定;它引入了一个名为“name”的布尔变量,并使其暗示约束。请注意,在实践中,非SAT核心不一定总是可重放的,例如,当电子匹配性能取决于断言中不影响可满足性的子项时。谢谢您的回答。我知道证据没有很好的记录。这就是为什么我希望得到一些明确的答案。对于我的项目来说,将自己限制为位向量是不可能的:我尝试将证明搜索从关键工具外包到Z3,然后应用一些重播技术在工具内部获得完整的证明。然而,证明粒度不是问题:在重放Z3证明的过程中,对于诸如
重写
引理
之类的粗略(但是局部)步骤,我可以直接在键中搜索证明。问题在于重播断言的规则,因为断言可能会被重写。