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:
parent
7168451201
commit
97c5ab30d5
2 changed files with 20 additions and 2 deletions
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue