Пример #1
0
    subpaving::var process(expr * t, unsigned depth, mpz & n, mpz & d) {
        SASSERT(is_int_real(t));
        checkpoint();

        if (is_cached(t)) {
            unsigned idx = m_cache.find(t);
            qm().set(n, m_cached_numerators[idx]);
            qm().set(d, m_cached_denominators[idx]);
            return m_cached_vars[idx];
        }

        SASSERT(!is_quantifier(t));
        if (::is_var(t) || !m_autil.is_arith_expr(t)) {
            qm().set(n, 1);
            qm().set(d, 1);
            return mk_var_for(t);
        }

        return process_arith_app(to_app(t), depth, n, d);
    }
Пример #2
0
 br_status reduce_app(func_decl * f, unsigned num, expr * const * args, expr_ref & result, proof_ref & result_pr) {
     if (num == 0)
         return BR_FAILED;
     family_id fid = f->get_family_id();
     if (fid == null_family_id)
         return BR_FAILED;
     
     for (unsigned i = 0; i < num; i++) {
         if (!is_ground(args[i]))
             return BR_FAILED; // non-ground terms are not handled.
     }
     
     app * u = nullptr;
     
     if (fid == m().get_basic_family_id())
         u = process_basic_app(f, num, args);
     else if (fid == m_a_util.get_family_id())
         u = process_arith_app(f, num, args);
     else if (fid == m_bv_util.get_family_id())
         u = process_bv_app(f, num, args);
     else if (fid == m_ar_util.get_family_id())
         u = process_array_app(f, num, args);
     else if (fid == m_dt_util.get_family_id())
         u = process_datatype_app(f, num, args);
     
     if (u == nullptr)
         return BR_FAILED;
     
     result = u;
     if (m_produce_proofs) {
         expr * s    = m().mk_app(f, num, args);
         expr * eq   = m().mk_eq(s, u);
         proof * pr1 = m().mk_def_intro(eq);
         result_pr   = m().mk_apply_def(s, u, pr1);
     }
     
     return BR_DONE;
 }