Skip to content

Commit a8e7074

Browse files
fix #2618
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 7c10fb8 commit a8e7074

File tree

2 files changed

+33
-28
lines changed

2 files changed

+33
-28
lines changed

src/ast/rewriter/seq_rewriter.cpp

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -981,20 +981,18 @@ br_status seq_rewriter::mk_seq_contains(expr* a, expr* b, expr_ref& result) {
981981
br_status seq_rewriter::mk_seq_at(expr* a, expr* b, expr_ref& result) {
982982
zstring c;
983983
rational r;
984-
if (!m_autil.is_numeral(b, r)) {
984+
expr_ref_vector lens(m());
985+
if (!get_lengths(b, lens, r)) {
985986
return BR_FAILED;
986987
}
987-
if (r.is_neg()) {
988+
if (lens.empty() && r.is_neg()) {
988989
result = m_util.str.mk_empty(m().get_sort(a));
989990
return BR_DONE;
990991
}
991-
if (!r.is_unsigned()) {
992-
return BR_FAILED;
993-
}
994-
unsigned len = r.get_unsigned();
992+
995993
expr* a2 = nullptr, *i2 = nullptr;
996-
if (m_util.str.is_at(a, a2, i2)) {
997-
if (len > 0) {
994+
if (lens.empty() && m_util.str.is_at(a, a2, i2)) {
995+
if (r.is_pos()) {
998996
result = m_util.str.mk_empty(m().get_sort(a));
999997
}
1000998
else {
@@ -1003,29 +1001,36 @@ br_status seq_rewriter::mk_seq_at(expr* a, expr* b, expr_ref& result) {
10031001
return BR_DONE;
10041002
}
10051003

1006-
expr_ref_vector as(m());
1007-
m_util.str.get_concat_units(a, as);
1008-
1009-
for (unsigned i = 0; i < as.size(); ++i) {
1010-
expr* a = as.get(i);
1011-
if (m_util.str.is_unit(a)) {
1012-
if (len == i) {
1013-
result = a;
1014-
return BR_REWRITE1;
1015-
}
1004+
m_lhs.reset();
1005+
m_util.str.get_concat_units(a, m_lhs);
1006+
1007+
unsigned i = 0;
1008+
for (; i < m_lhs.size(); ++i) {
1009+
expr* lhs = m_lhs.get(i);
1010+
if (lens.contains(lhs)) {
1011+
lens.erase(lhs);
10161012
}
1017-
else if (i > 0) {
1018-
SASSERT(len >= i);
1019-
result = m_util.str.mk_concat(as.size() - i, as.c_ptr() + i);
1020-
result = m().mk_app(m_util.get_family_id(), OP_SEQ_AT, result, m_autil.mk_int(len - i));
1021-
return BR_REWRITE2;
1013+
else if (m_util.str.is_unit(lhs) && r.is_pos()) {
1014+
r -= rational(1);
10221015
}
10231016
else {
1024-
return BR_FAILED;
1017+
break;
10251018
}
10261019
}
1027-
result = m_util.str.mk_empty(m().get_sort(a));
1028-
return BR_DONE;
1020+
if (i == 0) {
1021+
return BR_FAILED;
1022+
}
1023+
if (m_lhs.size() == i) {
1024+
result = m_util.str.mk_empty(m().get_sort(a));
1025+
return BR_DONE;
1026+
}
1027+
expr_ref pos(m_autil.mk_int(r), m());
1028+
for (expr* rhs : lens) {
1029+
pos = m_autil.mk_add(pos, m_util.str.mk_length(rhs));
1030+
}
1031+
result = m_util.str.mk_concat(m_lhs.size() - i , m_lhs.c_ptr() + i);
1032+
result = m_util.str.mk_at(result, pos);
1033+
return BR_REWRITE2;
10291034
}
10301035

10311036
br_status seq_rewriter::mk_seq_nth(expr* a, expr* b, expr_ref& result) {

src/smt/theory_seq.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3701,8 +3701,8 @@ void theory_seq::add_stoi_axiom(expr* e) {
37013701
literal l = mk_simplified_literal(m_autil.mk_ge(e, m_autil.mk_int(-1)));
37023702
add_axiom(l);
37033703

3704-
// stoi("") = -1
3705-
add_axiom(mk_eq(m_util.str.mk_stoi(m_util.str.mk_empty(m.get_sort(s))), m_autil.mk_int(-1), false));
3704+
// stoi("") = -1
3705+
add_axiom(~mk_literal(m_util.str.mk_is_empty(s)), mk_eq(m_util.str.mk_stoi(s), m_autil.mk_int(-1), false));
37063706
}
37073707

37083708
void theory_seq::add_itos_axiom(expr* e) {

0 commit comments

Comments
 (0)