@@ -981,20 +981,18 @@ br_status seq_rewriter::mk_seq_contains(expr* a, expr* b, expr_ref& result) {
981
981
br_status seq_rewriter::mk_seq_at (expr* a, expr* b, expr_ref& result) {
982
982
zstring c;
983
983
rational r;
984
- if (!m_autil.is_numeral (b, r)) {
984
+ expr_ref_vector lens (m ());
985
+ if (!get_lengths (b, lens, r)) {
985
986
return BR_FAILED;
986
987
}
987
- if (r.is_neg ()) {
988
+ if (lens. empty () && r.is_neg ()) {
988
989
result = m_util.str .mk_empty (m ().get_sort (a));
989
990
return BR_DONE;
990
991
}
991
- if (!r.is_unsigned ()) {
992
- return BR_FAILED;
993
- }
994
- unsigned len = r.get_unsigned ();
992
+
995
993
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 () ) {
998
996
result = m_util.str .mk_empty (m ().get_sort (a));
999
997
}
1000
998
else {
@@ -1003,29 +1001,36 @@ br_status seq_rewriter::mk_seq_at(expr* a, expr* b, expr_ref& result) {
1003
1001
return BR_DONE;
1004
1002
}
1005
1003
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);
1016
1012
}
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 );
1022
1015
}
1023
1016
else {
1024
- return BR_FAILED ;
1017
+ break ;
1025
1018
}
1026
1019
}
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;
1029
1034
}
1030
1035
1031
1036
br_status seq_rewriter::mk_seq_nth (expr* a, expr* b, expr_ref& result) {
0 commit comments