def ws.gshr_v

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

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

426# a shift right by k < n: the low half takes the high half's low k bits
427def ws.gshr_v(+n: Nat, +k: Nat, +hw: Word(n), +lw: Word(n), hk: {Nat.is_lt(k, n) == True{} : Bool}) -> {P.wv.V(n, ws.shr(n, k, hw), Word.or(n, ws.shr(n, k, lw), ws.shl(n, Nat.sub(n, k), hw))) == Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), U.U32Nat.dbl(Nat.sub(n, k), Word.to_nat(n, hw))) : Nat}:
428  +hkle = P.wn.lt_le(k, n, hk)
429  +hmle = ns.sub_le(n, k)
430  +es = Equal.cong(Nat, Nat, v => Word.to_nat(n, ws.shr(n, v, hw)), Nat.sub(n, Nat.sub(n, k)), k, ns.sub_sub(k, n, hkle))
431  +l3 = UO.nat_le_lt_trans(U.U32Nat.dbl(k, Word.to_nat(n, ws.shr(n, k, lw))), Word.to_nat(n, lw), U.U32Nat.dbl(k, U.U32Nat.dbl(Nat.sub(n, k), 1n)), ws.shr_le(n, k, lw), P.wn.lt_rw2(Word.to_nat(n, lw), U.U32Nat.dbl(n, 1n), U.U32Nat.dbl(k, U.U32Nat.dbl(Nat.sub(n, k), 1n)), Equal.sym(Nat, U.U32Nat.dbl(k, U.U32Nat.dbl(Nat.sub(n, k), 1n)), U.U32Nat.dbl(n, 1n), ns.dkm(n, k, 1n, hkle)), UL.word_value_lt(n, lw)))
432  +hy = Equal.trans(Bool, Nat.is_lt(Word.to_nat(n, ws.shr(n, k, lw)), U.U32Nat.dbl(Nat.sub(n, k), 1n)), Nat.is_lt(U.U32Nat.dbl(k, Word.to_nat(n, ws.shr(n, k, lw))), U.U32Nat.dbl(k, U.U32Nat.dbl(Nat.sub(n, k), 1n))), True{}, Equal.sym(Bool, Nat.is_lt(U.U32Nat.dbl(k, Word.to_nat(n, ws.shr(n, k, lw))), U.U32Nat.dbl(k, U.U32Nat.dbl(Nat.sub(n, k), 1n))), Nat.is_lt(Word.to_nat(n, ws.shr(n, k, lw)), U.U32Nat.dbl(Nat.sub(n, k), 1n)), UL.dbl_lt(k, Word.to_nat(n, ws.shr(n, k, lw)), U.U32Nat.dbl(Nat.sub(n, k), 1n))), l3)
433  +eor = Equal.trans(Nat, Word.to_nat(n, Word.or(n, ws.shr(n, k, lw), ws.shl(n, Nat.sub(n, k), hw))), Word.to_nat(n, Word.or(n, ws.shl(n, Nat.sub(n, k), hw), ws.shr(n, k, lw))), Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), Word.to_nat(n, ws.shr(n, k, lw))), Equal.cong(Word(n), Nat, v => Word.to_nat(n, v), Word.or(n, ws.shr(n, k, lw), ws.shl(n, Nat.sub(n, k), hw)), Word.or(n, ws.shl(n, Nat.sub(n, k), hw), ws.shr(n, k, lw)), UL.word_or_comm(n, ws.shr(n, k, lw), ws.shl(n, Nat.sub(n, k), hw))), ws.or_dis(n, Nat.sub(n, k), ws.shl(n, Nat.sub(n, k), hw), ws.shr(n, k, lw), Nat.sub(Word.to_nat(n, hw), U.U32Nat.dbl(Nat.sub(n, Nat.sub(n, k)), Word.to_nat(n, ws.shr(n, Nat.sub(n, Nat.sub(n, k)), hw)))), ws.g1a(n, Nat.sub(n, k), hw, hmle), hy))
434  Equal.trans(Nat, Nat.add(Word.to_nat(n, Word.or(n, ws.shr(n, k, lw), ws.shl(n, Nat.sub(n, k), hw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw)))), Nat.add(Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), Word.to_nat(n, ws.shr(n, k, lw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw)))), Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), U.U32Nat.dbl(Nat.sub(n, k), Word.to_nat(n, hw))), Equal.cong(Nat, Nat, v => Nat.add(v, U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw)))), Word.to_nat(n, Word.or(n, ws.shr(n, k, lw), ws.shl(n, Nat.sub(n, k), hw))), Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), Word.to_nat(n, ws.shr(n, k, lw))), eor), Equal.trans(Nat, Nat.add(Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), Word.to_nat(n, ws.shr(n, k, lw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw)))), Nat.add(Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw)))), Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), U.U32Nat.dbl(Nat.sub(n, k), Word.to_nat(n, hw))), Equal.cong(Nat, Nat, v => Nat.add(v, U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw)))), Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), Word.to_nat(n, ws.shr(n, k, lw))), Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw))), UL.nat_add_comm(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), Word.to_nat(n, ws.shr(n, k, lw)))), Equal.trans(Nat, Nat.add(Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw)))), Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw))))), Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), U.U32Nat.dbl(Nat.sub(n, k), Word.to_nat(n, hw))), UL.nat_add_assoc(Word.to_nat(n, ws.shr(n, k, lw)), Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw)))), Equal.trans(Nat, Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, k, hw))))), Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, Nat.sub(n, k)), hw))))), Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), U.U32Nat.dbl(Nat.sub(n, k), Word.to_nat(n, hw))), Equal.cong(Nat, Nat, v => Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), U.U32Nat.dbl(n, v))), Word.to_nat(n, ws.shr(n, k, hw)), Word.to_nat(n, ws.shr(n, Nat.sub(n, Nat.sub(n, k)), hw)), Equal.sym(Nat, Word.to_nat(n, ws.shr(n, Nat.sub(n, Nat.sub(n, k)), hw)), Word.to_nat(n, ws.shr(n, k, hw)), es)), Equal.cong(Nat, Nat, v => Nat.add(Word.to_nat(n, ws.shr(n, k, lw)), v), Nat.add(Word.to_nat(n, ws.shl(n, Nat.sub(n, k), hw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, Nat.sub(n, k)), hw)))), U.U32Nat.dbl(Nat.sub(n, k), Word.to_nat(n, hw)), ws.g1b(n, Nat.sub(n, k), hw, hmle))))))

Uses (30)

Used by (2)