3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 17:15:31 +00:00

merge with 4.7.1

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-05-22 17:10:36 -07:00
commit 50c93d1ad4
25 changed files with 182 additions and 103 deletions

View file

@ -627,10 +627,7 @@ namespace smt {
*/
void context::remove_parents_from_cg_table(enode * r1) {
// Remove parents from the congruence table
enode_vector::iterator it = r1->begin_parents();
enode_vector::iterator end = r1->end_parents();
for (; it != end; ++it) {
enode * parent = *it;
for (enode * parent : r1->get_parents()) {
#if 0
{
static unsigned num_eqs = 0;
@ -675,10 +672,7 @@ namespace smt {
*/
void context::reinsert_parents_into_cg_table(enode * r1, enode * r2, enode * n1, enode * n2, eq_justification js) {
enode_vector & r2_parents = r2->m_parents;
enode_vector::iterator it = r1->begin_parents();
enode_vector::iterator end = r1->end_parents();
for (; it != end; ++it) {
enode * parent = *it;
for (enode * parent : r1->get_parents()) {
if (!parent->is_marked())
continue;
parent->unset_mark();
@ -1008,10 +1002,7 @@ namespace smt {
r2->m_parents.shrink(r2_num_parents);
// try to reinsert parents of r1 that are not cgr
it = r1->begin_parents();
end = r1->end_parents();
for (; it != end; ++it) {
enode * parent = *it;
for (enode * parent : r1->get_parents()) {
TRACE("add_eq_parents", tout << "visiting: #" << parent->get_owner_id() << "\n";);
if (parent->is_cgc_enabled()) {
enode * cg = parent->m_cg;
@ -1206,10 +1197,7 @@ namespace smt {
bool context::is_diseq_slow(enode * n1, enode * n2) const {
if (n1->get_num_parents() > n2->get_num_parents())
std::swap(n1, n2);
enode_vector::iterator it = n1->begin_parents();
enode_vector::iterator end = n1->end_parents();
for (; it != end; ++it) {
enode * parent = *it;
for (enode * parent : n1->get_parents()) {
if (parent->is_eq() && is_relevant(parent->get_owner()) && get_assignment(enode2bool_var(parent)) == l_false &&
((parent->get_arg(0)->get_root() == n1->get_root() && parent->get_arg(1)->get_root() == n2->get_root()) ||
(parent->get_arg(1)->get_root() == n1->get_root() && parent->get_arg(0)->get_root() == n2->get_root()))) {
@ -1241,10 +1229,7 @@ namespace smt {
return false;
if (r1->get_num_parents() < SMALL_NUM_PARENTS) {
TRACE("is_ext_diseq", tout << mk_bounded_pp(n1->get_owner(), m_manager) << " " << mk_bounded_pp(n2->get_owner(), m_manager) << " " << depth << "\n";);
enode_vector::iterator it1 = r1->begin_parents();
enode_vector::iterator end1 = r1->end_parents();
for (; it1 != end1; ++it1) {
enode * p1 = *it1;
for (enode* p1 : r1->get_parents()) {
if (!is_relevant(p1))
continue;
if (p1->is_eq())
@ -1254,10 +1239,7 @@ namespace smt {
func_decl * f = p1->get_decl();
TRACE("is_ext_diseq", tout << "p1: " << mk_bounded_pp(p1->get_owner(), m_manager) << "\n";);
unsigned num_args = p1->get_num_args();
enode_vector::iterator it2 = r2->begin_parents();
enode_vector::iterator end2 = r2->end_parents();
for (; it2 != end2; ++it2) {
enode * p2 = *it2;
for (enode * p2 : r2->get_parents()) {
if (!is_relevant(p2))
continue;
if (p2->is_eq())
@ -1295,10 +1277,7 @@ namespace smt {
}
almost_cg_table & table = *(m_almost_cg_tables[depth]);
table.reset(r1, r2);
enode_vector::iterator it1 = r1->begin_parents();
enode_vector::iterator end1 = r1->end_parents();
for (; it1 != end1; ++it1) {
enode * p1 = *it1;
for (enode* p1 : r1->get_parents()) {
if (!is_relevant(p1))
continue;
if (p1->is_eq())
@ -1309,10 +1288,7 @@ namespace smt {
}
if (table.empty())
return false;
enode_vector::iterator it2 = r2->begin_parents();
enode_vector::iterator end2 = r2->end_parents();
for (; it2 != end2; ++it2) {
enode * p2 = *it2;
for (enode * p2 : r2->get_parents()) {
if (!is_relevant(p2))
continue;
if (p2->is_eq())
@ -1519,10 +1495,7 @@ namespace smt {
}
TRACE("push_new_th_diseqs", tout << "#" << r->get_owner_id() << " v" << v << "\n";);
theory_id th_id = th->get_id();
enode_vector::iterator it = r->begin_parents();
enode_vector::iterator end = r->end_parents();
for (; it != end; ++it) {
enode * parent = *it;
for (enode * parent : r->get_parents()) {
CTRACE("parent_bug", parent == 0, tout << "#" << r->get_owner_id() << ", num_parents: " << r->get_num_parents() << "\n"; display(tout););
if (parent->is_eq()) {
bool_var bv = get_bool_var_of_id(parent->get_owner_id());
@ -2215,9 +2188,7 @@ namespace smt {
TRACE("cached_generation", tout << "caching: #" << n->get_id() << " " << e->get_generation() << "\n";);
m_cached_generation.insert(n, e->get_generation());
}
unsigned num_args = to_app(n)->get_num_args();
for (unsigned i = 0; i < num_args; i++) {
expr * arg = to_app(n)->get_arg(i);
for (expr * arg : *to_app(n)) {
if (is_app(arg) || is_quantifier(arg))
todo.push_back(arg);
}
@ -4257,10 +4228,7 @@ namespace smt {
theory_var_list * l = n->get_th_var_list();
theory_id th_id = l->get_th_id();
enode_vector::const_iterator it = n->begin_parents();
enode_vector::const_iterator end = n->end_parents();
for (; it != end; ++it) {
enode * parent = *it;
for (enode* parent : n->get_parents()) {
family_id fid = parent->get_owner()->get_family_id();
if (fid != th_id && fid != m_manager.get_basic_family_id()) {
TRACE("is_shared", tout << mk_pp(n->get_owner(), m_manager) << "\nis shared because of:\n" << mk_pp(parent->get_owner(), m_manager) << "\n";);

View file

@ -341,10 +341,7 @@ namespace smt {
}
void context::display_parent_eqs(std::ostream & out, enode * n) const {
enode_vector::iterator it = n->begin_parents();
enode_vector::iterator end = n->end_parents();
for (; it != end; ++it) {
enode * parent = *it;
for (enode* parent : n->get_parents()) {
if (parent->is_eq())
display_eq_detail(out, parent);
}

View file

@ -216,15 +216,28 @@ namespace smt {
return m_args;
}
class args {
class const_args {
enode const& n;
public:
args(enode const& n):n(n) {}
args(enode const* n):n(*n) {}
enode_vector::const_iterator begin() const { return n.get_args(); }
enode_vector::const_iterator end() const { return n.get_args() + n.get_num_args(); }
const_args(enode const& n):n(n) {}
const_args(enode const* n):n(*n) {}
enode_vector::const_iterator begin() const { return n.m_args; }
enode_vector::const_iterator end() const { return n.m_args + n.get_num_args(); }
};
class args {
enode & n;
public:
args(enode & n):n(n) {}
args(enode * n):n(*n) {}
enode_vector::iterator begin() const { return n.m_args; }
enode_vector::iterator end() const { return n.m_args + n.get_num_args(); }
};
const_args get_const_args() const { return const_args(this); }
// args get_args() { return args(this); }
// unsigned get_id() const {
// return m_id;
// }
@ -294,15 +307,27 @@ namespace smt {
return m_commutative;
}
class parents {
class const_parents {
enode const& n;
public:
parents(enode const& _n):n(_n) {}
parents(enode const* _n):n(*_n) {}
const_parents(enode const& _n):n(_n) {}
const_parents(enode const* _n):n(*_n) {}
enode_vector::const_iterator begin() const { return n.begin_parents(); }
enode_vector::const_iterator end() const { return n.end_parents(); }
};
class parents {
enode& n;
public:
parents(enode & _n):n(_n) {}
parents(enode * _n):n(*_n) {}
enode_vector::iterator begin() const { return n.begin_parents(); }
enode_vector::iterator end() const { return n.end_parents(); }
};
parents get_parents() { return parents(this); }
const_parents get_const_parents() const { return const_parents(this); }
unsigned get_num_parents() const {
return m_parents.size();

View file

@ -31,6 +31,7 @@ Revision History:
#include "smt/params/theory_arith_params.h"
#include "smt/arith_eq_adapter.h"
#include "smt/proto_model/numeral_factory.h"
#include "smt/smt_context.h"
#include "util/obj_pair_hashtable.h"
#include "smt/old_interval.h"
#include "math/grobner/grobner.h"

View file

@ -1423,9 +1423,9 @@ namespace smt {
// len(hd) = i
// str.indexof(tl, N, 0)
expr * H; // "haystack"
expr * N; // "needle"
expr * i; // start index
expr * H = nullptr; // "haystack"
expr * N = nullptr; // "needle"
expr * i = nullptr; // start index
u.str.is_index(e, H, N, i);
expr_ref minus_one(m_autil.mk_numeral(rational::minus_one(), true), m);
@ -6768,7 +6768,7 @@ namespace smt {
expr * sub2;
if (u.re.is_to_re(re, sub1)) {
SASSERT(u.str.is_string(sub1));
zstring(str);
zstring str;
u.str.is_string(sub1, str);
lens.insert(str.length());
} else if (u.re.is_concat(re, sub1, sub2)) {
@ -6951,8 +6951,8 @@ namespace smt {
ast_manager & m = get_manager();
expr_ref_vector rhs(m);
expr * str;
expr * re;
expr * str = nullptr;
expr * re = nullptr;
u.str.is_in_re(str_in_re, str, re);
expr_ref strlen(mk_strlen(str), m);
@ -9929,8 +9929,8 @@ namespace smt {
bool regex_axiom_add = false;
for (obj_hashtable<expr>::iterator it = regex_terms.begin(); it != regex_terms.end(); ++it) {
expr * str_in_re = *it;
expr * str;
expr * re;
expr * str = nullptr;
expr * re = nullptr;
u.str.is_in_re(str_in_re, str, re);
lbool current_assignment = ctx.get_assignment(str_in_re);
TRACE("str", tout << "regex term: " << mk_pp(str, m) << " in " << mk_pp(re, m) << " : " << current_assignment << std::endl;);
@ -9944,7 +9944,7 @@ namespace smt {
if (regex_term_to_length_constraint.contains(str_in_re)) {
// use existing length constraint
expr * top_level_length_constraint;
expr * top_level_length_constraint = nullptr;
regex_term_to_length_constraint.find(str_in_re, top_level_length_constraint);
ptr_vector<expr> extra_length_vars;
@ -10473,8 +10473,8 @@ namespace smt {
// that's consistent with the current length information
for (ptr_vector<expr>::iterator term_it = str_in_re_terms.begin();
term_it != str_in_re_terms.end(); ++term_it) {
expr * _unused;
expr * re;
expr * _unused = nullptr;
expr * re = nullptr;
SASSERT(u.str.is_in_re(*term_it));
u.str.is_in_re(*term_it, _unused, re);