如何从Java程序中正确调用Z3?

时间:2013-10-27 08:59:59

标签: java z3

我想将Z3集成到我用Java开发的安全工具中。目前,我正在输出公式以检入文件,然后调用Z3。请问Ja​​va 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?

感谢。

1 个答案:

答案 0 :(得分:1)

Z3 Java API在下一版本发布之前不会更改任何函数/结构名称。当然可能有错误修正,也许还有一些附加功能。

使用求解器或策略更有意义取决于应用程序。但是,由于您当前使用基于文件的界面,因此使用基于解算器的界面可能就足够了。使用它时,solver.Check()将使用默认策略(可能取决于所使用的逻辑)来解决问题。

有关战术的更多信息,请参阅strategies tutorial,其中显示了如何使用基于SMT-LIB文件的界面中的目标和策略。这同样适用于Java API,并且策略的名称是相同的。 “smt”策略是用一种策略包裹的SMT解算器;这与输入语言(SMT1或SMT2)无关,与使用通过ctx.MkSolver()构造的默认Solver对象基本相同。