Skip to content

Commit 6df8b39

Browse files
Update seq_rewriter.cpp
1 parent eb7fd9e commit 6df8b39

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

src/ast/rewriter/seq_rewriter.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)