我正在使用 Z3 SMT 求解器来解决我在逻辑 QF_BV 中使用 SMTLIB 2 语言表达的问题。
该模型无法满足,我试图让求解器产生一个 unsat-core。
我的模型由几个“强制性”约束组成,我使用assert
语句指定它们。
我想要考虑用于 unsat-core 生成的断言已使用(assert (! (EXPR) :named NAME))
构造指定。
unsat
正如预期的那样,Z3 给了我一个。然而,Z3 似乎总是转储一个由所有命名断言组成的“微不足道”的 unsat-core。
我知道存在我的命名断言的一个子集,它是一个 unsat-core。我使用 Yices SMT 求解器找到了这个核心,它经常给我相对较小的未饱和核心。Yices 模型与 Z3 模型相同(几乎是从 SMT2 到 Yices 输入语言的逐行翻译)。
产生“好”的 unsat 核心是求解器特有的功能,还是我可以做出任何通用的建议/更改来帮助 Z3 给我一个更好的核心?