diff --git a/src/muz/base/dl_context.cpp b/src/muz/base/dl_context.cpp index 6d1f6664a..fc4abc91b 100644 --- a/src/muz/base/dl_context.cpp +++ b/src/muz/base/dl_context.cpp @@ -226,6 +226,7 @@ namespace datalog { m_engine(0), m_closed(false), m_saturation_was_run(false), + m_enable_bind_variables(true), m_last_status(OK), m_last_answer(m), m_engine_type(LAST_ENGINE), @@ -328,7 +329,12 @@ namespace datalog { } expr_ref context::bind_vars(expr* fml, bool is_forall) { - return m_bind_variables(fml, is_forall); + if (m_enable_bind_variables) { + return m_bind_variables(fml, is_forall); + } + else { + return expr_ref(fml, m); + } } void context::register_predicate(func_decl * decl, bool named) { @@ -680,6 +686,7 @@ namespace datalog { } void context::transform_rules(rule_transformer::plugin* plugin) { + flet _enable_bv(m_enable_bind_variables, false); rule_transformer transformer(*this); transformer.register_plugin(plugin); transform_rules(transformer); @@ -841,13 +848,6 @@ namespace datalog { } lbool context::query(expr* query) { -#if 0 - // TODO: what? - if(get_engine() != DUALITY_ENGINE) { - new_query(); - check_rules(m_rule_set); - } -#endif m_mc = mk_skip_model_converter(); m_last_status = OK; m_last_answer = 0; @@ -990,7 +990,6 @@ namespace datalog { for (unsigned i = 0; i < m_rule_fmls.size(); ++i) { expr_ref r = bind_vars(m_rule_fmls[i].get(), true); rules.push_back(r.get()); - // rules.push_back(m_rule_fmls[i].get()); names.push_back(m_rule_names[i]); bounds.push_back(m_rule_bounds[i]); } diff --git a/src/muz/base/dl_context.h b/src/muz/base/dl_context.h index 52b3cbaf2..9da4700e6 100644 --- a/src/muz/base/dl_context.h +++ b/src/muz/base/dl_context.h @@ -205,6 +205,7 @@ namespace datalog { bool m_closed; bool m_saturation_was_run; + bool m_enable_bind_variables; execution_result m_last_status; expr_ref m_last_answer; DL_ENGINE m_engine_type; @@ -294,6 +295,8 @@ namespace datalog { */ expr_ref bind_vars(expr* fml, bool is_forall); + bool& bind_vars_enabled() { return m_enable_bind_variables; } + /** Register datalog relation. diff --git a/src/muz/pdr/pdr_context.cpp b/src/muz/pdr/pdr_context.cpp index 042806d44..177b87820 100644 --- a/src/muz/pdr/pdr_context.cpp +++ b/src/muz/pdr/pdr_context.cpp @@ -729,6 +729,7 @@ namespace pdr { obj_map::iterator it = other.m_prop2level.begin(); obj_map::iterator end = other.m_prop2level.end(); for (; it != end; ++it) { + IF_VERBOSE(2, verbose_stream() << "(pdr-inherit: " << mk_pp(it->m_key, m) << ")\n";); add_property(it->m_key, it->m_value); } } diff --git a/src/muz/transforms/dl_mk_array_blast.cpp b/src/muz/transforms/dl_mk_array_blast.cpp index fb860f2ac..bc3b0cc38 100644 --- a/src/muz/transforms/dl_mk_array_blast.cpp +++ b/src/muz/transforms/dl_mk_array_blast.cpp @@ -266,11 +266,13 @@ namespace datalog { } else { m_rewriter(e, tmp); - change = change || (tmp != e); new_conjs.push_back(tmp); } } - + if (!inserted) { + rules.add_rule(&r); + return false; + } expr_ref fml1(m), fml2(m), body(m), head(m); body = m.mk_and(new_conjs.size(), new_conjs.c_ptr()); head = r.get_head(); @@ -278,8 +280,8 @@ namespace datalog { m_rewriter(body); sub(head); m_rewriter(head); - change = ackermanize(r, body, head) || change; - if (!inserted && !change) { + change = ackermanize(r, body, head); + if (!change) { rules.add_rule(&r); return false; } @@ -287,6 +289,7 @@ namespace datalog { fml2 = m.mk_implies(body, head); proof_ref p(m); rule_set new_rules(m_ctx); + TRACE("dl", tout << fml2 << "\n";); rm.mk_rule(fml2, p, new_rules, r.name()); diff --git a/src/muz/transforms/dl_transforms.cpp b/src/muz/transforms/dl_transforms.cpp index db62c2ec6..81f9d6f64 100644 --- a/src/muz/transforms/dl_transforms.cpp +++ b/src/muz/transforms/dl_transforms.cpp @@ -38,6 +38,8 @@ Revision History: namespace datalog { void apply_default_transformation(context& ctx) { + flet _enable_bv(ctx.bind_vars_enabled(), false); + rule_transformer transf(ctx); ctx.ensure_closed(); transf.reset(); diff --git a/src/smt/theory_arith_core.h b/src/smt/theory_arith_core.h index eb1b98507..48f6def5c 100644 --- a/src/smt/theory_arith_core.h +++ b/src/smt/theory_arith_core.h @@ -1376,6 +1376,9 @@ namespace smt { failed(); return false; } + if (get_context().get_cancel_flag()) { + return true; + } CASSERT("arith", satisfy_bounds()); discard_update_trail(); @@ -2145,6 +2148,9 @@ namespace smt { return false; } TRACE("arith_make_feasible_detail", display(tout);); + if (get_context().get_cancel_flag()) { + return true; + } } TRACE("arith_make_feasible", tout << "make_feasible: sat\n"; display(tout);); CASSERT("arith", wf_rows());