def ws.shr_le

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

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
import bend-osdev-word64@0.1.1.0/proof_value.bend as P
import bend-osdev-u32@0.1.0.0/LAWS_order.bend as UO

311# k shifts right: the floor of the value divided by 2^k
312def ws.shr_le(+n: Nat, j: Nat, +w: Word(n)) -> {Nat.is_le(U.U32Nat.dbl(j, Word.to_nat(n, ws.shr(n, j, w))), Word.to_nat(n, w)) == True{} : Bool}:
313  match j:
314    case 0n:
315      UL.nat_le_refl(Word.to_nat(n, w))
316    case 1n+ +p:
317      +e1 = Equal.trans(Nat, Nat.double(U.U32Nat.dbl(p, Word.to_nat(n, Word.shr(n, ws.shr(n, p, w))))), U.U32Nat.dbl(p, Nat.double(Word.to_nat(n, Word.shr(n, ws.shr(n, p, w))))), U.U32Nat.dbl(p, Nat.double(U.U32Nat.half(Word.to_nat(n, ws.shr(n, p, w))))), Equal.sym(Nat, U.U32Nat.dbl(p, Nat.double(Word.to_nat(n, Word.shr(n, ws.shr(n, p, w))))), Nat.double(U.U32Nat.dbl(p, Word.to_nat(n, Word.shr(n, ws.shr(n, p, w))))), ns.dbl_double(p, Word.to_nat(n, Word.shr(n, ws.shr(n, p, w))))), Equal.cong(Nat, Nat, v => U.U32Nat.dbl(p, Nat.double(v)), Word.to_nat(n, Word.shr(n, ws.shr(n, p, w))), U.U32Nat.half(Word.to_nat(n, ws.shr(n, p, w))), UL.word_shr_value(n, ws.shr(n, p, w))))
318      +l1 = Equal.trans(Bool, Nat.is_le(U.U32Nat.dbl(p, Nat.double(U.U32Nat.half(Word.to_nat(n, ws.shr(n, p, w))))), U.U32Nat.dbl(p, Word.to_nat(n, ws.shr(n, p, w)))), Nat.is_le(Nat.double(U.U32Nat.half(Word.to_nat(n, ws.shr(n, p, w)))), Word.to_nat(n, ws.shr(n, p, w))), True{}, UL.dbl_le(p, Nat.double(U.U32Nat.half(Word.to_nat(n, ws.shr(n, p, w)))), Word.to_nat(n, ws.shr(n, p, w))), ns.half_le(Word.to_nat(n, ws.shr(n, p, w))))
319      P.wn.le_rw(U.U32Nat.dbl(p, Nat.double(U.U32Nat.half(Word.to_nat(n, ws.shr(n, p, w))))), Nat.double(U.U32Nat.dbl(p, Word.to_nat(n, Word.shr(n, ws.shr(n, p, w))))), Word.to_nat(n, w), Equal.sym(Nat, Nat.double(U.U32Nat.dbl(p, Word.to_nat(n, Word.shr(n, ws.shr(n, p, w))))), U.U32Nat.dbl(p, Nat.double(U.U32Nat.half(Word.to_nat(n, ws.shr(n, p, w))))), e1), UO.nat_le_trans(U.U32Nat.dbl(p, Nat.double(U.U32Nat.half(Word.to_nat(n, ws.shr(n, p, w))))), U.U32Nat.dbl(p, Word.to_nat(n, ws.shr(n, p, w))), Word.to_nat(n, w), l1, ws.shr_le(n, p, w)))

Uses (20)

Used by (6)