mirror of
https://github.com/Z3Prover/z3
synced 2025-09-05 17:47:41 +00:00
have free variable utility use a class for more efficient re-use
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
73070585b8
commit
c09903288f
39 changed files with 300 additions and 303 deletions
|
@ -294,7 +294,7 @@ namespace datalog {
|
|||
if (m_simplifier.transform_rule(new_rules.last(), new_rule)) {
|
||||
if (r.get_proof()) {
|
||||
scoped_proof _sc(m);
|
||||
r.to_formula(fml1);
|
||||
rm.to_formula(r, fml1);
|
||||
p = m.mk_rewrite(fml1, fml2);
|
||||
p = m.mk_modus_ponens(r.get_proof(), p);
|
||||
new_rule->set_proof(m, p);
|
||||
|
|
|
@ -225,7 +225,6 @@ namespace datalog {
|
|||
mk_interp_tail_simplifier m_simplifier;
|
||||
bit_blaster_rewriter m_blaster;
|
||||
expand_mkbv m_rewriter;
|
||||
|
||||
|
||||
bool blast(rule *r, expr_ref& fml) {
|
||||
proof_ref pr(m);
|
||||
|
@ -235,7 +234,7 @@ namespace datalog {
|
|||
if (!m_simplifier.transform_rule(r, r2)) {
|
||||
r2 = r;
|
||||
}
|
||||
r2->to_formula(fml1);
|
||||
m_context.get_rule_manager().to_formula(*r2.get(), fml1);
|
||||
m_blaster(fml1, fml2, pr);
|
||||
m_rewriter(fml2, fml3);
|
||||
TRACE("dl", tout << mk_pp(fml, m) << " -> " << mk_pp(fml2, m) << " -> " << mk_pp(fml3, m) << "\n";);
|
||||
|
@ -274,7 +273,7 @@ namespace datalog {
|
|||
m_rewriter.m_cfg.set_dst(result);
|
||||
for (unsigned i = 0; !m_context.canceled() && i < sz; ++i) {
|
||||
rule * r = source.get_rule(i);
|
||||
r->to_formula(fml);
|
||||
rm.to_formula(*r, fml);
|
||||
if (blast(r, fml)) {
|
||||
proof_ref pr(m);
|
||||
if (r->get_proof()) {
|
||||
|
|
|
@ -134,9 +134,9 @@ namespace datalog {
|
|||
is_neg.push_back(false);
|
||||
res = rm.mk(head, tail.size(), tail.c_ptr(), is_neg.c_ptr(), tgt->name());
|
||||
if (m_ctx.generate_proof_trace()) {
|
||||
src.to_formula(fml1);
|
||||
tgt->to_formula(fml2);
|
||||
res->to_formula(fml);
|
||||
rm.to_formula(src, fml1);
|
||||
rm.to_formula(*tgt.get(),fml2);
|
||||
rm.to_formula(*res.get(),fml);
|
||||
#if 0
|
||||
sort* ps = m.mk_proof_sort();
|
||||
sort* domain[3] = { ps, ps, m.mk_bool_sort() };
|
||||
|
|
|
@ -238,7 +238,7 @@ namespace datalog {
|
|||
proof* p1 = r.get_proof();
|
||||
for (unsigned i = 0; i < added_rules.get_num_rules(); ++i) {
|
||||
rule* r2 = added_rules.get_rule(i);
|
||||
r2->to_formula(fml);
|
||||
rm.to_formula(*r2, fml);
|
||||
pr = m.mk_modus_ponens(m.mk_def_axiom(m.mk_implies(m.get_fact(p1), fml)), p1);
|
||||
r2->set_proof(m, pr);
|
||||
}
|
||||
|
|
|
@ -179,7 +179,7 @@ namespace datalog {
|
|||
if (m_context.generate_proof_trace()) {
|
||||
expr_ref_vector s1 = m_unifier.get_rule_subst(tgt, true);
|
||||
expr_ref_vector s2 = m_unifier.get_rule_subst(src, false);
|
||||
datalog::resolve_rule(tgt, src, tail_index, s1, s2, *res.get());
|
||||
datalog::resolve_rule(m_rm, tgt, src, tail_index, s1, s2, *res.get());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -37,10 +37,10 @@ namespace datalog {
|
|||
void mk_separate_negated_tails::get_private_vars(rule const& r, unsigned j) {
|
||||
m_vars.reset();
|
||||
m_fv.reset();
|
||||
get_free_vars(r.get_head(), m_fv);
|
||||
m_fv(r.get_head());
|
||||
for (unsigned i = 0; i < r.get_tail_size(); ++i) {
|
||||
if (i != j) {
|
||||
get_free_vars(r.get_tail(i), m_fv);
|
||||
m_fv.accumulate(r.get_tail(i));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,7 @@ namespace datalog {
|
|||
expr* v = p->get_arg(i);
|
||||
if (is_var(v)) {
|
||||
unsigned idx = to_var(v)->get_idx();
|
||||
if (idx >= m_fv.size() || !m_fv[idx]) {
|
||||
if (!m_fv.contains(idx)) {
|
||||
m_vars.push_back(v);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ namespace datalog {
|
|||
rule_manager& rm;
|
||||
context & m_ctx;
|
||||
ptr_vector<expr> m_vars;
|
||||
ptr_vector<sort> m_fv;
|
||||
expr_free_vars m_fv;
|
||||
|
||||
bool has_private_vars(rule const& r, unsigned j);
|
||||
void get_private_vars(rule const& r, unsigned j);
|
||||
|
|
|
@ -120,7 +120,7 @@ namespace datalog {
|
|||
obj_map<rule, rule*>::iterator end = m_rule2slice.end();
|
||||
expr_ref fml(m);
|
||||
for (; it != end; ++it) {
|
||||
it->m_value->to_formula(fml);
|
||||
rm.to_formula(*it->m_value, fml);
|
||||
m_pinned_exprs.push_back(fml);
|
||||
TRACE("dl",
|
||||
tout << "orig: " << mk_pp(fml, m) << "\n";
|
||||
|
@ -238,7 +238,7 @@ namespace datalog {
|
|||
r3->display(m_ctx, tout << "res:"););
|
||||
r1 = r3;
|
||||
}
|
||||
r1->to_formula(concl);
|
||||
rm.to_formula(*r1.get(), concl);
|
||||
proof* new_p = m.mk_hyper_resolve(premises.size(), premises.c_ptr(), concl, positions, substs);
|
||||
m_pinned_exprs.push_back(new_p);
|
||||
m_pinned_rules.push_back(r1.get());
|
||||
|
@ -676,10 +676,10 @@ namespace datalog {
|
|||
}
|
||||
|
||||
void mk_slice::add_free_vars(uint_set& result, expr* e) {
|
||||
ptr_vector<sort> sorts;
|
||||
get_free_vars(e, sorts);
|
||||
for (unsigned i = 0; i < sorts.size(); ++i) {
|
||||
if (sorts[i]) {
|
||||
expr_free_vars fv;
|
||||
fv(e);
|
||||
for (unsigned i = 0; i < fv.size(); ++i) {
|
||||
if (fv[i]) {
|
||||
result.insert(i);
|
||||
}
|
||||
}
|
||||
|
@ -773,14 +773,11 @@ namespace datalog {
|
|||
init_vars(r);
|
||||
app_ref_vector tail(m);
|
||||
app_ref head(m);
|
||||
ptr_vector<sort> sorts;
|
||||
update_predicate(r.get_head(), head);
|
||||
get_free_vars(head.get(), sorts);
|
||||
for (unsigned i = 0; i < r.get_uninterpreted_tail_size(); ++i) {
|
||||
app_ref t(m);
|
||||
update_predicate(r.get_tail(i), t);
|
||||
tail.push_back(t);
|
||||
get_free_vars(t, sorts);
|
||||
}
|
||||
expr_ref_vector conjs = get_tail_conjs(r);
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ namespace datalog {
|
|||
m_unify.apply(r, tail_idx, r2, new_rule)) {
|
||||
expr_ref_vector s1 = m_unify.get_rule_subst(r, true);
|
||||
expr_ref_vector s2 = m_unify.get_rule_subst(r2, false);
|
||||
resolve_rule(r, r2, tail_idx, s1, s2, *new_rule.get());
|
||||
resolve_rule(rm, r, r2, tail_idx, s1, s2, *new_rule.get());
|
||||
expand_tail(*new_rule.get(), tail_idx+r2.get_uninterpreted_tail_size(), src, dst);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue