def ws.shlv

bend-osdev-word64@0.1.1.0 · proof_shift.bend:277

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

277# Word.shl: the doubled value, less 2^n for the top bit
278def ws.shlv(n: Nat, w: Word(n)) -> {Nat.add(Word.to_nat(n, Word.shl(n, w)), U.U32Nat.dbl(n, U.U32Nat.bit(ws.top(n, w)))) == Nat.double(Word.to_nat(n, w)) : Nat}:
279  match n:
280    case 0n:
281      match w:
282        case WNil{}:
283          {==}
284    case 1n+ +p:
285      match w:
286        case WCon{False{}, +t}:
287          Equal.trans(Nat, Nat.add(Nat.double(Word.to_nat(p, Word.shl.put(p, False{}, t))), Nat.double(U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, False{}, t))))), Nat.double(Nat.add(Word.to_nat(p, Word.shl.put(p, False{}, t)), U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, False{}, t))))), Nat.double(Nat.add(U.U32Nat.bit(False{}), Nat.double(Word.to_nat(p, t)))), Equal.sym(Nat, Nat.double(Nat.add(Word.to_nat(p, Word.shl.put(p, False{}, t)), U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, False{}, t))))), Nat.add(Nat.double(Word.to_nat(p, Word.shl.put(p, False{}, t))), Nat.double(U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, False{}, t))))), ns.double_add(Word.to_nat(p, Word.shl.put(p, False{}, t)), U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, False{}, t))))), Equal.cong(Nat, Nat, v => Nat.double(v), Nat.add(Word.to_nat(p, Word.shl.put(p, False{}, t)), U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, False{}, t)))), Nat.add(U.U32Nat.bit(False{}), Nat.double(Word.to_nat(p, t))), ws.putv(p, False{}, t)))
288        case WCon{True{}, +t}:
289          Equal.trans(Nat, Nat.add(Nat.double(Word.to_nat(p, Word.shl.put(p, True{}, t))), Nat.double(U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, True{}, t))))), Nat.double(Nat.add(Word.to_nat(p, Word.shl.put(p, True{}, t)), U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, True{}, t))))), Nat.double(Nat.add(U.U32Nat.bit(True{}), Nat.double(Word.to_nat(p, t)))), Equal.sym(Nat, Nat.double(Nat.add(Word.to_nat(p, Word.shl.put(p, True{}, t)), U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, True{}, t))))), Nat.add(Nat.double(Word.to_nat(p, Word.shl.put(p, True{}, t))), Nat.double(U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, True{}, t))))), ns.double_add(Word.to_nat(p, Word.shl.put(p, True{}, t)), U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, True{}, t))))), Equal.cong(Nat, Nat, v => Nat.double(v), Nat.add(Word.to_nat(p, Word.shl.put(p, True{}, t)), U.U32Nat.dbl(p, U.U32Nat.bit(ws.topc(p, True{}, t)))), Nat.add(U.U32Nat.bit(True{}), Nat.double(Word.to_nat(p, t))), ws.putv(p, True{}, t)))

Uses (19)

Used by (1)