mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
fix #5381
This commit is contained in:
parent
29c6d42380
commit
897cbf347b
|
@ -148,6 +148,7 @@ namespace seq {
|
||||||
expr_ref_vector const* _es = nullptr;
|
expr_ref_vector const* _es = nullptr;
|
||||||
if (!match_itos3(e, n, _es))
|
if (!match_itos3(e, n, _es))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
expr_ref_vector const& es = *_es;
|
expr_ref_vector const& es = *_es;
|
||||||
|
|
||||||
if (es.empty()) {
|
if (es.empty()) {
|
||||||
|
@ -183,6 +184,8 @@ namespace seq {
|
||||||
expr_ref digit = m_ax.sk().mk_digit2int(u);
|
expr_ref digit = m_ax.sk().mk_digit2int(u);
|
||||||
add_consequence(m_ax.mk_ge(digit, 1));
|
add_consequence(m_ax.mk_ge(digit, 1));
|
||||||
}
|
}
|
||||||
|
expr_ref y(seq.str.mk_concat(e.rs, e.ls[0]->get_sort()), m);
|
||||||
|
ctx.add_solution(e.ls[0], y);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -402,8 +402,11 @@ final_check_status theory_seq::final_check_eh() {
|
||||||
++m_stats.m_branch_nqs;
|
++m_stats.m_branch_nqs;
|
||||||
TRACEFIN("branch_ne");
|
TRACEFIN("branch_ne");
|
||||||
return FC_CONTINUE;
|
return FC_CONTINUE;
|
||||||
|
}
|
||||||
|
if (branch_itos()) {
|
||||||
|
TRACEFIN("branch_itos");
|
||||||
|
return FC_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_unhandled_expr) {
|
if (m_unhandled_expr) {
|
||||||
TRACEFIN("give_up");
|
TRACEFIN("give_up");
|
||||||
TRACE("seq", tout << "unhandled: " << mk_pp(m_unhandled_expr, m) << "\n";);
|
TRACE("seq", tout << "unhandled: " << mk_pp(m_unhandled_expr, m) << "\n";);
|
||||||
|
@ -1539,14 +1542,55 @@ bool theory_seq::check_int_string() {
|
||||||
bool theory_seq::check_int_string(expr* e) {
|
bool theory_seq::check_int_string(expr* e) {
|
||||||
expr* n = nullptr;
|
expr* n = nullptr;
|
||||||
if (ctx.inconsistent())
|
if (ctx.inconsistent())
|
||||||
return true;
|
return true;
|
||||||
if (m_util.str.is_itos(e, n) && !m_util.str.is_stoi(n) && add_length_to_eqc(e))
|
if (m_util.str.is_itos(e, n) && !m_util.str.is_stoi(n) && add_length_to_eqc(e))
|
||||||
return true;
|
return true;
|
||||||
if (m_util.str.is_stoi(e, n) && !m_util.str.is_itos(n) && add_length_to_eqc(n))
|
if (m_util.str.is_stoi(e, n) && !m_util.str.is_itos(n) && add_length_to_eqc(n))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool theory_seq::branch_itos() {
|
||||||
|
bool change = false;
|
||||||
|
for (expr * e : m_int_string) {
|
||||||
|
if (branch_itos(e))
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
return change;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool theory_seq::branch_itos(expr* e) {
|
||||||
|
expr* n = nullptr;
|
||||||
|
rational val;
|
||||||
|
if (ctx.inconsistent())
|
||||||
|
return true;
|
||||||
|
if (!m_util.str.is_itos(e, n))
|
||||||
|
return false;
|
||||||
|
if (!ctx.e_internalized(e))
|
||||||
|
return false;
|
||||||
|
enode* r = ctx.get_enode(e)->get_root();
|
||||||
|
if (m_util.str.is_string(r->get_expr()))
|
||||||
|
return false;
|
||||||
|
if (!get_num_value(n, val))
|
||||||
|
return false;
|
||||||
|
if (val.is_neg())
|
||||||
|
return false;
|
||||||
|
literal b = mk_eq(e, m_util.str.mk_string(val.to_string()), false);
|
||||||
|
if (ctx.get_assignment(b) == l_true)
|
||||||
|
return false;
|
||||||
|
if (ctx.get_assignment(b) == l_false) {
|
||||||
|
literal a = mk_eq(n, m_autil.mk_int(val), false);
|
||||||
|
add_axiom(~a, b);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ctx.force_phase(b);
|
||||||
|
ctx.mark_as_relevant(b);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void theory_seq::apply_sort_cnstr(enode* n, sort* s) {
|
void theory_seq::apply_sort_cnstr(enode* n, sort* s) {
|
||||||
mk_var(n);
|
mk_var(n);
|
||||||
|
|
|
@ -566,6 +566,8 @@ namespace smt {
|
||||||
void add_int_string(expr* e);
|
void add_int_string(expr* e);
|
||||||
bool check_int_string();
|
bool check_int_string();
|
||||||
bool check_int_string(expr* e);
|
bool check_int_string(expr* e);
|
||||||
|
bool branch_itos();
|
||||||
|
bool branch_itos(expr* e);
|
||||||
|
|
||||||
expr_ref add_elim_string_axiom(expr* n);
|
expr_ref add_elim_string_axiom(expr* n);
|
||||||
void add_in_re_axiom(expr* n);
|
void add_in_re_axiom(expr* n);
|
||||||
|
|
Loading…
Reference in a new issue