mirror of
https://github.com/Z3Prover/z3
synced 2025-06-02 12:21:21 +00:00
fix build regression
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
f5455ce2ac
commit
8d940f64b8
4 changed files with 27 additions and 35 deletions
|
@ -1584,45 +1584,12 @@ br_status seq_rewriter::mk_eq_core(expr * l, expr * r, expr_ref & result) {
|
||||||
return BR_REWRITE3;
|
return BR_REWRITE3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* t = (concat (unit (nth t 0)) (unit (nth t 1)) (unit (nth t 2)) .. (unit (nth t k-1)))
|
|
||||||
* ->
|
|
||||||
* (length t) = k
|
|
||||||
*/
|
|
||||||
bool seq_rewriter::reduce_nth_eq(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_vector& lhs, expr_ref_vector& rhs) {
|
|
||||||
if (ls.size() == 1 && !rs.empty()) {
|
|
||||||
expr* l = ls.get(0);
|
|
||||||
for (unsigned i = 0; i < rs.size(); ++i) {
|
|
||||||
unsigned k = 0;
|
|
||||||
expr* ru = nullptr, *r = nullptr;
|
|
||||||
if (m_util.str.is_unit(rs.get(i), ru) && m_util.str.is_nth(ru, r, k) && k == i && r == l) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
arith_util a(m());
|
|
||||||
lhs.push_back(m_util.str.mk_length(l));
|
|
||||||
rhs.push_back(a.mk_int(rs.size()));
|
|
||||||
ls.reset();
|
|
||||||
rs.reset();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (rs.size() == 1 && !ls.empty()) {
|
|
||||||
return reduce_nth_eq(rs, ls, rhs, lhs);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool seq_rewriter::reduce_eq(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_vector& lhs, expr_ref_vector& rhs, bool& change) {
|
bool seq_rewriter::reduce_eq(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_vector& lhs, expr_ref_vector& rhs, bool& change) {
|
||||||
expr* a, *b;
|
expr* a, *b;
|
||||||
zstring s;
|
zstring s;
|
||||||
bool lchange = false;
|
bool lchange = false;
|
||||||
SASSERT(lhs.empty());
|
SASSERT(lhs.empty());
|
||||||
TRACE("seq", tout << ls << "\n"; tout << rs << "\n";);
|
TRACE("seq", tout << ls << "\n"; tout << rs << "\n";);
|
||||||
if (reduce_nth_eq(ls, rs, lhs, rhs)) {
|
|
||||||
change = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// solve from back
|
// solve from back
|
||||||
while (true) {
|
while (true) {
|
||||||
while (!rs.empty() && m_util.str.is_empty(rs.back())) {
|
while (!rs.empty() && m_util.str.is_empty(rs.back())) {
|
||||||
|
|
|
@ -170,8 +170,6 @@ public:
|
||||||
|
|
||||||
bool reduce_contains(expr* a, expr* b, expr_ref_vector& disj);
|
bool reduce_contains(expr* a, expr* b, expr_ref_vector& disj);
|
||||||
|
|
||||||
bool reduce_nth_eq(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_vector& lhs, expr_ref_vector& rhs);
|
|
||||||
|
|
||||||
void add_seqs(expr_ref_vector const& ls, expr_ref_vector const& rs, expr_ref_vector& lhs, expr_ref_vector& rhs);
|
void add_seqs(expr_ref_vector const& ls, expr_ref_vector const& rs, expr_ref_vector& lhs, expr_ref_vector& rhs);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2292,6 +2292,26 @@ bool theory_seq::simplify_eq(expr_ref_vector& ls, expr_ref_vector& rs, dependenc
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool theory_seq::solve_nth_eq(expr_ref_vector& ls, expr_ref_vector& rs, dependency* deps) {
|
||||||
|
if (ls.size() != 1) return false;
|
||||||
|
expr_ref l(ls.get(0), m);
|
||||||
|
for (unsigned i = 0; i < rs.size(); ++i) {
|
||||||
|
unsigned k = 0;
|
||||||
|
expr* ru = nullptr, *r = nullptr;
|
||||||
|
if (m_util.str.is_unit(rs.get(i), ru) && m_util.str.is_nth(ru, r, k) && k == i && r == l) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
add_solution(l, mk_concat(rs, m.get_sort(l)), deps);
|
||||||
|
expr_ref r(m_autil.mk_int(rs.size()), m);
|
||||||
|
ls.reset();
|
||||||
|
rs.reset();
|
||||||
|
ls.push_back(m_util.str.mk_length(l));
|
||||||
|
rs.push_back(r);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool theory_seq::solve_unit_eq(expr_ref_vector const& l, expr_ref_vector const& r, dependency* deps) {
|
bool theory_seq::solve_unit_eq(expr_ref_vector const& l, expr_ref_vector const& r, dependency* deps) {
|
||||||
if (l.size() == 1 && is_var(l[0]) && !occurs(l[0], r) && add_solution(l[0], mk_concat(r, m.get_sort(l[0])), deps)) {
|
if (l.size() == 1 && is_var(l[0]) && !occurs(l[0], r) && add_solution(l[0], mk_concat(r, m.get_sort(l[0])), deps)) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -2446,6 +2466,12 @@ bool theory_seq::solve_eq(expr_ref_vector const& l, expr_ref_vector const& r, de
|
||||||
TRACE("seq", tout << "binary\n";);
|
TRACE("seq", tout << "binary\n";);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (!ctx.inconsistent() && solve_nth_eq(ls, rs, deps)) {
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
if (!ctx.inconsistent() && solve_nth_eq(rs, ls, deps)) {
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
if (!ctx.inconsistent() && change) {
|
if (!ctx.inconsistent() && change) {
|
||||||
// The propagation step from arithmetic state (e.g. length offset) to length constraints
|
// The propagation step from arithmetic state (e.g. length offset) to length constraints
|
||||||
if (get_context().get_scope_level() == 0) {
|
if (get_context().get_scope_level() == 0) {
|
||||||
|
|
|
@ -432,6 +432,7 @@ namespace smt {
|
||||||
bool simplify_eq(expr_ref_vector& l, expr_ref_vector& r, dependency* dep);
|
bool simplify_eq(expr_ref_vector& l, expr_ref_vector& r, dependency* dep);
|
||||||
bool solve_unit_eq(expr* l, expr* r, dependency* dep);
|
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 solve_unit_eq(expr_ref_vector const& l, expr_ref_vector const& r, dependency* dep);
|
||||||
|
bool solve_nth_eq(expr_ref_vector& ls, expr_ref_vector& rs, dependency* dep);
|
||||||
bool is_binary_eq(expr_ref_vector const& l, expr_ref_vector const& r, expr_ref& x, ptr_vector<expr>& xunits, ptr_vector<expr>& yunits, expr_ref& y);
|
bool is_binary_eq(expr_ref_vector const& l, expr_ref_vector const& r, expr_ref& x, ptr_vector<expr>& xunits, ptr_vector<expr>& yunits, expr_ref& y);
|
||||||
bool is_quat_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, expr_ref& x1, expr_ref_vector& xs, expr_ref& x2, expr_ref& y1, expr_ref_vector& ys, expr_ref& y2);
|
bool is_quat_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, expr_ref& x1, expr_ref_vector& xs, expr_ref& x2, expr_ref& y1, expr_ref_vector& ys, expr_ref& y2);
|
||||||
bool is_ternary_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, expr_ref& x, expr_ref_vector& xs, expr_ref& y1, expr_ref_vector& ys, expr_ref& y2, bool flag1);
|
bool is_ternary_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, expr_ref& x, expr_ref_vector& xs, expr_ref& y1, expr_ref_vector& ys, expr_ref& y2, bool flag1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue