mirror of
https://github.com/Z3Prover/z3
synced 2025-07-18 02:16:40 +00:00
* fixing issue #4651 * regression fix * fix #4662 Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * reenabled lift_ites_throttled with an additional filter, without the filter finding the model in report #4651 goes from .02s to 20s, also updated pretty printing of regexes to be more accurate * removing temp testing variable * Allow to skip System.loadLibrary() calls from Java Native class (#4667) * using intended utility methods for sort detection * adding ack/model Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add smt params dependency Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * missing file Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * deps Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * order Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * persist fields Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * dbg build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * reset caches Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * sr Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix cmake build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * shuffle dependencies Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * warnings /errors Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * update include Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * missing cmakelists Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * update cmake Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add depend Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add depend Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * virtual method Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * path Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * move parameters from ast/rewriter to params Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * move fpa Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix warnings Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove pragma Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * dbg Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * updated sat_smt Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix #4651 Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * encoding options #4665 Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * expose name inclusion as optional Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix misc issues around #4661 introduced when adding lazy push/pop to selected theories Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove lazy push from theory_lra Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix dotnet build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * release nodes Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * free memory in egraph Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * avoid duplicate class names frame in sat_scc and sat_smt Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding euf Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * elaborate on smt/drat format outline, expose euf mode as config Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * mk-var during copy Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * move theory_var_list into id_var_list and utilities from smt-enode into it, prepare for theory variables in egraph Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * with bounded Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * Remove duplicate binary condition. Fixes #4668. * butterfly effect on fp? Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * prepare for theory plugins Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * file Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * build fix * remove SMTFD Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * SMTFD is back (#4676) * fixing issue #4651 * regression fix * reenabled lift_ites_throttled with an additional filter, without the filter finding the model in report #4651 goes from .02s to 20s, also updated pretty printing of regexes to be more accurate * removing temp testing variable * using intended utility methods for sort detection * misc edits related to nonground regexes * bug fix of state id off by 1 calculation error and improved pretty printing with regex tooltip generated in dgml state graph * removed unused method declaration * improved id to regex value map info in generated dgml * reorgd callback function for state pretty printer * updated some comments Co-authored-by: Nikolaj Bjorner <nbjorner@microsoft.com> Co-authored-by: Sergey Vladimirov <vlsergey@gmail.com> Co-authored-by: Christoph M. Wintersteiger <cwinter@microsoft.com> Co-authored-by: Arie Gurfinkel <arie.gurfinkel@gmail.com>
This commit is contained in:
parent
d02b0cde7a
commit
af54a79acc
8 changed files with 280 additions and 54 deletions
|
@ -860,11 +860,12 @@ br_status seq_rewriter::mk_seq_length(expr* a, expr_ref& result) {
|
|||
used in the normal form for derivatives in mk_re_derivative.
|
||||
*/
|
||||
br_status seq_rewriter::lift_ites_throttled(func_decl* f, unsigned n, expr* const* args, expr_ref& result) {
|
||||
expr* c = nullptr, *t = nullptr, *e = nullptr;
|
||||
for (unsigned i = 0; i < n; ++i) {
|
||||
if (m().is_ite(args[i], c, t, e) &&
|
||||
expr* c = nullptr, * t = nullptr, * e = nullptr;
|
||||
for (unsigned i = 0; i < n; ++i)
|
||||
if (m().is_ite(args[i], c, t, e) &&
|
||||
lift_ites_filter(f, args[i]) &&
|
||||
(get_depth(t) <= 2 || t->get_ref_count() == 1 ||
|
||||
get_depth(e) <= 2 || e->get_ref_count() == 1)) {
|
||||
get_depth(e) <= 2 || e->get_ref_count() == 1)) {
|
||||
ptr_buffer<expr> new_args;
|
||||
for (unsigned j = 0; j < n; ++j) new_args.push_back(args[j]);
|
||||
new_args[i] = t;
|
||||
|
@ -872,12 +873,26 @@ br_status seq_rewriter::lift_ites_throttled(func_decl* f, unsigned n, expr* cons
|
|||
new_args[i] = e;
|
||||
expr_ref arg2(m().mk_app(f, new_args), m());
|
||||
result = m().mk_ite(c, arg1, arg2);
|
||||
TRACE("seq_verbose", tout << "lifting ite: " << mk_pp(result, m()) << std::endl;);
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
}
|
||||
return BR_FAILED;
|
||||
}
|
||||
|
||||
/* returns false iff the ite must not be lifted */
|
||||
bool seq_rewriter::lift_ites_filter(func_decl* f, expr* ite) {
|
||||
// do not lift ites from sequences over regexes
|
||||
// for example DO NOT lift to_re(ite(c, s, t)) to ite(c, to_re(s), to_re(t))
|
||||
if (u().is_re(f->get_range()) && u().is_seq(m().get_sort(ite)))
|
||||
return false;
|
||||
// The following check is intended to avoid lifting cases such as
|
||||
// substring(s,0,ite(c,e1,e2)) ==> ite(c, substring(s,0,e1), substring(s,0,e2))
|
||||
// TBD: not sure if this is too restrictive though and may block cases when such lifting is desired
|
||||
// if (m_autil.is_int(m().get_sort(ite)) && u().is_seq(f->get_range()))
|
||||
// return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool seq_rewriter::is_suffix(expr* s, expr* offset, expr* len) {
|
||||
expr_ref_vector lens(m());
|
||||
|
@ -3246,11 +3261,12 @@ br_status seq_rewriter::mk_str_in_regexp(expr* a, expr* b, expr_ref& result) {
|
|||
result = m().mk_true();
|
||||
return BR_DONE;
|
||||
}
|
||||
expr* b1 = nullptr;
|
||||
if (re().is_to_re(b, b1)) {
|
||||
result = m_br.mk_eq_rw(a, b1);
|
||||
return BR_REWRITE1;
|
||||
expr_ref b_s(m());
|
||||
if (lift_str_from_to_re(b, b_s)) {
|
||||
result = m_br.mk_eq_rw(a, b_s);
|
||||
return BR_REWRITE_FULL;
|
||||
}
|
||||
expr* b1 = nullptr;
|
||||
expr* eps = nullptr;
|
||||
if (re().is_opt(b, b1) ||
|
||||
(re().is_union(b, b1, eps) && re().is_epsilon(eps)) ||
|
||||
|
@ -3337,6 +3353,30 @@ bool seq_rewriter::has_fixed_length_constraint(expr* a, unsigned& len) {
|
|||
return minl == maxl;
|
||||
}
|
||||
|
||||
bool seq_rewriter::lift_str_from_to_re_ite(expr* r, expr_ref& result)
|
||||
{
|
||||
expr* cond = nullptr, * then_r = nullptr, * else_r = nullptr;
|
||||
expr_ref then_s(m());
|
||||
expr_ref else_s(m());
|
||||
if (m().is_ite(r, cond, then_r, else_r) &&
|
||||
lift_str_from_to_re(then_r, then_s) &&
|
||||
lift_str_from_to_re(else_r, else_s)) {
|
||||
result = m().mk_ite(cond, then_s, else_s);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool seq_rewriter::lift_str_from_to_re(expr* r, expr_ref& result)
|
||||
{
|
||||
expr* s = nullptr;
|
||||
if (re().is_to_re(r, s)) {
|
||||
result = s;
|
||||
return true;
|
||||
}
|
||||
return lift_str_from_to_re_ite(r, result);
|
||||
}
|
||||
|
||||
br_status seq_rewriter::mk_str_to_regexp(expr* a, expr_ref& result) {
|
||||
return BR_FAILED;
|
||||
}
|
||||
|
@ -3375,11 +3415,13 @@ br_status seq_rewriter::mk_re_concat(expr* a, expr* b, expr_ref& result) {
|
|||
result = a;
|
||||
return BR_DONE;
|
||||
}
|
||||
expr* a1 = nullptr, *b1 = nullptr;
|
||||
if (re().is_to_re(a, a1) && re().is_to_re(b, b1)) {
|
||||
result = re().mk_to_re(str().mk_concat(a1, b1));
|
||||
expr_ref a_str(m());
|
||||
expr_ref b_str(m());
|
||||
if (lift_str_from_to_re(a, a_str) && lift_str_from_to_re(b, b_str)) {
|
||||
result = re().mk_to_re(str().mk_concat(a_str, b_str));
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
expr* a1 = nullptr, *b1 = nullptr;
|
||||
if (re().is_star(a, a1) && re().is_star(b, b1) && a1 == b1) {
|
||||
result = a;
|
||||
return BR_DONE;
|
||||
|
@ -3811,7 +3853,14 @@ br_status seq_rewriter::mk_re_star(expr* a, expr_ref& result) {
|
|||
result = re().mk_star(re().mk_union(b1, c1));
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
if (m().is_ite(a, c, b1, c1)) {
|
||||
if ((re().is_full_char(b1) || re().is_full_seq(b1)) &&
|
||||
(re().is_full_char(c1) || re().is_full_seq(c1))) {
|
||||
result = re().mk_full_seq(m().get_sort(b1));
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
|
||||
}
|
||||
return BR_FAILED;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue