3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-05-09 00:35:47 +00:00
This commit is contained in:
Christoph M. Wintersteiger 2016-05-20 19:55:01 +01:00
commit cae53c3ec2
26 changed files with 70 additions and 285 deletions

View file

@ -739,6 +739,7 @@ public:
if (idx2 < idx1) {
std::swap(idx1,idx2);
}
(void) max_idx;
SASSERT(idx1 < idx2 && idx2 < edges.size());
SASSERT(max_idx < edges.size());
dst = get_source(edges[idx2]);

View file

@ -1342,6 +1342,7 @@ namespace smt {
tout << "v" << x_i << " ";
tout << (has_shared?"shared":"not shared") << "\n";);
(void) empty_column;
SASSERT(!safe_gain(min_gain, max_gain) ||
empty_column ||
(unbounded_gain(max_gain) == (x_i == null_theory_var)));

View file

@ -218,6 +218,7 @@ namespace smt {
SASSERT(r && bv_sz == m_ebits);
r = m_bu.is_numeral(values[2], sig_r, bv_sz);
SASSERT(r && bv_sz == m_sbits - 1);
(void)r;
SASSERT(mpzm.is_one(sgn_r.to_mpq().denominator()));
SASSERT(mpzm.is_one(exp_r.to_mpq().denominator()));

View file

@ -1820,22 +1820,16 @@ bool theory_seq::solve_ne(unsigned idx) {
TRACE("seq", display_disequation(tout << "reduces to false: ", n););
return true;
}
else if (!change) {
TRACE("seq", tout << "no change " << n.ls(i) << " " << n.rs(i) << "\n";);
if (updated) {
new_ls.push_back(n.ls(i));
new_rs.push_back(n.rs(i));
}
continue;
}
else {
// eliminate ite expressions.
reduce_ite(lhs, new_lits, num_undef_lits, change);
reduce_ite(rhs, new_lits, num_undef_lits, change);
reduce_ite(ls, new_lits, num_undef_lits, change);
reduce_ite(rs, new_lits, num_undef_lits, change);
if (!change) {
TRACE("seq", tout << "no change " << n.ls(i) << " " << n.rs(i) << "\n";);
if (updated) {
new_ls.push_back(n.ls(i));
new_rs.push_back(n.rs(i));
}
continue;
}
if (!updated) {
for (unsigned j = 0; j < i; ++j) {
@ -1940,32 +1934,6 @@ bool theory_seq::solve_ne(unsigned idx) {
return updated;
}
void theory_seq::reduce_ite(expr_ref_vector & ls, literal_vector& new_lits, unsigned& num_undef_lits, bool& change) {
expr* cond, *th, *el;
context& ctx = get_context();
for (unsigned i = 0; i < ls.size(); ++i) {
expr* e = ls[i].get();
if (m.is_ite(e, cond, th, el)) {
literal lit(mk_literal(cond));
switch (ctx.get_assignment(lit)) {
case l_true:
change = true;
new_lits.push_back(lit);
ls[i] = th;
break;
case l_false:
change = true;
new_lits.push_back(~lit);
ls[i] = el;
break;
case l_undef:
++num_undef_lits;
break;
}
}
}
}
bool theory_seq::solve_nc(unsigned idx) {
nc const& n = m_ncs[idx];
@ -2613,6 +2581,7 @@ expr_ref theory_seq::expand(expr* e0, dependency*& eqs) {
}
expr* e = m_rep.find(e0, deps);
expr* e1, *e2, *e3;
context& ctx = get_context();
if (m_util.str.is_concat(e, e1, e2)) {
result = mk_concat(expand(e1, deps), expand(e2, deps));
}
@ -2637,11 +2606,26 @@ expr_ref theory_seq::expand(expr* e0, dependency*& eqs) {
else if (m_util.str.is_index(e, e1, e2, e3)) {
result = m_util.str.mk_index(expand(e1, deps), expand(e2, deps), e3);
}
else if (m.is_ite(e, e1, e2, e3)) {
literal lit(mk_literal(e1));
switch (ctx.get_assignment(lit)) {
case l_true:
deps = m_dm.mk_join(deps, m_dm.mk_leaf(assumption(lit)));
result = expand(e2, deps);
break;
case l_false:
deps = m_dm.mk_join(deps, m_dm.mk_leaf(assumption(~lit)));
result = expand(e3, deps);
break;
case l_undef:
result = e;
break;
}
}
else if (m_util.str.is_itos(e, e1)) {
rational val;
if (get_value(e1, val)) {
expr_ref num(m), res(m);
context& ctx = get_context();
num = m_autil.mk_numeral(val, true);
if (!ctx.e_internalized(num)) {
ctx.internalize(num, false);

View file

@ -410,7 +410,6 @@ namespace smt {
bool solve_nqs(unsigned i);
bool solve_ne(unsigned i);
bool solve_nc(unsigned i);
void reduce_ite(expr_ref_vector& ls, literal_vector& new_lits, unsigned& num_undef_lits, bool& change);
struct cell {
cell* m_parent;