3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-08 10:25:18 +00:00

#5532 add blocking condition for recursion.

This commit is contained in:
Nikolaj Bjorner 2021-09-07 12:28:18 +02:00
parent 93415740b6
commit 8c406c161e
2 changed files with 13 additions and 8 deletions

View file

@ -21,6 +21,7 @@ Notes:
#include "ast/ast.h"
#include "ast/rewriter/rewriter_types.h"
#include "ast/act_cache.h"
#include "util/obj_hashtable.h"
/**
\brief Common infrastructure for AST rewriters.
@ -60,6 +61,7 @@ protected:
proof_ref_vector m_result_pr_stack;
// --------------------------
obj_hashtable<expr> m_blocked;
expr * m_root;
unsigned m_num_qvars;
struct scope {
@ -112,6 +114,8 @@ protected:
void set_new_child_flag(expr * old_t, expr * new_t) { if (old_t != new_t) set_new_child_flag(old_t); }
void elim_reflex_prs(unsigned spos);
void block(expr* t) { m_blocked.insert(t); }
bool is_blocked(expr* t) const { return m_blocked.contains(t); }
public:
rewriter_core(ast_manager & m, bool proof_gen);
virtual ~rewriter_core();

View file

@ -195,14 +195,15 @@ bool rewriter_tpl<Config>::visit(expr * t, unsigned max_depth) {
if (process_const<ProofGen>(to_app(t)))
return true;
TRACE("rewriter_const", tout << "process const: " << mk_bounded_pp(t, m()) << " -> " << mk_bounded_pp(m_r, m()) << "\n";);
#if 1
#else
// disabled pending fix for loop/stack overflow in case of recursive expansion (possible)
rewriter_tpl rw(m(), false, m_cfg);
expr_ref result(m());
rw(m_r, result, m_pr);
m_r = result;
#endif
if (!is_blocked(t)) {
rewriter_tpl rw(m(), false, m_cfg);
for (auto* s : m_blocked)
rw.block(s);
rw.block(t);
expr_ref result(m());
rw(m_r, result, m_pr);
m_r = result;
}
set_new_child_flag(t, m_r);
result_stack().push_back(m_r);
return true;