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

butterfly effect with relevancy marking

bail out of infinite instantiation loop
This commit is contained in:
Nikolaj Bjorner 2021-02-15 16:37:23 -08:00
parent a6dce246f6
commit 823830181b
8 changed files with 45 additions and 33 deletions

View file

@ -33,7 +33,7 @@ namespace smt {
ast_manager& m;
arith_util a;
seq_util seq;
seq_skolem m_sk;
seq::skolem m_sk;
bool m_digits_initialized;
literal mk_eq_empty(expr* e, bool phase = true) { return mk_eq_empty2(e, phase); }

View file

@ -1321,23 +1321,34 @@ bool theory_seq::propagate_length_coherence(expr* e) {
expr_ref lo_e(m_autil.mk_numeral(lo, true), m);
expr_ref len_e_ge_lo(m_autil.mk_ge(mk_len(e), lo_e), m);
literal low = mk_literal(len_e_ge_lo);
add_axiom(~low, mk_seq_eq(e, tail));
literal eq = mk_seq_eq(e, tail);
bool added = false;
if (ctx.get_assignment(eq) != l_true) {
add_axiom(~low, eq);
added = true;
}
expr_ref len_e = mk_len(e);
if (upper_bound(len_e, hi)) {
// len(e) <= hi => len(tail) <= hi - lo
expr_ref high1(m_autil.mk_le(len_e, m_autil.mk_numeral(hi, true)), m);
if (hi == lo) {
add_axiom(~mk_literal(high1), mk_seq_eq(seq, emp));
added = true;
}
else {
expr_ref high2(m_autil.mk_le(mk_len(seq), m_autil.mk_numeral(hi-lo, true)), m);
add_axiom(~mk_literal(high1), mk_literal(high2));
literal h2 = mk_literal(high2);
if (ctx.get_assignment(h2) != l_true) {
add_axiom(~mk_literal(high1), h2);
added = true;
}
}
}
else {
assume_equality(seq, emp);
added = true;
}
return true;
return added;
}

View file

@ -32,7 +32,7 @@ namespace smt {
class seq_util::rex& seq_regex::re() { return th.m_util.re; }
class seq_util::str& seq_regex::str() { return th.m_util.str; }
seq_rewriter& seq_regex::seq_rw() { return th.m_seq_rewrite; }
seq_skolem& seq_regex::sk() { return th.m_sk; }
seq::skolem& seq_regex::sk() { return th.m_sk; }
arith_util& seq_regex::a() { return th.m_autil; }
void seq_regex::rewrite(expr_ref& e) { th.m_rewrite(e); }

View file

@ -137,7 +137,7 @@ namespace smt {
class seq_util::rex& re();
class seq_util::str& str();
seq_rewriter& seq_rw();
seq_skolem& sk();
seq::skolem& sk();
arith_util& a();
bool is_string_equality(literal lit);

View file

@ -546,13 +546,14 @@ class theory_lra::imp {
enode * mk_enode(app * n) {
TRACE("arith", tout << expr_ref(n, m) << " internalized: " << ctx().e_internalized(n) << "\n";);
if (reflect(n))
for (expr* arg : *n)
if (!ctx().e_internalized(arg))
th.ensure_enode(arg);
if (ctx().e_internalized(n)) {
return get_enode(n);
}
else {
if (reflect(n))
for (expr* arg : *n)
th.ensure_enode(arg);
return ctx().mk_enode(n, !reflect(n), false, enable_cgc_for(n));
}
}

View file

@ -355,7 +355,7 @@ namespace smt {
seq_rewriter m_seq_rewrite;
seq_util m_util;
arith_util m_autil;
seq_skolem m_sk;
seq::skolem m_sk;
seq_axioms m_ax;
seq_regex m_regex;
arith_value m_arith_value;