mirror of
https://github.com/Z3Prover/z3
synced 2025-06-07 14:43:23 +00:00
muZ Datalog: be more aggressive when forming join_project
This commit is contained in:
parent
21ea48bfd8
commit
a7c7b70e19
1 changed files with 26 additions and 6 deletions
|
@ -408,25 +408,45 @@ namespace datalog {
|
||||||
|
|
||||||
void compiler::get_local_indexes_for_projection(app * t, var_counter & globals, unsigned ofs,
|
void compiler::get_local_indexes_for_projection(app * t, var_counter & globals, unsigned ofs,
|
||||||
unsigned_vector & res) {
|
unsigned_vector & res) {
|
||||||
|
// TODO: this can be optimized to avoid renames in some cases
|
||||||
unsigned n = t->get_num_args();
|
unsigned n = t->get_num_args();
|
||||||
for(unsigned i = 0; i<n; i++) {
|
for(unsigned i = 0; i<n; i++) {
|
||||||
expr * e = t->get_arg(i);
|
expr * e = t->get_arg(i);
|
||||||
if(!is_var(e) || globals.get(to_var(e)->get_idx())!=0) {
|
if (is_var(e) && globals.get(to_var(e)->get_idx()) > 0) {
|
||||||
continue;
|
globals.update(to_var(e)->get_idx(), -1);
|
||||||
}
|
|
||||||
res.push_back(i + ofs);
|
res.push_back(i + ofs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void compiler::get_local_indexes_for_projection(rule * r, unsigned_vector & res) {
|
void compiler::get_local_indexes_for_projection(rule * r, unsigned_vector & res) {
|
||||||
SASSERT(r->get_positive_tail_size()==2);
|
SASSERT(r->get_positive_tail_size()==2);
|
||||||
ast_manager & m = m_context.get_manager();
|
ast_manager & m = m_context.get_manager();
|
||||||
rule_counter counter;
|
rule_counter counter;
|
||||||
counter.count_rule_vars(m, r);
|
// leave one column copy per var in the head (avoids later duplication)
|
||||||
|
counter.count_vars(m, r->get_head(), -1);
|
||||||
|
|
||||||
|
// take interp & neg preds into account (at least 1 column copy if referenced)
|
||||||
|
unsigned n = r->get_tail_size();
|
||||||
|
if (n > 2) {
|
||||||
|
rule_counter counter_tail;
|
||||||
|
for (unsigned i = 2; i < n; ++i) {
|
||||||
|
counter_tail.count_vars(m, r->get_tail(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
rule_counter::iterator I = counter_tail.begin(), E = counter_tail.end();
|
||||||
|
for (; I != E; ++I) {
|
||||||
|
int& n = counter.get(I->m_key);
|
||||||
|
if (n == 0)
|
||||||
|
n = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
app * t1 = r->get_tail(0);
|
app * t1 = r->get_tail(0);
|
||||||
app * t2 = r->get_tail(1);
|
app * t2 = r->get_tail(1);
|
||||||
counter.count_vars(m, t1, -1);
|
counter.count_vars(m, t1);
|
||||||
counter.count_vars(m, t2, -1);
|
counter.count_vars(m, t2);
|
||||||
|
|
||||||
get_local_indexes_for_projection(t1, counter, 0, res);
|
get_local_indexes_for_projection(t1, counter, 0, res);
|
||||||
get_local_indexes_for_projection(t2, counter, t1->get_num_args(), res);
|
get_local_indexes_for_projection(t2, counter, t1->get_num_args(), res);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue