3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-23 14:23:40 +00:00

limit recursion depth of push_not() to 8 (#4917)

This commit is contained in:
Nuno Lopes 2020-12-29 03:55:43 +00:00 committed by GitHub
parent 374ae52d70
commit 799de71a9f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 7 deletions

View file

@ -201,10 +201,10 @@ expr_ref mk_not(const expr_ref& e) {
} }
expr_ref push_not(const expr_ref& e) { expr_ref push_not(const expr_ref& e, unsigned limit) {
ast_manager& m = e.get_manager(); ast_manager& m = e.get_manager();
if (!is_app(e)) { if (!is_app(e) || limit == 0) {
return expr_ref(m.mk_not(e), m); return mk_not(e);
} }
app* a = to_app(e); app* a = to_app(e);
if (m.is_and(a)) { if (m.is_and(a)) {
@ -213,7 +213,7 @@ expr_ref push_not(const expr_ref& e) {
} }
expr_ref_vector args(m); expr_ref_vector args(m);
for (expr* arg : *a) { for (expr* arg : *a) {
args.push_back(push_not(expr_ref(arg, m))); args.push_back(push_not(expr_ref(arg, m), limit-1));
} }
return mk_or(args); return mk_or(args);
} }
@ -223,11 +223,11 @@ expr_ref push_not(const expr_ref& e) {
} }
expr_ref_vector args(m); expr_ref_vector args(m);
for (expr* arg : *a) { for (expr* arg : *a) {
args.push_back(push_not(expr_ref(arg, m))); args.push_back(push_not(expr_ref(arg, m), limit-1));
} }
return mk_and(args); return mk_and(args);
} }
return expr_ref(mk_not(m, e), m); return mk_not(e);
} }
expr * expand_distinct(ast_manager & m, unsigned num_args, expr * const * args) { expr * expand_distinct(ast_manager & m, unsigned num_args, expr * const * args) {

View file

@ -141,7 +141,7 @@ inline app_ref mk_not(const app_ref& e) { return app_ref(e.m().mk_not(e), e.m())
/** /**
Negate and push over conjunction or disjunction. Negate and push over conjunction or disjunction.
*/ */
expr_ref push_not(const expr_ref& arg); expr_ref push_not(const expr_ref& arg, unsigned limit = 8);
/** /**
Return the expression (and (not (= args[0] args[1])) (not (= args[0] args[2])) ... (not (= args[num_args-2] args[num_args-1]))) Return the expression (and (not (= args[0] args[1])) (not (= args[0] args[2])) ... (not (= args[num_args-2] args[num_args-1])))