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

fill in some use cases

This commit is contained in:
Nikolaj Bjorner 2021-12-14 19:51:30 -08:00
parent 79bc33b88e
commit bc1e44ab71

View file

@ -1020,20 +1020,21 @@ namespace polysat {
r = alloc(pdd, pa * pb);
}
else if (bv.is_bv_udiv(e, a, b)) {
// quot = udiv(a, b)
// quot*b + rem == a
// rem < b or b == 0
// quot*b does not overflow
auto quot = s.var(s.add_var(sz));
auto rem = s.var(s.add_var(sz));
auto pa = to_pdd(m, s, expr2pdd, a);
auto pb = to_pdd(m, s, expr2pdd, b);
s.add_eq(quot*pb + rem - pa);
s.add_ult(rem, pb);
s.add_noovfl(quot, pb);
// todo: add clause or use external iteration?
// s.add_clause(s.ult(rem, pb), s.eq(b));
r = alloc(pdd, quot);
auto pb = to_pdd(m, s, expr2pdd, b);
auto qr = s.quot_rem(pa, pb);
r = alloc(pdd, std::get<0>(qr));
}
else if (bv.is_bv_urem(e, a, b)) {
auto pa = to_pdd(m, s, expr2pdd, a);
auto pb = to_pdd(m, s, expr2pdd, b);
auto qr = s.quot_rem(pa, pb);
r = alloc(pdd, std::get<1>(qr));
}
else if (bv.is_bv_lshr(e, a, b)) {
auto pa = to_pdd(m, s, expr2pdd, a);
auto pb = to_pdd(m, s, expr2pdd, b);
r = alloc(pdd, s.shr(pa, pb));
}
else if (bv.is_numeral(e, n, sz))
r = alloc(pdd, s.value(n, sz));