@@ -1450,6 +1450,59 @@ br_status seq_rewriter::mk_seq_last_index(expr* a, expr* b, expr_ref& result) {
14501450        result = m_autil.mk_int (0 );
14511451        return  BR_DONE;
14521452    }
1453+ 
1454+     if  (str ().is_empty (b)) {
1455+         result = str ().mk_length (a);
1456+         return  BR_DONE;
1457+     }
1458+ 
1459+     expr_ref_vector as (m ()), bs (m ());
1460+     str ().get_concat_units (a, as);
1461+     str ().get_concat_units (b, bs);
1462+ 
1463+     auto  is_suffix = [&](expr_ref_vector const & as, expr_ref_vector const & bs) {
1464+         if  (as.size () < bs.size ())
1465+             return  l_undef;
1466+         for  (unsigned  j = 0 ; j < bs.size (); ++j) {
1467+             auto  a = as.get (as.size () - j - 1 );
1468+             auto  b = bs.get (bs.size () - j - 1 );
1469+             if  (m ().are_equal (a, b))
1470+                 continue ;
1471+             if  (m ().are_distinct (a, b))
1472+                 return  l_false;
1473+             return  l_undef;
1474+         }
1475+         return  l_true;
1476+     };
1477+ 
1478+     switch  (compare_lengths (as, bs)) {
1479+     case  shorter_c:
1480+         result = minus_one ();
1481+         return  BR_DONE;
1482+     case  same_length_c:
1483+         result = m ().mk_ite (m ().mk_eq (a, b), zero (), minus_one ());
1484+         return  BR_REWRITE_FULL;
1485+     case  longer_c: {
1486+         unsigned  i = as.size ();
1487+         while  (i >= bs.size ()) {
1488+             switch  (is_suffix (as, bs)) {
1489+             case  l_undef:
1490+                 return  BR_FAILED;
1491+             case  l_true:
1492+                 result = m_autil.mk_sub (str ().mk_length (a), m_autil.mk_int (bs.size () - i));
1493+                 return  BR_REWRITE3;
1494+             case  l_false:
1495+                 as.pop_back ();
1496+                 --i;
1497+                 break ;
1498+             }
1499+         }
1500+         break ;
1501+     }
1502+     default :
1503+         break ;
1504+     }
1505+ 
14531506    return  BR_FAILED;
14541507}
14551508
0 commit comments