@@ -547,7 +547,7 @@ br_status seq_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * con
547
547
case _OP_STRING_STRIDOF:
548
548
UNREACHABLE ();
549
549
}
550
- CTRACE (" seq_verbose" , st != BR_FAILED, tout << result << " \n " ;);
550
+ CTRACE (" seq_verbose" , st != BR_FAILED, tout << f-> get_name () << " " << result << " \n " ;);
551
551
return st;
552
552
}
553
553
@@ -1142,16 +1142,35 @@ br_status seq_rewriter::mk_seq_replace(expr* a, expr* b, expr* c, expr_ref& resu
1142
1142
result = m_util.str .mk_concat (c, a);
1143
1143
return BR_REWRITE1;
1144
1144
}
1145
-
1146
- if (m_util.str .is_string (b, s2)) {
1147
- m_lhs.reset ();
1148
- m_util.str .get_concat (a, m_lhs);
1149
- if (!m_lhs.empty () && m_util.str .is_string (m_lhs.get (0 ), s1) &&
1150
- s1.contains (s2)) {
1151
- m_lhs[0 ] = m_util.str .mk_string (s1.replace (s2, s3));
1152
- result = m_util.str .mk_concat (m_lhs.size (), m_lhs.c_ptr ());
1153
- return BR_REWRITE1;
1145
+
1146
+ m_lhs.reset ();
1147
+ m_util.str .get_concat (a, m_lhs);
1148
+
1149
+ // a = "", |b| > 0 -> replace("",b,c) = ""
1150
+ if (m_lhs.empty ()) {
1151
+ unsigned len = 0 ;
1152
+ m_util.str .get_concat (b, m_lhs);
1153
+ min_length (m_lhs.size (), m_lhs.c_ptr (), len);
1154
+ if (len > 0 ) {
1155
+ result = a;
1156
+ return BR_DONE;
1154
1157
}
1158
+ return BR_FAILED;
1159
+ }
1160
+
1161
+ // a := b + rest
1162
+ if (m_lhs.get (0 ) == b) {
1163
+ m_lhs[0 ] = c;
1164
+ result = m_util.str .mk_concat (m_lhs.size (), m_lhs.c_ptr ());
1165
+ return BR_REWRITE1;
1166
+ }
1167
+
1168
+ // a : a' + rest string, b is string, c is string, a' contains b
1169
+ if (m_util.str .is_string (b, s2) && m_util.str .is_string (c, s3) &&
1170
+ m_util.str .is_string (m_lhs.get (0 ), s1) && s1.contains (s2) ) {
1171
+ m_lhs[0 ] = m_util.str .mk_string (s1.replace (s2, s3));
1172
+ result = m_util.str .mk_concat (m_lhs.size (), m_lhs.c_ptr ());
1173
+ return BR_REWRITE1;
1155
1174
}
1156
1175
1157
1176
return BR_FAILED;
0 commit comments