def top9
bend-collections-laws-math@1.0.0.0 · proofs/math/typed/f64adda.bend:38
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/f64adda.bend as F64adda
import Base
import bend-collections-laws-math@1.0.0.0/spec/lib/common.bend as C
import bend-collections-laws-math@1.0.0.0/spec/math/w64.bend as SW
import bend-collections-laws-math@1.0.0.0/src/math/w64.bend as X
import bend-collections-laws-math@1.0.0.0/src/math/u64.bend as WU
import bend-collections-laws-math@1.0.0.0/proofs/lib/logic.bend as L
import bend-collections-laws-math@1.0.0.0/proofs/lib/lemmas/proofs/nat_algebra.bend as NA
import bend-collections-laws-math@1.0.0.0/proofs/lib/word.bend as WD
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/width.bend as WW
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/w64add.bend as WA
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/w64sh.bend as SH
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/f64rtools.bend as RT
38
39def top9(+one: Nat, +h1: {one == 1n : Nat}, +f: WU.U64, +Fr: Nat, +hf: {SW.value(f) == Fr : Nat}, +hF: {C.fits(52n, Fr) == True{} : Bool}, +c: U32, +hc: {c == U32{WD.pw(32n, 29n)} : U32}) -> {SW.value(X.add(WU.U64{0, c}, X.shl(f, 9n))) == C.shift(9n, Nat.add(Fr, C.shift(52n, one))) : Nat}:
40 +hFv = L.subst(Nat, z => {C.fits(52n, z) == True{} : Bool}, Fr, SW.value(f), Equal.sym(Nat, SW.value(f), Fr, hf), hF)
41 +e9 = Equal.trans(Nat, SW.value(X.shl(f, 9n)), C.shift(9n, SW.value(f)), C.shift(9n, Fr), shl_v(f, 9n, 52n, {==}, {==}, hFv), Equal.cong(Nat, Nat, z => C.shift(9n, z), SW.value(f), Fr, hf))
42 a1 = WA.add_value(WU.U64{0, c}, X.shl(f, 9n))
43 +es = Equal.trans(Nat, Nat.add(SW.value(WU.U64{0, c}), SW.value(X.shl(f, 9n))), Nat.add(C.shift(61n, one), SW.value(X.shl(f, 9n))), C.shift(9n, Nat.add(Fr, C.shift(52n, one))), Equal.cong(Nat, Nat, z => Nat.add(z, SW.value(X.shl(f, 9n))), SW.value(WU.U64{0, c}), C.shift(61n, one), c61(one, h1, c, hc)), Equal.trans(Nat, Nat.add(C.shift(61n, one), SW.value(X.shl(f, 9n))), Nat.add(C.shift(61n, one), C.shift(9n, Fr)), C.shift(9n, Nat.add(Fr, C.shift(52n, one))), Equal.cong(Nat, Nat, z => Nat.add(C.shift(61n, one), z), SW.value(X.shl(f, 9n)), C.shift(9n, Fr), e9), Equal.trans(Nat, Nat.add(C.shift(61n, one), C.shift(9n, Fr)), Nat.add(C.shift(9n, Fr), C.shift(61n, one)), C.shift(9n, Nat.add(Fr, C.shift(52n, one))), NA.add_comm(C.shift(61n, one), C.shift(9n, Fr)), Equal.trans(Nat, Nat.add(C.shift(9n, Fr), C.shift(61n, one)), Nat.add(C.shift(9n, Fr), C.shift(9n, C.shift(52n, one))), C.shift(9n, Nat.add(Fr, C.shift(52n, one))), Equal.cong(Nat, Nat, z => Nat.add(C.shift(9n, Fr), z), C.shift(61n, one), C.shift(9n, C.shift(52n, one)), WW.shift_comp(9n, 52n, one)), Equal.sym(Nat, C.shift(9n, Nat.add(Fr, C.shift(52n, one))), Nat.add(C.shift(9n, Fr), C.shift(9n, C.shift(52n, one))), WW.shift_add(9n, Fr, C.shift(52n, one)))))))
44 +f53 = WW.limbs_fit(52n, 1n, Fr, one, hF, L.subst(Nat, z => {C.fits(1n, z) == True{} : Bool}, 1n, one, Equal.sym(Nat, one, 1n, h1), {==}))
45 +f64 = SH.fits_mono(Nat.add(9n, 53n), 64n, C.shift(9n, Nat.add(Fr, C.shift(52n, one))), {==}, Equal.trans(Bool, C.fits(Nat.add(9n, 53n), C.shift(9n, Nat.add(Fr, C.shift(52n, one)))), C.fits(53n, Nat.add(Fr, C.shift(52n, one))), True{}, RT.fits_sh(9n, 53n, Nat.add(Fr, C.shift(52n, one))), f53))
46 Equal.trans(Nat, SW.value(X.add(WU.U64{0, c}, X.shl(f, 9n))), C.low(64n, Nat.add(SW.value(WU.U64{0, c}), SW.value(X.shl(f, 9n)))), C.shift(9n, Nat.add(Fr, C.shift(52n, one))), a1, Equal.trans(Nat, C.low(64n, Nat.add(SW.value(WU.U64{0, c}), SW.value(X.shl(f, 9n)))), C.low(64n, C.shift(9n, Nat.add(Fr, C.shift(52n, one)))), C.shift(9n, Nat.add(Fr, C.shift(52n, one))), Equal.cong(Nat, Nat, z => C.low(64n, z), Nat.add(SW.value(WU.U64{0, c}), SW.value(X.shl(f, 9n))), C.shift(9n, Nat.add(Fr, C.shift(52n, one))), es), WW.low_fit(64n, C.shift(9n, Nat.add(Fr, C.shift(52n, one))), f64)))