@@ -1420,45 +1420,43 @@ br_status seq_rewriter::mk_seq_replace(expr* a, expr* b, expr* c, expr_ref& resu
1420
1420
}
1421
1421
1422
1422
// 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) {
1434
1425
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);
1440
1427
if (m ().are_equal (a0, b0))
1441
1428
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;
1448
1434
}
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)))
1452
1442
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 ;
1461
1458
}
1459
+
1462
1460
if (i > 0 ) {
1463
1461
expr_ref a1 (m_util.str .mk_concat (i, m_lhs.c_ptr (), sort_a), m ());
1464
1462
expr_ref a2 (m_util.str .mk_concat (m_lhs.size ()-i, m_lhs.c_ptr ()+i, sort_a), m ());
0 commit comments