def ws.shlk
bend-osdev-word64@0.1.1.0 · proof_shift.bend:291
import bend-osdev-word64@0.1.1.0/proof_shift.bend as ProofShift
import Base
import bend-osdev-u32@0.1.0.0/u32.bend as U
import bend-osdev-u32@0.1.0.0/LAWS.bend as UL
291
292def ws.shlk(+n: Nat, k: Nat, +w: Word(n)) -> {Nat.add(Word.to_nat(n, ws.shl(n, k, w)), U.U32Nat.dbl(n, ws.ov(n, k, w))) == U.U32Nat.dbl(k, Word.to_nat(n, w)) : Nat}:
293 match k:
294 case 0n:
295 ns.d0(n, Word.to_nat(n, w))
296 case 1n+ +p:
297 Equal.trans(Nat, Nat.add(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), U.U32Nat.dbl(n, Nat.add(U.U32Nat.bit(ws.top(n, ws.shl(n, p, w))), Nat.double(ws.ov(n, p, w))))), Nat.add(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), Nat.add(U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w)))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w))))), Nat.double(U.U32Nat.dbl(p, Word.to_nat(n, w))), Equal.cong(Nat, Nat, v => Nat.add(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), v), U.U32Nat.dbl(n, Nat.add(U.U32Nat.bit(ws.top(n, ws.shl(n, p, w))), Nat.double(ws.ov(n, p, w)))), Nat.add(U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w)))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w)))), UL.dbl_add(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w))), Nat.double(ws.ov(n, p, w)))), Equal.trans(Nat, Nat.add(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), Nat.add(U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w)))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w))))), Nat.add(Nat.add(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w))))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w)))), Nat.double(U.U32Nat.dbl(p, Word.to_nat(n, w))), Equal.sym(Nat, Nat.add(Nat.add(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w))))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w)))), Nat.add(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), Nat.add(U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w)))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w))))), UL.nat_add_assoc(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w)))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w))))), Equal.trans(Nat, Nat.add(Nat.add(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w))))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w)))), Nat.add(Nat.double(Word.to_nat(n, ws.shl(n, p, w))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w)))), Nat.double(U.U32Nat.dbl(p, Word.to_nat(n, w))), Equal.cong(Nat, Nat, v => Nat.add(v, U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w)))), Nat.add(Word.to_nat(n, Word.shl(n, ws.shl(n, p, w))), U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, ws.shl(n, p, w))))), Nat.double(Word.to_nat(n, ws.shl(n, p, w))), ws.shlv(n, ws.shl(n, p, w))), Equal.trans(Nat, Nat.add(Nat.double(Word.to_nat(n, ws.shl(n, p, w))), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w)))), Nat.add(Nat.double(Word.to_nat(n, ws.shl(n, p, w))), Nat.double(U.U32Nat.dbl(n, ws.ov(n, p, w)))), Nat.double(U.U32Nat.dbl(p, Word.to_nat(n, w))), Equal.cong(Nat, Nat, v => Nat.add(Nat.double(Word.to_nat(n, ws.shl(n, p, w))), v), U.U32Nat.dbl(n, Nat.double(ws.ov(n, p, w))), Nat.double(U.U32Nat.dbl(n, ws.ov(n, p, w))), ns.dbl_double(n, ws.ov(n, p, w))), Equal.trans(Nat, Nat.add(Nat.double(Word.to_nat(n, ws.shl(n, p, w))), Nat.double(U.U32Nat.dbl(n, ws.ov(n, p, w)))), Nat.double(Nat.add(Word.to_nat(n, ws.shl(n, p, w)), U.U32Nat.dbl(n, ws.ov(n, p, w)))), Nat.double(U.U32Nat.dbl(p, Word.to_nat(n, w))), Equal.sym(Nat, Nat.double(Nat.add(Word.to_nat(n, ws.shl(n, p, w)), U.U32Nat.dbl(n, ws.ov(n, p, w)))), Nat.add(Nat.double(Word.to_nat(n, ws.shl(n, p, w))), Nat.double(U.U32Nat.dbl(n, ws.ov(n, p, w)))), ns.double_add(Word.to_nat(n, ws.shl(n, p, w)), U.U32Nat.dbl(n, ws.ov(n, p, w)))), Equal.cong(Nat, Nat, v => Nat.double(v), Nat.add(Word.to_nat(n, ws.shl(n, p, w)), U.U32Nat.dbl(n, ws.ov(n, p, w))), U.U32Nat.dbl(p, Word.to_nat(n, w)), ws.shlk(n, p, w)))))))