この種の量子を処理するには、Z3で使用可能な定量化モジュールを使用する必要があります。ここではそれを使用する方法の例がある(http://rise4fun.com/Z3/3C3オンラインで試してください):
(assert (forall ((t Int)) (= t 5)))
(check-sat-using (then qe smt))
(reset)
(assert (forall ((t Bool)) (= t true)))
(check-sat-using (then qe smt))
コマンドcheck-sat-using
は、私たちが問題を解決するための戦略を指定することができます。上記の例では、私はちょうどqe
(量限定子の削除)を使用していて、汎用のSMTソルバーを呼び出しています。 これらの例では、qe
で十分です。
ここで私たちは本当にqe
とsmt
(オンラインで試してみてください。http://rise4fun.com/Z3/l3Rl)を結合する必要があり、より複雑な例であり、ここで
(declare-const a Int)
(declare-const b Int)
(assert (forall ((t Int)) (=> (<= t a) (< t b))))
(check-sat-using (then qe smt))
(get-model)
EDIT は、C/C++ APIを使用して同じ例です。
void tactic_qe() {
std::cout << "tactic example using quantifier elimination\n";
context c;
// Create a solver using "qe" and "smt" tactics
solver s =
(tactic(c, "qe") &
tactic(c, "smt")).mk_solver();
expr a = c.int_const("a");
expr b = c.int_const("b");
expr x = c.int_const("x");
expr f = implies(x <= a, x < b);
// We have to use the C API directly for creating quantified formulas.
Z3_app vars[] = {(Z3_app) x};
expr qf = to_expr(c, Z3_mk_forall_const(c, 0, 1, vars,
0, 0, // no pattern
f));
std::cout << qf << "\n";
s.add(qf);
std::cout << s.check() << "\n";
std::cout << s.get_model() << "\n";
}
素晴らしいです。できます。 C Apiを使ってこれを指定する方法を教えていただけますか? Z3_check関数がそれ以上引数を受け付けないためです。 – ThorstenT
戦術を作成してソルバーに変換する必要があります。私は、C/C++ APIを使用した例を追加しました。 –
それは本当に素晴らしいです。今私はそれが欲しいのようにZ3の作品:) – ThorstenT