3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-19 04:13:38 +00:00

enable canceling simplex on interrupt, investigating PDR inconsistency

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2015-03-25 12:13:57 -07:00
parent 4145b92136
commit 10cdbb881f
6 changed files with 27 additions and 13 deletions

View file

@ -226,6 +226,7 @@ namespace datalog {
m_engine(0), m_engine(0),
m_closed(false), m_closed(false),
m_saturation_was_run(false), m_saturation_was_run(false),
m_enable_bind_variables(true),
m_last_status(OK), m_last_status(OK),
m_last_answer(m), m_last_answer(m),
m_engine_type(LAST_ENGINE), m_engine_type(LAST_ENGINE),
@ -328,8 +329,13 @@ namespace datalog {
} }
expr_ref context::bind_vars(expr* fml, bool is_forall) { expr_ref context::bind_vars(expr* fml, bool is_forall) {
if (m_enable_bind_variables) {
return m_bind_variables(fml, is_forall); return m_bind_variables(fml, is_forall);
} }
else {
return expr_ref(fml, m);
}
}
void context::register_predicate(func_decl * decl, bool named) { void context::register_predicate(func_decl * decl, bool named) {
if (!is_predicate(decl)) { if (!is_predicate(decl)) {
@ -680,6 +686,7 @@ namespace datalog {
} }
void context::transform_rules(rule_transformer::plugin* plugin) { void context::transform_rules(rule_transformer::plugin* plugin) {
flet<bool> _enable_bv(m_enable_bind_variables, false);
rule_transformer transformer(*this); rule_transformer transformer(*this);
transformer.register_plugin(plugin); transformer.register_plugin(plugin);
transform_rules(transformer); transform_rules(transformer);
@ -841,13 +848,6 @@ namespace datalog {
} }
lbool context::query(expr* query) { 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_mc = mk_skip_model_converter();
m_last_status = OK; m_last_status = OK;
m_last_answer = 0; m_last_answer = 0;
@ -990,7 +990,6 @@ namespace datalog {
for (unsigned i = 0; i < m_rule_fmls.size(); ++i) { for (unsigned i = 0; i < m_rule_fmls.size(); ++i) {
expr_ref r = bind_vars(m_rule_fmls[i].get(), true); expr_ref r = bind_vars(m_rule_fmls[i].get(), true);
rules.push_back(r.get()); rules.push_back(r.get());
// rules.push_back(m_rule_fmls[i].get());
names.push_back(m_rule_names[i]); names.push_back(m_rule_names[i]);
bounds.push_back(m_rule_bounds[i]); bounds.push_back(m_rule_bounds[i]);
} }

View file

@ -205,6 +205,7 @@ namespace datalog {
bool m_closed; bool m_closed;
bool m_saturation_was_run; bool m_saturation_was_run;
bool m_enable_bind_variables;
execution_result m_last_status; execution_result m_last_status;
expr_ref m_last_answer; expr_ref m_last_answer;
DL_ENGINE m_engine_type; DL_ENGINE m_engine_type;
@ -294,6 +295,8 @@ namespace datalog {
*/ */
expr_ref bind_vars(expr* fml, bool is_forall); expr_ref bind_vars(expr* fml, bool is_forall);
bool& bind_vars_enabled() { return m_enable_bind_variables; }
/** /**
Register datalog relation. Register datalog relation.

View file

@ -729,6 +729,7 @@ namespace pdr {
obj_map<expr, unsigned>::iterator it = other.m_prop2level.begin(); obj_map<expr, unsigned>::iterator it = other.m_prop2level.begin();
obj_map<expr, unsigned>::iterator end = other.m_prop2level.end(); obj_map<expr, unsigned>::iterator end = other.m_prop2level.end();
for (; it != end; ++it) { 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); add_property(it->m_key, it->m_value);
} }
} }

View file

@ -266,11 +266,13 @@ namespace datalog {
} }
else { else {
m_rewriter(e, tmp); m_rewriter(e, tmp);
change = change || (tmp != e);
new_conjs.push_back(tmp); new_conjs.push_back(tmp);
} }
} }
if (!inserted) {
rules.add_rule(&r);
return false;
}
expr_ref fml1(m), fml2(m), body(m), head(m); expr_ref fml1(m), fml2(m), body(m), head(m);
body = m.mk_and(new_conjs.size(), new_conjs.c_ptr()); body = m.mk_and(new_conjs.size(), new_conjs.c_ptr());
head = r.get_head(); head = r.get_head();
@ -278,8 +280,8 @@ namespace datalog {
m_rewriter(body); m_rewriter(body);
sub(head); sub(head);
m_rewriter(head); m_rewriter(head);
change = ackermanize(r, body, head) || change; change = ackermanize(r, body, head);
if (!inserted && !change) { if (!change) {
rules.add_rule(&r); rules.add_rule(&r);
return false; return false;
} }
@ -287,6 +289,7 @@ namespace datalog {
fml2 = m.mk_implies(body, head); fml2 = m.mk_implies(body, head);
proof_ref p(m); proof_ref p(m);
rule_set new_rules(m_ctx); rule_set new_rules(m_ctx);
TRACE("dl", tout << fml2 << "\n";);
rm.mk_rule(fml2, p, new_rules, r.name()); rm.mk_rule(fml2, p, new_rules, r.name());

View file

@ -38,6 +38,8 @@ Revision History:
namespace datalog { namespace datalog {
void apply_default_transformation(context& ctx) { void apply_default_transformation(context& ctx) {
flet<bool> _enable_bv(ctx.bind_vars_enabled(), false);
rule_transformer transf(ctx); rule_transformer transf(ctx);
ctx.ensure_closed(); ctx.ensure_closed();
transf.reset(); transf.reset();

View file

@ -1376,6 +1376,9 @@ namespace smt {
failed(); failed();
return false; return false;
} }
if (get_context().get_cancel_flag()) {
return true;
}
CASSERT("arith", satisfy_bounds()); CASSERT("arith", satisfy_bounds());
discard_update_trail(); discard_update_trail();
@ -2145,6 +2148,9 @@ namespace smt {
return false; return false;
} }
TRACE("arith_make_feasible_detail", display(tout);); 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);); TRACE("arith_make_feasible", tout << "make_feasible: sat\n"; display(tout););
CASSERT("arith", wf_rows()); CASSERT("arith", wf_rows());