From 7ab7b8646b9b4fbfec63a573175abea103f2c45d Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Tue, 10 Aug 2021 14:47:26 -0700 Subject: [PATCH] #5454 --- src/sat/smt/q_ematch.cpp | 4 ++++ src/sat/smt/q_mam.cpp | 15 +++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/sat/smt/q_ematch.cpp b/src/sat/smt/q_ematch.cpp index c83680f72..a2c27fd60 100644 --- a/src/sat/smt/q_ematch.cpp +++ b/src/sat/smt/q_ematch.cpp @@ -490,6 +490,10 @@ namespace q { TRACE("q", tout << "add " << mk_pp(_q, m) << "\n";); clause* c = clausify(_q); quantifier* q = c->q(); + if (m_q2clauses.contains(q)) { + dealloc(c); + return; + } ensure_ground_enodes(*c); m_clauses.push_back(c); m_q2clauses.insert(q, c->index()); diff --git a/src/sat/smt/q_mam.cpp b/src/sat/smt/q_mam.cpp index 000f76879..8b75e87ea 100644 --- a/src/sat/smt/q_mam.cpp +++ b/src/sat/smt/q_mam.cpp @@ -414,7 +414,7 @@ namespace q { enode_vector m_candidates; #ifdef Z3DEBUG egraph * m_egraph; - ptr_vector m_patterns; + svector> m_patterns; #endif #ifdef _PROFILE_MAM stopwatch m_watch; @@ -568,7 +568,7 @@ namespace q { m_egraph = ctx; } - ptr_vector & get_patterns() { + svector> & get_patterns() { return m_patterns; } #endif @@ -578,8 +578,8 @@ namespace q { if (m_egraph) { ast_manager & m = m_egraph->get_manager(); out << "patterns:\n"; - for (app* a : m_patterns) - out << mk_pp(a, m) << "\n"; + for (auto [q, a] : m_patterns) + out << mk_pp(q, m) << " " << mk_pp(a, m) << "\n"; } #endif out << "function: " << m_root_lbl->get_name(); @@ -2862,12 +2862,11 @@ namespace q { // The E-matching engine that was built when all + and * applications were binary. // We ignore the pattern if it does not have the expected number of arguments. // This is not the ideal solution, but it avoids possible crashes. - if (tree->expected_num_args() == p->get_num_args()) { + if (tree->expected_num_args() == p->get_num_args()) m_compiler.insert(tree, qa, mp, first_idx, false); - } } - DEBUG_CODE(m_trees[lbl_id]->get_patterns().push_back(mp); - ctx.push(push_back_trail(m_trees[lbl_id]->get_patterns()));); + DEBUG_CODE(m_trees[lbl_id]->get_patterns().push_back(std::make_pair(qa, mp)); + ctx.push(push_back_trail, false>(m_trees[lbl_id]->get_patterns()));); TRACE("trigger_bug", tout << "after add_pattern, first_idx: " << first_idx << "\n"; m_trees[lbl_id]->display(tout);); }