Пример #1
0
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);
    }
}
Пример #2
0
 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;
 }