def tl.pick
bend-osdev-gf@0.1.1.0 · PROOF.bend:7895
import bend-osdev-gf@0.1.1.0/PROOF.bend as PROOF
import Base
import bend-osdev-gf@0.1.1.0/gf.bend as G
import bend-osdev-gf@0.1.1.0/tables.bend as T
import bend-osdev-array@0.1.0.1/array.bend as A
import bend-osdev-gf@0.1.1.0/proof_tab.bend as GT
import bend-osdev-gf@0.1.1.0/proof_tab_cases.bend as GC
import bend-osdev-gf@0.1.1.0/LAWS.bend as Laws
7895
7896def tl.pick(+f: G.Gf8Field, +l: List<&2, U32>, zx: Bool, zy: Bool, +a: U32, +b: U32, +ex: {U32.is_eq(G.Gf8.elt(a), 0) == zx : Bool}, +ey: {U32.is_eq(G.Gf8.elt(b), 0) == zy : Bool}, +hl: {List.length(&2, U32, l) == A.Arrays.slots(8n) : Nat}, +hxa: {A.Arrays.nth(U32, l, A.Arrays.index(8n, G.Gf8.elt(a)), 0) == U32.from_nat(G.Gf8.log(f, a)) : U32}, +hxb: {A.Arrays.nth(U32, l, A.Arrays.index(8n, G.Gf8.elt(b)), 0) == U32.from_nat(G.Gf8.log(f, b)) : U32}, ela: {G.Gf8.is_zero(a) == False{} : Bool} -> {G.Gf8.exp(f, G.Gf8.log(f, a)) == G.Gf8.elt(a) : U32}, elb: {G.Gf8.is_zero(b) == False{} : Bool} -> {G.Gf8.exp(f, G.Gf8.log(f, b)) == G.Gf8.elt(b) : U32}) -> {T.gf8tab.two.pick(Bool.or(zx, zy), GT.gt.tab(f, l), G.Gf8.elt(a), G.Gf8.elt(b), False{}) == (GT.gt.tab(f, l), G.Gf8.mul(f, a, b)) : T.Gf8Tab & U32}:
7897 match zx zy:
7898 case True{} _:
7899 %Equal.sym(U32, G.Gf8.mul(f, a, b), 0, tl.zero_l(f, a, b, ex)) : {(GT.gt.tab(f, l), 0) == (GT.gt.tab(f, l), _) : T.Gf8Tab & U32}
7900 {==}
7901 case False{} True{}:
7902 %Equal.sym(U32, G.Gf8.mul(f, a, b), 0, Equal.trans(U32, G.Gf8.mul(f, a, b), G.Gf8.mul(f, b, a), 0, Laws.mul_comm(f, a, b), tl.zero_l(f, b, a, ey))) : {(GT.gt.tab(f, l), 0) == (GT.gt.tab(f, l), _) : T.Gf8Tab & U32}
7903 {==}
7904 case False{} False{}:
7905 tl.nzpick(f, l, a, b, hl, hxa, hxb, ela(Equal.trans(Bool, G.Gf8.is_zero(a), U32.is_eq(G.Gf8.elt(a), 0), False{}, Equal.sym(Bool, U32.is_eq(G.Gf8.elt(a), 0), G.Gf8.is_zero(a), GC.gc.isz(a)), ex)), elb(Equal.trans(Bool, G.Gf8.is_zero(b), U32.is_eq(G.Gf8.elt(b), 0), False{}, Equal.sym(Bool, U32.is_eq(G.Gf8.elt(b), 0), G.Gf8.is_zero(b), GC.gc.isz(b)), ey)))