3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-10-10 09:48:05 +00:00

fix #1675, regression in core processing in maxres

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-06-19 23:23:19 -07:00
parent 26e9321517
commit 335d672bf1
43 changed files with 246 additions and 321 deletions

View file

@ -228,10 +228,9 @@ namespace datalog {
expr_ref eval_q(model_ref& model, func_decl* f, unsigned i) {
func_decl_ref fn = mk_q_func_decl(f);
expr_ref t(m), result(m);
expr_ref t(m);
t = m.mk_app(mk_q_func_decl(f).get(), mk_q_num(i));
model->eval(t, result);
return result;
return (*model)(t);
}
expr_ref eval_q(model_ref& model, expr* t, unsigned i) {
@ -240,8 +239,7 @@ namespace datalog {
num = mk_q_num(i);
expr* nums[1] = { num };
vs(t, 1, nums, tmp);
model->eval(tmp, result);
return result;
return (*model)(tmp);
}
lbool get_model() {
@ -258,7 +256,7 @@ namespace datalog {
func_decl* pred = b.m_query_pred;
dl_decl_util util(m);
T = m.mk_const(symbol("T"), mk_index_sort());
md->eval(T, vl);
vl = (*md)(T);
VERIFY (m_bv.is_numeral(vl, num, bv_size));
SASSERT(num.is_unsigned());
level = num.get_unsigned();
@ -505,8 +503,7 @@ namespace datalog {
func_decl_ref rule_i = mk_level_rule(pred, i, level);
TRACE("bmc", rls[i]->display(b.m_ctx, tout << "Checking rule " << mk_pp(rule_i, m) << " "););
prop_r = m.mk_app(rule_i, prop->get_num_args(), prop->get_args());
md->eval(prop_r, prop_v);
if (m.is_true(prop_v)) {
if (md->is_true(prop_r)) {
r = rls[i];
break;
}
@ -527,8 +524,7 @@ namespace datalog {
return pr;
}
for (unsigned j = 0; j < sub.size(); ++j) {
md->eval(sub[j].get(), tmp);
sub[j] = tmp;
sub[j] = (*md)(sub[j].get());
}
svector<std::pair<unsigned, unsigned> > positions;
@ -1062,8 +1058,7 @@ namespace datalog {
return pr;
}
for (unsigned j = 0; j < sub.size(); ++j) {
md->eval(sub[j].get(), tmp);
sub[j] = tmp;
sub[j] = (*md)(sub.get(j));
}
rule_ref rl(b.m_ctx.get_rule_manager());
rl = rules[i];
@ -1116,7 +1111,7 @@ namespace datalog {
bool check_model(model_ref& md, expr* trace) {
expr_ref trace_val(m), eq(m);
md->eval(trace, trace_val);
trace_val = (*md)(trace);
eq = m.mk_eq(trace, trace_val);
b.m_solver.push();
b.m_solver.assert_expr(eq);
@ -1135,8 +1130,8 @@ namespace datalog {
void mk_answer(model_ref& md, expr_ref& trace, expr_ref& path) {
IF_VERBOSE(2, model_smt2_pp(verbose_stream(), m, *md, 0););
md->eval(trace, trace);
md->eval(path, path);
trace = (*md)(trace);
path = (*md)(path);
IF_VERBOSE(2, verbose_stream() << mk_pp(trace, m) << "\n";
for (unsigned i = 0; i < b.m_solver.size(); ++i) {
verbose_stream() << mk_pp(b.m_solver.get_formula(i), m) << "\n";

View file

@ -1398,7 +1398,7 @@ bool pred_transformer::is_ctp_blocked(lemma *lem) {
expr_ref lemmas(m), val(m);
lemmas = pt.get_formulas(lem->level());
pm.formula_n2o(lemmas.get(), lemmas, i);
if (ctp->eval(lemmas, val) && m.is_false(val)) {return false;}
if (ctp->is_false(lemmas)) return false;
}
// lem is blocked by ctp since none of the lemmas at the previous
@ -2440,13 +2440,13 @@ bool context::validate()
get_rule_manager ().
display_smt2(r, tout) << "\n";);
model->eval(r.get_head(), tmp);
tmp = (*model)(r.get_head());
expr_ref_vector fmls(m);
fmls.push_back(m.mk_not(tmp));
unsigned utsz = r.get_uninterpreted_tail_size();
unsigned tsz = r.get_tail_size();
for (unsigned j = 0; j < utsz; ++j) {
model->eval(r.get_tail(j), tmp);
tmp = (*model)(r.get_tail(j));
fmls.push_back(tmp);
}
for (unsigned j = utsz; j < tsz; ++j) {

View file

@ -71,10 +71,11 @@ void qe_project(ast_manager& m, app_ref_vector& vars, expr_ref& fml, model_ref&
expr_substitution sub(m);
proof_ref pr(m.mk_asserted(m.mk_true()), m);
expr_ref bval(m);
model::scoped_model_completion _scm(*M, true);
for (unsigned i = 0; i < vars.size(); i++) {
if (m.is_bool(vars.get(i))) {
// obtain the interpretation of the ith var using model completion
VERIFY(M->eval(vars.get(i), bval, true));
bval = (*M)(vars.get(i));
sub.insert(vars.get(i), bval, pr);
} else {
arith_vars.push_back(vars.get(i));
@ -106,7 +107,7 @@ void qe_project(ast_manager& m, app_ref_vector& vars, expr_ref& fml, model_ref&
tout << "Projected arith vars:\n" << mk_pp(fml, m) << "\n";
);
}
SASSERT(M->eval(fml, bval, true) && m.is_true(bval)); // M |= fml
SASSERT(M->is_true(fml));
vars.reset();
vars.append(arith_vars);
}

View file

@ -461,8 +461,8 @@ void model_evaluator::eval_array_eq(app* e, expr* arg1, expr* arg2)
{
TRACE("old_spacer", tout << "array equality: " << mk_pp(e, m) << "\n";);
expr_ref v1(m), v2(m);
m_model->eval(arg1, v1);
m_model->eval(arg2, v2);
v1 = (*m_model)(arg1);
v2 = (*m_model)(arg2);
if (v1 == v2) {
set_true(e);
return;
@ -510,8 +510,8 @@ void model_evaluator::eval_array_eq(app* e, expr* arg1, expr* arg2)
args2.append(store[i].size() - 1, store[i].c_ptr());
s1 = m_array.mk_select(args1.size(), args1.c_ptr());
s2 = m_array.mk_select(args2.size(), args2.c_ptr());
m_model->eval(s1, w1);
m_model->eval(s2, w2);
w1 = (*m_model)(s1);
w2 = (*m_model)(s2);
if (w1 == w2) {
continue;
}
@ -729,7 +729,7 @@ void model_evaluator::eval_fmls(ptr_vector<expr> const& formulas)
eval_basic(curr);
} else {
expr_ref vl(m);
m_model->eval(curr, vl);
vl = eval(m_model, curr);
assign_value(curr, vl);
}
@ -798,11 +798,10 @@ expr_ref model_evaluator::eval(const model_ref& model, func_decl* d)
return result;
}
expr_ref model_evaluator::eval(const model_ref& model, expr* e)
{
expr_ref result(m);
expr_ref model_evaluator::eval(const model_ref& model, expr* e){
m_model = model.get();
VERIFY(m_model->eval(e, result, true));
model::scoped_model_completion _scm(m_model, true);
expr_ref result = (*m_model)(e);
if (m_array.is_array(e)) {
vector<expr_ref_vector> stores;
expr_ref_vector args(m);

View file

@ -378,7 +378,7 @@ namespace spacer_qe {
rational r;
cx = mk_mul (c, m_var->x());
cxt = mk_add (cx, t);
VERIFY(mdl.eval(cxt, val, true));
val = mdl(cxt);
VERIFY(a.is_numeral(val, r));
SASSERT (r > rational::zero () || r < rational::zero ());
if (r > rational::zero ()) {
@ -464,8 +464,7 @@ namespace spacer_qe {
m_strict.reset();
m_eq.reset ();
expr_ref var_val (m);
VERIFY (mdl.eval (m_var->x(), var_val, true));
expr_ref var_val = mdl(m_var->x());
unsigned eq_idx = lits.size ();
for (unsigned i = 0; i < lits.size(); ++i) {
@ -492,7 +491,7 @@ namespace spacer_qe {
rational r;
cx = mk_mul (c, m_var->x());
cxt = mk_add (cx, t);
VERIFY(mdl.eval(cxt, val, true));
val = mdl(cxt);
VERIFY(a.is_numeral(val, r));
if (is_eq) {
@ -738,7 +737,7 @@ namespace spacer_qe {
rational r;
cx = mk_mul (m_coeffs[max_t], m_var->x());
cxt = mk_add (cx, m_terms.get (max_t));
VERIFY(mdl.eval(cxt, val, true));
val = mdl(cxt);
VERIFY(a.is_numeral(val, r));
// get the offset from the smallest/largest possible value for x
@ -796,13 +795,13 @@ namespace spacer_qe {
// evaluate x in mdl
rational r_x;
VERIFY(mdl.eval(m_var->x (), val, true));
val = mdl(m_var->x ());
VERIFY(a.is_numeral (val, r_x));
for (unsigned i = 0; i < m_terms.size(); ++i) {
rational const& ac = m_coeffs[i];
if (!m_eq[i] && ac.is_pos() == do_pos) {
VERIFY(mdl.eval(m_terms.get (i), val, true));
val = mdl(m_terms.get (i));
VERIFY(a.is_numeral(val, r));
r /= abs(ac);
// skip the literal if false in the model
@ -955,8 +954,7 @@ namespace spacer_qe {
new_var = m.mk_fresh_const ("mod_var", d->get_range ());
eqs.push_back (m.mk_eq (new_var, new_term));
// obtain value of new_term in mdl
expr_ref val (m);
mdl.eval (new_term, val, true);
expr_ref val = mdl(new_term);
// use the variable from now on
new_term = new_var;
changed = true;
@ -1413,7 +1411,7 @@ namespace spacer_qe {
app_ref val_const (m.mk_fresh_const ("sel", val_sort), m);
m_aux_vars.push_back (val_const);
// extend M to include val_const
expr_ref val (m);
expr_ref val(m);
m_mev.eval (*M, a_new, val);
M->register_decl (val_const->get_decl (), val);
// add equality

View file

@ -65,10 +65,11 @@ proof_ref ground_sat_answer_op::operator()(pred_transformer &query) {
SASSERT(res == l_true);
model_ref mdl;
m_solver->get_model(mdl);
model::scoped_model_completion _scm(mdl, true);
for (unsigned i = 0, sz = query.sig_size(); i < sz; ++i) {
expr_ref arg(m), val(m);
arg = m.mk_const(m_pm.o2n(query.sig(i), 0));
mdl->eval(arg, val, true);
val = (*mdl)(arg);
qsubst.push_back(val);
}
}
@ -141,11 +142,13 @@ void ground_sat_answer_op::mk_children(frame &fr, vector<frame> &todo) {
void ground_sat_answer_op::mk_child_subst_from_model(func_decl *pred,
unsigned j, model_ref &mdl,
expr_ref_vector &subst) {
model::scoped_model_completion _scm(mdl, true);
pred_transformer &pt = m_ctx.get_pred_transformer(pred);
for (unsigned i = 0, sz = pt.sig_size(); i < sz; ++i) {
expr_ref arg(m), val(m);
arg = m.mk_const(m_pm.o2o(pt.sig(i), 0, j));
mdl->eval(arg, val, true);
val = (*mdl)(arg);
subst.push_back(val);
}
}

View file

@ -472,7 +472,7 @@ namespace spacer {
for (unsigned j = 0; j < matrix.num_cols(); ++j) {
expr_ref evaluation(m);
model.get()->eval(bounded_vectors[j][k].get(), evaluation, false);
evaluation = (*model)(bounded_vectors[j][k].get());
if (!util.is_zero(evaluation)) {
coeff_lits.push_back(std::make_pair(rational(1), ordered_basis[j]));
}

View file

@ -693,13 +693,12 @@ namespace tb {
m_solver.assert_expr(postcond);
lbool is_sat = m_solver.check();
if (is_sat == l_true) {
expr_ref tmp(m);
expr* n;
model_ref mdl;
m_solver.get_model(mdl);
for (unsigned i = 0; i < fmls.size(); ++i) {
n = fmls[i].get();
if (mdl->eval(n, tmp) && m.is_false(tmp)) {
if (mdl->is_false(n)) {
m_refs.push_back(normalize(n));
m_sat_lits.insert(m_refs.back());
}