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:
parent
a6dce246f6
commit
823830181b
8 changed files with 45 additions and 33 deletions
|
@ -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); }
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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); }
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue