mirror of
https://github.com/Z3Prover/z3
synced 2025-07-24 13:18:55 +00:00
reorganization of rule_set structure
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
5915533170
commit
8f46179def
65 changed files with 778 additions and 10668 deletions
|
@ -64,8 +64,7 @@ namespace datalog {
|
|||
reset_dealloc_values(m_data);
|
||||
}
|
||||
|
||||
void rule_dependencies::remove_m_data_entry(func_decl * key)
|
||||
{
|
||||
void rule_dependencies::remove_m_data_entry(func_decl * key) {
|
||||
item_set * itm_set = m_data.find(key);
|
||||
dealloc(itm_set);
|
||||
m_data.remove(key);
|
||||
|
@ -109,7 +108,7 @@ namespace datalog {
|
|||
void rule_dependencies::populate(rule const* r) {
|
||||
TRACE("dl_verbose", tout << r->get_decl()->get_name() << "\n";);
|
||||
m_visited.reset();
|
||||
func_decl * d = r->get_head()->get_decl();
|
||||
func_decl * d = r->get_decl();
|
||||
func_decl_set & s = ensure_key(d);
|
||||
|
||||
for (unsigned i = 0; i < r->get_tail_size(); ++i) {
|
||||
|
@ -164,7 +163,7 @@ namespace datalog {
|
|||
}
|
||||
ptr_vector<func_decl>::iterator rit = to_remove.begin();
|
||||
ptr_vector<func_decl>::iterator rend = to_remove.end();
|
||||
for (; rit!=rend; ++rit) {
|
||||
for (; rit != rend; ++rit) {
|
||||
remove_m_data_entry(*rit);
|
||||
}
|
||||
}
|
||||
|
@ -173,7 +172,7 @@ namespace datalog {
|
|||
remove_m_data_entry(itm);
|
||||
iterator pit = begin();
|
||||
iterator pend = end();
|
||||
for (; pit!=pend; ++pit) {
|
||||
for (; pit != pend; ++pit) {
|
||||
item_set & itms = *pit->get_value();
|
||||
itms.remove(itm);
|
||||
}
|
||||
|
@ -244,7 +243,7 @@ namespace datalog {
|
|||
}
|
||||
curr_index++;
|
||||
}
|
||||
if (res.size()<init_len+m_data.size()) {
|
||||
if (res.size() < init_len + m_data.size()) {
|
||||
res.shrink(init_len);
|
||||
return false;
|
||||
}
|
||||
|
@ -283,17 +282,19 @@ namespace datalog {
|
|||
m_rule_manager(ctx.get_rule_manager()),
|
||||
m_rules(m_rule_manager),
|
||||
m_deps(ctx),
|
||||
m_stratifier(0) {
|
||||
m_stratifier(0),
|
||||
m_refs(ctx.get_manager()) {
|
||||
}
|
||||
|
||||
rule_set::rule_set(const rule_set & rs)
|
||||
: m_context(rs.m_context),
|
||||
m_rule_manager(rs.m_rule_manager),
|
||||
m_rules(m_rule_manager),
|
||||
m_deps(rs.m_context),
|
||||
m_stratifier(0) {
|
||||
add_rules(rs);
|
||||
if (rs.m_stratifier) {
|
||||
rule_set::rule_set(const rule_set & other)
|
||||
: m_context(other.m_context),
|
||||
m_rule_manager(other.m_rule_manager),
|
||||
m_rules(m_rule_manager),
|
||||
m_deps(other.m_context),
|
||||
m_stratifier(0),
|
||||
m_refs(m_context.get_manager()) {
|
||||
add_rules(other);
|
||||
if (other.m_stratifier) {
|
||||
VERIFY(close());
|
||||
}
|
||||
}
|
||||
|
@ -303,18 +304,67 @@ namespace datalog {
|
|||
}
|
||||
|
||||
void rule_set::reset() {
|
||||
if (m_stratifier) {
|
||||
m_stratifier = 0;
|
||||
}
|
||||
m_rules.reset();
|
||||
reset_dealloc_values(m_head2rules);
|
||||
m_deps.reset();
|
||||
m_rules.reset();
|
||||
m_stratifier = 0;
|
||||
m_output_preds.reset();
|
||||
m_orig2pred.reset();
|
||||
m_pred2orig.reset();
|
||||
m_refs.reset();
|
||||
}
|
||||
|
||||
ast_manager & rule_set::get_manager() const {
|
||||
return m_context.get_manager();
|
||||
}
|
||||
|
||||
func_decl* rule_set::get_orig(func_decl* pred) const {
|
||||
func_decl* orig = pred;
|
||||
m_pred2orig.find(pred, orig);
|
||||
return orig;
|
||||
}
|
||||
|
||||
func_decl* rule_set::get_pred(func_decl* orig) const {
|
||||
func_decl* pred = orig;
|
||||
m_orig2pred.find(orig, pred);
|
||||
return pred;
|
||||
}
|
||||
|
||||
void rule_set::inherit_predicates(rule_set const& other) {
|
||||
m_refs.append(other.m_refs);
|
||||
SASSERT(m_refs.size() < 1000);
|
||||
set_union(m_output_preds, other.m_output_preds);
|
||||
{
|
||||
obj_map<func_decl, func_decl*>::iterator it = other.m_orig2pred.begin();
|
||||
obj_map<func_decl, func_decl*>::iterator end = other.m_orig2pred.end();
|
||||
for (; it != end; ++it) {
|
||||
m_orig2pred.insert(it->m_key, it->m_value);
|
||||
m_refs.push_back(it->m_key);
|
||||
m_refs.push_back(it->m_value);
|
||||
}
|
||||
}
|
||||
{
|
||||
obj_map<func_decl, func_decl*>::iterator it = other.m_pred2orig.begin();
|
||||
obj_map<func_decl, func_decl*>::iterator end = other.m_pred2orig.end();
|
||||
for (; it != end; ++it) {
|
||||
m_pred2orig.insert(it->m_key, it->m_value);
|
||||
m_refs.push_back(it->m_key);
|
||||
m_refs.push_back(it->m_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void rule_set::inherit_predicate(rule_set const& other, func_decl* orig, func_decl* pred) {
|
||||
if (other.is_output_predicate(orig)) {
|
||||
set_output_predicate(pred);
|
||||
}
|
||||
orig = other.get_orig(orig);
|
||||
m_refs.push_back(pred);
|
||||
m_refs.push_back(orig);
|
||||
m_orig2pred.insert(orig, pred);
|
||||
m_pred2orig.insert(pred, orig);
|
||||
}
|
||||
|
||||
void rule_set::add_rule(rule * r) {
|
||||
TRACE("dl_verbose", r->display(m_context, tout << "add:"););
|
||||
SASSERT(!is_closed());
|
||||
|
@ -329,7 +379,7 @@ namespace datalog {
|
|||
|
||||
void rule_set::del_rule(rule * r) {
|
||||
TRACE("dl", r->display(m_context, tout << "del:"););
|
||||
func_decl* d = r->get_head()->get_decl();
|
||||
func_decl* d = r->get_decl();
|
||||
rule_vector* rules = m_head2rules.find(d);
|
||||
#define DEL_VECTOR(_v) \
|
||||
for (unsigned i = (_v).size(); i > 0; ) { \
|
||||
|
@ -345,32 +395,26 @@ namespace datalog {
|
|||
DEL_VECTOR(m_rules);
|
||||
}
|
||||
|
||||
void rule_set::ensure_closed()
|
||||
{
|
||||
void rule_set::ensure_closed() {
|
||||
if (!is_closed()) {
|
||||
VERIFY(close());
|
||||
}
|
||||
}
|
||||
|
||||
bool rule_set::close() {
|
||||
SASSERT(!is_closed()); //the rule_set is not already closed
|
||||
|
||||
|
||||
SASSERT(!is_closed()); //the rule_set is not already closed
|
||||
m_deps.populate(*this);
|
||||
m_stratifier = alloc(rule_stratifier, m_deps);
|
||||
|
||||
if (!stratified_negation()) {
|
||||
m_stratifier = 0;
|
||||
m_deps.reset();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void rule_set::reopen() {
|
||||
SASSERT(is_closed());
|
||||
|
||||
m_stratifier = 0;
|
||||
m_deps.reset();
|
||||
}
|
||||
|
@ -401,18 +445,20 @@ namespace datalog {
|
|||
return true;
|
||||
}
|
||||
|
||||
void rule_set::add_rules(const rule_set & src) {
|
||||
SASSERT(!is_closed());
|
||||
unsigned n = src.get_num_rules();
|
||||
for (unsigned i=0; i<n; i++) {
|
||||
add_rule(src.get_rule(i));
|
||||
void rule_set::replace_rules(const rule_set & src) {
|
||||
if (this != &src) {
|
||||
reset();
|
||||
add_rules(src);
|
||||
}
|
||||
}
|
||||
|
||||
void rule_set::add_rules(unsigned sz, rule * const * rules) {
|
||||
for (unsigned i=0; i<sz; i++) {
|
||||
add_rule(rules[i]);
|
||||
void rule_set::add_rules(const rule_set & src) {
|
||||
SASSERT(!is_closed());
|
||||
unsigned n = src.get_num_rules();
|
||||
for (unsigned i = 0; i < n; i++) {
|
||||
add_rule(src.get_rule(i));
|
||||
}
|
||||
inherit_predicates(src);
|
||||
}
|
||||
|
||||
const rule_vector & rule_set::get_predicate_rules(func_decl * pred) const {
|
||||
|
@ -433,6 +479,38 @@ namespace datalog {
|
|||
return m_stratifier->get_predicate_strat(pred);
|
||||
}
|
||||
|
||||
void rule_set::split_founded_rules(func_decl_set& founded, func_decl_set& non_founded) {
|
||||
founded.reset();
|
||||
non_founded.reset();
|
||||
{
|
||||
decl2rules::iterator it = begin_grouped_rules(), end = end_grouped_rules();
|
||||
for (; it != end; ++it) {
|
||||
non_founded.insert(it->m_key);
|
||||
}
|
||||
}
|
||||
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);
|
||||
bool found = false;
|
||||
for (unsigned i = 0; !found && i < rv.size(); ++i) {
|
||||
rule const& r = *rv[i];
|
||||
bool is_founded = true;
|
||||
for (unsigned j = 0; is_founded && j < r.get_uninterpreted_tail_size(); ++j) {
|
||||
is_founded = founded.contains(r.get_decl(j));
|
||||
}
|
||||
if (is_founded) {
|
||||
founded.insert(*it);
|
||||
non_founded.remove(*it);
|
||||
change = true;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void rule_set::display(std::ostream & out) const {
|
||||
out << "; rule count: " << get_num_rules() << "\n";
|
||||
|
@ -451,17 +529,6 @@ namespace datalog {
|
|||
r->display(m_context, out);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0 //print dependencies
|
||||
out<<"##\n";
|
||||
out<<m_deps.size()<<"\n";
|
||||
#endif
|
||||
|
||||
#if 0 //print strats
|
||||
out<<"##\n";
|
||||
|
||||
stratifier strat(m_deps);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue