mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
fixes to previous push and streamlining
This commit is contained in:
parent
4e82a9af5f
commit
5974200444
|
@ -3326,9 +3326,9 @@ expr_ref seq_rewriter::mk_antimirov_deriv_restrict(expr* e, expr* d, expr* cond)
|
||||||
}
|
}
|
||||||
|
|
||||||
expr_ref seq_rewriter::mk_regex_union_normalize(expr* r1, expr* r2) {
|
expr_ref seq_rewriter::mk_regex_union_normalize(expr* r1, expr* r2) {
|
||||||
expr_ref _r1(r1, m), _r2(r2, m);
|
expr_ref _r1(r1, m()), _r2(r2, m());
|
||||||
ASSERT(m_util.is_re(r1));
|
SASSERT(m_util.is_re(r1));
|
||||||
ASSERT(m_util.is_re(r2));
|
SASSERT(m_util.is_re(r2));
|
||||||
expr_ref result(m());
|
expr_ref result(m());
|
||||||
std::function<bool(expr*, expr*&, expr*&)> test = [&](expr* t, expr*& a, expr*& b) { return re().is_union(t, a, b); };
|
std::function<bool(expr*, expr*&, expr*&)> test = [&](expr* t, expr*& a, expr*& b) { return re().is_union(t, a, b); };
|
||||||
std::function<expr* (expr*, expr*)> compose = [&](expr* r1, expr* r2) { return re().mk_union(r1, r2); };
|
std::function<expr* (expr*, expr*)> compose = [&](expr* r1, expr* r2) { return re().mk_union(r1, r2); };
|
||||||
|
@ -3346,9 +3346,9 @@ expr_ref seq_rewriter::mk_regex_union_normalize(expr* r1, expr* r2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
expr_ref seq_rewriter::mk_regex_inter_normalize(expr* r1, expr* r2) {
|
expr_ref seq_rewriter::mk_regex_inter_normalize(expr* r1, expr* r2) {
|
||||||
expr_ref _r1(r1, m), _r2(r2, m);
|
expr_ref _r1(r1, m()), _r2(r2, m());
|
||||||
ASSERT(m_util.is_re(r1));
|
SASSERT(m_util.is_re(r1));
|
||||||
ASSERT(m_util.is_re(r2));
|
SASSERT(m_util.is_re(r2));
|
||||||
expr_ref result(m());
|
expr_ref result(m());
|
||||||
std::function<bool(expr*, expr*&, expr*&)> test = [&](expr* t, expr*& a, expr*& b) { return re().is_intersection(t, a, b); };
|
std::function<bool(expr*, expr*&, expr*&)> test = [&](expr* t, expr*& a, expr*& b) { return re().is_intersection(t, a, b); };
|
||||||
std::function<expr* (expr*, expr*)> compose = [&](expr* r1, expr* r2) { return re().mk_inter(r1, r2); };
|
std::function<expr* (expr*, expr*)> compose = [&](expr* r1, expr* r2) { return re().mk_inter(r1, r2); };
|
||||||
|
@ -3382,7 +3382,7 @@ expr_ref seq_rewriter::merge_regex_sets(expr* r1, expr* r2, expr* unit,
|
||||||
expr_ref_vector prefix(m());
|
expr_ref_vector prefix(m());
|
||||||
expr* a, * ar, * ar1, * b, * br, * br1;
|
expr* a, * ar, * ar1, * b, * br, * br1;
|
||||||
VERIFY(m_util.is_re(r1, seq_sort));
|
VERIFY(m_util.is_re(r1, seq_sort));
|
||||||
ASSERT(m_util.is_re(r2));
|
SASSERT(m_util.is_re(r2));
|
||||||
SASSERT(r2->get_sort() == r1->get_sort());
|
SASSERT(r2->get_sort() == r1->get_sort());
|
||||||
// Ordering of expressions used by merging, 0 means unordered, -1 means e1 < e2, 1 means e2 < e1
|
// Ordering of expressions used by merging, 0 means unordered, -1 means e1 < e2, 1 means e2 < e1
|
||||||
auto compare = [&](expr* x, expr* y) {
|
auto compare = [&](expr* x, expr* y) {
|
||||||
|
@ -3395,7 +3395,7 @@ expr_ref seq_rewriter::merge_regex_sets(expr* r1, expr* r2, expr* unit,
|
||||||
|
|
||||||
xid = (re().is_complement(x, z) ? z->get_id() : x->get_id());
|
xid = (re().is_complement(x, z) ? z->get_id() : x->get_id());
|
||||||
yid = (re().is_complement(y, z) ? z->get_id() : y->get_id());
|
yid = (re().is_complement(y, z) ? z->get_id() : y->get_id());
|
||||||
ASSERT(xid != yid);
|
SASSERT(xid != yid);
|
||||||
return (xid < yid ? -1 : 1);
|
return (xid < yid ? -1 : 1);
|
||||||
};
|
};
|
||||||
auto composeresult = [&](expr* suffix) {
|
auto composeresult = [&](expr* suffix) {
|
||||||
|
@ -3404,124 +3404,80 @@ expr_ref seq_rewriter::merge_regex_sets(expr* r1, expr* r2, expr* unit,
|
||||||
result = compose(prefix.back(), result);
|
result = compose(prefix.back(), result);
|
||||||
prefix.pop_back();
|
prefix.pop_back();
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
};
|
};
|
||||||
if (r1 == r2)
|
if (r1 == r2)
|
||||||
result = r1;
|
result = r1;
|
||||||
else if (are_complements(r1, r2))
|
else if (are_complements(r1, r2))
|
||||||
// TODO: loops
|
// TODO: loops
|
||||||
result = unit;
|
return expr_ref(unit, m());
|
||||||
else {
|
else {
|
||||||
signed int k;
|
|
||||||
ar = r1;
|
ar = r1;
|
||||||
br = r2;
|
br = r2;
|
||||||
while (true) {;
|
while (true) {;
|
||||||
|
if (ar == br)
|
||||||
|
return composeresult(ar);
|
||||||
|
|
||||||
|
if (are_complements(ar, br))
|
||||||
|
return expr_ref(unit, m());
|
||||||
|
|
||||||
|
if (test(br, b, br1) && !test(ar, a, ar1))
|
||||||
|
std::swap(ar, br);
|
||||||
|
|
||||||
|
if (test(br, b, br1)) {
|
||||||
|
VERIFY(test(ar, a, ar1));
|
||||||
|
if (are_complements(a, b))
|
||||||
|
return expr_ref(unit, m());
|
||||||
|
switch (compare(a, b)) {
|
||||||
|
case 0:
|
||||||
|
// a == b
|
||||||
|
prefix.push_back(a);
|
||||||
|
ar = ar1;
|
||||||
|
br = br1;
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
// a < b
|
||||||
|
prefix.push_back(a);
|
||||||
|
ar = ar1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// b < a
|
||||||
|
prefix.push_back(b);
|
||||||
|
br = br1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (test(ar, a, ar1)) {
|
if (test(ar, a, ar1)) {
|
||||||
if (test(br, b, br1)) {
|
// br is not decomposable
|
||||||
if (a == b) {
|
if (are_complements(a, br))
|
||||||
prefix.push_back(a);
|
return expr_ref(unit, m());
|
||||||
ar = ar1;
|
switch (compare(a, br)) {
|
||||||
br = br1;
|
case 0:
|
||||||
}
|
// result = prefix ++ ar
|
||||||
else if (are_complements(a, b)) {
|
return composeresult(ar);
|
||||||
result = unit;
|
case -1:
|
||||||
break;
|
// a < br
|
||||||
}
|
prefix.push_back(a);
|
||||||
else {
|
ar = ar1;
|
||||||
k = compare(a, b);
|
break;
|
||||||
if (k == -1) {
|
case 1:
|
||||||
// a < b
|
// br < a, result = prefix ++ (br) ++ ar
|
||||||
prefix.push_back(a);
|
prefix.push_back(br);
|
||||||
ar = ar1;
|
return composeresult(ar);
|
||||||
}
|
default:
|
||||||
else {
|
UNREACHABLE();
|
||||||
// b < a
|
|
||||||
prefix.push_back(b);
|
|
||||||
br = br1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// br is not decomposable
|
|
||||||
if (a == br) {
|
|
||||||
// result = prefix ++ ar
|
|
||||||
composeresult(ar);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (are_complements(a, br)) {
|
|
||||||
result = unit;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
k = compare(a, br);
|
|
||||||
if (k == -1) {
|
|
||||||
// a < br
|
|
||||||
prefix.push_back(a);
|
|
||||||
ar = ar1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// br < a, result = prefix ++ (br) ++ ar
|
|
||||||
prefix.push_back(br);
|
|
||||||
composeresult(ar);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// ar is not decomposable
|
|
||||||
if (test(br, b, br1)) {
|
|
||||||
if (ar == b) {
|
|
||||||
// result = prefix ++ br
|
|
||||||
composeresult(br);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (are_complements(ar, b)) {
|
|
||||||
result = unit;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
k = compare(ar, b);
|
|
||||||
if (k == -1) {
|
|
||||||
// ar < b, result = prefix ++ (ar) ++ br
|
|
||||||
prefix.push_back(ar);
|
|
||||||
composeresult(br);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// b < ar
|
|
||||||
prefix.push_back(b);
|
|
||||||
br = br1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// neither ar nor br is decomposable
|
|
||||||
if (ar == br) {
|
|
||||||
// result = prefix ++ ar
|
|
||||||
composeresult(ar);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (are_complements(ar, br)) {
|
|
||||||
result = unit;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
k = compare(ar, br);
|
|
||||||
if (k == -1) {
|
|
||||||
// ar < br, result = prefix ++ (ar) ++ (br)
|
|
||||||
prefix.push_back(ar);
|
|
||||||
composeresult(br);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// br < ar, result = prefix ++ (br) ++ (ar)
|
|
||||||
prefix.push_back(br);
|
|
||||||
composeresult(ar);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// neither ar nor br is decomposable
|
||||||
|
if (compare(ar, br) == -1)
|
||||||
|
std::swap(ar, br);
|
||||||
|
// br < ar, result = prefix ++ (br) ++ (ar)
|
||||||
|
prefix.push_back(br);
|
||||||
|
return composeresult(ar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
Loading…
Reference in a new issue