mirror of
https://github.com/Z3Prover/z3
synced 2025-08-18 01:02:15 +00:00
add unconstrained elimination for sequences
This commit is contained in:
parent
a0f3727e90
commit
d1c7ff1a36
12 changed files with 148 additions and 16 deletions
|
@ -5518,6 +5518,7 @@ bool seq_rewriter::reduce_eq(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_
|
|||
reduce_front(ls, rs, eqs) &&
|
||||
reduce_itos(ls, rs, eqs) &&
|
||||
reduce_itos(rs, ls, eqs) &&
|
||||
reduce_value_clash(ls, rs, eqs) &&
|
||||
reduce_by_length(ls, rs, eqs) &&
|
||||
reduce_subsequence(ls, rs, eqs) &&
|
||||
reduce_non_overlap(ls, rs, eqs) &&
|
||||
|
@ -5943,6 +5944,41 @@ bool seq_rewriter::reduce_non_overlap(expr_ref_vector& ls, expr_ref_vector& rs,
|
|||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* partial check for value clash.
|
||||
* checks that elements that do not occur in
|
||||
* other sequence are non-values.
|
||||
* The check could be extended to take non-value
|
||||
* characters (units) into account.
|
||||
*/
|
||||
bool seq_rewriter::reduce_value_clash(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& eqs) {
|
||||
ptr_buffer<expr> es;
|
||||
if (ls.empty() || rs.empty())
|
||||
return true;
|
||||
es.append(ls.size(), ls.data());
|
||||
auto remove = [&](expr* r) {
|
||||
for (unsigned i = 0; i < es.size(); ++i) {
|
||||
if (r == es[i]) {
|
||||
es[i] = es.back();
|
||||
es.pop_back();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
auto is_unit_value = [&](expr* r) {
|
||||
return m().is_value(r) && str().is_unit(r);
|
||||
};
|
||||
for (expr* r : rs) {
|
||||
if (remove(r))
|
||||
continue;
|
||||
if (!is_unit_value(r))
|
||||
return true;
|
||||
}
|
||||
return any_of(es, [&](expr* e) { return is_unit_value(e); });
|
||||
}
|
||||
|
||||
bool seq_rewriter::reduce_subsequence(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& eqs) {
|
||||
|
||||
if (ls.size() > rs.size())
|
||||
|
|
|
@ -340,6 +340,7 @@ class seq_rewriter {
|
|||
bool is_sequence(expr* e, expr_ref_vector& seq);
|
||||
bool is_sequence(eautomaton& aut, expr_ref_vector& seq);
|
||||
bool get_lengths(expr* e, expr_ref_vector& lens, rational& pos);
|
||||
bool reduce_value_clash(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& new_eqs);
|
||||
bool reduce_back(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& new_eqs);
|
||||
bool reduce_front(expr_ref_vector& ls, expr_ref_vector& rs, expr_ref_pair_vector& new_eqs);
|
||||
void remove_empty_and_concats(expr_ref_vector& es);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue