void tactic2solver::pop_core(unsigned n) { unsigned new_lvl = m_scopes.size() - n; unsigned old_sz = m_scopes[new_lvl]; m_assertions.shrink(old_sz); m_scopes.shrink(new_lvl); m_result = 0; }
bool detect_equivalences(expr_ref_vector& v, bool inside_disjunction) { bool have_pair = false; unsigned prev_pair_idx = 0; arg_pair ap; unsigned read_idx = 0; unsigned write_idx = 0; while(read_idx<v.size()) { expr * e = v[read_idx].get(); arg_pair new_ap; if (match_arg_pair(e, new_ap, inside_disjunction)) { app * neq = nullptr; if (have_pair) { neq = detect_equivalence(ap, new_ap, inside_disjunction); } if (neq) { have_pair = false; v[prev_pair_idx] = neq; read_idx++; continue; } else { have_pair = true; prev_pair_idx = write_idx; ap = new_ap; } } else { have_pair = false; } if (write_idx!=read_idx) { v[write_idx] = e; } read_idx++; write_idx++; } v.shrink(write_idx); return read_idx!=write_idx; }
static void remove_duplicates(expr_ref_vector& v) { expr * a = v[0].get(); unsigned read_idx = 1; unsigned write_idx = 1; for (;;) { while(read_idx<v.size() && a==v[read_idx].get()) { read_idx++; } if (read_idx==v.size()) { break; } a = v[read_idx].get(); if (write_idx!=read_idx) { v[write_idx] = a; } write_idx++; read_idx++; } v.shrink(write_idx); }
/** Factors input vector v into equivalence classes and the rest */ void factor_eqs(expr_ref_vector &v, expr_equiv_class &equiv) { ast_manager &m = v.get_manager(); arith_util arith(m); expr *e1 = 0, *e2 = 0; flatten_and(v); unsigned j = 0; for (unsigned i = 0; i < v.size(); ++i) { if (m.is_eq(v.get(i), e1, e2)) { if (arith.is_zero(e1)) { std::swap(e1, e2); } // y + -1*x == 0 expr* a0 = 0, *a1 = 0, *x = 0; if (arith.is_zero(e2) && arith.is_add(e1, a0, a1)) { if (arith.is_times_minus_one(a1, x)) { e1 = a0; e2 = x; } else if (arith.is_times_minus_one(a0, x)) { e1 = a1; e2 = x; } } equiv.merge(e1, e2); } else { if (j < i) { v[j] = v.get(i); } j++; } } v.shrink(j); }