3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00

add a way to supress lambdas

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2022-06-10 14:35:20 -07:00
parent 97437bce4c
commit 5db133f875
8 changed files with 60 additions and 17 deletions

View file

@ -232,6 +232,7 @@ namespace smt {
expr_ref s_instance(m);
proof_ref pr(m);
m_context.get_rewriter()(instance, s_instance, pr);
TRACE("qi_queue_bug", tout << "new instance after simplification:\n" << s_instance << "\n";);
if (m.is_true(s_instance)) {
TRACE("checker", tout << "reduced to true, before:\n" << mk_ll_pp(instance, m););

View file

@ -3743,7 +3743,7 @@ namespace smt {
if (status == l_false) {
return false;
}
if (status == l_true && !m_qmanager->has_quantifiers() && !m_has_lambda) {
if (status == l_true && !m_qmanager->has_quantifiers() && m_lambdas.empty()) {
return false;
}
if (status == l_true && m_qmanager->has_quantifiers()) {
@ -3766,7 +3766,7 @@ namespace smt {
break;
}
}
if (status == l_true && m_has_lambda) {
if (status == l_true && !m_lambdas.empty()) {
m_last_search_failure = LAMBDAS;
status = l_undef;
return false;
@ -4010,7 +4010,7 @@ namespace smt {
TRACE("final_check_step", tout << "RESULT final_check: " << result << "\n";);
if (result == FC_GIVEUP && f != OK)
m_last_search_failure = f;
if (result == FC_DONE && m_has_lambda) {
if (result == FC_DONE && !m_lambdas.empty()) {
m_last_search_failure = LAMBDAS;
result = FC_GIVEUP;
}

View file

@ -773,7 +773,7 @@ namespace smt {
void internalize_quantifier(quantifier * q, bool gate_ctx);
bool m_has_lambda = false;
obj_hashtable<quantifier> m_lambdas, m_non_lambdas;
void internalize_lambda(quantifier * q);
void internalize_formula_core(app * n, bool gate_ctx);
@ -783,6 +783,9 @@ namespace smt {
friend class set_enode_flag_trail;
public:
void add_non_lambda(quantifier* q);
void set_enode_flag(bool_var v, bool is_new_var);
protected:

View file

@ -606,8 +606,21 @@ namespace smt {
bool_var bv = get_bool_var(fa);
assign(literal(bv, false), nullptr);
mark_as_relevant(bv);
push_trail(value_trail<bool>(m_has_lambda));
m_has_lambda = true;
if (m_non_lambdas.contains(q))
return;
push_trail(insert_obj_trail<quantifier>(m_lambdas, q));
m_lambdas.insert(q);
}
void context::add_non_lambda(quantifier* q) {
if (m_non_lambdas.contains(q))
return;
m_non_lambdas.insert(q);
push_trail(insert_obj_trail<quantifier>(m_lambdas, q));
if (m_lambdas.contains(q)) {
m_lambdas.remove(q);
push_trail(remove_obj_trail<quantifier>(m_lambdas, q));
}
}
/**

View file

@ -1455,7 +1455,9 @@ bool theory_seq::internalize_term(app* term) {
if (ctx.e_internalized(term)) {
mk_var(ctx.get_enode(term));
return true;
}
}
suppress_lambda(term);
if (m.is_bool(term) &&
(m_util.str.is_in_re(term) || m_sk.is_skolem(term))) {
@ -1490,6 +1492,23 @@ bool theory_seq::internalize_term(app* term) {
return true;
}
void theory_seq::suppress_lambda(app* term) {
if (!m_util.str.is_map(term) && !m_util.str.is_mapi(term) &&
!m_util.str.is_foldl(term) && !m_util.str.is_foldli(term))
return;
expr* fn = to_app(term)->get_arg(0);
quantifier* q = nullptr;
if (is_lambda(fn))
q = to_quantifier(fn);
else if (is_app(fn))
q = m.is_lambda_def(to_app(fn)->get_decl());
if (q)
ctx.add_non_lambda(q);
}
void theory_seq::add_length(expr* l) {
expr* e = nullptr;
VERIFY(m_util.str.is_length(l, e));

View file

@ -388,6 +388,7 @@ namespace smt {
bool internalize_atom(app* atom, bool) override;
bool internalize_term(app*) override;
void internalize_eq_eh(app * atom, bool_var v) override;
void suppress_lambda(app* term);
void new_eq_eh(theory_var, theory_var) override;
void new_diseq_eh(theory_var, theory_var) override;
void assign_eh(bool_var v, bool is_true) override;