diff --git a/src/ast/rewriter/bool_rewriter.cpp b/src/ast/rewriter/bool_rewriter.cpp index 101bbd771..1ee0a53b3 100644 --- a/src/ast/rewriter/bool_rewriter.cpp +++ b/src/ast/rewriter/bool_rewriter.cpp @@ -905,7 +905,26 @@ br_status bool_rewriter::mk_ite_core(expr * c, expr * t, expr * e, expr_ref & re } } +#if 0 + expr* t1, *t2; + // (ite c (not (= t1 t2)) t1) ==> (not (= t1 (and c t2))) + if (m().is_not(t, t1) && m().is_eq(t1, t1, t2) && e == t1) { + expr_ref a(m()); + mk_and(c, t2, a); + result = m().mk_not(m().mk_eq(t1, a)); + return BR_REWRITE2; + } + if (m().is_not(t, t1) && m().is_eq(t1, t2, t1) && e == t1) { + expr_ref a(m()); + mk_and(c, t2, a); + result = m().mk_eq(t1, a); + return BR_REWRITE2; + } +#endif + + if (m().is_ite(t) && m_ite_extra_rules && m_elim_ite) { + std::cout << "extra rules\n"; // (ite c1 (ite c2 t1 t2) t1) ==> (ite (and c1 (not c2)) t2 t1) if (e == to_app(t)->get_arg(1)) { expr_ref not_c2(m()); @@ -923,6 +942,7 @@ br_status bool_rewriter::mk_ite_core(expr * c, expr * t, expr * e, expr_ref & re return BR_REWRITE1; } + if (m().is_ite(e)) { // (ite c1 (ite c2 t1 t2) (ite c3 t1 t2)) ==> (ite (or (and c1 c2) (and (not c1) c3)) t1 t2) if (to_app(t)->get_arg(1) == to_app(e)->get_arg(1) && diff --git a/src/math/lp/monomial_bounds.cpp b/src/math/lp/monomial_bounds.cpp index 89f4b04cf..1ed0956dc 100644 --- a/src/math/lp/monomial_bounds.cpp +++ b/src/math/lp/monomial_bounds.cpp @@ -24,6 +24,11 @@ namespace nla { } } + bool monomial_bounds::is_too_big(mpq const& q) const { + return rational(q).bitsize() > 256; + } + + /** * Accumulate product of variables in monomial starting at position 'start' */ @@ -51,6 +56,8 @@ namespace nla { lp::explanation ex; dep.get_upper_dep(range, ex); auto const& upper = dep.upper(range); + if (is_too_big(upper)) + return false; auto cmp = dep.upper_is_open(range) ? llc::LT : llc::LE; new_lemma lemma(c(), "propagate value - upper bound of range is below value"); lemma &= ex; @@ -62,6 +69,8 @@ namespace nla { lp::explanation ex; dep.get_lower_dep(range, ex); auto const& lower = dep.lower(range); + if (is_too_big(lower)) + return false; auto cmp = dep.lower_is_open(range) ? llc::GT : llc::GE; new_lemma lemma(c(), "propagate value - lower bound of range is above value"); lemma &= ex; @@ -106,7 +115,7 @@ namespace nla { auto le = dep.upper_is_open(range) ? llc::LT : llc::LE; new_lemma lemma(c(), "propagate value - root case - upper bound of range is below value"); lemma &= ex; - lemma |= ineq(v, le, r); + lemma |= ineq(v, le, r); return true; } if (p % 2 == 0 && val_v.is_neg()) { @@ -114,7 +123,7 @@ namespace nla { auto ge = dep.upper_is_open(range) ? llc::GT : llc::GE; new_lemma lemma(c(), "propagate value - root case - upper bound of range is below negative value"); lemma &= ex; - lemma |= ineq(v, ge, -r); + lemma |= ineq(v, ge, -r); return true; } } diff --git a/src/math/lp/monomial_bounds.h b/src/math/lp/monomial_bounds.h index e170cf507..236f29bc0 100644 --- a/src/math/lp/monomial_bounds.h +++ b/src/math/lp/monomial_bounds.h @@ -17,6 +17,7 @@ namespace nla { class monomial_bounds : common { dep_intervals& dep; void var2interval(lpvar v, scoped_dep_interval& i); + bool is_too_big(mpq const& q) const; bool propagate_down(monic const& m, lpvar u); bool propagate_value(dep_interval& range, lpvar v); bool propagate_value(dep_interval& range, lpvar v, unsigned power);