diff --git a/src/smt/theory_seq.cpp b/src/smt/theory_seq.cpp index ddfadaa8c..a775b268d 100644 --- a/src/smt/theory_seq.cpp +++ b/src/smt/theory_seq.cpp @@ -522,7 +522,7 @@ bool theory_seq::eq_unit(expr* const& l, expr* const &r) const { } // exists x, y, rs' != empty s.t. (ls = x ++ rs' ++ y & rs = rs') || (ls = rs' ++ x && rs = y ++ rs') -unsigned_vector theory_seq::overlap(ptr_vector const& ls, ptr_vector const& rs) { +unsigned_vector theory_seq::overlap(expr_ref_vector const& ls, expr_ref_vector const& rs) { SASSERT(!ls.empty() && !rs.empty()); unsigned_vector res; expr* l = mk_concat(ls); @@ -554,7 +554,7 @@ unsigned_vector theory_seq::overlap(ptr_vector const& ls, ptr_vector } // exists x, y, rs' != empty s.t. (ls = x ++ rs' ++ y & rs = rs') || (ls = x ++ rs' && rs = rs' ++ y) -unsigned_vector theory_seq::overlap2(ptr_vector const& ls, ptr_vector const& rs) { +unsigned_vector theory_seq::overlap2(expr_ref_vector const& ls, expr_ref_vector const& rs) { SASSERT(!ls.empty() && !rs.empty()); unsigned_vector res; expr* l = mk_concat(ls); @@ -584,7 +584,7 @@ unsigned_vector theory_seq::overlap2(ptr_vector const& ls, ptr_vector xs, expr* y1, ptr_vector ys, expr* y2) { + expr* const& x, expr_ref_vector const& xs, expr* const& y1, expr_ref_vector const& ys, expr* const& y2) { context& ctx = get_context(); bool change = false; for (auto ind : indexes) { @@ -634,7 +634,7 @@ expr* x, ptr_vector xs, expr* y1, ptr_vector ys, expr* y2) { // Equation is of the form x ++ xs = y1 ++ ys ++ y2 where xs, ys are units. bool theory_seq::branch_ternary_variable(eq const& e, bool flag1) { - ptr_vector xs, ys; + expr_ref_vector xs(m), ys(m); expr* x = nullptr, *y1 = nullptr, *y2 = nullptr; bool is_ternary = is_ternary_eq(e.ls(), e.rs(), x, xs, y1, ys, y2, flag1); if (!is_ternary) { @@ -701,7 +701,7 @@ bool theory_seq::branch_ternary_variable(eq const& e, bool flag1) { } bool theory_seq::branch_ternary_variable_base2(dependency* dep, unsigned_vector indexes, -ptr_vector xs, expr* x, expr* y1, ptr_vector ys, expr* y2) { + expr_ref_vector const& xs, expr* const& x, expr* const& y1, expr_ref_vector const& ys, expr* const& y2) { context& ctx = get_context(); bool change = false; for (auto ind : indexes) { @@ -750,7 +750,7 @@ ptr_vector xs, expr* x, expr* y1, ptr_vector ys, expr* y2) { // Equation is of the form xs ++ x = y1 ++ ys ++ y2 where xs, ys are units. bool theory_seq::branch_ternary_variable2(eq const& e, bool flag1) { - ptr_vector xs, ys; + expr_ref_vector xs(m), ys(m); expr* x = nullptr, *y1 = nullptr, *y2 = nullptr; bool is_ternary = is_ternary_eq2(e.ls(), e.rs(), xs, x, y1, ys, y2, flag1); if (!is_ternary) { @@ -827,7 +827,7 @@ bool theory_seq::branch_quat_variable() { // Equation is of the form x1 ++ xs ++ x2 = y1 ++ ys ++ y2 where xs, ys are units. bool theory_seq::branch_quat_variable(eq const& e) { - ptr_vector xs, ys; + expr_ref_vector xs(m), ys(m); expr* x1_l = nullptr, *x2 = nullptr, *y1_l = nullptr, *y2 = nullptr; bool is_quat = is_quat_eq(e.ls(), e.rs(), x1_l, xs, x2, y1_l, ys, y2); if (!is_quat) { @@ -1388,8 +1388,8 @@ bool theory_seq::branch_variable_mb() { for (auto elem : len2) l2 += elem; if (l1 != l2) { TRACE("seq", tout << "lengths are not compatible\n";); - expr_ref l = mk_concat(e.ls()); - expr_ref r = mk_concat(e.rs()); + expr_ref l(mk_concat(e.ls()), m); + expr_ref r(mk_concat(e.rs()), m); expr_ref lnl(m_util.str.mk_length(l), m), lnr(m_util.str.mk_length(r), m); propagate_eq(e.dep(), lnl, lnr, false); change = true; @@ -2490,7 +2490,7 @@ bool theory_seq::is_binary_eq(expr_ref_vector const& ls, expr_ref_vector const& } bool theory_seq::is_quat_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, -expr*& x1, ptr_vector& xs, expr*& x2, expr*& y1, ptr_vector& ys, expr*& y2) { +expr*& x1, expr_ref_vector& xs, expr*& x2, expr*& y1, expr_ref_vector& ys, expr*& y2) { if (ls.size() > 1 && is_var(ls[0]) && is_var(ls.back()) && rs.size() > 1 && is_var(rs[0]) && is_var(rs.back())) { unsigned l_start = 1; @@ -2533,7 +2533,7 @@ expr*& x1, ptr_vector& xs, expr*& x2, expr*& y1, ptr_vector& ys, exp } bool theory_seq::is_ternary_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, -expr*& x, ptr_vector& xs, expr*& y1, ptr_vector& ys, expr*& y2, bool flag1) { +expr*& x, expr_ref_vector& xs, expr*& y1, expr_ref_vector& ys, expr*& y2, bool flag1) { if (ls.size() > 1 && (is_var(ls[0]) || flag1) && rs.size() > 1 && is_var(rs[0]) && is_var(rs.back())) { unsigned l_start = ls.size()-1; @@ -2571,7 +2571,7 @@ expr*& x, ptr_vector& xs, expr*& y1, ptr_vector& ys, expr*& y2, bool } bool theory_seq::is_ternary_eq2(expr_ref_vector const& ls, expr_ref_vector const& rs, -ptr_vector& xs, expr*& x, expr*& y1, ptr_vector& ys, expr*& y2, bool flag1) { + expr_ref_vector& xs, expr*& x, expr*& y1, expr_ref_vector& ys, expr*& y2, bool flag1) { if (ls.size() > 1 && (is_var(ls.back()) || flag1) && rs.size() > 1 && is_var(rs[0]) && is_var(rs.back())) { unsigned l_start = 0; diff --git a/src/smt/theory_seq.h b/src/smt/theory_seq.h index 6be9b894f..577454621 100644 --- a/src/smt/theory_seq.h +++ b/src/smt/theory_seq.h @@ -402,10 +402,10 @@ namespace smt { bool branch_variable(eq const& e); bool branch_binary_variable(eq const& e); bool eq_unit(expr* const& l, expr* const &r) const; - unsigned_vector overlap(ptr_vector const& ls, ptr_vector const& rs); - unsigned_vector overlap2(ptr_vector const& ls, ptr_vector const& rs); - bool branch_ternary_variable_base(dependency* dep, unsigned_vector indexes, expr* x, ptr_vector xs, expr* y1, ptr_vector ys, expr* y2); - bool branch_ternary_variable_base2(dependency* dep, unsigned_vector indexes, ptr_vector xs, expr* x, expr* y1, ptr_vector ys, expr* y2); + unsigned_vector overlap(expr_ref_vector const& ls, expr_ref_vector const& rs); + unsigned_vector overlap2(expr_ref_vector const& ls, expr_ref_vector const& rs); + bool branch_ternary_variable_base(dependency* dep, unsigned_vector indexes, expr* const& x, expr_ref_vector const& xs, expr* const& y1, expr_ref_vector const& ys, expr* const& y2); + bool branch_ternary_variable_base2(dependency* dep, unsigned_vector indexes, expr_ref_vector const& xs, expr* const& x, expr* const& y1, expr_ref_vector const& ys, expr* const& y2); bool branch_ternary_variable(eq const& e, bool flag1 = false); bool branch_ternary_variable2(eq const& e, bool flag1 = false); bool branch_quat_variable(eq const& e); @@ -427,9 +427,9 @@ namespace smt { bool solve_unit_eq(expr* l, expr* r, dependency* dep); bool solve_unit_eq(expr_ref_vector const& l, expr_ref_vector const& r, dependency* dep); bool is_binary_eq(expr_ref_vector const& l, expr_ref_vector const& r, expr*& x, ptr_vector& xunits, ptr_vector& yunits, expr*& y); - bool is_quat_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, expr*& x1, ptr_vector& xs, expr*& x2, expr*& y1, ptr_vector& ys, expr*& y2); - bool is_ternary_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, expr*& x, ptr_vector& xs, expr*& y1, ptr_vector& ys, expr*& y2, bool flag1); - bool is_ternary_eq2(expr_ref_vector const& ls, expr_ref_vector const& rs, ptr_vector& xs, expr*& x, expr*& y1, ptr_vector& ys, expr*& y2, bool flag1); + bool is_quat_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, expr*& x1, expr_ref_vector& xs, expr*& x2, expr*& y1, expr_ref_vector& ys, expr*& y2); + bool is_ternary_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, expr*& x, expr_ref_vector& xs, expr*& y1, expr_ref_vector& ys, expr*& y2, bool flag1); + bool is_ternary_eq2(expr_ref_vector const& ls, expr_ref_vector const& rs, expr_ref_vector& xs, expr*& x, expr*& y1, expr_ref_vector& ys, expr*& y2, bool flag1); bool solve_binary_eq(expr_ref_vector const& l, expr_ref_vector const& r, dependency* dep); bool propagate_max_length(expr* l, expr* r, dependency* dep); @@ -441,7 +441,7 @@ namespace smt { expr_ref mk_empty(sort* s) { return expr_ref(m_util.str.mk_empty(s), m); } expr_ref mk_concat(unsigned n, expr*const* es) { return expr_ref(m_util.str.mk_concat(n, es), m); } expr_ref mk_concat(expr_ref_vector const& es, sort* s) { if (es.empty()) return mk_empty(s); return mk_concat(es.size(), es.c_ptr()); } - expr_ref mk_concat(expr_ref_vector const& es) { SASSERT(!es.empty()); return mk_concat(es.size(), es.c_ptr()); } + expr* mk_concat(expr_ref_vector const& es) { SASSERT(!es.empty()); return m_util.str.mk_concat(es.size(), es.c_ptr()); } expr_ref mk_concat(ptr_vector const& es) { SASSERT(!es.empty()); return mk_concat(es.size(), es.c_ptr()); } expr_ref mk_concat(expr* e1, expr* e2) { return expr_ref(m_util.str.mk_concat(e1, e2), m); } expr_ref mk_concat(expr* e1, expr* e2, expr* e3) { return expr_ref(m_util.str.mk_concat(e1, e2, e3), m); }