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

lorem ipsum

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-05-26 20:55:02 -07:00
parent 0c2c1861f1
commit 9764007c97
2 changed files with 11 additions and 13 deletions

View file

@ -267,7 +267,7 @@ namespace smt {
return true; return true;
} }
void seq_regex::propagate_eq(expr* r1, expr* r2) { expr_ref seq_regex::symmetric_diff(expr* r1, expr* r2) {
expr_ref r(m); expr_ref r(m);
if (re().is_empty(r1)) if (re().is_empty(r1))
std::swap(r1, r2); std::swap(r1, r2);
@ -276,29 +276,25 @@ namespace smt {
else else
r = re().mk_union(re().mk_diff(r1, r2), re().mk_diff(r2, r1)); r = re().mk_union(re().mk_diff(r1, r2), re().mk_diff(r2, r1));
rewrite(r); rewrite(r);
return r;
}
void seq_regex::propagate_eq(expr* r1, expr* r2) {
expr_ref r = symmetric_diff(r1, r2);
sort* seq_sort = nullptr; sort* seq_sort = nullptr;
VERIFY(u().is_re(r, seq_sort)); VERIFY(u().is_re(r, seq_sort));
expr_ref emp(re().mk_empty(seq_sort), m); expr_ref emp(re().mk_empty(seq_sort), m);
literal lit = ~th.mk_eq(r, emp, false);
expr_ref is_empty = sk().mk_is_empty(r, emp); expr_ref is_empty = sk().mk_is_empty(r, emp);
th.add_axiom(~lit, th.mk_literal(is_empty)); th.add_axiom(~th.mk_eq(r, emp, false), th.mk_literal(is_empty));
} }
void seq_regex::propagate_ne(expr* r1, expr* r2) { void seq_regex::propagate_ne(expr* r1, expr* r2) {
expr_ref r(m); expr_ref r = symmetric_diff(r1, r2);
if (re().is_empty(r1))
std::swap(r1, r2);
if (re().is_empty(r2))
r = r1;
else
r = re().mk_union(re().mk_diff(r1, r2), re().mk_diff(r2, r1));
rewrite(r);
sort* seq_sort = nullptr; sort* seq_sort = nullptr;
VERIFY(u().is_re(r, seq_sort)); VERIFY(u().is_re(r, seq_sort));
expr_ref emp(re().mk_empty(seq_sort), m); expr_ref emp(re().mk_empty(seq_sort), m);
literal lit = ~th.mk_eq(r, emp, false);
expr_ref is_non_empty = sk().mk_is_non_empty(r, emp); expr_ref is_non_empty = sk().mk_is_non_empty(r, emp);
th.add_axiom(~lit, th.mk_literal(is_non_empty)); th.add_axiom(th.mk_eq(r, emp, false), th.mk_literal(is_non_empty));
} }
bool seq_regex::is_member(expr* r, expr* u) { bool seq_regex::is_member(expr* r, expr* u) {

View file

@ -67,6 +67,8 @@ namespace smt {
bool is_member(expr* r, expr* u); bool is_member(expr* r, expr* u);
expr_ref symmetric_diff(expr* r1, expr* r2);
public: public:
seq_regex(theory_seq& th); seq_regex(theory_seq& th);