mirror of
https://github.com/Z3Prover/z3
synced 2025-04-16 05:48:44 +00:00
fix axiomatization of str.replace. Fixes issue #703
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
2d8325ed43
commit
879f792125
|
@ -144,6 +144,9 @@ zstring zstring::replace(zstring const& src, zstring const& dst) const {
|
||||||
if (length() < src.length()) {
|
if (length() < src.length()) {
|
||||||
return zstring(*this);
|
return zstring(*this);
|
||||||
}
|
}
|
||||||
|
if (src.length() == 0) {
|
||||||
|
return zstring(*this);
|
||||||
|
}
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (unsigned i = 0; i < length(); ++i) {
|
for (unsigned i = 0; i < length(); ++i) {
|
||||||
bool eq = !found && i + src.length() <= length();
|
bool eq = !found && i + src.length() <= length();
|
||||||
|
|
|
@ -2903,10 +2903,12 @@ void theory_seq::add_replace_axiom(expr* r) {
|
||||||
expr_ref xsy = mk_concat(x, s, y);
|
expr_ref xsy = mk_concat(x, s, y);
|
||||||
literal cnt = mk_literal(m_util.str.mk_contains(a ,s));
|
literal cnt = mk_literal(m_util.str.mk_contains(a ,s));
|
||||||
literal a_emp = mk_eq_empty(a);
|
literal a_emp = mk_eq_empty(a);
|
||||||
|
literal s_emp = mk_eq_empty(s);
|
||||||
add_axiom(~a_emp, mk_seq_eq(r, a));
|
add_axiom(~a_emp, mk_seq_eq(r, a));
|
||||||
add_axiom(cnt, mk_seq_eq(r, a));
|
add_axiom(cnt, mk_seq_eq(r, a));
|
||||||
add_axiom(~cnt, a_emp, mk_seq_eq(a, xsy));
|
add_axiom(~s_emp, mk_seq_eq(r, a));
|
||||||
add_axiom(~cnt, a_emp, mk_seq_eq(r, xty));
|
add_axiom(~cnt, a_emp, s_emp, mk_seq_eq(a, xsy));
|
||||||
|
add_axiom(~cnt, a_emp, s_emp, mk_seq_eq(r, xty));
|
||||||
tightest_prefix(s, x);
|
tightest_prefix(s, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue