Beispiel #1
0
    br_status reduce_app(func_decl * f, unsigned num, expr * const * args, expr_ref & result, proof_ref & result_pr) {
        result_pr = 0;
        family_id fid = f->get_family_id();
        if (fid == null_family_id) {
            if (num == 0) {
                expr * val = m_model.get_const_interp(f);
                if (val != 0) {
                    result = val;
                    return BR_DONE;
                }

                if (m_model_completion) {
                    sort * s   = f->get_range();
                    expr * val = m_model.get_some_value(s);
                    m_model.register_decl(f, val);
                    result = val;
                    return BR_DONE;
                }
                return BR_FAILED;
            }
            SASSERT(num > 0);
            func_interp * fi = m_model.get_func_interp(f);
            if (fi != 0 && eval_fi(fi, num, args, result)) {
                TRACE("model_evaluator", tout << "reduce_app " << f->get_name() << "\n";
                      for (unsigned i = 0; i < num; i++) tout << mk_ismt2_pp(args[i], m()) << "\n";
                      tout << "---->\n" << mk_ismt2_pp(result, m()) << "\n";);
                return BR_DONE;
            }
 bool evaluate(func_decl* f, unsigned num, expr * const * args, expr_ref & result) {
     func_interp* fi = m_model.get_func_interp(f);
     return (fi != 0) && eval_fi(fi, num, args, result);
 }