def un.and_zero
bend-osdev-u32@0.1.0.0 · PROOF.bend:2171
import bend-osdev-u32@0.1.0.0/PROOF.bend as PROOF
import Base
import bend-osdev-u32@0.1.0.0/u32.bend as U
2171def un.and_zero(n: Nat, +w: Word(n), +m: Word(n), hm: {Word.to_nat(n, m) == 0n : Nat}) -> {Word.to_nat(n, Word.and(n, w, m)) == 0n : Nat}:
2172 match n:
2173 case 0n:
2174 {==}
2175 case 1n+ +p:
2176 match w m:
2177 case WCon{+x, +wt} WCon{True{}, +mt}:
2178 Empty.absurd({Word.to_nat(1n+p, Word.and(1n+p, WCon{x, wt}, WCon{True{}, mt})) == 0n : Nat}, un.sz(Nat.double(Word.to_nat(p, mt)), hm))
2179 case WCon{+x, +wt} WCon{False{}, +mt}:
2180 Equal.trans(Nat, Word.to_nat(1n+p, WCon{Bool.and(x, False{}), Word.and(p, wt, mt)}), Nat.add(U.U32Nat.bit(False{}), Nat.double(0n)), 0n, Equal.trans(Nat, Word.to_nat(1n+p, WCon{Bool.and(x, False{}), Word.and(p, wt, mt)}), Nat.add(U.U32Nat.bit(False{}), Nat.double(Word.to_nat(p, Word.and(p, wt, mt)))), Nat.add(U.U32Nat.bit(False{}), Nat.double(0n)), Equal.trans(Nat, Word.to_nat(1n+p, WCon{Bool.and(x, False{}), Word.and(p, wt, mt)}), Nat.add(U.U32Nat.bit(Bool.and(x, False{})), Nat.double(Word.to_nat(p, Word.and(p, wt, mt)))), Nat.add(U.U32Nat.bit(False{}), Nat.double(Word.to_nat(p, Word.and(p, wt, mt)))), un.wc(p, Bool.and(x, False{}), Word.and(p, wt, mt)), Equal.cong(Nat, Nat, zz => Nat.add(zz, Nat.double(Word.to_nat(p, Word.and(p, wt, mt)))), U.U32Nat.bit(Bool.and(x, False{})), U.U32Nat.bit(False{}), Equal.cong(Bool, Nat, zz => U.U32Nat.bit(zz), Bool.and(x, False{}), False{}, un.band_f(x)))), Equal.cong(Nat, Nat, zz => Nat.add(U.U32Nat.bit(False{}), Nat.double(zz)), Word.to_nat(p, Word.and(p, wt, mt)), 0n, un.and_zero(p, wt, mt, un.dz0(Word.to_nat(p, mt), hm)))), {==})