def sub_eq

bend-collections-laws-math@1.0.0.0 · proofs/math/typed/w64m128.bend:110

import bend-collections-laws-math@1.0.0.0/proofs/math/typed/w64m128.bend as W64m128
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/word.bend as WD
import bend-collections-laws-math@1.0.0.0/proofs/lib/lemmas/spec/numeric.bend as S
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/w64mul.bend as W64M
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/width.bend as WW

110def sub_eq(+one: Nat, +h1: {one == 1n : Nat}, +a: WU.U64, +b: WU.U64) -> {Nat.add(SW.value(X.sub(a, b)), SW.value(b)) == Nat.add(SW.value(a), C.shift(64n, QSUB(one, a, b))) : Nat}:
111  match a b:
112    case WU.U64{+al, +ah} WU.U64{+bl, +bh}:
113      +lo = U32.sub(al, bl)
114      +c1 = U32.is_lt(al, bl)
115      +s = U32.sub(ah, bh)
116      +cb = X.b32(c1)
117      +hi = U32.sub(s, cb)
118      +b1 = WD.bo(c1, one)
119      +b2 = WD.bo(U32.is_lt(ah, bh), one)
120      +b3 = WD.bo(U32.is_lt(s, cb), one)
121      +ecb = Equal.trans(Nat, v(cb), S.bit_value(c1), b1, W64M.b32_v(c1), Equal.sym(Nat, b1, S.bit_value(c1), WD.bo_bit(c1, one, h1)))
122      +e3 = Equal.trans(Nat, Nat.add(v(hi), b1), Nat.add(v(hi), v(cb)), Nat.add(v(s), C.shift(32n, b3)), Equal.cong(Nat, Nat, t => Nat.add(v(hi), t), b1, v(cb), Equal.sym(Nat, v(cb), b1, ecb)), WA.sub_cons(one, h1, s, cb))
123      +eq = WA.sub_alg(v(lo), v(hi), v(al), v(ah), v(bl), v(bh), v(s), b1, b2, b3, WA.sub_cons(one, h1, al, bl), WA.sub_cons(one, h1, ah, bh), e3)
124      +q = Nat.add(b2, b3)
125      Equal.trans(Nat, Nat.add(WA.val(lo, hi), WA.val(bl, bh)), Nat.add(WA.val(al, ah), C.shift(32n, C.shift(32n, q))), Nat.add(WA.val(al, ah), C.shift(64n, q)), eq, Equal.cong(Nat, Nat, t => Nat.add(WA.val(al, ah), t), C.shift(32n, C.shift(32n, q)), C.shift(64n, q), Equal.sym(Nat, C.shift(64n, q), C.shift(32n, C.shift(32n, q)), WW.shift_comp(32n, 32n, q))))

Uses (22)

Used by (2)