我想将 Z3 集成到我用 Java 开发的安全工具中。目前,我正在输出公式以签入文件,然后调用 Z3. 请问Java API有多稳定?
当我查看随 Z3 分发的 Java API 示例时,似乎有两种方法可以解决公式。第一个是创建求解器:
Solver solver = ctx.MkSolver();
for (BoolExpr a : g.Formulas())
solver.Assert(a);
if (solver.Check() != Status.SATISFIABLE)
throw new TestFailedException();
另一种方法是使用战术。有使用策略“简化”和“smt”的例子
ApplyResult ar = ApplyTactic(ctx, ctx.MkTactic("simplify"), g);
if (ar.NumSubgoals() == 1
&& (ar.Subgoals()[0].IsDecidedSat() || ar.Subgoals()[0]
.IsDecidedUnsat()))
throw new TestFailedException();
我的问题是:哪种方式调用 z3 更有效?第一个或第二个。哪种策略对哪个问题有好处?策略“smt”适用于 SMT-LIB1 还是 SMT-LIB2?
谢谢。