Esempio n. 1
0
 bool mk_coalesce::same_body(rule const& r1, rule const& r2) const {
     SASSERT(r1.get_decl() == r2.get_decl());
     unsigned sz = r1.get_uninterpreted_tail_size();
     if (sz != r2.get_uninterpreted_tail_size()) {
         return false;
     }
     for (unsigned i = 0; i < sz; ++i) {
         if (r1.get_decl(i) != r2.get_decl(i)) {
             return false;
         }
         if (r1.is_neg_tail(i) != r2.is_neg_tail(i)) {
             return false;
         }
     }
     return true;
 }    
Esempio n. 2
0
 void mk_unfold::expand_tail(rule& r, unsigned tail_idx, rule_set const& src, rule_set& dst) {
     SASSERT(tail_idx <= r.get_uninterpreted_tail_size());
     if (tail_idx == r.get_uninterpreted_tail_size()) {
         dst.add_rule(&r);
     }
     else {
         func_decl* p = r.get_decl(tail_idx);
         rule_vector const& p_rules = src.get_predicate_rules(p);
         rule_ref new_rule(rm);
         for (unsigned i = 0; i < p_rules.size(); ++i) {
             rule const& r2 = *p_rules[i];
             if (m_unify.unify_rules(r, tail_idx, r2) &&
                 m_unify.apply(r, tail_idx, r2, new_rule)) {
                 expr_ref_vector s1 = m_unify.get_rule_subst(r, true);
                 expr_ref_vector s2 = m_unify.get_rule_subst(r2, false);                    
                 resolve_rule(rm, r, r2, tail_idx, s1, s2, *new_rule.get());
                 expand_tail(*new_rule.get(), tail_idx+r2.get_uninterpreted_tail_size(), src, dst);
             }
         }
     }
 }