3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-18 02:16:40 +00:00

add missing tactic descriptions, add rewrite for tamagochi

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2023-01-08 13:32:26 -08:00
parent 95cb06d8cf
commit fcea32344e
19 changed files with 147 additions and 49 deletions

View file

@ -2807,6 +2807,28 @@ br_status bv_rewriter::mk_mkbv(unsigned num, expr * const * args, expr_ref & res
return BR_FAILED;
}
bool bv_rewriter::is_bit(expr* t, unsigned& val) {
rational v;
unsigned sz;
return is_bv(t) && is_numeral(t, v, sz) && sz == 1 && (val = v.get_unsigned(), true);
}
bool bv_rewriter::is_eq_bit(expr * t, expr * & x, unsigned & val) {
expr* lhs, *rhs;
if (!m.is_eq(t, lhs, rhs))
return false;
if (is_bit(lhs, val)) {
x = rhs;
return true;
}
if (is_bit(rhs, val)) {
x = lhs;
return true;
}
return false;
}
br_status bv_rewriter::mk_ite_core(expr * c, expr * t, expr * e, expr_ref & result) {
TRACE("bv_ite", tout << "mk_ite_core:\n" << mk_ismt2_pp(c, m) << "?\n"
<< mk_ismt2_pp(t, m) << "\n:" << mk_ismt2_pp(e, m) << "\n";);
@ -2819,6 +2841,20 @@ br_status bv_rewriter::mk_ite_core(expr * c, expr * t, expr * e, expr_ref & resu
return BR_REWRITE1;
}
// if x = 0 then 0 else 1
expr* t1;
unsigned bit1, bit2, bit3;
if (is_bv(t) && is_eq_bit(c, t1, bit1) && is_bit(t, bit2) && is_bit(e, bit3)) {
if (bit1 == bit2 && bit3 != bit2) {
result = t1;
return BR_DONE;
}
if (bit1 == bit3 && bit3 != bit2) {
result = m_util.mk_bv_not(t1);
return BR_REWRITE1;
}
}
if (m_ite2id && m.is_eq(c) && is_bv(t) && is_bv(e)) {
// detect when ite is actually some simple function based on the pattern (lhs=rhs) ? t : e
expr * lhs = to_app(c)->get_arg(0);