diff --git a/src/sat/smt/array_axioms.cpp b/src/sat/smt/array_axioms.cpp index e824b01ad..a2e5200de 100644 --- a/src/sat/smt/array_axioms.cpp +++ b/src/sat/smt/array_axioms.cpp @@ -700,6 +700,18 @@ namespace array { n->unmark1(); } + bool solver::check_lambdas() { + unsigned num_vars = get_num_vars(); + for (unsigned i = 0; i < num_vars; i++) { + auto* n = var2enode(i); + if (a.is_as_array(n->get_expr()) || is_lambda(n->get_expr())) + for (euf::enode* p : euf::enode_parents(n)) + if (!ctx.is_beta_redex(p, n)) + return false; + } + return true; + } + bool solver::is_shared_arg(euf::enode* r) { SASSERT(r->is_root()); for (euf::enode* n : euf::enode_parents(r)) { diff --git a/src/sat/smt/array_internalize.cpp b/src/sat/smt/array_internalize.cpp index 68dea4d63..bd01f52da 100644 --- a/src/sat/smt/array_internalize.cpp +++ b/src/sat/smt/array_internalize.cpp @@ -252,6 +252,8 @@ namespace array { return p->get_arg(0)->get_root() == n->get_root(); if (a.is_map(p->get_expr())) return true; + if (a.is_store(p->get_expr())) + return true; return false; } diff --git a/src/sat/smt/array_solver.cpp b/src/sat/smt/array_solver.cpp index eb8986098..2481e337a 100644 --- a/src/sat/smt/array_solver.cpp +++ b/src/sat/smt/array_solver.cpp @@ -108,7 +108,9 @@ namespace array { if (m_delay_qhead < m_axiom_trail.size()) return sat::check_result::CR_CONTINUE; - + if (!check_lambdas()) + return sat::check_result::CR_GIVEUP; + // validate_check(); return sat::check_result::CR_DONE; } diff --git a/src/sat/smt/array_solver.h b/src/sat/smt/array_solver.h index f2b4fb565..fbff2afb6 100644 --- a/src/sat/smt/array_solver.h +++ b/src/sat/smt/array_solver.h @@ -218,6 +218,7 @@ namespace array { bool should_prop_upward(var_data const& d) const; bool can_beta_reduce(euf::enode* n) const { return can_beta_reduce(n->get_expr()); } bool can_beta_reduce(expr* e) const; + bool check_lambdas(); var_data& get_var_data(euf::enode* n) { return get_var_data(n->get_th_var(get_id())); } var_data& get_var_data(theory_var v) { return *m_var_data[v]; }