mirror of
https://github.com/Z3Prover/z3
synced 2025-07-19 10:52:02 +00:00
get_app --> get_expr + fix term_lt()
This commit is contained in:
parent
dda65fdd2e
commit
9c7d9818d3
2 changed files with 151 additions and 146 deletions
|
@ -28,7 +28,7 @@ namespace qe {
|
|||
|
||||
class term {
|
||||
// -- an app represented by this term
|
||||
expr* m_app; // NSB: to make usable with exprs
|
||||
expr* m_expr; // NSB: to make usable with exprs
|
||||
// -- root of the equivalence class
|
||||
term* m_root;
|
||||
// -- next element in the equivalence class (cyclic linked list)
|
||||
|
@ -50,16 +50,16 @@ namespace qe {
|
|||
ptr_vector<term> m_children;
|
||||
|
||||
public:
|
||||
term(expr* a, u_map<term*>& app2term) :
|
||||
m_app(a),
|
||||
term(expr* v, u_map<term*>& app2term) :
|
||||
m_expr(v),
|
||||
m_root(this),
|
||||
m_next(this),
|
||||
m_class_size(1),
|
||||
m_mark(false),
|
||||
m_mark2(false),
|
||||
m_interpreted(false) {
|
||||
if (!is_app(a)) return;
|
||||
for (expr* e : *to_app(a)) {
|
||||
if (!is_app()) return;
|
||||
for (expr* e : *to_app(m_expr)) {
|
||||
term* t = app2term[e->get_id()];
|
||||
t->get_root().m_parents.push_back(this);
|
||||
m_children.push_back(t);
|
||||
|
@ -108,9 +108,9 @@ namespace qe {
|
|||
return true;
|
||||
}
|
||||
|
||||
unsigned get_id() const { return m_app->get_id();}
|
||||
unsigned get_id() const { return m_expr->get_id();}
|
||||
|
||||
unsigned get_decl_id() const { return is_app(m_app) ? to_app(m_app)->get_decl()->get_id() : m_app->get_id(); }
|
||||
unsigned get_decl_id() const { return is_app() ? get_app()->get_decl()->get_id() : m_expr->get_id(); }
|
||||
|
||||
bool is_marked() const {return m_mark;}
|
||||
void set_mark(bool v){m_mark = v;}
|
||||
|
@ -118,10 +118,12 @@ namespace qe {
|
|||
void set_mark2(bool v){m_mark2 = v;} // NSB: where is this used?
|
||||
|
||||
bool is_interpreted() const {return m_interpreted;}
|
||||
bool is_theory() const { return !is_app(m_app) || to_app(m_app)->get_family_id() != null_family_id; }
|
||||
bool is_theory() const { return !is_app() || get_app()->get_family_id() != null_family_id; }
|
||||
void mark_as_interpreted() {m_interpreted=true;}
|
||||
expr* get_app() const {return m_app;}
|
||||
unsigned get_num_args() const { return is_app(m_app) ? to_app(m_app)->get_num_args() : 0; }
|
||||
expr* get_expr() const {return m_expr;}
|
||||
bool is_app() const {return ::is_app(m_expr);}
|
||||
app *get_app() const {return is_app() ? to_app(m_expr) : nullptr;}
|
||||
unsigned get_num_args() const { return is_app() ? get_app()->get_num_args() : 0; }
|
||||
|
||||
term &get_root() const {return *m_root;}
|
||||
bool is_root() const {return m_root == this;}
|
||||
|
@ -485,7 +487,7 @@ namespace qe {
|
|||
SASSERT(r.is_root());
|
||||
|
||||
if (r.get_num_args() == 0) {
|
||||
return expr_ref(r.get_app(), m);
|
||||
return expr_ref(r.get_expr(), m);
|
||||
}
|
||||
|
||||
expr* res = nullptr;
|
||||
|
@ -538,21 +540,23 @@ namespace qe {
|
|||
|
||||
/// Order of preference for roots of equivalence classes
|
||||
/// XXX This should be factored out to let clients control the preference
|
||||
bool term_graph::term_le(term const &t1, term const &t2) {
|
||||
bool term_graph::term_lt(term const &t1, term const &t2) {
|
||||
|
||||
// prefer constants over applications
|
||||
// prefer uninterpreted constants over values
|
||||
// prefer smaller expressions over larger ones
|
||||
if (t1.get_num_args() == 0 && t2.get_num_args() > 0) {
|
||||
return true;
|
||||
}
|
||||
if (t1.get_num_args() == 0 || t2.get_num_args() == 0) {
|
||||
if (t1.get_num_args() == t2.get_num_args()) {
|
||||
// NSB: how does this possibly define an order?
|
||||
return m.is_value(t2.get_app());
|
||||
// t1.get_num_args() == t2.get_num_args() == 0
|
||||
if (m.is_value(t1.get_expr()) == m.is_value(t2.get_expr()))
|
||||
return t1.get_id() < t2.get_id();
|
||||
return m.is_value(t2.get_expr());
|
||||
}
|
||||
return t1.get_num_args() < t2.get_num_args();
|
||||
}
|
||||
|
||||
unsigned sz1 = get_num_exprs(t1.get_app());
|
||||
unsigned sz2 = get_num_exprs(t1.get_app());
|
||||
unsigned sz1 = get_num_exprs(t1.get_expr());
|
||||
unsigned sz2 = get_num_exprs(t1.get_expr());
|
||||
return sz1 < sz2;
|
||||
}
|
||||
|
||||
|
@ -560,7 +564,7 @@ namespace qe {
|
|||
term *r = &t;
|
||||
for (term *it = &t.get_next(); it != &t; it = &it->get_next()) {
|
||||
it->set_mark(true);
|
||||
if (term_le(*it, *r)) { r = it; }
|
||||
if (term_lt(*it, *r)) { r = it; }
|
||||
}
|
||||
|
||||
// -- if found something better, make it the new root
|
||||
|
@ -580,7 +584,7 @@ namespace qe {
|
|||
|
||||
void term_graph::display(std::ostream &out) {
|
||||
for (term * t : m_terms) {
|
||||
out << mk_pp(t->get_app(), m) << " is root " << t->is_root()
|
||||
out << mk_pp(t->get_expr(), m) << " is root " << t->is_root()
|
||||
<< " cls sz " << t->get_class_size()
|
||||
<< " term " << t
|
||||
<< "\n";
|
||||
|
@ -624,7 +628,8 @@ namespace qe {
|
|||
}
|
||||
|
||||
expr* term_graph::mk_pure(term& t) {
|
||||
expr* e = t.get_app();
|
||||
expr* e = t.get_expr();
|
||||
// AG: the if-statement looks wrong
|
||||
if (m_term2app.find(t.get_id(), e)) e;
|
||||
if (!is_app(e)) return nullptr;
|
||||
app* a = ::to_app(e);
|
||||
|
|
|
@ -64,7 +64,7 @@ namespace qe {
|
|||
|
||||
bool is_internalized(expr *a);
|
||||
|
||||
bool term_le(term const &t1, term const &t2);
|
||||
bool term_lt(term const &t1, term const &t2);
|
||||
void pick_root (term &t);
|
||||
void pick_roots();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue