From 510231df42f0d40a83121fa5363cd50cce6596ec Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Tue, 23 Aug 2016 12:26:38 -0300 Subject: [PATCH] fix to #717. The bottom-up COI filter can only use positive facts for filtering Signed-off-by: Nikolaj Bjorner --- src/muz/dataflow/dataflow.h | 6 +++--- src/muz/transforms/dl_mk_coi_filter.cpp | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/muz/dataflow/dataflow.h b/src/muz/dataflow/dataflow.h index 1e52c5f93..d2be194eb 100644 --- a/src/muz/dataflow/dataflow.h +++ b/src/muz/dataflow/dataflow.h @@ -72,7 +72,7 @@ namespace datalog { } e->get_data().m_value->push_back(cur); } - if (cur->get_uninterpreted_tail_size() == 0) { + if (cur->get_positive_tail_size() == 0) { func_decl *sym = cur->get_head()->get_decl(); bool new_info = m_facts.insert_if_not_there2(sym, Fact())->get_data().m_value.init_up(m_context, cur); if (new_info) { @@ -97,7 +97,7 @@ namespace datalog { } void step_bottom_up() { - for(todo_set::iterator I = m_todo[m_todo_idx].begin(), + for(todo_set::iterator I = m_todo[m_todo_idx].begin(), E = m_todo[m_todo_idx].end(); I!=E; ++I) { ptr_vector * rules; if (!m_body2rules.find(*I, rules)) @@ -236,7 +236,7 @@ namespace datalog { return m_facts.get(m_rule->get_decl(idx), Fact::null_fact); } unsigned size() const { - return m_rule->get_uninterpreted_tail_size(); + return m_rule->get_positive_tail_size(); } }; diff --git a/src/muz/transforms/dl_mk_coi_filter.cpp b/src/muz/transforms/dl_mk_coi_filter.cpp index e3d01a537..0f155f65b 100644 --- a/src/muz/transforms/dl_mk_coi_filter.cpp +++ b/src/muz/transforms/dl_mk_coi_filter.cpp @@ -44,9 +44,7 @@ namespace datalog { if (m_context.has_facts(r->get_decl(i))) { return 0; } - if (false && r->is_neg_tail(i)) { - return 0; - } + if (r->is_neg_tail(i)) { if (!engine.get_fact(r->get_decl(i)).is_reachable()) { if (!new_tail) { @@ -62,6 +60,7 @@ namespace datalog { m_new_tail_neg.push_back(true); } } + else { SASSERT(!new_tail); if (!engine.get_fact(r->get_decl(i)).is_reachable()) {