3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-21 13:23:39 +00:00

more ddnf

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2014-08-21 22:16:51 -07:00
parent 34aa06b5a3
commit eaabae3219

View file

@ -21,19 +21,9 @@ Revision History:
--*/ --*/
#include "ddnf.h" #include "ddnf.h"
#include "trail.h"
#include "dl_rule_set.h" #include "dl_rule_set.h"
#include "dl_context.h" #include "dl_context.h"
#include "dl_mk_rule_inliner.h"
#include "smt_kernel.h"
#include "qe_lite.h"
#include "bool_rewriter.h"
#include "th_rewriter.h"
#include "datatype_decl_plugin.h"
#include "for_each_expr.h"
#include "matcher.h"
#include "scoped_proof.h" #include "scoped_proof.h"
#include "fixedpoint_params.hpp"
namespace datalog { namespace datalog {
@ -167,11 +157,18 @@ namespace datalog {
public: public:
dot() {} dot() {}
dot(tbv const& pos, vector<tbv> const& negs): dot(tbv const& pos, vector<tbv> const& negs):
m_pos(pos), m_negs(negs) {} m_pos(pos), m_negs(negs) {
DEBUG_CODE(
for (unsigned i = 0; i < negs.size(); ++i) {
SASSERT(pos.size() == negs[i].size());
}
);
}
tbv const& pos() const { return m_pos; } tbv const& pos() const { return m_pos; }
tbv neg(unsigned i) const { return m_negs[i]; } tbv neg(unsigned i) const { return m_negs[i]; }
unsigned size() const { return m_negs.size(); } unsigned size() const { return m_negs.size(); }
unsigned num_bits() const { return m_pos.size(); }
bool operator==(dot const& other) const { bool operator==(dot const& other) const {
if (m_pos != other.m_pos) return false; if (m_pos != other.m_pos) return false;
@ -195,12 +192,7 @@ namespace datalog {
struct eq { struct eq {
bool operator()(dot const& d1, dot const& d2) const { bool operator()(dot const& d1, dot const& d2) const {
if (d1.pos() != d2.pos()) return false; return d1 == d2;
if (d1.size() != d2.size()) return false;
for (unsigned i = 0; i < d1.size(); ++i) {
if (d1.neg(i) != d2.neg(i)) return false;
}
return true;
} }
}; };
@ -295,6 +287,7 @@ namespace datalog {
}; };
typedef ptr_hashtable<ddnf_node, ddnf_node::hash, ddnf_node::eq> ddnf_nodes; typedef ptr_hashtable<ddnf_node, ddnf_node::hash, ddnf_node::eq> ddnf_nodes;
typedef map<dot, ddnf_nodes*, dot::hash, dot::eq> dot2nodes;
class ddnf_mgr { class ddnf_mgr {
unsigned m_num_bits; unsigned m_num_bits;
@ -302,7 +295,7 @@ namespace datalog {
ddnf_node_vector m_noderefs; ddnf_node_vector m_noderefs;
ddnf_nodes m_nodes; ddnf_nodes m_nodes;
ptr_vector<ddnf_nodes> m_tables; ptr_vector<ddnf_nodes> m_tables;
map<dot, ddnf_nodes*, dot::hash, dot::eq> m_dots; dot2nodes m_dots;
bool m_internalized; bool m_internalized;
public: public:
ddnf_mgr(unsigned n): m_num_bits(n), m_noderefs(*this), m_internalized(false) { ddnf_mgr(unsigned n): m_num_bits(n), m_noderefs(*this), m_internalized(false) {
@ -325,6 +318,7 @@ namespace datalog {
} }
void insert(dot const& d) { void insert(dot const& d) {
SASSERT(d.size() == m_num_bits);
SASSERT(!m_internalized); SASSERT(!m_internalized);
if (m_dots.contains(d)) return; if (m_dots.contains(d)) return;
ddnf_nodes* ns = alloc(ddnf_nodes); ddnf_nodes* ns = alloc(ddnf_nodes);
@ -336,6 +330,11 @@ namespace datalog {
} }
} }
ddnf_nodes const& lookup(dot const& d) {
internalize();
return *m_dots.find(d);
}
void display(std::ostream& out) const { void display(std::ostream& out) const {
for (unsigned i = 0; i < m_noderefs.size(); ++i) { for (unsigned i = 0; i < m_noderefs.size(); ++i) {
m_noderefs[i]->display(out); m_noderefs[i]->display(out);
@ -409,6 +408,7 @@ namespace datalog {
root.add_child(new_n); root.add_child(new_n);
} }
void internalize() { void internalize() {
// create map: dot |-> ddnf_node set // create map: dot |-> ddnf_node set
if (!m_internalized) { if (!m_internalized) {
@ -419,10 +419,6 @@ namespace datalog {
} }
} }
ddnf_nodes const& lookup(dot const& d) const {
return *m_dots.find(d);
}
void add_pos(ddnf_node& n, vector<dot>& active) { void add_pos(ddnf_node& n, vector<dot>& active) {
for (unsigned i = 0; i < n.pos().size(); ++i) { for (unsigned i = 0; i < n.pos().size(); ++i) {
active.push_back(n.pos()[i]); active.push_back(n.pos()[i]);
@ -455,20 +451,55 @@ namespace datalog {
}; };
void ddnf_node::add_child(ddnf_node* n) { void ddnf_node::add_child(ddnf_node* n) {
SASSERT(!m_tbv.is_subset(n->m_tbv)); SASSERT(!m_tbv.is_subset(n->m_tbv));
m_children.push_back(n); m_children.push_back(n);
} }
void ddnf_node::remove_child(ddnf_node* n) { void ddnf_node::remove_child(ddnf_node* n) {
m_children.erase(n); m_children.erase(n);
} }
bool ddnf_node::contains_child(ddnf_node* n) const { bool ddnf_node::contains_child(ddnf_node* n) const {
return m_children.contains(n); return m_children.contains(n);
} }
class ddnfs {
u_map<ddnf_mgr*> m_mgrs;
public:
ddnfs() {}
~ddnfs() {
u_map<ddnf_mgr*>::iterator it = m_mgrs.begin(), end = m_mgrs.end();
for (; it != end; ++it) {
dealloc(it->m_value);
}
}
void insert(dot const& d) {
unsigned n = d.num_bits();
ddnf_mgr* m = 0;
if (!m_mgrs.find(n, m)) {
m = alloc(ddnf_mgr, n);
m_mgrs.insert(n, m);
}
m->insert(d);
}
ddnf_nodes const& lookup(dot const& d) const {
return m_mgrs.find(d.num_bits())->lookup(d);
}
void display(std::ostream& out) const {
u_map<ddnf_mgr*>::iterator it = m_mgrs.begin(), end = m_mgrs.end();
for (; it != end; ++it) {
it->m_value->display(out);
}
}
};
class ddnf::imp { class ddnf::imp {
struct stats { struct stats {
@ -482,6 +513,7 @@ bool ddnf_node::contains_child(ddnf_node* n) const {
volatile bool m_cancel; volatile bool m_cancel;
ptr_vector<expr> m_todo; ptr_vector<expr> m_todo;
ast_mark m_visited1, m_visited2; ast_mark m_visited1, m_visited2;
ddnfs m_ddnfs;
stats m_stats; stats m_stats;
public: public:
@ -528,6 +560,7 @@ bool ddnf_node::contains_child(ddnf_node* n) const {
UNREACHABLE(); UNREACHABLE();
return expr_ref(m.mk_true(), m); return expr_ref(m.mk_true(), m);
} }
private: private:
proof_ref get_proof() const { proof_ref get_proof() const {
@ -644,6 +677,14 @@ bool ddnf_node::contains_child(ddnf_node* n) const {
return true; return true;
} }
void compile(expr* e) {
// TBD:
// compiles monadic predicates into dots.
// saves the mapping from expr |-> dot
// such that atomic sub-formula can be expressed
// as a set of ddnf_nodes
}
}; };
ddnf::ddnf(context& ctx): ddnf::ddnf(context& ctx):