mirror of
https://github.com/Z3Prover/z3
synced 2025-07-18 02:16:40 +00:00
fix bug in seq rewriter op_cache::find (#4509)
* remove unneeded reverse case in derivative; placeholder for generalized lifted derivative * experimental tweaks to RE rewriter to improve performance * if-then-else lifting (broken code -- preserving this commit in case this idea is useful later) * if-then-else derivative optimizations: new approach templates * implement if-then-else BDD normal form for derivatives (code compiles but is still buggy) * remove std::cout debugging for PR * Revert "remove std::cout debugging for PR" This reverts commitc7bdc44d31
. * debugging * fix derivative interaction with reverse; add flags for left/right derivative and lifting over union/intersection * remove debugging statements for PR * Revert "remove debugging statements for PR" This reverts commit38e85a7288
. * revert some purely cosmetic changes from upstream; fix a bug * revert unnecessary changes * remove some redundant rewrites and add a new one for str.in_re(s, comp(r)) * add disabled rewrite for complement * fix bug in op cache find (result was not saved) * remove debugging std::cout for PR
This commit is contained in:
parent
ec1e733ef2
commit
1fd567d1e9
4 changed files with 99 additions and 28 deletions
|
@ -146,7 +146,6 @@ namespace smt {
|
|||
m_to_propagate.push_back(lit);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Propagate the atom (accept s i r)
|
||||
*
|
||||
|
@ -222,9 +221,9 @@ namespace smt {
|
|||
// (accept s i R) & len(s) > i => (accept s (+ i 1) D(nth(s, i), R)) or conds
|
||||
expr_ref d(m);
|
||||
expr_ref head = th.mk_nth(s, i);
|
||||
d = re().mk_derivative(m.mk_var(0, m.get_sort(head)), r);
|
||||
|
||||
d = derivative_wrapper(m.mk_var(0, m.get_sort(head)), r);
|
||||
// timer tm;
|
||||
rewrite(d);
|
||||
// std::cout << d->get_id() << " " << tm.get_seconds() << "\n";
|
||||
// if (tm.get_seconds() > 1)
|
||||
// std::cout << d << "\n";
|
||||
|
@ -351,6 +350,17 @@ namespace smt {
|
|||
return r;
|
||||
}
|
||||
|
||||
/*
|
||||
Wrapper around the regex symbolic derivative from the rewriter.
|
||||
Ensures that the derivative is written in a normalized BDD form
|
||||
with optimizations for if-then-else expressions involving the head.
|
||||
*/
|
||||
expr_ref seq_regex::derivative_wrapper(expr* hd, expr* r) {
|
||||
expr_ref result = expr_ref(re().mk_derivative(hd, r), m);
|
||||
rewrite(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
void seq_regex::propagate_eq(expr* r1, expr* r2) {
|
||||
expr_ref r = symmetric_diff(r1, r2);
|
||||
expr_ref emp(re().mk_empty(m.get_sort(r)), m);
|
||||
|
@ -392,8 +402,7 @@ namespace smt {
|
|||
literal null_lit = th.mk_literal(is_nullable);
|
||||
expr_ref hd = mk_first(r);
|
||||
expr_ref d(m);
|
||||
d = re().mk_derivative(hd, r);
|
||||
rewrite(d);
|
||||
d = derivative_wrapper(hd, r);
|
||||
literal_vector lits;
|
||||
lits.push_back(~lit);
|
||||
if (null_lit != false_literal)
|
||||
|
@ -450,8 +459,7 @@ namespace smt {
|
|||
th.add_axiom(~lit, ~th.mk_literal(is_nullable));
|
||||
expr_ref hd = mk_first(r);
|
||||
expr_ref d(m);
|
||||
d = re().mk_derivative(hd, r);
|
||||
rewrite(d);
|
||||
d = derivative_wrapper(hd, r);
|
||||
literal_vector lits;
|
||||
expr_ref_pair_vector cofactors(m);
|
||||
get_cofactors(d, cofactors);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue