3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-15 21:38:44 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-04-07 14:39:54 -07:00
parent 6d6881c87a
commit 35f184a6b9
11 changed files with 108 additions and 114 deletions

View file

@ -47,7 +47,12 @@ bool model_core::eval(func_decl* f, expr_ref & r) const {
}
void model_core::register_decl(func_decl * d, expr * v) {
SASSERT(d->get_arity() == 0);
if (d->get_arity() > 0) {
func_interp* fi = alloc(func_interp, m, d->get_arity());
fi->set_else(v);
register_decl(d, fi);
return;
}
TRACE("model", tout << "register " << d->get_name() << "\n";
if (v) tout << mk_pp(v, m) << "\n";
);

View file

@ -96,8 +96,9 @@ namespace datalog {
throw default_exception(std::string("certificates are not supported for ") + m_name);
}
virtual model_ref get_model() {
return model_ref(alloc(model, m));
return model_ref();
}
virtual void get_rules_along_trace (rule_ref_vector& rules) {
throw default_exception(std::string("get_rules_along_trace is not supported for ") + m_name);
}

View file

@ -1019,7 +1019,6 @@ namespace datalog {
void rule::display(context & ctx, std::ostream & out) const {
ast_manager & m = ctx.get_manager();
out << m_name.str () << ":\n";
//out << mk_pp(m_head, m);
output_predicate(ctx, m_head, out);
if (m_tail_size == 0) {
out << ".\n";

View file

@ -188,10 +188,8 @@ namespace datalog {
unsigned curr_index = init_len;
rule_dependencies reversed(*this, true);
iterator pit = begin();
iterator pend = end();
for (; pit!=pend; ++pit) {
func_decl * pred = pit->m_key;
for (auto& kv : *this) {
func_decl * pred = kv.m_key;
unsigned deg = in_degree(pred);
if (deg == 0) {
res.push_back(pred);
@ -204,10 +202,7 @@ namespace datalog {
while (curr_index < res.size()) { //res.size() can change in the loop iteration
func_decl * curr = res[curr_index];
const item_set & children = reversed.get_deps(curr);
item_set::iterator cit = children.begin();
item_set::iterator cend = children.end();
for (; cit!=cend; ++cit) {
func_decl * child = *cit;
for (func_decl * child : children) {
deg_map::obj_map_entry * e = degs.find_core(child);
SASSERT(e);
unsigned & child_deg = e->get_data().m_value;
@ -227,20 +222,14 @@ namespace datalog {
return true;
}
void rule_dependencies::display(std::ostream & out ) const
{
iterator pit = begin();
iterator pend = end();
for (; pit != pend; ++pit) {
func_decl * pred = pit->m_key;
const item_set & deps = *pit->m_value;
item_set::iterator dit=deps.begin();
item_set::iterator dend=deps.end();
if (dit == dend) {
void rule_dependencies::display(std::ostream & out ) const {
for (auto const& kv : *this) {
func_decl * pred = kv.m_key;
const item_set & deps = *kv.m_value;
if (deps.empty()) {
out << pred->get_name()<<" - <none>\n";
}
for (; dit != dend; ++dit) {
func_decl * dep = *dit;
for (func_decl* dep : deps) {
out << pred->get_name() << " -> " << dep->get_name() << "\n";
}
}
@ -473,9 +462,8 @@ namespace datalog {
bool change = true;
while (change) {
change = false;
func_decl_set::iterator it = non_founded.begin(), end = non_founded.end();
for (; it != end; ++it) {
rule_vector const& rv = get_predicate_rules(*it);
for (func_decl * f : non_founded) {
rule_vector const& rv = get_predicate_rules(f);
bool found = false;
for (unsigned i = 0; !found && i < rv.size(); ++i) {
rule const& r = *rv[i];
@ -484,8 +472,8 @@ namespace datalog {
is_founded = founded.contains(r.get_decl(j));
}
if (is_founded) {
founded.insert(*it);
non_founded.remove(*it);
founded.insert(f);
non_founded.remove(f);
change = true;
found = true;
}
@ -497,19 +485,12 @@ namespace datalog {
void rule_set::display(std::ostream & out) const {
out << "; rule count: " << get_num_rules() << "\n";
out << "; predicate count: " << m_head2rules.size() << "\n";
func_decl_set::iterator pit = m_output_preds.begin();
func_decl_set::iterator pend = m_output_preds.end();
for (; pit != pend; ++pit) {
out << "; output: " << (*pit)->get_name() << '\n';
for (func_decl * f : m_output_preds) {
out << "; output: " << f->get_name() << '\n';
}
decl2rules::iterator it = m_head2rules.begin();
decl2rules::iterator end = m_head2rules.end();
for (; it != end; ++it) {
ptr_vector<rule> * rules = it->m_value;
ptr_vector<rule>::iterator it2 = rules->begin();
ptr_vector<rule>::iterator end2 = rules->end();
for (; it2 != end2; ++it2) {
rule * r = *it2;
for (auto const& kv : m_head2rules) {
ptr_vector<rule> * rules = kv.m_value;
for (rule* r : *rules) {
if (!r->passes_output_thresholds(m_context)) {
continue;
}
@ -722,8 +703,8 @@ namespace datalog {
void rule_stratifier::display(std::ostream& out) const {
m_deps.display(out << "dependencies\n");
out << "strata\n";
for (unsigned i = 0; i < m_strats.size(); ++i) {
for (auto * item : *m_strats[i]) {
for (auto * s : m_strats) {
for (auto * item : *s) {
out << item->get_name() << " ";
}
out << "\n";

View file

@ -283,14 +283,9 @@ class horn_tactic : public tactic {
g->reset();
if (produce_models) {
model_ref md = m_ctx.get_model();
model_converter_ref mc2 = model2model_converter(&*md);
if (mc) {
model_converter_ref mc2 = model2model_converter(md.get());
mc = concat(mc.get(), mc2.get());
}
else {
mc = mc2;
}
}
break;
}
case l_undef:
@ -320,8 +315,6 @@ class horn_tactic : public tactic {
proof_converter_ref & pc) {
expr_ref fml(m);
func_decl* query_pred = to_app(q)->get_decl();
m_ctx.set_output_predicate(query_pred);
m_ctx.get_rules(); // flush adding rules.

View file

@ -115,6 +115,14 @@ namespace datalog {
e->get_data().m_value = rel;
}
decl_set relation_manager::collect_predicates() const {
decl_set res;
for (auto const& kv : m_relations) {
res.insert(kv.m_key);
}
return res;
}
void relation_manager::collect_non_empty_predicates(decl_set & res) const {
for (auto const& kv : m_relations) {
if (!kv.m_value->fast_empty()) {

View file

@ -155,6 +155,7 @@ namespace datalog {
}
}
decl_set collect_predicates() const;
void collect_non_empty_predicates(decl_set & res) const;
void restrict_predicates(const decl_set & preds);

View file

@ -257,16 +257,6 @@ namespace datalog {
is_approx = true;
}
rel.to_formula(e);
#if 0
// Alternative format:
// List the signature of the relation as
// part of the answer.
expr_ref_vector args(m);
for (unsigned j = 0; j < q->get_arity(); ++j) {
args.push_back(m.mk_var(j, q->get_domain(j)));
}
e = m.mk_implies(m.mk_app(q, args.size(), args.c_ptr()), e);
#endif
ans.push_back(e);
}
SASSERT(!m_last_result_relation);
@ -294,6 +284,19 @@ namespace datalog {
return res;
}
model_ref rel_context::get_model() {
model_ref md = alloc(model, m);
auto& rm = get_rmanager();
func_decl_set decls = rm.collect_predicates();
expr_ref fml(m);
for (func_decl* p : decls) {
rm.get_relation(p).to_formula(fml);
md->register_decl(p, fml);
}
(*m_context.get_model_converter())(md);
return md;
}
void rel_context::transform_rules() {
rule_transformer transf(m_context);
transf.register_plugin(alloc(mk_coi_filter, m_context));

View file

@ -91,6 +91,8 @@ namespace datalog {
void transform_rules() override;
model_ref get_model() override;
bool try_get_size(func_decl* pred, unsigned& rel_size) const override;
/**
\brief query result if it contains fact.

View file

@ -104,13 +104,14 @@ namespace datalog {
generic_model_converter* mc0 = alloc(generic_model_converter, m, "dl_coi");
for (auto const& kv : engine) {
if (!kv.m_value.is_reachable()) {
mc0->add(kv.m_key, m.mk_false());
unreachable.insert(kv.m_key);
}
}
for (func_decl* f : unreachable) {
mc0->add(f, m.mk_false());
}
m_context.add_model_converter(mc0);
TRACE("dl", m_context.get_model_converter()->display(tout););
}
CTRACE("dl", res, res->display(tout););
return res.detach();