Java で開発したセキュリティ ツールに Z3 を統合したいと考えています。現在、式を出力してファイルにチェックインし、Z3 を呼び出しています。Java API の安定性についてお尋ねしてもよろしいですか?
Z3で配布しているJava APIの例を見ると、数式を解くには2つの方法があるようです。1 つ目は、ソルバーを作成することです。
Solver solver = ctx.MkSolver();
for (BoolExpr a : g.Formulas())
solver.Assert(a);
if (solver.Check() != Status.SATISFIABLE)
throw new TestFailedException();
別の方法は、戦術を使用することです。タクティック「simplify」と「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 を呼び出すより効率的な方法はどれですか? 最初または2番目のもの。そして、どの戦術がどの問題に適していますか? タクティック "smt" は SMT-LIB1 または SMT-LIB2 用ですか?
ありがとう。