mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 12:08:18 +00:00
some more rewrites
This commit is contained in:
parent
59d8895d15
commit
a74ef394ec
|
@ -824,7 +824,6 @@ br_status seq_rewriter::mk_seq_length(expr* a, expr_ref& result) {
|
||||||
result = m_autil.mk_add(es.size(), es.c_ptr());
|
result = m_autil.mk_add(es.size(), es.c_ptr());
|
||||||
return BR_REWRITE2;
|
return BR_REWRITE2;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
expr* s = nullptr, *offset = nullptr, *length = nullptr;
|
expr* s = nullptr, *offset = nullptr, *length = nullptr;
|
||||||
if (str().is_extract(a, s, offset, length)) {
|
if (str().is_extract(a, s, offset, length)) {
|
||||||
expr_ref len_s(str().mk_length(s), m());
|
expr_ref len_s(str().mk_length(s), m());
|
||||||
|
@ -843,7 +842,6 @@ br_status seq_rewriter::mk_seq_length(expr* a, expr_ref& result) {
|
||||||
result);
|
result);
|
||||||
return BR_REWRITE_FULL;
|
return BR_REWRITE_FULL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return BR_FAILED;
|
return BR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3811,6 +3809,9 @@ br_status seq_rewriter::mk_eq_core(expr * l, expr * r, expr_ref & result) {
|
||||||
return reduce_re_eq(l, r, result);
|
return reduce_re_eq(l, r, result);
|
||||||
}
|
}
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
if (reduce_eq_empty(l, r, result))
|
||||||
|
return BR_REWRITE3;
|
||||||
|
|
||||||
if (!reduce_eq(l, r, new_eqs, changed)) {
|
if (!reduce_eq(l, r, new_eqs, changed)) {
|
||||||
result = m().mk_false();
|
result = m().mk_false();
|
||||||
TRACE("seq_verbose", tout << result << "\n";);
|
TRACE("seq_verbose", tout << result << "\n";);
|
||||||
|
@ -4207,6 +4208,25 @@ bool seq_rewriter::reduce_itos(expr_ref_vector& ls, expr_ref_vector& rs,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool seq_rewriter::reduce_eq_empty(expr* l, expr* r, expr_ref& result) {
|
||||||
|
if (str().is_empty(r))
|
||||||
|
std::swap(l,r);
|
||||||
|
if (!str().is_empty(l))
|
||||||
|
return false;
|
||||||
|
expr* s = nullptr, *offset = nullptr, *len = nullptr;
|
||||||
|
if (str().is_extract(r, s, offset, len)) {
|
||||||
|
expr_ref len_s(str().mk_length(s), m());
|
||||||
|
expr_ref_vector fmls(m());
|
||||||
|
fmls.push_back(m_autil.mk_lt(offset, m_autil.mk_int(0)));
|
||||||
|
fmls.push_back(m().mk_eq(s, l));
|
||||||
|
fmls.push_back(m_autil.mk_lt(len, m_autil.mk_int(0)));
|
||||||
|
fmls.push_back(m_autil.mk_ge(offset, len_s));
|
||||||
|
result = m().mk_or(fmls);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool seq_rewriter::reduce_by_length(expr_ref_vector& ls, expr_ref_vector& rs,
|
bool seq_rewriter::reduce_by_length(expr_ref_vector& ls, expr_ref_vector& rs,
|
||||||
expr_ref_pair_vector& eqs) {
|
expr_ref_pair_vector& eqs) {
|
||||||
|
|
||||||
|
|
|
@ -268,6 +268,7 @@ class seq_rewriter {
|
||||||
bool reduce_subsequence(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& eqs);
|
bool reduce_subsequence(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& eqs);
|
||||||
bool reduce_by_length(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& eqs);
|
bool reduce_by_length(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& eqs);
|
||||||
bool reduce_itos(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& eqs);
|
bool reduce_itos(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& eqs);
|
||||||
|
bool reduce_eq_empty(expr* l, expr* r, expr_ref& result);
|
||||||
bool min_length(expr_ref_vector const& es, unsigned& len);
|
bool min_length(expr_ref_vector const& es, unsigned& len);
|
||||||
expr* concat_non_empty(expr_ref_vector& es);
|
expr* concat_non_empty(expr_ref_vector& es);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue