在 z3 中使用 Tactics 时清空 Unsat 核心

Empty Unsat Cores when using Tactics in z3

Solver returns 使用战术时清空 unsat 核心。

案例 1:

s = Solver()
x = Real('x')
B = Bool('b')
C = Bool('c')
s.add(B == (x > 1))
s.add(C == (x == -1))
s.check(B, C)

案例二:

s = Then('simplify', 'solve-eqs', 'smt').solver()
x = Real('x')
B = Bool('b')
C = Bool('c')
s.add(B == (x > 1))
s.add(C == (x == -1))
s.check(B, C)

在这两种情况下,检查 returns unsat(应该如此),但在第二种情况下我使用策略时得到一个空的 unsat 核心。有没有办法在使用带有策略的求解器时获得不饱和核心?

PS:这些都是非常简单的演示示例。我正在处理一个更大的问题,我有许多上帝抵抗军的限制(战术可能会有所帮助),我需要提取未饱和的核心。

如果您使用战术,则需要明确启用 unsat 核心。以下作品:

from z3 import *
s = Then('simplify', 'solve-eqs', 'smt').solver()
s.set(unsat_core=True)
x = Real('x')
B = Bool('b')
C = Bool('c')
s.add(B == (x > 1))
s.add(C == (x == -1))
s.check(B, C)

print s.unsat_core()

注意第三行对 s.set 的调用。输出:

$ python b.py
[b, c]