From d0fc463a0cb85d5ad0ae073f57a3f26949e74333 Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Tue, 24 Sep 2019 15:56:53 -0700 Subject: [PATCH] fix #2581 Signed-off-by: Nikolaj Bjorner --- src/qe/nlqsat.cpp | 2 +- src/smt/theory_arith_core.h | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/qe/nlqsat.cpp b/src/qe/nlqsat.cpp index 816cead19..5a626486f 100644 --- a/src/qe/nlqsat.cpp +++ b/src/qe/nlqsat.cpp @@ -609,7 +609,7 @@ namespace qe { if (a.is_power(n, n1, n2) && a.is_numeral(n2, r) && r.is_unsigned()) { return; } - if (a.is_div(n) && s.m_mode == qsat_t) { + if (a.is_div(n) && s.m_mode == qsat_t && is_ground(n)) { m_has_divs = true; return; } diff --git a/src/smt/theory_arith_core.h b/src/smt/theory_arith_core.h index 21f65dd28..a93911f29 100644 --- a/src/smt/theory_arith_core.h +++ b/src/smt/theory_arith_core.h @@ -339,22 +339,32 @@ namespace smt { template theory_var theory_arith::internalize_mul(app * m) { rational _val; + TRACE("arith", tout << mk_pp(m, get_manager()) << "\n";); SASSERT(m_util.is_mul(m)); - SASSERT(!m_util.is_numeral(m->get_arg(1))); - if (m_util.is_numeral(m->get_arg(0), _val)) { + expr* arg0 = m->get_arg(0); + expr* arg1 = m->get_arg(1); + if (m_util.is_numeral(arg1)) { + std::swap(arg0, arg1); + } + SASSERT(!m_util.is_numeral(arg1)); + if (m_util.is_numeral(arg0, _val)) { SASSERT(m->get_num_args() == 2); numeral val(_val); + if (_val.is_zero()) { + return internalize_numeral(m, val); + } + SASSERT(!val.is_zero()); SASSERT(!val.is_one()); unsigned r_id = mk_row(); scoped_row_vars _sc(m_row_vars, m_row_vars_top); - if (is_var(m->get_arg(1))) { + if (is_var(arg1)) { std::ostringstream strm; strm << mk_pp(m, get_manager()) << " contains a free variable"; throw default_exception(strm.str()); } if (reflection_enabled()) - internalize_term_core(to_app(m->get_arg(0))); - theory_var v = internalize_mul_core(to_app(m->get_arg(1))); + internalize_term_core(to_app(arg0)); + theory_var v = internalize_mul_core(to_app(arg1)); add_row_entry(r_id, val, v); enode * e = mk_enode(m); theory_var s = mk_var(e);