rule_set * mk_coalesce::operator()(rule_set const & source, model_converter_ref& mc, proof_converter_ref& pc) {
     m_pc = 0;
     ref<replace_proof_converter> rpc;
     if (pc) {
         rpc = alloc(replace_proof_converter, m);
         m_pc = rpc.get();
     }
     rule_set* rules = alloc(rule_set, m_ctx);
     rule_set::decl2rules::iterator it = source.begin_grouped_rules(), end = source.end_grouped_rules();
     for (; it != end; ++it) {
         rule_ref_vector d_rules(rm);
         d_rules.append(it->m_value->size(), it->m_value->c_ptr());
         for (unsigned i = 0; i < d_rules.size(); ++i) {
             rule_ref r1(d_rules[i].get(), rm);
             for (unsigned j = i + 1; j < d_rules.size(); ++j) {
                 if (same_body(*r1.get(), *d_rules[j].get())) {
                     merge_rules(r1, *d_rules[j].get());
                     d_rules[j] = d_rules.back();
                     d_rules.pop_back();
                     --j;
                 }
             }
             rules->add_rule(r1.get());
         }
     }
     if (pc) {
         pc = concat(pc.get(), rpc.get());
     }
     return rules;
 }
Ejemplo n.º 2
0
 rule_set * mk_coalesce::operator()(rule_set const & source) {
     rule_set* rules = alloc(rule_set, m_ctx);
     rules->inherit_predicates(source);
     rule_set::decl2rules::iterator it = source.begin_grouped_rules(), end = source.end_grouped_rules();
     for (; it != end; ++it) {
         rule_ref_vector d_rules(rm);
         d_rules.append(it->m_value->size(), it->m_value->c_ptr());
         for (unsigned i = 0; i < d_rules.size(); ++i) {
             rule_ref r1(d_rules[i].get(), rm);
             for (unsigned j = i + 1; j < d_rules.size(); ++j) {
                 if (same_body(*r1.get(), *d_rules[j].get())) {
                     merge_rules(r1, *d_rules[j].get());
                     d_rules[j] = d_rules.back();
                     d_rules.pop_back();
                     --j;
                 }
             }
             rules->add_rule(r1.get());
         }
     }
     return rules;
 }