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:
parent
3810374cdd
commit
ab73c20757
14 changed files with 830 additions and 56 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue