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:
parent
26e9321517
commit
335d672bf1
43 changed files with 246 additions and 321 deletions
|
@ -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";
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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]));
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue