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:
parent
551d72b294
commit
6fee9b90cb
13 changed files with 117 additions and 177 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue