3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-19 10:52:02 +00:00

move to separate axiom management

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2021-02-23 18:09:40 -08:00
parent 9bde93f812
commit 377d060036
16 changed files with 302 additions and 565 deletions

View file

@ -66,6 +66,8 @@ namespace smt {
ctx.mark_as_relevant(bv);
if (seq.is_char_le(term))
internalize_le(literal(bv, false), term);
if (seq.is_char_is_digit(term))
internalize_is_digit(literal(bv, false), term);
return true;
}
@ -153,6 +155,30 @@ namespace smt {
ctx.mk_th_axiom(get_id(), lit, ~le);
}
void theory_char::internalize_is_digit(literal lit, app* term) {
expr* x = nullptr;
VERIFY(seq.is_char_is_digit(term, x));
enode* zero = ensure_enode(seq.mk_char('0'));
enode* nine = ensure_enode(seq.mk_char('9'));
theory_var v = ctx.get_enode(x)->get_th_var(get_id());
theory_var z = zero->get_th_var(get_id());
theory_var n = nine->get_th_var(get_id());
init_bits(v);
init_bits(z);
init_bits(n);
auto const& bv = get_ebits(v);
auto const& zv = get_ebits(z);
auto const& nv = get_ebits(n);
expr_ref le1(m), le2(m);
m_bb.mk_ule(bv.size(), zv.c_ptr(), bv.c_ptr(), le1);
m_bb.mk_ule(bv.size(), bv.c_ptr(), nv.c_ptr(), le2);
literal lit1 = mk_literal(le1);
literal lit2 = mk_literal(le2);
ctx.mk_th_axiom(get_id(), ~lit, lit1);
ctx.mk_th_axiom(get_id(), ~lit, lit2);
ctx.mk_th_axiom(get_id(), ~lit1, ~lit2, lit);
}
literal_vector const& theory_char::get_bits(theory_var v) {
init_bits(v);
return m_bits[v];