在 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]
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]