z3py unsat核心与z3.Optimize()的用法

时间:2018-06-19 17:33:38

标签: python z3 z3py

我正在使用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)。这里有什么区别?

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由于某种原因它对您不起作用吗?