3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00

fix model generation for tc/po

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-04-11 11:39:27 -07:00
parent 551d72b294
commit 6fee9b90cb
13 changed files with 117 additions and 177 deletions

View file

@ -170,7 +170,11 @@ struct model::top_sort : public ::top_sort<func_decl> {
top_sort(ast_manager& m):
m_rewrite(m)
{}
{
params_ref p;
p.set_bool("elim_ite", false);
m_rewrite.updt_params(p);
}
void add_occurs(func_decl* f) {
m_occur_count.insert(f, occur_count(f) + 1);
@ -428,7 +432,12 @@ expr_ref model::cleanup_expr(top_sort& ts, expr* e, unsigned current_partition)
}
#endif
else {
new_t = ts.m_rewrite.mk_app(f, args.size(), args.c_ptr());
if (m.is_ite(f)) {
new_t = m.mk_app(f, args.size(), args.c_ptr());
}
else {
new_t = ts.m_rewrite.mk_app(f, args.size(), args.c_ptr());
}
}
if (t != new_t.get()) trail.push_back(new_t);
@ -443,7 +452,7 @@ expr_ref model::cleanup_expr(top_sort& ts, expr* e, unsigned current_partition)
break;
}
}
ts.m_rewrite(cache[e], new_t);
return new_t;
}

View file

@ -99,7 +99,11 @@ struct evaluator_cfg : public default_rewriter_cfg {
bool evaluate(func_decl * f, unsigned num, expr * const * args, expr_ref & result) {
func_interp * fi = m_model.get_func_interp(f);
return (fi != nullptr) && eval_fi(fi, num, args, result);
bool r = (fi != nullptr) && eval_fi(fi, num, args, result);
CTRACE("model_evaluator", r, 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 r;
}
// Try to use the entries to quickly evaluate the fi
@ -138,6 +142,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
br_status reduce_app(func_decl * f, unsigned num, expr * const * args, expr_ref & result, proof_ref & result_pr) {
TRACE("model_evaluator", tout << f->get_name() << "\n";);
result_pr = nullptr;
family_id fid = f->get_family_id();
bool is_uninterp = fid != null_family_id && m.get_plugin(fid)->is_considered_uninterpreted(f);
@ -188,7 +193,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
}
return m_b_rw.mk_app_core(f, num, args, result);
}
CTRACE("model_evaluator", st != BR_FAILED, tout << result << "\n";);
if (fid == m_a_rw.get_fid())
st = m_a_rw.mk_app_core(f, num, args, result);
else if (fid == m_bv_rw.get_fid())
@ -208,21 +213,19 @@ struct evaluator_cfg : public default_rewriter_cfg {
st = BR_DONE;
}
else if (evaluate(f, 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";);
st = BR_REWRITE1;
}
if (st == BR_FAILED && !m.is_builtin_family_id(fid))
CTRACE("model_evaluator", st != BR_FAILED, tout << result << "\n";);
if (st == BR_FAILED && !m.is_builtin_family_id(fid)) {
st = evaluate_partial_theory_func(f, num, args, result, result_pr);
CTRACE("model_evaluator", st != BR_FAILED, tout << result << "\n";);
}
if (st == BR_DONE && is_app(result)) {
app* a = to_app(result);
if (evaluate(a->get_decl(), a->get_num_args(), a->get_args(), result)) {
st = BR_REWRITE1;
}
}
#if 1
TRACE("model_evaluator", tout << st << " " << num << " " << m_ar.is_as_array(f) << " " << m_model_completion << "\n";);
if (st == BR_FAILED && num == 0 && m_ar.is_as_array(f) && m_model_completion) {
func_decl* g = nullptr;
VERIFY(m_ar.is_as_array(f, g));
@ -253,7 +256,6 @@ struct evaluator_cfg : public default_rewriter_cfg {
return BR_DONE;
}
}
#endif
CTRACE("model_evaluator", st != BR_FAILED, tout << result << "\n";);
return st;
@ -296,7 +298,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
return false;
}
def = fi->get_interp();
SASSERT(def != 0);
SASSERT(def != nullptr);
return true;
}
@ -320,7 +322,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
br_status evaluate_partial_theory_func(func_decl * f,
unsigned num, expr * const * args,
expr_ref & result, proof_ref & result_pr) {
SASSERT(f != 0);
SASSERT(f != nullptr);
SASSERT(!m.is_builtin_family_id(f->get_family_id()));
result = nullptr;
result_pr = nullptr;
@ -433,8 +435,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
args_table table2(DEFAULT_HASHTABLE_INITIAL_CAPACITY, ah, ae);
// stores with smaller index take precedence
for (unsigned i = stores1.size(); i > 0; ) {
--i;
for (unsigned i = stores1.size(); i-- > 0; ) {
table1.insert(stores1[i].c_ptr());
}

View file

@ -196,7 +196,7 @@ static void pp_funs(std::ostream & out, ast_printer_context & ctx, model_core co
sort_fun_decls(m, md, func_decls);
for (unsigned i = 0; i < func_decls.size(); i++) {
func_decl * f = func_decls[i];
if (recfun_util.is_defined(f)) {
if (recfun_util.is_defined(f) && !recfun_util.is_generated(f)) {
continue;
}
func_interp * f_i = md.get_func_interp(f);