diff --git a/scripts/mk_project.py b/scripts/mk_project.py index 6e352f06f..f2c688525 100644 --- a/scripts/mk_project.py +++ b/scripts/mk_project.py @@ -55,8 +55,8 @@ def init_project_def(): add_lib('fpa', ['core_tactics', 'bv_tactics', 'sat_tactic'], 'tactic/fpa') add_lib('smt_tactic', ['smt'], 'smt/tactic') add_lib('sls_tactic', ['tactic', 'normal_forms', 'core_tactics', 'bv_tactics'], 'tactic/sls') - add_lib('duality', ['smt', 'interp']) add_lib('qe', ['smt','sat'], 'qe') + add_lib('duality', ['smt', 'interp', 'qe']) add_lib('muz', ['smt', 'sat', 'smt2parser', 'aig_tactic', 'qe'], 'muz/base') add_lib('transforms', ['muz', 'hilbert'], 'muz/transforms') add_lib('rel', ['muz', 'transforms'], 'muz/rel') diff --git a/src/duality/duality.h b/src/duality/duality.h index 82d729104..f20d664be 100644 --- a/src/duality/duality.h +++ b/src/duality/duality.h @@ -97,7 +97,8 @@ namespace Duality { bool IsClosedFormula(const Term &t); - private: + Term AdjustQuantifiers(const Term &t); +private: void SummarizeRec(hash_set &memo, std::vector &lits, int &ops, const Term &t); int CountOperatorsRec(hash_set &memo, const Term &t); diff --git a/src/duality/duality_rpfp.cpp b/src/duality/duality_rpfp.cpp index e3f6da63d..ef62d38c1 100644 --- a/src/duality/duality_rpfp.cpp +++ b/src/duality/duality_rpfp.cpp @@ -573,6 +573,13 @@ namespace Duality { return RemoveRedundancyRec(memo,smemo,t); } + Z3User::Term Z3User::AdjustQuantifiers(const Term &t) + { + if(t.is_quantifier() || (t.is_app() && t.has_quantifiers())) + return t.qe_lite(); + return t; + } + Z3User::Term Z3User::SubstRecHide(hash_map &memo, const Term &t, int number) { std::pair foo(t,expr(ctx)); @@ -2136,6 +2143,7 @@ namespace Duality { g = RemoveRedundancy(g); g = g.simplify(); #endif + g = AdjustQuantifiers(g); return g; } diff --git a/src/duality/duality_solver.cpp b/src/duality/duality_solver.cpp index 40ddf25b1..073f4dce9 100644 --- a/src/duality/duality_solver.cpp +++ b/src/duality/duality_solver.cpp @@ -1819,7 +1819,7 @@ namespace Duality { } bool NodeTooComplicated(Node *node){ - return tree->CountOperators(node->Annotation.Formula) > 5; + return tree->CountOperators(node->Annotation.Formula) > 3; } void SimplifyNode(Node *node){ diff --git a/src/duality/duality_wrapper.cpp b/src/duality/duality_wrapper.cpp index 30531ce51..14fe545e0 100644 --- a/src/duality/duality_wrapper.cpp +++ b/src/duality/duality_wrapper.cpp @@ -26,6 +26,7 @@ Revision History: #include "expr_abstract.h" #include "stopwatch.h" #include "model_smt2_pp.h" +#include "qe_lite.h" namespace Duality { @@ -329,6 +330,14 @@ expr context::make_quant(decl_kind op, const std::vector &_sorts, const st return simplify(p); } + expr expr::qe_lite() const { + ::qe_lite qe(m()); + expr_ref result(to_expr(raw()),m()); + proof_ref pf(m()); + qe(result,pf); + return ctx().cook(result); + } + expr clone_quantifier(const expr &q, const expr &b){ return q.ctx().cook(q.m().update_quantifier(to_quantifier(q.raw()), to_expr(b.raw()))); } diff --git a/src/duality/duality_wrapper.h b/src/duality/duality_wrapper.h index e0824d4be..fec1f08d1 100755 --- a/src/duality/duality_wrapper.h +++ b/src/duality/duality_wrapper.h @@ -558,6 +558,8 @@ namespace Duality { expr simplify(params const & p) const; + expr qe_lite() const; + friend expr clone_quantifier(const expr &, const expr &); friend expr clone_quantifier(const expr &q, const expr &b, const std::vector &patterns);