diff --git a/src/ast/rewriter/seq_axioms.cpp b/src/ast/rewriter/seq_axioms.cpp index 3ef433138..2d48cfe4e 100644 --- a/src/ast/rewriter/seq_axioms.cpp +++ b/src/ast/rewriter/seq_axioms.cpp @@ -792,8 +792,6 @@ namespace seq { es.reverse(); eq = m.mk_eq(seq.str.mk_ubv2s(b), seq.str.mk_concat(es, seq.str.mk_string_sort())); add_clause(~ge10k, ge10k1, eq); - ubv2ch_axiom(bv_sort); - } void axioms::ubv2ch_axiom(sort* bv_sort) { diff --git a/src/ast/rewriter/seq_rewriter.cpp b/src/ast/rewriter/seq_rewriter.cpp index 8745326b0..0bd653232 100644 --- a/src/ast/rewriter/seq_rewriter.cpp +++ b/src/ast/rewriter/seq_rewriter.cpp @@ -2209,6 +2209,12 @@ br_status seq_rewriter::mk_str_is_digit(expr* a, expr_ref& result) { br_status seq_rewriter::mk_str_ubv2s(expr* a, expr_ref& result) { + bv_util bv(m()); + rational val; + if (bv.is_numeral(a, val)) { + result = str().mk_string(zstring(val)); + return BR_DONE; + } return BR_FAILED; } diff --git a/src/smt/seq_axioms.h b/src/smt/seq_axioms.h index cd7f38064..16091fcf4 100644 --- a/src/smt/seq_axioms.h +++ b/src/smt/seq_axioms.h @@ -80,6 +80,7 @@ namespace smt { void add_stoi_axiom(expr* e, unsigned k) { m_ax.stoi_axiom(e, k); } void add_itos_axiom(expr* s, unsigned k) { m_ax.itos_axiom(s, k); } void add_ubv2s_axiom(expr* b, unsigned k) { m_ax.ubv2s_axiom(b, k); } + void add_ubv2ch_axioms(sort* s) { m_ax.ubv2ch_axiom(s); } void add_lt_axiom(expr* n) { m_ax.lt_axiom(n); } void add_le_axiom(expr* n) { m_ax.le_axiom(n); } void add_is_digit_axiom(expr* n) { m_ax.is_digit_axiom(n); } diff --git a/src/smt/theory_seq.cpp b/src/smt/theory_seq.cpp index 7e4eda114..599646b5b 100644 --- a/src/smt/theory_seq.cpp +++ b/src/smt/theory_seq.cpp @@ -1579,6 +1579,14 @@ bool theory_seq::check_ubv_string(expr* e) { k++; value = div(value, rational(10)); } + bool has_sort = false; + for (auto* e2 : m_has_ubv_axiom) { + expr* b2 = nullptr; + VERIFY(m_util.str.is_ubv2s(e2, b2)); + has_sort |= b2->get_sort() == b->get_sort(); + } + if (!has_sort) + m_ax.add_ubv2ch_axioms(b->get_sort()); m_has_ubv_axiom.insert(e); m_trail_stack.push(insert_obj_trail(m_has_ubv_axiom, e)); m_ax.add_ubv2s_axiom(b, k);