我想将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();
另一种方法是使用Tactic。有使用战术“简化”和“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?
感谢。
答案 0 :(得分:1)
Z3 Java API在下一版本发布之前不会更改任何函数/结构名称。当然可能有错误修正,也许还有一些附加功能。
使用求解器或策略更有意义取决于应用程序。但是,由于您当前使用基于文件的界面,因此使用基于解算器的界面可能就足够了。使用它时,solver.Check()将使用默认策略(可能取决于所使用的逻辑)来解决问题。
有关战术的更多信息,请参阅strategies tutorial,其中显示了如何使用基于SMT-LIB文件的界面中的目标和策略。这同样适用于Java API,并且策略的名称是相同的。 “smt”策略是用一种策略包裹的SMT解算器;这与输入语言(SMT1或SMT2)无关,与使用通过ctx.MkSolver()构造的默认Solver对象基本相同。