expr * poly_simplifier_plugin::mk_mul(numeral const & c, expr * body) { numeral c_prime, d; c_prime = norm(c); if (c_prime.is_zero()) return 0; if (body == 0) return mk_numeral(c_prime); if (c_prime.is_one()) return body; if (is_numeral(body, d)) { c_prime = norm(c_prime*d); if (c_prime.is_zero()) return 0; return mk_numeral(c_prime); } set_curr_sort(body); expr * args[2] = { mk_numeral(c_prime), body }; return mk_mul(2, args); }
expr * fpa_decl_plugin::get_some_value(sort * s) { if (s->is_sort_of(m_family_id, FLOATING_POINT_SORT)) { mpf tmp; m_fm.mk_nan(s->get_parameter(0).get_int(), s->get_parameter(1).get_int(), tmp); expr * res = mk_numeral(tmp); m_fm.del(tmp); return res; } else if (s->is_sort_of(m_family_id, ROUNDING_MODE_SORT)) { func_decl * f = mk_rm_const_decl(OP_FPA_RM_TOWARD_ZERO, 0, nullptr, 0, nullptr, s); return m_manager->mk_const(f); } UNREACHABLE(); return nullptr; }
void arith_simplifier_plugin::div_monomial(expr_ref_vector& monomials, numeral const& g) { numeral n; for (unsigned i = 0; i < monomials.size(); ++i) { expr* e = monomials[i].get(); if (is_numeral(e, n)) { SASSERT((n/g).is_int()); monomials[i] = mk_numeral(n/g); } else if (is_mul(e) && is_numeral(to_app(e)->get_arg(0), n)) { SASSERT((n/g).is_int()); monomials[i] = mk_mul(n/g, to_app(e)->get_arg(1)); } else { UNREACHABLE(); } } }