3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-12 12:08:18 +00:00

z3str3: fix support for re.complement and re.intersection

This commit is contained in:
Murphy Berzish 2020-04-24 17:49:26 -05:00
parent 470e87afe9
commit d21911c073
2 changed files with 17 additions and 1 deletions

View file

@ -2069,6 +2069,18 @@ namespace smt {
return zstring("(.*)"); return zstring("(.*)");
} else if (u.re.is_full_char(a_regex)) { } else if (u.re.is_full_char(a_regex)) {
return zstring("str.allchar"); return zstring("str.allchar");
} else if (u.re.is_intersection(a_regex)) {
expr * a0;
expr * a1;
u.re.is_intersection(a_regex, a0, a1);
zstring a0str = get_std_regex_str(a0);
zstring a1str = get_std_regex_str(a1);
return zstring("(") + a0str + zstring("&&") + a1str + zstring(")");
} else if (u.re.is_complement(a_regex)) {
expr * body;
u.re.is_complement(a_regex, body);
zstring bodyStr = get_std_regex_str(body);
return zstring("(^") + bodyStr + zstring(")");
} else { } else {
TRACE("str", tout << "BUG: unrecognized regex term " << mk_pp(regex, get_manager()) << std::endl;); TRACE("str", tout << "BUG: unrecognized regex term " << mk_pp(regex, get_manager()) << std::endl;);
UNREACHABLE(); return zstring(""); UNREACHABLE(); return zstring("");

View file

@ -902,7 +902,11 @@ namespace smt {
return true; return true;
} else if (u.re.is_complement(re)) { } else if (u.re.is_complement(re)) {
// TODO can we do better? // TODO can we do better?
return false; return false;
} else if (u.re.is_intersection(re)) {
return false;
} else if (u.re.is_complement(re)) {
return false;
} else if (u.re.is_loop(re, sub1, lo, hi) || u.re.is_loop(re, sub1, lo)) { } else if (u.re.is_loop(re, sub1, lo, hi) || u.re.is_loop(re, sub1, lo)) {
return check_regex_length_linearity_helper(sub1, already_star); return check_regex_length_linearity_helper(sub1, already_star);
} else { } else {