@@ -1410,6 +1410,61 @@ br_status seq_rewriter::mk_seq_replace(expr* a, expr* b, expr* c, expr_ref& resu
1410
1410
result = m_util.str .mk_concat (m_lhs.size (), m_lhs.c_ptr (), sort_a);
1411
1411
return BR_REWRITE1;
1412
1412
}
1413
+ m_lhs.reset ();
1414
+ m_rhs.reset ();
1415
+ m_util.str .get_concat_units (a, m_lhs);
1416
+ m_util.str .get_concat_units (b, m_rhs);
1417
+ if (m_rhs.empty ()) {
1418
+ result = m_util.str .mk_concat (c, a);
1419
+ return BR_REWRITE1;
1420
+ }
1421
+
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
+ }
1434
+ 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
+ }
1440
+ if (m ().are_equal (a0, b0))
1441
+ continue ;
1442
+ if (m ().are_distinct (a0, b0)) {
1443
+ is_prefix = l_false;
1444
+ break ;
1445
+ }
1446
+ is_prefix = l_undef;
1447
+ break ;
1448
+ }
1449
+ if (is_prefix == l_undef)
1450
+ break ;
1451
+ if (is_prefix == l_false)
1452
+ 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;
1461
+ }
1462
+ if (i > 0 ) {
1463
+ expr_ref a1 (m_util.str .mk_concat (i, m_lhs.c_ptr (), sort_a), m ());
1464
+ expr_ref a2 (m_util.str .mk_concat (m_lhs.size ()-i, m_lhs.c_ptr ()+i, sort_a), m ());
1465
+ result = m_util.str .mk_concat (a1, m_util.str .mk_replace (a2, b, c));
1466
+ return BR_REWRITE_FULL;
1467
+ }
1413
1468
1414
1469
return BR_FAILED;
1415
1470
}
0 commit comments