得到一个;“好”;带z3(逻辑QF_BV)的unsat核心

得到一个;“好”;带z3(逻辑QF_BV)的unsat核心,z3,Z3,我正在使用Z3 SMT解算器来解决我用逻辑QF_BV表示的问题,使用SMTLIB 2语言 模型不可满足,我正试图让解算器生成一个不可满足的核心 我的模型由几个“强制”约束组成,我使用assert语句指定这些约束 我希望在生成unsat核心时考虑的断言是使用(assert(!(EXPR):named NAME))构造指定的 Z3给了我一个unsat,正如预期的那样。然而,Z3似乎总是转储一个由所有命名断言组成的“普通”unsat核心 我知道我的命名断言存在一个子集,这是一个unsat核心。我使用Y

我正在使用Z3 SMT解算器来解决我用逻辑QF_BV表示的问题,使用SMTLIB 2语言

模型不可满足,我正试图让解算器生成一个不可满足的核心

我的模型由几个“强制”约束组成,我使用
assert
语句指定这些约束

我希望在生成unsat核心时考虑的断言是使用
(assert(!(EXPR):named NAME))
构造指定的

Z3给了我一个
unsat
,正如预期的那样。然而,Z3似乎总是转储一个由所有命名断言组成的“普通”unsat核心

我知道我的命名断言存在一个子集,这是一个unsat核心。我使用Yices SMT solver发现了这个核心,它经常给我相对较小的unsat核心。Yices模型与Z3模型相同(几乎是从SMT2到Yices输入语言的逐行翻译)


生成“好的”unsat核心是一项特定于求解器的功能,还是我可以提出任何通用建议/更改来帮助Z3为我提供更好的核心?

Z3和Yices 1.x使用相同的方法计算unsat核心。跟踪用于证明不可满足性的所有断言。然而,每个系统建立的证明可能会有很大的不同。除了Z3和Yices提供的功能外,还有计算最小unsat核的算法。这是一本书

编辑:默认情况下,Z3在尝试解决问题之前使用几个预处理步骤。其中一些步骤可能会影响unsat核心的生成。特别是,它使用问题中的方程消除常数。我们说Z3“解”方程并消除变量。在您的应用程序中,可以通过禁用此步骤来获得更小的内核。我们可以通过使用选项来实现这一点

(set-option :auto-config false)
Z3将执行一个非常通用的配置。对于位向量问题,通常最好禁用“相关传播”:

最后,我们现在可以启用/禁用变量消除步骤,并查看对unsat核心大小的影响

(set-option :solver true) ;; Z3 will generate the core C0 C1 C2
(set-option :solver false) ;; Z3 will generate the core C1 C2

谢谢回复!我上传了一个示例脚本。我已经包括了一个简短的描述,以帮助理解。你能看一下你有没有什么建议给我吗?我有你的脚本,我会更新答案的。顺便说一句,在一些位向量文本之前缺少
#
s。
(set-option :solver true) ;; Z3 will generate the core C0 C1 C2
(set-option :solver false) ;; Z3 will generate the core C1 C2