void project_plugin::partition_args(model& model, app_ref_vector const& selects, expr_ref_vector& lits) { ast_manager& m = selects.get_manager(); if (selects.empty()) return; unsigned num_args = selects[0]->get_decl()->get_arity(); for (unsigned j = 1; j < num_args; ++j) { expr_ref_vector args(m); for (unsigned i = 0; i < selects.size(); ++i) { args.push_back(selects[i]->get_arg(j)); } project_plugin::partition_values(model, args, lits); } }
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; }