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

small improvements to bmc engine

courtesy of Marc Brockschmidt
This commit is contained in:
Arie Gurfinkel 2017-07-31 16:07:16 -04:00
parent 7168451201
commit 97c5ab30d5
2 changed files with 20 additions and 2 deletions

View file

@ -32,6 +32,7 @@ Revision History:
#include "muz/transforms/dl_transforms.h" #include "muz/transforms/dl_transforms.h"
#include "muz/transforms/dl_mk_rule_inliner.h" #include "muz/transforms/dl_mk_rule_inliner.h"
#include "ast/scoped_proof.h" #include "ast/scoped_proof.h"
#include "muz/base/fixedpoint_params.hpp"
namespace datalog { namespace datalog {
@ -143,6 +144,7 @@ namespace datalog {
b.m_fparams.m_model = true; b.m_fparams.m_model = true;
b.m_fparams.m_model_compact = true; b.m_fparams.m_model_compact = true;
b.m_fparams.m_mbqi = true; b.m_fparams.m_mbqi = true;
b.m_rule_trace.reset();
} }
void mk_qrule_vars(datalog::rule const& r, unsigned rule_id, expr_ref_vector& sub) { void mk_qrule_vars(datalog::rule const& r, unsigned rule_id, expr_ref_vector& sub) {
@ -279,6 +281,7 @@ namespace datalog {
} }
SASSERT(r); SASSERT(r);
mk_qrule_vars(*r, i, sub); mk_qrule_vars(*r, i, sub);
b.m_rule_trace.push_back(r);
// we have rule, we have variable names of rule. // we have rule, we have variable names of rule.
// extract values for the variables in the rule. // extract values for the variables in the rule.
@ -470,6 +473,7 @@ namespace datalog {
b.m_fparams.m_model_compact = true; b.m_fparams.m_model_compact = true;
// b.m_fparams.m_mbqi = true; // b.m_fparams.m_mbqi = true;
b.m_fparams.m_relevancy_lvl = 2; b.m_fparams.m_relevancy_lvl = 2;
b.m_rule_trace.reset();
} }
lbool check(unsigned level) { lbool check(unsigned level) {
@ -507,6 +511,7 @@ namespace datalog {
} }
} }
SASSERT(r); SASSERT(r);
b.m_rule_trace.push_back(r);
rm.to_formula(*r, fml); rm.to_formula(*r, fml);
IF_VERBOSE(1, verbose_stream() << mk_pp(fml, m) << "\n";); IF_VERBOSE(1, verbose_stream() << mk_pp(fml, m) << "\n";);
prs.push_back(r->get_proof()); prs.push_back(r->get_proof());
@ -760,6 +765,7 @@ namespace datalog {
b.m_fparams.m_model_compact = true; b.m_fparams.m_model_compact = true;
b.m_fparams.m_mbqi = false; b.m_fparams.m_mbqi = false;
b.m_fparams.m_relevancy_lvl = 2; b.m_fparams.m_relevancy_lvl = 2;
b.m_rule_trace.reset();
} }
func_decl_ref mk_predicate(func_decl* pred) { func_decl_ref mk_predicate(func_decl* pred) {
@ -1078,6 +1084,7 @@ namespace datalog {
} }
head = rl->get_head(); head = rl->get_head();
pr = m.mk_hyper_resolve(sz+1, prs.c_ptr(), head, positions, substs); pr = m.mk_hyper_resolve(sz+1, prs.c_ptr(), head, positions, substs);
b.m_rule_trace.push_back(rl.get());
return pr; return pr;
} }
} }
@ -1154,7 +1161,8 @@ namespace datalog {
lbool check() { lbool check() {
setup(); setup();
for (unsigned i = 0; ; ++i) { unsigned max_depth = b.m_ctx.get_params().bmc_linear_unrolling_depth();
for (unsigned i = 0; i < max_depth; ++i) {
IF_VERBOSE(1, verbose_stream() << "level: " << i << "\n";); IF_VERBOSE(1, verbose_stream() << "level: " << i << "\n";);
b.checkpoint(); b.checkpoint();
compile(i); compile(i);
@ -1167,6 +1175,7 @@ namespace datalog {
return res; return res;
} }
} }
return l_undef;
} }
private: private:
@ -1202,6 +1211,7 @@ namespace datalog {
} }
} }
SASSERT(r); SASSERT(r);
b.m_rule_trace.push_back(r);
mk_rule_vars(*r, level, i, sub); mk_rule_vars(*r, level, i, sub);
// we have rule, we have variable names of rule. // we have rule, we have variable names of rule.
@ -1284,6 +1294,7 @@ namespace datalog {
b.m_fparams.m_model_compact = true; b.m_fparams.m_model_compact = true;
b.m_fparams.m_mbqi = false; b.m_fparams.m_mbqi = false;
// m_fparams.m_auto_config = false; // m_fparams.m_auto_config = false;
b.m_rule_trace.reset();
} }
@ -1426,7 +1437,8 @@ namespace datalog {
m_solver(m, m_fparams), m_solver(m, m_fparams),
m_rules(ctx), m_rules(ctx),
m_query_pred(m), m_query_pred(m),
m_answer(m) { m_answer(m),
m_rule_trace(ctx.get_rule_manager()) {
} }
bmc::~bmc() {} bmc::~bmc() {}
@ -1530,6 +1542,10 @@ namespace datalog {
return m_answer; return m_answer;
} }
void bmc::get_rules_along_trace(datalog::rule_ref_vector& rules) {
rules.append(m_rule_trace);
}
void bmc::compile(rule_set const& rules, expr_ref_vector& fmls, unsigned level) { void bmc::compile(rule_set const& rules, expr_ref_vector& fmls, unsigned level) {
nonlinear nl(*this); nonlinear nl(*this);
nl.compile(rules, fmls, level); nl.compile(rules, fmls, level);

View file

@ -38,6 +38,7 @@ namespace datalog {
rule_set m_rules; rule_set m_rules;
func_decl_ref m_query_pred; func_decl_ref m_query_pred;
expr_ref m_answer; expr_ref m_answer;
rule_ref_vector m_rule_trace;
void checkpoint(); void checkpoint();
@ -63,6 +64,7 @@ namespace datalog {
void collect_statistics(statistics& st) const; void collect_statistics(statistics& st) const;
void reset_statistics(); void reset_statistics();
void get_rules_along_trace(datalog::rule_ref_vector& rules);
expr_ref get_answer(); expr_ref get_answer();