3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-26 21:16:02 +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

@ -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

@ -115,7 +115,7 @@ namespace datalog {
m_next_relation_fid(0) {}
virtual ~relation_manager();
void reset();
void reset_relations();
@ -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.