我在过去一年左右一直在使用Z3 4.0版的Ocaml API,主要是比特矢量理论。现在我需要在执行Z3.solver_check后提取不满核心,遗憾的是版本4没有此功能。我可以进行重写,使用假设代表公式中的每个bitvector方程,然后得到不满核心,但这是代码的关键部分,它可能会影响整体性能。
有没有办法在不经过第4版假设的情况下获得不满核心?长期解决方案当然是转移到最新版本,但如果有一个不那么具有破坏性的解决方案那就不错了。例如,有没有办法从不饱和度证明中提取不饱和核心(由Z3.solver_get_proof返回)?
谢谢!
答案 0 :(得分:1)
如果使用Solver模块中的assert_and_track函数,则get_unsat_core(也在Solver模块中)将返回与跟踪的断言相对应的跟踪文字集。在UnsatCoreAndProofExample2方法中以及Java(https://github.com/Z3Prover/z3/blob/master/examples/java/JavaExample.java)中有一个使用assert_and_track作为C#API的示例。 ML样本中没有相应的例子,但是对OCaml的翻译不应该太复杂。