有没有办法使用solver.unsat_core,而不使用solver.assert_and_track?

时间:2017-07-20 21:18:11

标签: python logic z3 smt z3py

有没有办法让下面的代码工作,并打印出一个有效的不满核心?

from z3 import *

a = Int('a')
b = Int('b')

s = Solver()
s.add(a == 1)
s.add(a == 2)
s.add(b == 3)

s.check()

# This prints [], and I would like it to print [a == 1, a == 2]
print(s.unsat_core())

我知道我可以这样做:

from z3 import *

a = Int('a')
b = Int('b')

s = Solver()
s.assert_and_track(a == 1, 'p1')
s.assert_and_track(a == 2, 'p2')
s.assert_and_track(b == 3, 'p3')

s.check()
# This prints [p1, p2]
print(s.unsat_core())

但对于我正在进行的真实项目,通过并为每个约束命名(由于它们的音量以及它们如何生成它们)会很痛苦。)

1 个答案:

答案 0 :(得分:1)

除非您自己实施,否则不会。无条件核心提取需要标记约束,请参阅本文档第67页的顶部:http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf

话虽如此,你可以建立一个数据库"通过定义您自己的add版本,首先组成一个名称并插入它,然后在您将类似定义的函数my_unsat_core中进行反向查找。如果你以通用的方式实现它,Z3人可能也有兴趣将它合并到他们的API中。将是一个很好的补充。