Skip to content

Commit 2793c3a

Browse files
more replace rewrites #4084
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 03ba268 commit 2793c3a

File tree

1 file changed

+31
-33
lines changed

1 file changed

+31
-33
lines changed

src/ast/rewriter/seq_rewriter.cpp

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,45 +1420,43 @@ br_status seq_rewriter::mk_seq_replace(expr* a, expr* b, expr* c, expr_ref& resu
14201420
}
14211421

14221422
// is b a prefix of m_lhs at position i?
1423-
1424-
unsigned i = 0;
1425-
for (; i < m_lhs.size(); ++i) {
1426-
lbool is_prefix = l_true;
1427-
for (unsigned j = 0; j < m_rhs.size(); ++j) {
1428-
if (i + j >= m_lhs.size()) {
1429-
expr_ref a1(m_util.str.mk_concat(i, m_lhs.c_ptr(), sort_a), m());
1430-
expr_ref a2(m_util.str.mk_concat(m_lhs.size()-i, m_lhs.c_ptr()+i, sort_a), m());
1431-
result = m().mk_ite(m().mk_eq(a2, b), m_util.str.mk_concat(a1, c), a);
1432-
return BR_REWRITE_FULL;
1433-
}
1423+
auto compare_at_i = [&](unsigned i) {
1424+
for (unsigned j = 0; j < m_rhs.size() && i + j < m_lhs.size(); ++j) {
14341425
expr* b0 = m_rhs.get(j);
1435-
expr* a0 = m_lhs.get(i+j);
1436-
if (!m_util.str.is_unit(b0) || !m_util.str.is_unit(a0)) {
1437-
is_prefix = l_undef;
1438-
break;
1439-
}
1426+
expr* a0 = m_lhs.get(i + j);
14401427
if (m().are_equal(a0, b0))
14411428
continue;
1442-
if (m().are_distinct(a0, b0)) {
1443-
is_prefix = l_false;
1444-
break;
1445-
}
1446-
is_prefix = l_undef;
1447-
break;
1429+
if (!m_util.str.is_unit(b0) || !m_util.str.is_unit(a0))
1430+
return l_undef;
1431+
if (m().are_distinct(a0, b0))
1432+
return l_false;
1433+
return l_undef;
14481434
}
1449-
if (is_prefix == l_undef)
1450-
break;
1451-
if (is_prefix == l_false)
1435+
return l_true;
1436+
};
1437+
1438+
unsigned i = 0;
1439+
for (; i < m_lhs.size(); ++i) {
1440+
lbool cmp = compare_at_i(i);
1441+
if (cmp == l_false && m_util.str.is_unit(m_lhs.get(i)))
14521442
continue;
1453-
expr_ref_vector es(m());
1454-
//std::cout << i << " " << m_lhs << "\n";
1455-
//std::cout << "rhs: " << m_rhs << "\n";
1456-
es.append(i, m_lhs.c_ptr());
1457-
es.push_back(c);
1458-
es.append(m_lhs.size()-i-m_rhs.size(), m_lhs.c_ptr()+i+m_rhs.size());
1459-
result = m_util.str.mk_concat(es, sort_a);
1460-
return BR_REWRITE_FULL;
1443+
if (cmp == l_true && m_lhs.size() < i + m_rhs.size()) {
1444+
expr_ref a1(m_util.str.mk_concat(i, m_lhs.c_ptr(), sort_a), m());
1445+
expr_ref a2(m_util.str.mk_concat(m_lhs.size()-i, m_lhs.c_ptr()+i, sort_a), m());
1446+
result = m().mk_ite(m().mk_eq(a2, b), m_util.str.mk_concat(a1, c), a);
1447+
return BR_REWRITE_FULL;
1448+
}
1449+
if (cmp == l_true) {
1450+
expr_ref_vector es(m());
1451+
es.append(i, m_lhs.c_ptr());
1452+
es.push_back(c);
1453+
es.append(m_lhs.size()-i-m_rhs.size(), m_lhs.c_ptr()+i+m_rhs.size());
1454+
result = m_util.str.mk_concat(es, sort_a);
1455+
return BR_REWRITE_FULL;
1456+
}
1457+
break;
14611458
}
1459+
14621460
if (i > 0) {
14631461
expr_ref a1(m_util.str.mk_concat(i, m_lhs.c_ptr(), sort_a), m());
14641462
expr_ref a2(m_util.str.mk_concat(m_lhs.size()-i, m_lhs.c_ptr()+i, sort_a), m());

0 commit comments

Comments
 (0)