mirror of
https://github.com/Z3Prover/z3
synced 2025-06-08 23:23:23 +00:00
parent
406c0792f1
commit
b79b8c9bc4
3 changed files with 22 additions and 22 deletions
|
@ -36,21 +36,15 @@ namespace datalog {
|
||||||
}
|
}
|
||||||
|
|
||||||
void rule_transformer::reset() {
|
void rule_transformer::reset() {
|
||||||
plugin_vector::iterator it = m_plugins.begin();
|
for (auto* p : m_plugins)
|
||||||
plugin_vector::iterator end = m_plugins.end();
|
dealloc(p);
|
||||||
for(; it!=end; ++it) {
|
|
||||||
dealloc(*it);
|
|
||||||
}
|
|
||||||
m_plugins.reset();
|
m_plugins.reset();
|
||||||
m_dirty = false;
|
m_dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rule_transformer::cancel() {
|
void rule_transformer::cancel() {
|
||||||
plugin_vector::iterator it = m_plugins.begin();
|
for (auto* p : m_plugins)
|
||||||
plugin_vector::iterator end = m_plugins.end();
|
p->cancel();
|
||||||
for(; it!=end; ++it) {
|
|
||||||
(*it)->cancel();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct rule_transformer::plugin_comparator {
|
struct rule_transformer::plugin_comparator {
|
||||||
|
@ -69,7 +63,7 @@ namespace datalog {
|
||||||
void rule_transformer::register_plugin(plugin * p) {
|
void rule_transformer::register_plugin(plugin * p) {
|
||||||
m_plugins.push_back(p);
|
m_plugins.push_back(p);
|
||||||
p->attach(*this);
|
p->attach(*this);
|
||||||
m_dirty=true;
|
m_dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rule_transformer::operator()(rule_set & rules) {
|
bool rule_transformer::operator()(rule_set & rules) {
|
||||||
|
@ -81,7 +75,7 @@ namespace datalog {
|
||||||
tout<<"init:\n";
|
tout<<"init:\n";
|
||||||
rules.display(tout);
|
rules.display(tout);
|
||||||
);
|
);
|
||||||
rule_set* new_rules = alloc(rule_set, rules);
|
scoped_ptr<rule_set> new_rules = alloc(rule_set, rules);
|
||||||
plugin_vector::iterator it = m_plugins.begin();
|
plugin_vector::iterator it = m_plugins.begin();
|
||||||
plugin_vector::iterator end = m_plugins.end();
|
plugin_vector::iterator end = m_plugins.end();
|
||||||
for(; it!=end && !m_context.canceled(); ++it) {
|
for(; it!=end && !m_context.canceled(); ++it) {
|
||||||
|
@ -91,7 +85,7 @@ namespace datalog {
|
||||||
IF_VERBOSE(1, verbose_stream() << "(transform " << typeid(p).name() << "...";);
|
IF_VERBOSE(1, verbose_stream() << "(transform " << typeid(p).name() << "...";);
|
||||||
stopwatch sw;
|
stopwatch sw;
|
||||||
sw.start();
|
sw.start();
|
||||||
rule_set * new_rules1 = p(*new_rules);
|
scoped_ptr<rule_set> new_rules1 = p(*new_rules);
|
||||||
sw.stop();
|
sw.stop();
|
||||||
double sec = sw.get_seconds();
|
double sec = sw.get_seconds();
|
||||||
if (sec < 0.001) sec = 0.0;
|
if (sec < 0.001) sec = 0.0;
|
||||||
|
@ -104,13 +98,12 @@ namespace datalog {
|
||||||
!new_rules1->close()) {
|
!new_rules1->close()) {
|
||||||
warning_msg("a rule transformation skipped "
|
warning_msg("a rule transformation skipped "
|
||||||
"because it destratified negation");
|
"because it destratified negation");
|
||||||
dealloc(new_rules1);
|
new_rules1 = nullptr;
|
||||||
IF_VERBOSE(1, verbose_stream() << "no-op " << sec << "s)\n";);
|
IF_VERBOSE(1, verbose_stream() << "no-op " << sec << "s)\n";);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
modified = true;
|
modified = true;
|
||||||
dealloc(new_rules);
|
new_rules = new_rules1.detach();
|
||||||
new_rules = new_rules1;
|
|
||||||
new_rules->ensure_closed();
|
new_rules->ensure_closed();
|
||||||
|
|
||||||
IF_VERBOSE(1, verbose_stream() << new_rules->get_num_rules() << " rules " << sec << "s)\n";);
|
IF_VERBOSE(1, verbose_stream() << new_rules->get_num_rules() << " rules " << sec << "s)\n";);
|
||||||
|
@ -122,7 +115,6 @@ namespace datalog {
|
||||||
if (modified) {
|
if (modified) {
|
||||||
rules.replace_rules(*new_rules);
|
rules.replace_rules(*new_rules);
|
||||||
}
|
}
|
||||||
dealloc(new_rules);
|
|
||||||
return modified;
|
return modified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -628,6 +628,9 @@ namespace datalog {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mk_explanations::~mk_explanations() {
|
||||||
|
}
|
||||||
|
|
||||||
func_decl * mk_explanations::get_union_decl(context & ctx) {
|
func_decl * mk_explanations::get_union_decl(context & ctx) {
|
||||||
ast_manager & m = ctx.get_manager();
|
ast_manager & m = ctx.get_manager();
|
||||||
sort_ref s(ctx.get_decl_util().mk_rule_sort(), m);
|
sort_ref s(ctx.get_decl_util().mk_rule_sort(), m);
|
||||||
|
@ -669,7 +672,7 @@ namespace datalog {
|
||||||
|
|
||||||
func_decl * mk_explanations::get_e_decl(func_decl * orig_decl) {
|
func_decl * mk_explanations::get_e_decl(func_decl * orig_decl) {
|
||||||
decl_map::obj_map_entry * e = m_e_decl_map.insert_if_not_there2(orig_decl, 0);
|
decl_map::obj_map_entry * e = m_e_decl_map.insert_if_not_there2(orig_decl, 0);
|
||||||
if (e->get_data().m_value==0) {
|
if (e->get_data().m_value == nullptr) {
|
||||||
relation_signature e_domain;
|
relation_signature e_domain;
|
||||||
e_domain.append(orig_decl->get_arity(), orig_decl->get_domain());
|
e_domain.append(orig_decl->get_arity(), orig_decl->get_domain());
|
||||||
e_domain.push_back(m_e_sort);
|
e_domain.push_back(m_e_sort);
|
||||||
|
@ -790,8 +793,11 @@ namespace datalog {
|
||||||
|
|
||||||
product_relation & prod_rel = static_cast<product_relation &>(e_rel);
|
product_relation & prod_rel = static_cast<product_relation &>(e_rel);
|
||||||
SASSERT(prod_rel.size()==2);
|
SASSERT(prod_rel.size()==2);
|
||||||
SASSERT(prod_rel[0].get_plugin().is_sieve_relation());
|
|
||||||
SASSERT(prod_rel[1].get_plugin().is_sieve_relation());
|
if (!prod_rel[0].get_plugin().is_sieve_relation())
|
||||||
|
throw default_exception("explanations are not supported for this query");
|
||||||
|
if (!prod_rel[1].get_plugin().is_sieve_relation())
|
||||||
|
throw default_exception("explanations are not supported for this query");
|
||||||
sieve_relation * srels[] = {
|
sieve_relation * srels[] = {
|
||||||
static_cast<sieve_relation *>(&prod_rel[0]),
|
static_cast<sieve_relation *>(&prod_rel[0]),
|
||||||
static_cast<sieve_relation *>(&prod_rel[1]) };
|
static_cast<sieve_relation *>(&prod_rel[1]) };
|
||||||
|
@ -876,10 +882,10 @@ namespace datalog {
|
||||||
if (!m_context.generate_explanations()) {
|
if (!m_context.generate_explanations()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
rule_set * res = alloc(rule_set, m_context);
|
scoped_ptr<rule_set> res = alloc(rule_set, m_context);
|
||||||
transform_facts(m_context.get_rel_context()->get_rmanager(), source, *res);
|
transform_facts(m_context.get_rel_context()->get_rmanager(), source, *res);
|
||||||
transform_rules(source, *res);
|
transform_rules(source, *res);
|
||||||
return res;
|
return res.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -66,6 +66,8 @@ namespace datalog {
|
||||||
*/
|
*/
|
||||||
mk_explanations(context & ctx);
|
mk_explanations(context & ctx);
|
||||||
|
|
||||||
|
~mk_explanations() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Return explanation predicate that corresponds to \c orig_decl.
|
\brief Return explanation predicate that corresponds to \c orig_decl.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue