有没有办法让下面的代码工作,并打印出一个有效的不满核心?
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())
但对于我正在进行的真实项目,通过并为每个约束命名(由于它们的音量以及它们如何生成它们)会很痛苦。)
答案 0 :(得分:1)
除非您自己实施,否则不会。无条件核心提取需要标记约束,请参阅本文档第67页的顶部:http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf
话虽如此,你可以建立一个数据库"通过定义您自己的add
版本,首先组成一个名称并插入它,然后在您将类似定义的函数my_unsat_core
中进行反向查找。如果你以通用的方式实现它,Z3人可能也有兴趣将它合并到他们的API中。将是一个很好的补充。