def subv
bend-collections-laws-math@1.0.0.0 · proofs/math/typed/f64addb.bend:39
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/f64addb.bend as F64addb
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/math/typed/w64add.bend as WA
import bend-collections-laws-math@1.0.0.0/proofs/math/typed/w64sh.bend as SH
39
40def subv(+tw: WU.U64, +sw: WU.U64, +t: Nat, +S: Nat, +d: Nat, +ht: {SW.value(tw) == Nat.double(t) : Nat}, +hs: {SW.value(sw) == S : Nat}, +hle: {Nat.is_le(SW.jam(C.high(d, S), C.low(d, S)), Nat.double(t)) == True{} : Bool}) -> {SW.value(X.sub(tw, X.shr_jam(sw, d))) == Nat.sub(Nat.double(t), SW.jam(C.high(d, S), C.low(d, S))) : Nat}:
41 sj = SH.shr_jam_value(sw, d)
42 +JJ = SW.jam(C.high(d, S), C.low(d, S))
43 +ej = Equal.trans(Nat, SW.value(X.shr_jam(sw, d)), SW.jam(C.high(d, SW.value(sw)), C.low(d, SW.value(sw))), JJ, sj, Equal.cong(Nat, Nat, z => SW.jam(C.high(d, z), C.low(d, z)), SW.value(sw), S, hs))
44 +hle2 = L.subst(Nat, z => {Nat.is_le(z, SW.value(tw)) == True{} : Bool}, JJ, SW.value(X.shr_jam(sw, d)), Equal.sym(Nat, SW.value(X.shr_jam(sw, d)), JJ, ej), L.subst(Nat, z => {Nat.is_le(JJ, z) == True{} : Bool}, Nat.double(t), SW.value(tw), Equal.sym(Nat, SW.value(tw), Nat.double(t), ht), hle))
45 s1 = WA.sub_value(tw, X.shr_jam(sw, d), hle2)
46 Equal.trans(Nat, SW.value(X.sub(tw, X.shr_jam(sw, d))), Nat.sub(SW.value(tw), SW.value(X.shr_jam(sw, d))), Nat.sub(Nat.double(t), JJ), s1, Equal.trans(Nat, Nat.sub(SW.value(tw), SW.value(X.shr_jam(sw, d))), Nat.sub(Nat.double(t), SW.value(X.shr_jam(sw, d))), Nat.sub(Nat.double(t), JJ), Equal.cong(Nat, Nat, z => Nat.sub(z, SW.value(X.shr_jam(sw, d))), SW.value(tw), Nat.double(t), ht), Equal.cong(Nat, Nat, z => Nat.sub(Nat.double(t), z), SW.value(X.shr_jam(sw, d)), JJ, ej)))