void euf_arith_mbi_plugin::filter_private_arith(app_ref_vector& avars) { arith_util a(m); unsigned j = 0; obj_hashtable<func_decl> shared; for (func_decl* f : m_shared) shared.insert(f); for (unsigned i = 0; i < avars.size(); ++i) { app* v = avars.get(i); if (!shared.contains(v->get_decl()) && v->get_family_id() != a.get_family_id()) { avars[j++] = v; } } avars.shrink(j); }
bool solve(model& model, app_ref_vector& vars, expr_ref_vector& lits) { expr_mark is_var, is_rem; if (vars.empty()) { return false; } bool reduced = false; for (unsigned i = 0; i < vars.size(); ++i) { is_var.mark(vars[i].get()); } expr_ref tmp(m), t(m), v(m); th_rewriter rw(m); for (unsigned i = 0; i < lits.size(); ++i) { expr* e = lits[i].get(), *l, *r; if (m.is_eq(e, l, r) && reduce_eq(is_var, l, r, v, t)) { reduced = true; project_plugin::erase(lits, i); expr_safe_replace sub(m); sub.insert(v, t); is_rem.mark(v); for (unsigned j = 0; j < lits.size(); ++j) { sub(lits[j].get(), tmp); rw(tmp); lits[j] = tmp; } } } if (reduced) { unsigned j = 0; for (unsigned i = 0; i < vars.size(); ++i) { if (!is_rem.is_marked(vars[i].get())) { if (i != j) { vars[j] = vars[i].get(); } ++j; } } vars.shrink(j); } return reduced; }