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

add length axioms

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2021-07-13 14:22:58 +02:00
parent a49a5b3a0b
commit 0752b1385c
4 changed files with 43 additions and 10 deletions

View file

@ -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_ubv2s_len_axiom(expr* b, unsigned k) { m_ax.ubv2s_len_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); }

View file

@ -1532,8 +1532,19 @@ bool theory_seq::add_length_to_eqc(expr* e) {
}
void theory_seq::add_ubv_string(expr* e) {
bool has_sort = false;
expr* b = nullptr;
VERIFY(m_util.str.is_ubv2s(e, b));
for (auto* e2 : m_ubv_string) {
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_ubv_string.push_back(e);
m_trail_stack.push(push_back_vector<expr_ref_vector>(m_ubv_string));
add_length_to_eqc(e);
}
bool theory_seq::check_ubv_string() {
@ -1554,6 +1565,11 @@ bool theory_seq::check_ubv_string(expr* e) {
expr* b = nullptr;
bv_util bv(m);
VERIFY(m_util.str.is_ubv2s(e, b));
rational len;
if (get_length(e, len) && len.is_unsigned())
m_ax.add_ubv2s_len_axiom(b, len.get_unsigned());
unsigned sz = bv.get_bv_size(b);
rational value(0);
bool all_bits_assigned = true;
@ -1579,14 +1595,7 @@ 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<expr>(m_has_ubv_axiom, e));
m_ax.add_ubv2s_axiom(b, k);