3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-25 12:35:59 +00:00

add Karr linear invariants as transformer

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2013-03-10 17:53:18 -07:00
parent 3810374cdd
commit ab73c20757
14 changed files with 830 additions and 56 deletions

View file

@ -16,40 +16,55 @@ Author:
Revision History:
--*/
#include <algorithm>
#include<typeinfo>
#include"dl_context.h"
#include"dl_rule_transformer.h"
namespace datalog {
rule_transformer::rule_transformer(context & ctx)
: m_context(ctx), m_rule_manager(m_context.get_rule_manager()), m_dirty(false) {
: m_context(ctx), m_rule_manager(m_context.get_rule_manager()), m_dirty(false), m_cancel(false) {
}
rule_transformer::~rule_transformer() {
plugin_vector::iterator it=m_plugins.begin();
plugin_vector::iterator end=m_plugins.end();
reset();
}
void rule_transformer::reset() {
plugin_vector::iterator it = m_plugins.begin();
plugin_vector::iterator end = m_plugins.end();
for(; it!=end; ++it) {
dealloc(*it);
}
m_plugins.reset();
m_dirty = false;
m_cancel = false;
}
void rule_transformer::cancel() {
m_cancel = true;
plugin_vector::iterator it = m_plugins.begin();
plugin_vector::iterator end = m_plugins.end();
for(; it!=end; ++it) {
(*it)->cancel();
}
}
struct rule_transformer::plugin_comparator {
bool operator()(rule_transformer::plugin * p1, rule_transformer::plugin * p2) {
return p1->get_priority()>p2->get_priority();
return p1->get_priority() > p2->get_priority();
}
};
void rule_transformer::ensure_ordered() {
if (!m_dirty) {
return;
if (m_dirty) {
std::sort(m_plugins.begin(), m_plugins.end(), plugin_comparator());
m_dirty = false;
}
std::sort(m_plugins.begin(), m_plugins.end(), plugin_comparator());
m_dirty=false;
}
void rule_transformer::register_plugin(plugin * p) {
@ -67,9 +82,9 @@ namespace datalog {
tout<<"init:\n";
rules.display(tout);
);
plugin_vector::iterator it=m_plugins.begin();
plugin_vector::iterator end=m_plugins.end();
for(; it!=end; ++it) {
plugin_vector::iterator it = m_plugins.begin();
plugin_vector::iterator end = m_plugins.end();
for(; it!=end && !m_cancel; ++it) {
plugin & p = **it;
rule_set * new_rules = p(rules, mc, pc);