3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-07 18:05:21 +00:00

fix #5032, reset substitution during fold transformation

This commit is contained in:
Nikolaj Bjorner 2021-02-15 14:14:25 -08:00
parent 6bd02e122b
commit c387863da1
3 changed files with 10 additions and 2 deletions

View file

@ -2453,6 +2453,12 @@ typedef obj_ref<app, ast_manager> app_ref;
typedef obj_ref<var,ast_manager> var_ref;
typedef app_ref proof_ref;
inline expr_ref operator~(expr_ref const & e) {
if (e.m().is_not(e))
return expr_ref(to_app(e)->get_arg(0), e.m());
return expr_ref(e.m().mk_not(e), e.m());
}
// -----------------------------------
//
// ast_vector (smart pointer vector)

View file

@ -496,6 +496,7 @@ namespace recfun {
if (max_score <= 4)
break;
ptr_vector<sort> domain;
ptr_vector<expr> args;
for (unsigned i = 0; i < n; ++i) {
@ -508,9 +509,10 @@ namespace recfun {
func_decl* f = pd.get_def()->get_decl();
expr_ref new_body(m().mk_app(f, n, args.c_ptr()), m());
set_definition(subst, pd, n, vars, max_expr);
subst.reset();
subst.insert(max_expr, new_body);
result = subst(result);
TRACEFN("substituted\n" << mk_pp(max_expr, m()) << "\n->\n" << new_body << "\n" << result);
TRACEFN("substituted\n" << mk_pp(max_expr, m()) << "\n->\n" << new_body << "\n-result->\n" << result);
}
return result;
}

View file

@ -258,7 +258,7 @@ namespace smt {
for (unsigned v = get_num_vars(); v-- > 0; ) {
expr* e = get_expr(v);
if (seq.is_char(e) && m_var2value[v] == UINT_MAX && get_char_value(v, c)) {
CTRACE("seq", seq.is_char(e), tout << mk_pp(e, m) << " root: " << get_enode(v)->is_root() << " is_value: " << get_char_value(v, c) << "\n";);
CTRACE("seq_verbose", seq.is_char(e), tout << mk_pp(e, m) << " root: " << get_enode(v)->is_root() << " is_value: " << get_char_value(v, c) << "\n";);
enode* r = get_enode(v)->get_root();
m_value2var.reserve(c + 1, null_theory_var);
theory_var u = m_value2var[c];