mirror of
https://github.com/Z3Prover/z3
synced 2025-06-04 13:21:22 +00:00
This commit is contained in:
parent
913b90f7aa
commit
773e829c58
2 changed files with 26 additions and 32 deletions
|
@ -5531,44 +5531,37 @@ lbool seq_rewriter::eq_length(expr* x, expr* y) {
|
||||||
maximal length (the sequence is bounded).
|
maximal length (the sequence is bounded).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool seq_rewriter::min_length(expr* e, unsigned& len) {
|
bool seq_rewriter::min_length(unsigned sz, expr* const* ss, unsigned& len) {
|
||||||
|
ptr_buffer<expr> es;
|
||||||
|
for (unsigned i = 0; i < sz; ++i)
|
||||||
|
es.push_back(ss[i]);
|
||||||
zstring s;
|
zstring s;
|
||||||
len = 0;
|
len = 0;
|
||||||
if (str().is_unit(e)) {
|
bool bounded = true;
|
||||||
len = 1;
|
while (!es.empty()) {
|
||||||
return true;
|
expr* e = es.back();
|
||||||
|
es.pop_back();
|
||||||
|
if (str().is_unit(e))
|
||||||
|
len += 1;
|
||||||
|
else if (str().is_empty(e))
|
||||||
|
continue;
|
||||||
|
else if (str().is_string(e, s))
|
||||||
|
len += s.length();
|
||||||
|
else if (str().is_concat(e))
|
||||||
|
for (expr* arg : *to_app(e))
|
||||||
|
es.push_back(arg);
|
||||||
|
else
|
||||||
|
bounded = false;
|
||||||
}
|
}
|
||||||
else if (str().is_empty(e)) {
|
return bounded;
|
||||||
len = 0;
|
}
|
||||||
return true;
|
|
||||||
}
|
bool seq_rewriter::min_length(expr* e, unsigned& len) {
|
||||||
else if (str().is_string(e, s)) {
|
return min_length(1, &e, len);
|
||||||
len = s.length();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (str().is_concat(e)) {
|
|
||||||
unsigned min_l = 0;
|
|
||||||
bool bounded = true;
|
|
||||||
for (expr* arg : *to_app(e)) {
|
|
||||||
if (!min_length(arg, min_l))
|
|
||||||
bounded = false;
|
|
||||||
len += min_l;
|
|
||||||
}
|
|
||||||
return bounded;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool seq_rewriter::min_length(expr_ref_vector const& es, unsigned& len) {
|
bool seq_rewriter::min_length(expr_ref_vector const& es, unsigned& len) {
|
||||||
unsigned min_l = 0;
|
return min_length(es.size(), es.data(), len);
|
||||||
bool bounded = true;
|
|
||||||
len = 0;
|
|
||||||
for (expr* arg : es) {
|
|
||||||
if (!min_length(arg, min_l))
|
|
||||||
bounded = false;
|
|
||||||
len += min_l;
|
|
||||||
}
|
|
||||||
return bounded;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool seq_rewriter::max_length(expr* e, rational& len) {
|
bool seq_rewriter::max_length(expr* e, rational& len) {
|
||||||
|
|
|
@ -322,6 +322,7 @@ class seq_rewriter {
|
||||||
bool reduce_eq_empty(expr* l, expr* r, expr_ref& result);
|
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);
|
||||||
bool min_length(expr* e, unsigned& len);
|
bool min_length(expr* e, unsigned& len);
|
||||||
|
bool min_length(unsigned sz, expr* const* es, unsigned& len);
|
||||||
bool max_length(expr* e, rational& len);
|
bool max_length(expr* e, rational& len);
|
||||||
lbool eq_length(expr* x, expr* y);
|
lbool eq_length(expr* x, expr* y);
|
||||||
expr* concat_non_empty(expr_ref_vector& es);
|
expr* concat_non_empty(expr_ref_vector& es);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue