mirror of
https://github.com/Z3Prover/z3
synced 2025-04-16 05:48:44 +00:00
filter query predicates from models
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
7bbabcdf6d
commit
e43383b6a8
|
@ -68,9 +68,13 @@ namespace datalog {
|
||||||
m_goals.reset();
|
m_goals.reset();
|
||||||
rm.mk_query(query, m_ctx.get_rules());
|
rm.mk_query(query, m_ctx.get_rules());
|
||||||
m_ctx.apply_default_transformation();
|
m_ctx.apply_default_transformation();
|
||||||
func_decl *head_decl = m_ctx.get_rules().get_output_predicate();
|
func_decl* head_decl = m_ctx.get_rules().get_output_predicate();
|
||||||
|
rule_set& rules = m_ctx.get_rules();
|
||||||
expr_ref head(m_ctx.get_rules().get_predicate_rules(head_decl)[0]->get_head(), m);
|
rule_vector const& rv = rules.get_predicate_rules(head_decl);
|
||||||
|
if (rv.empty()) {
|
||||||
|
return l_false;
|
||||||
|
}
|
||||||
|
expr_ref head(rv[0]->get_head(), m);
|
||||||
ground(head);
|
ground(head);
|
||||||
m_goals.push_back(to_app(head));
|
m_goals.push_back(to_app(head));
|
||||||
return search(20, 0);
|
return search(20, 0);
|
||||||
|
|
|
@ -250,11 +250,11 @@ namespace datalog {
|
||||||
rule_set new_rules(m_ctx);
|
rule_set new_rules(m_ctx);
|
||||||
rm.mk_rule(fml2, p, new_rules, r.name());
|
rm.mk_rule(fml2, p, new_rules, r.name());
|
||||||
|
|
||||||
TRACE("dl", new_rules.last()->display(m_ctx, tout << "new rule\n"););
|
|
||||||
rule_ref new_rule(rm);
|
rule_ref new_rule(rm);
|
||||||
if (m_simplifier.transform_rule(new_rules.last(), new_rule)) {
|
if (m_simplifier.transform_rule(new_rules.last(), new_rule)) {
|
||||||
rules.add_rule(new_rule.get());
|
rules.add_rule(new_rule.get());
|
||||||
rm.mk_rule_rewrite_proof(r, *new_rule.get());
|
rm.mk_rule_rewrite_proof(r, *new_rule.get());
|
||||||
|
TRACE("dl", new_rule->display(m_ctx, tout << "new rule\n"););
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ Revision History:
|
||||||
#include"expr_replacer.h"
|
#include"expr_replacer.h"
|
||||||
#include"bool_rewriter.h"
|
#include"bool_rewriter.h"
|
||||||
#include"expr_safe_replace.h"
|
#include"expr_safe_replace.h"
|
||||||
|
#include"filter_model_converter.h"
|
||||||
|
|
||||||
namespace datalog {
|
namespace datalog {
|
||||||
|
|
||||||
|
@ -335,8 +336,14 @@ namespace datalog {
|
||||||
vars.reverse();
|
vars.reverse();
|
||||||
names.reverse();
|
names.reverse();
|
||||||
func_decl* qpred = m_ctx.mk_fresh_head_predicate(symbol("query"), symbol(), vars.size(), vars.c_ptr(), body_pred);
|
func_decl* qpred = m_ctx.mk_fresh_head_predicate(symbol("query"), symbol(), vars.size(), vars.c_ptr(), body_pred);
|
||||||
m_ctx.register_predicate(qpred, false);
|
m_ctx.register_predicate(qpred, false);
|
||||||
rules.set_output_predicate(qpred);
|
rules.set_output_predicate(qpred);
|
||||||
|
|
||||||
|
if (m_ctx.get_model_converter()) {
|
||||||
|
filter_model_converter* mc = alloc(filter_model_converter, m);
|
||||||
|
mc->insert(qpred);
|
||||||
|
m_ctx.add_model_converter(mc);
|
||||||
|
}
|
||||||
|
|
||||||
expr_ref_vector qhead_args(m);
|
expr_ref_vector qhead_args(m);
|
||||||
for (unsigned i = 0; i < vars.size(); i++) {
|
for (unsigned i = 0; i < vars.size(); i++) {
|
||||||
|
|
|
@ -24,6 +24,7 @@ Revision History:
|
||||||
#include"expr_replacer.h"
|
#include"expr_replacer.h"
|
||||||
#include"dl_rule_transformer.h"
|
#include"dl_rule_transformer.h"
|
||||||
#include"dl_mk_slice.h"
|
#include"dl_mk_slice.h"
|
||||||
|
#include"filter_model_converter.h"
|
||||||
|
|
||||||
class horn_tactic : public tactic {
|
class horn_tactic : public tactic {
|
||||||
struct imp {
|
struct imp {
|
||||||
|
@ -226,6 +227,9 @@ class horn_tactic : public tactic {
|
||||||
}
|
}
|
||||||
queries.reset();
|
queries.reset();
|
||||||
queries.push_back(q);
|
queries.push_back(q);
|
||||||
|
filter_model_converter* mc1 = alloc(filter_model_converter, m);
|
||||||
|
mc1->insert(to_app(q)->get_decl());
|
||||||
|
mc = mc1;
|
||||||
}
|
}
|
||||||
SASSERT(queries.size() == 1);
|
SASSERT(queries.size() == 1);
|
||||||
q = queries[0].get();
|
q = queries[0].get();
|
||||||
|
@ -276,7 +280,13 @@ class horn_tactic : public tactic {
|
||||||
g->reset();
|
g->reset();
|
||||||
if (produce_models) {
|
if (produce_models) {
|
||||||
model_ref md = m_ctx.get_model();
|
model_ref md = m_ctx.get_model();
|
||||||
mc = model2model_converter(&*md);
|
model_converter_ref mc2 = model2model_converter(&*md);
|
||||||
|
if (mc) {
|
||||||
|
mc = concat(mc.get(), mc2.get());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mc = mc2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue