mirror of
https://github.com/Z3Prover/z3
synced 2025-11-04 13:29:11 +00:00
fix param evaluation non-determinism
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
02290e8736
commit
fad311a70a
4 changed files with 57 additions and 32 deletions
|
|
@ -388,8 +388,11 @@ namespace smt {
|
|||
expr_ref le(m_arith.mk_le(sz->get_arg(1), nV), m);
|
||||
expr_ref fr(m.mk_app(fg.second, result), m);
|
||||
// set-has-size(a, k) => k <= n or g(f(a,n)) = n
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
mk_th_axiom(~mk_literal(sz), mk_literal(le), mk_eq(nV, fr));
|
||||
literal sz_lit = mk_literal(sz);
|
||||
literal not_sz_lit = ~sz_lit;
|
||||
literal le_lit = mk_literal(le);
|
||||
literal eq_lit = mk_eq(nV, fr);
|
||||
mk_th_axiom(not_sz_lit, le_lit, eq_lit);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -163,8 +163,10 @@ public:
|
|||
|
||||
expr_ref v(m.mk_fresh_const(x->get_decl()->get_name(), m.mk_bool_sort()), m);
|
||||
if (last_v) axioms.push_back(m.mk_implies(v, last_v));
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
xs.push_back(m.mk_ite(v, a.mk_int(1), a.mk_int(0)));
|
||||
expr_ref one(a.mk_int(1), m);
|
||||
expr_ref zero(a.mk_int(0), m);
|
||||
expr_ref ite(m.mk_ite(v, one, zero), m);
|
||||
xs.push_back(ite);
|
||||
m_mc->hide(v);
|
||||
last_v = v;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,20 +35,30 @@ tactic * mk_nra_tactic(ast_manager & m, params_ref const& p) {
|
|||
p2.set_uint("seed", 13);
|
||||
p2.set_bool("factor", false);
|
||||
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
tactic* simplify1 = mk_simplify_tactic(m, p);
|
||||
tactic* propagate = mk_propagate_values_tactic(m, p);
|
||||
tactic* qe_lite = mk_qe_lite_tactic(m);
|
||||
tactic* simplify2 = mk_simplify_tactic(m, p);
|
||||
|
||||
tactic* qfnra_main = mk_qfnra_nlsat_tactic(m, p);
|
||||
tactic* try_qfnra_main = try_for(qfnra_main, 5000);
|
||||
tactic* qfnra_alt1 = mk_qfnra_nlsat_tactic(m, p1);
|
||||
tactic* try_qfnra_alt1 = try_for(qfnra_alt1, 10000);
|
||||
tactic* qfnra_alt2 = mk_qfnra_nlsat_tactic(m, p2);
|
||||
tactic* qfnra_branch = or_else(try_qfnra_main, try_qfnra_alt1, qfnra_alt2);
|
||||
|
||||
tactic* nlqsat = mk_nlqsat_tactic(m, p);
|
||||
tactic* smt = mk_smt_tactic(m, p);
|
||||
tactic* fallback_branch = or_else(nlqsat, smt);
|
||||
|
||||
probe* qfnra_probe = mk_is_qfnra_probe();
|
||||
tactic* conditional = cond(qfnra_probe, qfnra_branch, fallback_branch);
|
||||
|
||||
return and_then(
|
||||
mk_simplify_tactic(m, p),
|
||||
mk_propagate_values_tactic(m, p),
|
||||
mk_qe_lite_tactic(m),
|
||||
mk_simplify_tactic(m, p),
|
||||
cond(mk_is_qfnra_probe(),
|
||||
or_else(try_for(mk_qfnra_nlsat_tactic(m, p), 5000),
|
||||
try_for(mk_qfnra_nlsat_tactic(m, p1), 10000),
|
||||
mk_qfnra_nlsat_tactic(m, p2)),
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
or_else(mk_nlqsat_tactic(m, p),
|
||||
mk_smt_tactic(m, p))
|
||||
));
|
||||
simplify1,
|
||||
propagate,
|
||||
qe_lite,
|
||||
simplify2,
|
||||
conditional);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -784,10 +784,12 @@ Notes:
|
|||
}
|
||||
|
||||
// result => xs[0] + ... + xs[n-1] <= 1
|
||||
literal not_result = mk_not(result);
|
||||
for (unsigned i = 0; i < n; ++i) {
|
||||
for (unsigned j = i + 1; j < n; ++j) {
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
add_clause(mk_not(result), mk_not(xs[i]), mk_not(xs[j]));
|
||||
literal not_xi = mk_not(xs[i]);
|
||||
literal not_xj = mk_not(xs[j]);
|
||||
add_clause(not_result, not_xi, not_xj);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -876,10 +878,12 @@ Notes:
|
|||
for (unsigned i = 0; i + 2 < n; ++i) {
|
||||
add_clause(mk_not(ys[i]), ys[i + 1]);
|
||||
}
|
||||
literal not_r = mk_not(r);
|
||||
for (unsigned i = 0; i + 1 < n; ++i) {
|
||||
add_clause(mk_not(xs[i]), ys[i]);
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
add_clause(mk_not(r), mk_not(ys[i]), mk_not(xs[i + 1]));
|
||||
literal not_yi = mk_not(ys[i]);
|
||||
literal not_x_next = mk_not(xs[i + 1]);
|
||||
add_clause(not_r, not_yi, not_x_next);
|
||||
}
|
||||
|
||||
if (is_eq) {
|
||||
|
|
@ -903,10 +907,11 @@ Notes:
|
|||
}
|
||||
if (is_eq) {
|
||||
literal zero = fresh("zero");
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
add_clause(mk_not(zero), mk_not(xs[n-1]));
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
add_clause(mk_not(zero), mk_not(ys[n-2]));
|
||||
literal not_zero = mk_not(zero);
|
||||
literal not_x_last = mk_not(xs[n-1]);
|
||||
literal not_y_last = mk_not(ys[n-2]);
|
||||
add_clause(not_zero, not_x_last);
|
||||
add_clause(not_zero, not_y_last);
|
||||
add_clause(r, zero, twos.back());
|
||||
}
|
||||
else {
|
||||
|
|
@ -940,11 +945,13 @@ Notes:
|
|||
for (unsigned k = 0; k < nbits; ++k) {
|
||||
bits.push_back(fresh("bit"));
|
||||
}
|
||||
literal not_result = mk_not(result);
|
||||
for (unsigned i = 0; i < ors.size(); ++i) {
|
||||
for (unsigned k = 0; k < nbits; ++k) {
|
||||
bool bit_set = (i & (static_cast<unsigned>(1 << k))) != 0;
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
add_clause(mk_not(result), mk_not(ors[i]), bit_set ? bits[k] : mk_not(bits[k]));
|
||||
literal not_or = mk_not(ors[i]);
|
||||
literal bit_lit = bit_set ? bits[k] : mk_not(bits[k]);
|
||||
add_clause(not_result, not_or, bit_lit);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
|
@ -1041,8 +1048,9 @@ Notes:
|
|||
void cmp_le(literal x1, literal x2, literal y1, literal y2) {
|
||||
add_clause(mk_not(x1), y1);
|
||||
add_clause(mk_not(x2), y1);
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
add_clause(mk_not(x1), mk_not(x2), y2);
|
||||
literal not_x1 = mk_not(x1);
|
||||
literal not_x2 = mk_not(x2);
|
||||
add_clause(not_x1, not_x2, y2);
|
||||
}
|
||||
|
||||
void cmp_eq(literal x1, literal x2, literal y1, literal y2) {
|
||||
|
|
@ -1421,8 +1429,10 @@ Notes:
|
|||
}
|
||||
for (unsigned i = 1; i <= a; ++i) {
|
||||
for (unsigned j = 1; j <= b && i + j <= c; ++j) {
|
||||
// TODO: non-deterministic parameter evaluation
|
||||
add_clause(mk_not(as[i-1]),mk_not(bs[j-1]),out[i+j-1]);
|
||||
literal not_ai = mk_not(as[i-1]);
|
||||
literal not_bj = mk_not(bs[j-1]);
|
||||
literal out_lit = out[i + j - 1];
|
||||
add_clause(not_ai, not_bj, out_lit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue