def ws.gshl_lo

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

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

398# a shift left by k < n: the high half takes the low half's top k bits
399def ws.gshl_lo(+n: Nat, +k: Nat, +hw: Word(n), +lw: Word(n), +ch: Word(n), +cl: Word(n), hk: {Nat.is_lt(k, n) == True{} : Bool}, h: {Nat.is_le(U.U32Nat.dbl(k, P.wv.V(n, hw, lw)), P.wv.V(n, ch, cl)) == True{} : Bool}) -> {P.wv.V(n, Word.or(n, ws.shl(n, k, hw), ws.shr(n, Nat.sub(n, k), lw)), ws.shl(n, k, lw)) == U.U32Nat.dbl(k, P.wv.V(n, hw, lw)) : Nat}:
400  +hkle = P.wn.lt_le(k, n, hk)
401  +hb = Equal.trans(Bool, Nat.is_lt(U.U32Nat.dbl(k, Word.to_nat(n, hw)), U.U32Nat.dbl(n, 1n)), Nat.is_lt(U.U32Nat.dbl(n, U.U32Nat.dbl(k, Word.to_nat(n, hw))), U.U32Nat.dbl(n, U.U32Nat.dbl(n, 1n))), True{}, Equal.sym(Bool, Nat.is_lt(U.U32Nat.dbl(n, U.U32Nat.dbl(k, Word.to_nat(n, hw))), U.U32Nat.dbl(n, U.U32Nat.dbl(n, 1n))), Nat.is_lt(U.U32Nat.dbl(k, Word.to_nat(n, hw)), U.U32Nat.dbl(n, 1n)), UL.dbl_lt(n, U.U32Nat.dbl(k, Word.to_nat(n, hw)), U.U32Nat.dbl(n, 1n))), ws.hb(n, k, hw, lw, ch, cl, h))
402  +exh = ws.uniq(n, ws.ov(n, k, hw), 0n, Word.to_nat(n, ws.shl(n, k, hw)), U.U32Nat.dbl(k, Word.to_nat(n, hw)), Equal.trans(Nat, Nat.add(Word.to_nat(n, ws.shl(n, k, hw)), U.U32Nat.dbl(n, ws.ov(n, k, hw))), U.U32Nat.dbl(k, Word.to_nat(n, hw)), Nat.add(U.U32Nat.dbl(k, Word.to_nat(n, hw)), U.U32Nat.dbl(n, 0n)), ws.shlk(n, k, hw), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(k, Word.to_nat(n, hw)), U.U32Nat.dbl(n, 0n)), U.U32Nat.dbl(k, Word.to_nat(n, hw)), ns.d0(n, U.U32Nat.dbl(k, Word.to_nat(n, hw))))), UL.word_value_lt(n, ws.shl(n, k, hw)), hb)
403  +l3 = UO.nat_le_lt_trans(U.U32Nat.dbl(Nat.sub(n, k), Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))), Word.to_nat(n, lw), U.U32Nat.dbl(Nat.sub(n, k), U.U32Nat.dbl(k, 1n)), ws.shr_le(n, Nat.sub(n, k), lw), P.wn.lt_rw2(Word.to_nat(n, lw), U.U32Nat.dbl(n, 1n), U.U32Nat.dbl(Nat.sub(n, k), U.U32Nat.dbl(k, 1n)), Equal.sym(Nat, U.U32Nat.dbl(Nat.sub(n, k), U.U32Nat.dbl(k, 1n)), U.U32Nat.dbl(n, 1n), ns.dmk(n, k, 1n, hkle)), UL.word_value_lt(n, lw)))
404  +hs = Equal.trans(Bool, Nat.is_lt(Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)), U.U32Nat.dbl(k, 1n)), Nat.is_lt(U.U32Nat.dbl(Nat.sub(n, k), Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))), U.U32Nat.dbl(Nat.sub(n, k), U.U32Nat.dbl(k, 1n))), True{}, Equal.sym(Bool, Nat.is_lt(U.U32Nat.dbl(Nat.sub(n, k), Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))), U.U32Nat.dbl(Nat.sub(n, k), U.U32Nat.dbl(k, 1n))), Nat.is_lt(Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)), U.U32Nat.dbl(k, 1n)), UL.dbl_lt(Nat.sub(n, k), Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)), U.U32Nat.dbl(k, 1n))), l3)
405  +ehi = ws.or_dis(n, k, ws.shl(n, k, hw), ws.shr(n, Nat.sub(n, k), lw), Word.to_nat(n, hw), exh, hs)
406  Equal.trans(Nat, Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), U.U32Nat.dbl(n, Word.to_nat(n, Word.or(n, ws.shl(n, k, hw), ws.shr(n, Nat.sub(n, k), lw))))), Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), U.U32Nat.dbl(n, Nat.add(Word.to_nat(n, ws.shl(n, k, hw)), Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))))), U.U32Nat.dbl(k, P.wv.V(n, hw, lw)), Equal.cong(Nat, Nat, v => Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), U.U32Nat.dbl(n, v)), Word.to_nat(n, Word.or(n, ws.shl(n, k, hw), ws.shr(n, Nat.sub(n, k), lw))), Nat.add(Word.to_nat(n, ws.shl(n, k, hw)), Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))), ehi), Equal.trans(Nat, Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), U.U32Nat.dbl(n, Nat.add(Word.to_nat(n, ws.shl(n, k, hw)), Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))))), Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), Nat.add(U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))))), U.U32Nat.dbl(k, P.wv.V(n, hw, lw)), Equal.cong(Nat, Nat, v => Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), v), U.U32Nat.dbl(n, Nat.add(Word.to_nat(n, ws.shl(n, k, hw)), Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)))), Nat.add(U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)))), UL.dbl_add(n, Word.to_nat(n, ws.shl(n, k, hw)), Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)))), Equal.trans(Nat, Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), Nat.add(U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))))), Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), Nat.add(U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw))))), U.U32Nat.dbl(k, P.wv.V(n, hw, lw)), Equal.cong(Nat, Nat, v => Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), v), Nat.add(U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)))), Nat.add(U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw)))), UL.nat_add_comm(U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))))), Equal.trans(Nat, Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), Nat.add(U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw))))), Nat.add(Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw)))), U.U32Nat.dbl(k, P.wv.V(n, hw, lw)), Equal.sym(Nat, Nat.add(Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw)))), Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), Nat.add(U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw))))), UL.nat_add_assoc(Word.to_nat(n, ws.shl(n, k, lw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw))))), Equal.trans(Nat, Nat.add(Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)))), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw)))), Nat.add(U.U32Nat.dbl(k, Word.to_nat(n, lw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw)))), U.U32Nat.dbl(k, P.wv.V(n, hw, lw)), Equal.cong(Nat, Nat, v => Nat.add(v, U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw)))), Nat.add(Word.to_nat(n, ws.shl(n, k, lw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shr(n, Nat.sub(n, k), lw)))), U.U32Nat.dbl(k, Word.to_nat(n, lw)), ws.g1b(n, k, lw, hkle)), Equal.trans(Nat, Nat.add(U.U32Nat.dbl(k, Word.to_nat(n, lw)), U.U32Nat.dbl(n, Word.to_nat(n, ws.shl(n, k, hw)))), Nat.add(U.U32Nat.dbl(k, Word.to_nat(n, lw)), U.U32Nat.dbl(n, U.U32Nat.dbl(k, Word.to_nat(n, hw)))), U.U32Nat.dbl(k, P.wv.V(n, hw, lw)), Equal.cong(Nat, Nat, v => Nat.add(U.U32Nat.dbl(k, Word.to_nat(n, lw)), U.U32Nat.dbl(n, v)), Word.to_nat(n, ws.shl(n, k, hw)), U.U32Nat.dbl(k, Word.to_nat(n, hw)), exh), Equal.sym(Nat, U.U32Nat.dbl(k, P.wv.V(n, hw, lw)), Nat.add(U.U32Nat.dbl(k, Word.to_nat(n, lw)), U.U32Nat.dbl(n, U.U32Nat.dbl(k, Word.to_nat(n, hw)))), ws.ea(n, k, hw, lw))))))))

Uses (34)

Used by (1)