我正在使用z3 python API。我想一方面使用Z3的unsat核心功能,另一方面又可以针对某些条件进行优化。
因此,如果我想使用unsat内核,请执行以下操作:
self.solver = z3.Solver()
self._solver.assert_and_track(constraint1, error_message1)
self._solver.assert_and_track(constraint2, error_message2)
...
self._solver.check()
if len(self._solver.unsat_core()) > 0
print (self._solver.unsat_core())
那很好。 但除此之外,我还可以使用z3.Optimize()中的maximum()和minimum()函数。尽管此求解器实例似乎不提供未饱和核。有可能一起使用吗?
我还在网上看到,代替使用assert_and_track()函数,可以使用暗示来跟踪未饱和核:Implies(p1,约束1)。这里有什么区别?
答案 0 :(得分:0)
Z3不同时支持优化和非核心生成。这是大约两个月前的相关票证:https://github.com/Z3Prover/z3/issues/1577
请注意,这不是因为无法实现:只是他们尚未实现。在此注册您的请求可能会激励他们增加支持!
关于使用隐式跟踪非卫星核心的问题:我认为这实际上就是assert_and_track
所做的。您可以在此处查看其源代码:https://github.com/Z3Prover/z3/blob/d2c937a989ea360e9cba06583eccaa257c75870f/src/api/python/z3/z3.py#L6418-L6446由于某种原因它对您不起作用吗?