PROOF_div.bend
bend-osdev-word64@0.1.1.0 · 442 lines · 39 definitions
1
2
3import Base
4import bend-osdev-u32@0.1.0.0/u32.bend as U
5import bend-osdev-u32@0.1.0.0/LAWS.bend as UL
6import bend-osdev-u32@0.1.0.0/PROOF.bend as UP
7import bend-osdev-word64@0.1.1.0/word64.bend as W
8import bend-osdev-word64@0.1.1.0/LAWS.bend as WB
9import bend-osdev-word64@0.1.1.0/PROOF.bend as WBP
10import bend-osdev-word64@0.1.1.0/proof_value.bend as P
11import bend-osdev-word64@0.1.1.0/proof_shift.bend as PS
12import bend-osdev-u32@0.1.0.0/LAWS_order.bend as UO
13import bend-osdev-u32@0.1.0.0/PROOF_order.bend as UOP
14import bend-osdev-word64@0.1.1.0/LAWS_bits.bend as LB
15import bend-osdev-word64@0.1.1.0/PROOF_bits.bend as LBP
16import bend-osdev-word64@0.1.1.0/LAWS_div.bend as Laws
17
18
19
20
21def wu.ve(+w: Word(32n)) -> {Word.to_nat(32n, w) == U32.to_nat(U32{w}) : Nat}:
22 {==}
23
24def wu.lt(+x: U32) -> {Nat.is_lt(U32.to_nat(x), U.U32Nat.dbl(32n, 1n)) == True{} : Bool}:
25 match x:
26 case U32{+w}:
27 %wu.ve(w) : {Nat.is_lt(_, U.U32Nat.dbl(32n, 1n)) == True{} : Bool}
28 UL.word_value_lt(32n, w)
29
30def wv.g(+n: Nat, +m: Nat, +h: Word(n), +l: Word(n), e: {Nat.add(n, n) == m : Nat}) -> {Nat.is_lt(P.wv.V(n, h, l), U.U32Nat.dbl(m, 1n)) == True{} : Bool}:
31 %e : {Nat.is_lt(P.wv.V(n, h, l), U.U32Nat.dbl(_, 1n)) == True{} : Bool}
32 %UL.dbl_dbl(n, n, 1n) : {Nat.is_lt(P.wv.V(n, h, l), _) == True{} : Bool}
33 P.wv.val_lt2(n, Word.to_nat(n, l), Word.to_nat(n, h), UL.word_value_lt(n, l), UL.word_value_lt(n, h))
34
35def wv.ve(+h: Word(32n), +l: Word(32n)) -> {P.wv.V(32n, h, l) == W.W64.to_nat(W.W64{U32{h}, U32{l}}) : Nat}:
36 {==}
37
38def wv.lt64(+x: W.W64) -> {Nat.is_lt(W.W64.to_nat(x), U.U32Nat.dbl(64n, 1n)) == True{} : Bool}:
39 match x:
40 case W.W64{U32{+h}, U32{+l}}:
41 %wv.ve(h, l) : {Nat.is_lt(_, U.U32Nat.dbl(64n, 1n)) == True{} : Bool}
42 wv.g(32n, 64n, h, l, {==})
43
44def wn.sub0(x: Nat) -> {Nat.sub(x, 0n) == x : Nat}:
45 match x:
46 case 0n:
47 {==}
48 case 1n+ +p:
49 {==}
50
51def wn.le0(x: Nat) -> {Nat.is_le(0n, x) == True{} : Bool}:
52 match x:
53 case 0n:
54 {==}
55 case 1n+ +p:
56 {==}
57
58def wn.ft(e: {False{} == True{} : Bool}) -> Empty:
59 P.wn.ft(e)
60
61def wn.tf(e: {True{} == False{} : Bool}) -> Empty:
62 PS.ns.tf(e)
63
64def wn.ge_lt(c: Cmp) -> {Cmp.is_ge(c) == Bool.not(Cmp.is_lt(c)) : Bool}:
65 match c:
66 case LT{}:
67 {==}
68 case EQ{}:
69 {==}
70 case GT{}:
71 {==}
72
73def wm.fn(+h: Nat, +n: Nat, +x: Nat, +en: {Nat.add(h, h) == n : Nat}) -> {U.U32Nat.dbl(n, x) == U.U32Nat.dbl(h, U.U32Nat.dbl(h, x)) : Nat}:
74 Equal.trans(Nat, U.U32Nat.dbl(n, x), U.U32Nat.dbl(Nat.add(h, h), x), U.U32Nat.dbl(h, U.U32Nat.dbl(h, x)), Equal.cong(Nat, Nat, zz => U.U32Nat.dbl(zz, x), n, Nat.add(h, h), Equal.sym(Nat, Nat.add(h, h), n, en)), Equal.sym(Nat, U.U32Nat.dbl(h, U.U32Nat.dbl(h, x)), U.U32Nat.dbl(Nat.add(h, h), x), UL.dbl_dbl(h, h, x)))
75
76
77
78
79
80
81
82
83def wd.lt2(x: Nat, h: {Nat.is_lt(x, U.U32Nat.dbl(1n, 1n)) == True{} : Bool}) -> {Nat.is_le(x, 1n) == True{} : Bool}:
84 match x:
85 case 0n:
86 {==}
87 case 1n+ +p:
88 match p:
89 case 0n:
90 {==}
91 case 1n+ +q:
92 match q:
93 case 0n:
94 Empty.absurd({Nat.is_le(2n, 1n) == True{} : Bool}, wn.ft(h))
95 case 1n+ +r:
96 Empty.absurd({Nat.is_le(3n+r, 1n) == True{} : Bool}, wn.ft(h))
97
98def wd.bt(x: Nat, h: {Nat.is_lt(x, U.U32Nat.dbl(1n, 1n)) == True{} : Bool}) -> {U.U32Nat.bit(Nat.is_eq(x, 1n)) == x : Nat}:
99 match x:
100 case 0n:
101 {==}
102 case 1n+ +p:
103 match p:
104 case 0n:
105 {==}
106 case 1n+ +q:
107 match q:
108 case 0n:
109 Empty.absurd({U.U32Nat.bit(Nat.is_eq(2n, 1n)) == 2n : Nat}, wn.ft(h))
110 case 1n+ +r:
111 Empty.absurd({U.U32Nat.bit(Nat.is_eq(3n+r, 1n)) == 3n+r : Nat}, wn.ft(h))
112
113def wd.bv(g: Bool) -> {U32.to_nat(W.W64.bit(g)) == U.U32Nat.bit(g) : Nat}:
114 match g:
115 case True{}:
116 {==}
117 case False{}:
118 {==}
119
120def wd.bl(g: Bool) -> {Nat.is_lt(U32.to_nat(W.W64.bit(g)), U.U32Nat.dbl(1n, 1n)) == True{} : Bool}:
121 match g:
122 case True{}:
123 {==}
124 case False{}:
125 {==}
126
127
128def wd.top(+x: W.W64) -> {Nat.is_lt(U32.to_nat(U32.shrn(W.W64.hi(x), 31n)), U.U32Nat.dbl(1n, 1n)) == True{} : Bool}:
129 Equal.trans(Bool, Nat.is_lt(U32.to_nat(U32.shrn(W.W64.hi(x), 31n)), U.U32Nat.dbl(1n, 1n)), Nat.is_lt(U.U32Nat.high(31n, U32.to_nat(W.W64.hi(x))), U.U32Nat.dbl(1n, 1n)), True{}, Equal.cong(Nat, Bool, zz => Nat.is_lt(zz, U.U32Nat.dbl(1n, 1n)), U32.to_nat(U32.shrn(W.W64.hi(x), 31n)), U.U32Nat.high(31n, U32.to_nat(W.W64.hi(x))), Equal.sym(Nat, U.U32Nat.high(31n, U32.to_nat(W.W64.hi(x))), U32.to_nat(U32.shrn(W.W64.hi(x), 31n)), Equal.sym(Nat, U32.to_nat(U32.shrn(W.W64.hi(x), 31n)), U.U32Nat.high(31n, U32.to_nat(W.W64.hi(x))), UL.u32_shrn_value(W.W64.hi(x), 31n)))), UL.high_lt(31n, 1n, 32n, U32.to_nat(W.W64.hi(x)), {==}, wu.lt(W.W64.hi(x))))
130
131def wd.nz(x: Nat, e: {Nat.is_eq(x, 0n) == False{} : Bool}) -> {Nat.is_lt(0n, x) == True{} : Bool}:
132 match x:
133 case 0n:
134 Empty.absurd({Nat.is_lt(0n, 0n) == True{} : Bool}, wn.tf(e))
135 case 1n+ +p:
136 {==}
137
138
139def wd.wv(p: Nat, x: Bool, t: Word(p)) -> {Word.to_nat(1n+p, WCon{x, t}) == Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, t))) : Nat}:
140 match x:
141 case True{}:
142 {==}
143 case False{}:
144 {==}
145
146
147def wd.eta(p: W.W64 & W.W64) -> {p == (W.W64.fst(p), W.W64.snd(p)) : W.W64 & W.W64}:
148 (q, r) = p
149 {==}
150
151def wd.p1(-x: Nat, -y: Nat, -c: Nat, -d: Nat, pr: {x == y : Nat} & {Nat.is_lt(c, d) == True{} : Bool}) -> {x == y : Nat}:
152 (+u, +v) = pr
153 u
154
155def wd.p2(-x: Nat, -y: Nat, -c: Nat, -d: Nat, pr: {x == y : Nat} & {Nat.is_lt(c, d) == True{} : Bool}) -> {Nat.is_lt(c, d) == True{} : Bool}:
156 (+u, +v) = pr
157 v
158
159def wr.d0(+x0: Nat, +x1: Nat, +x2: Nat, +x3: Nat) -> {Nat.add(Nat.add(x0, x1), U.U32Nat.dbl(x2, x3)) == Nat.add(x1, Nat.add(x0, U.U32Nat.dbl(x2, x3))) : Nat}:
160 %Equal.sym(Nat, Nat.add(Nat.add(x0, x1), U.U32Nat.dbl(x2, x3)), Nat.add(x0, Nat.add(x1, U.U32Nat.dbl(x2, x3))), UL.nat_add_assoc(x0, x1, U.U32Nat.dbl(x2, x3))) : {_ == Nat.add(x1, Nat.add(x0, U.U32Nat.dbl(x2, x3))) : Nat}
161 %Equal.sym(Nat, Nat.add(x0, Nat.add(x1, U.U32Nat.dbl(x2, x3))), Nat.add(x1, Nat.add(x0, U.U32Nat.dbl(x2, x3))), Equal.sym(Nat, Nat.add(x1, Nat.add(x0, U.U32Nat.dbl(x2, x3))), Nat.add(x0, Nat.add(x1, U.U32Nat.dbl(x2, x3))), UL.nat_add_left_comm(x1, x0, U.U32Nat.dbl(x2, x3)))) : {_ == Nat.add(x1, Nat.add(x0, U.U32Nat.dbl(x2, x3))) : Nat}
162 {==}
163
164def wr.d1(+x0: Nat, +x1: Nat, +x2: Nat) -> {Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}:
165 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2), x0)) : {_ == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
166 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x0)), UL.nat_add_assoc(Nat.mul(x0, x2), x2, x0)) : {Nat.add(Nat.mul(x0, x1), _) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
167 %Equal.sym(Nat, Nat.add(x2, x0), Nat.add(x0, x2), UL.nat_add_comm(x2, x0)) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), _)) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
168 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x0, x2)), Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2)), UL.nat_add_left_comm(Nat.mul(x0, x2), x0, x2)) : {Nat.add(Nat.mul(x0, x1), _) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
169 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), UL.nat_add_left_comm(Nat.mul(x0, x1), x0, Nat.add(Nat.mul(x0, x2), x2))) : {_ == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
170 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2)), x2), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2)), x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.mul(x0, x2), x2))) : {Nat.add(x0, _) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
171 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2)), x2)), Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2))), x2), Equal.sym(Nat, Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2))), x2), Nat.add(x0, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2)), x2)), UL.nat_add_assoc(x0, Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2)), x2))) : {_ == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
172 %Equal.sym(Nat, x0, Nat.mul(1n, x0), Equal.sym(Nat, Nat.mul(1n, x0), x0, UL.nat_one_mul(x0))) : {Nat.add(Nat.add(_, Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2))), x2) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
173 %Equal.sym(Nat, Nat.mul(1n, x0), Nat.mul(x0, 1n), Equal.sym(Nat, Nat.mul(x0, 1n), Nat.mul(1n, x0), UL.nat_mul_comm(x0, 1n))) : {Nat.add(Nat.add(_, Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2))), x2) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
174 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2)), Nat.mul(x0, Nat.add(x1, x2)), Equal.sym(Nat, Nat.mul(x0, Nat.add(x1, x2)), Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x2)), UL.nat_mul_add(x0, x1, x2))) : {Nat.add(Nat.add(Nat.mul(x0, 1n), _), x2) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
175 %Equal.sym(Nat, Nat.add(Nat.mul(x0, 1n), Nat.mul(x0, Nat.add(x1, x2))), Nat.mul(x0, Nat.add(1n, Nat.add(x1, x2))), Equal.sym(Nat, Nat.mul(x0, Nat.add(1n, Nat.add(x1, x2))), Nat.add(Nat.mul(x0, 1n), Nat.mul(x0, Nat.add(x1, x2))), UL.nat_mul_add(x0, 1n, Nat.add(x1, x2)))) : {Nat.add(_, x2) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
176 %Equal.sym(Nat, Nat.add(1n, Nat.add(x1, x2)), Nat.add(x1, Nat.add(1n, x2)), Equal.sym(Nat, Nat.add(x1, Nat.add(1n, x2)), Nat.add(1n, Nat.add(x1, x2)), UL.nat_add_left_comm(x1, 1n, x2))) : {Nat.add(Nat.mul(x0, _), x2) == Nat.add(Nat.mul(x0, Nat.add(x1, 1n+x2)), x2) : Nat}
177 {==}
178
179def wr.d2(+x0: Nat, +x1: Nat, +x2: Nat, +x3: Nat) -> {Nat.add(Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), x3), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}:
180 %Equal.sym(Nat, Nat.double(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), UL.nat_double(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))) : {Nat.add(Nat.add(_, x3), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
181 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))) : {Nat.add(Nat.add(_, x3), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
182 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), UL.nat_add_assoc(Nat.mul(x0, x2), x2, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))) : {Nat.add(Nat.add(Nat.add(Nat.mul(x0, x1), _), x3), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
183 %Equal.sym(Nat, Nat.add(x2, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.mul(x0, x1), Nat.add(x2, Nat.add(Nat.mul(x0, x2), x2))), UL.nat_add_left_comm(x2, Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))) : {Nat.add(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), _)), x3), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
184 %Equal.sym(Nat, Nat.add(x2, Nat.add(Nat.mul(x0, x2), x2)), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), UL.nat_add_left_comm(x2, Nat.mul(x0, x2), x2)) : {Nat.add(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x1), _))), x3), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
185 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), UL.nat_add_left_comm(Nat.mul(x0, x2), Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))) : {Nat.add(Nat.add(Nat.add(Nat.mul(x0, x1), _), x3), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
186 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), x3), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), x3)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), x3)) : {Nat.add(_, Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
187 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), x3), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))), x3)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))), x3)) : {Nat.add(Nat.add(Nat.mul(x0, x1), _), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
188 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))), x3), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), x3)), UL.nat_add_assoc(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), x3)) : {Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), _)), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
189 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), x3), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.add(x2, x2), x3)), UL.nat_add_assoc(Nat.mul(x0, x2), Nat.add(x2, x2), x3)) : {Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), _))), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
190 %Equal.sym(Nat, Nat.add(Nat.add(x2, x2), x3), Nat.add(x2, Nat.add(x2, x3)), UL.nat_add_assoc(x2, x2, x3)) : {Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), _)))), Nat.double(x0)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
191 %Equal.sym(Nat, Nat.double(x0), Nat.add(x0, x0), UL.nat_double(x0)) : {Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))), _) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
192 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))), Nat.add(x0, x0)), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))), Nat.add(x0, x0))), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))), Nat.add(x0, x0))) : {_ == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
193 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))), Nat.add(x0, x0)), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))), Nat.add(x0, x0))), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))), Nat.add(x0, x0))) : {Nat.add(Nat.mul(x0, x1), _) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
194 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))), Nat.add(x0, x0)), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))), Nat.add(x0, x0))), UL.nat_add_assoc(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))), Nat.add(x0, x0))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), _)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
195 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))), Nat.add(x0, x0)), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.add(x2, Nat.add(x2, x3)), Nat.add(x0, x0))), UL.nat_add_assoc(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)), Nat.add(x0, x0))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), _))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
196 %Equal.sym(Nat, Nat.add(Nat.add(x2, Nat.add(x2, x3)), Nat.add(x0, x0)), Nat.add(x2, Nat.add(Nat.add(x2, x3), Nat.add(x0, x0))), UL.nat_add_assoc(x2, Nat.add(x2, x3), Nat.add(x0, x0))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), _)))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
197 %Equal.sym(Nat, Nat.add(Nat.add(x2, x3), Nat.add(x0, x0)), Nat.add(x2, Nat.add(x3, Nat.add(x0, x0))), UL.nat_add_assoc(x2, x3, Nat.add(x0, x0))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, _))))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
198 %Equal.sym(Nat, Nat.add(x3, Nat.add(x0, x0)), Nat.add(x0, Nat.add(x3, x0)), UL.nat_add_left_comm(x3, x0, x0)) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, _)))))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
199 %Equal.sym(Nat, Nat.add(x3, x0), Nat.add(x0, x3), UL.nat_add_comm(x3, x0)) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, Nat.add(x0, _))))))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
200 %Equal.sym(Nat, Nat.add(x2, Nat.add(x0, Nat.add(x0, x3))), Nat.add(x0, Nat.add(x2, Nat.add(x0, x3))), UL.nat_add_left_comm(x2, x0, Nat.add(x0, x3))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, _))))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
201 %Equal.sym(Nat, Nat.add(x2, Nat.add(x0, x3)), Nat.add(x0, Nat.add(x2, x3)), UL.nat_add_left_comm(x2, x0, x3)) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x0, _)))))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
202 %Equal.sym(Nat, Nat.add(x2, Nat.add(x0, Nat.add(x0, Nat.add(x2, x3)))), Nat.add(x0, Nat.add(x2, Nat.add(x0, Nat.add(x2, x3)))), UL.nat_add_left_comm(x2, x0, Nat.add(x0, Nat.add(x2, x3)))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), _)))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
203 %Equal.sym(Nat, Nat.add(x2, Nat.add(x0, Nat.add(x2, x3))), Nat.add(x0, Nat.add(x2, Nat.add(x2, x3))), UL.nat_add_left_comm(x2, x0, Nat.add(x2, x3))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x0, _))))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
204 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x0, Nat.add(x0, Nat.add(x2, Nat.add(x2, x3))))), Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(x0, Nat.add(x2, Nat.add(x2, x3))))), UL.nat_add_left_comm(Nat.mul(x0, x2), x0, Nat.add(x0, Nat.add(x2, Nat.add(x2, x3))))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), _))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
205 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x0, Nat.add(x2, Nat.add(x2, x3)))), Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))), UL.nat_add_left_comm(Nat.mul(x0, x2), x0, Nat.add(x2, Nat.add(x2, x3)))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x0, _)))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
206 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))), Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))), UL.nat_add_left_comm(Nat.mul(x0, x2), x0, Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), _)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
207 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))), Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))), UL.nat_add_left_comm(Nat.mul(x0, x2), x0, Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(x0, _))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
208 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))))), UL.nat_add_left_comm(Nat.mul(x0, x1), x0, Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))))) : {Nat.add(Nat.mul(x0, x1), _) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
209 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))), UL.nat_add_left_comm(Nat.mul(x0, x1), x0, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))) : {Nat.add(Nat.mul(x0, x1), Nat.add(x0, _)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
210 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))))), UL.nat_add_left_comm(Nat.mul(x0, x1), x0, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3)))))))) : {_ == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
211 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))))), UL.nat_add_left_comm(Nat.mul(x0, x1), x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x2, x3))))))) : {Nat.add(x0, _) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
212 %Equal.sym(Nat, Nat.add(x2, Nat.add(x2, x3)), Nat.add(Nat.add(x2, x2), x3), Equal.sym(Nat, Nat.add(Nat.add(x2, x2), x3), Nat.add(x2, Nat.add(x2, x3)), UL.nat_add_assoc(x2, x2, x3))) : {Nat.add(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), _)))))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
213 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.add(x2, x2), x3)), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), x3), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), x3), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.add(x2, x2), x3)), UL.nat_add_assoc(Nat.mul(x0, x2), Nat.add(x2, x2), x3))) : {Nat.add(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), _))))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
214 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), x3)), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))), x3), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))), x3), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), x3)), UL.nat_add_assoc(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), x3))) : {Nat.add(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), _)))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
215 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))), x3)), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), x3), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), x3), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))), x3)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))), x3))) : {Nat.add(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x1), _))) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
216 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), x3)), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), x3), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), x3), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), x3)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), x3))) : {Nat.add(x0, Nat.add(x0, _)) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
217 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), x3)), Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))), x3), Equal.sym(Nat, Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))), x3), Nat.add(x0, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), x3)), UL.nat_add_assoc(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), x3))) : {Nat.add(x0, _) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
218 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))), x3)), Nat.add(Nat.add(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))))), x3), Equal.sym(Nat, Nat.add(Nat.add(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))))), x3), Nat.add(x0, Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))), x3)), UL.nat_add_assoc(x0, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))), x3))) : {_ == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
219 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))), Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))), Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))), UL.nat_add_left_comm(Nat.mul(x0, x1), x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))))) : {Nat.add(Nat.add(x0, _), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
220 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))), UL.nat_add_left_comm(Nat.mul(x0, x2), Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))) : {Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(x0, _))), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
221 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), Nat.add(Nat.mul(x0, x2), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), Nat.add(x0, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2))))), UL.nat_add_left_comm(Nat.mul(x0, x2), x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)))))) : {Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), _)), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
222 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), Nat.add(x2, Nat.add(Nat.mul(x0, x2), x2)), Equal.sym(Nat, Nat.add(x2, Nat.add(Nat.mul(x0, x2), x2)), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x2)), UL.nat_add_left_comm(x2, Nat.mul(x0, x2), x2))) : {Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x0, Nat.add(Nat.mul(x0, x1), _))))), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
223 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x2, Nat.add(Nat.mul(x0, x2), x2))), Nat.add(x2, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Equal.sym(Nat, Nat.add(x2, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.mul(x0, x1), Nat.add(x2, Nat.add(Nat.mul(x0, x2), x2))), UL.nat_add_left_comm(x2, Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))) : {Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), Nat.add(x0, _)))), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
224 %Equal.sym(Nat, Nat.add(x0, Nat.add(x2, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), Nat.add(x2, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), Equal.sym(Nat, Nat.add(x2, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), Nat.add(x0, Nat.add(x2, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), UL.nat_add_left_comm(x2, x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))))) : {Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), _))), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
225 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))))), Nat.add(Nat.add(Nat.mul(x0, x2), x2), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), x2), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), Nat.add(Nat.mul(x0, x2), Nat.add(x2, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))))), UL.nat_add_assoc(Nat.mul(x0, x2), x2, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))))) : {Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), _)), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
226 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), x2), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))))), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), x2), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))))), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))))) : {Nat.add(Nat.add(x0, _), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
227 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))))), Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), Equal.sym(Nat, Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))), Nat.add(x0, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))))), UL.nat_add_assoc(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)))))) : {Nat.add(_, x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
228 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2))), Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), UL.nat_add_left_comm(Nat.mul(x0, x1), x0, Nat.add(Nat.mul(x0, x2), x2)))) : {Nat.add(Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), _), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
229 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2)), Nat.add(Nat.mul(x0, x2), Nat.add(x0, x2)), Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x0, x2)), Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2)), UL.nat_add_left_comm(Nat.mul(x0, x2), x0, x2))) : {Nat.add(Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.mul(x0, x1), _)), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
230 %Equal.sym(Nat, Nat.add(x0, x2), Nat.add(x2, x0), Equal.sym(Nat, Nat.add(x2, x0), Nat.add(x0, x2), UL.nat_add_comm(x2, x0))) : {Nat.add(Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), _))), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
231 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x2, x0)), Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x0)), UL.nat_add_assoc(Nat.mul(x0, x2), x2, x0))) : {Nat.add(Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.mul(x0, x1), _)), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
232 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0)), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2), x0))) : {Nat.add(Nat.add(Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), _), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
233 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2))), Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2))), Nat.add(x0, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2))), UL.nat_add_left_comm(Nat.mul(x0, x1), x0, Nat.add(Nat.mul(x0, x2), x2)))) : {Nat.add(Nat.add(_, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
234 %Equal.sym(Nat, Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2)), Nat.add(Nat.mul(x0, x2), Nat.add(x0, x2)), Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x0, x2)), Nat.add(x0, Nat.add(Nat.mul(x0, x2), x2)), UL.nat_add_left_comm(Nat.mul(x0, x2), x0, x2))) : {Nat.add(Nat.add(Nat.add(Nat.mul(x0, x1), _), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
235 %Equal.sym(Nat, Nat.add(x0, x2), Nat.add(x2, x0), Equal.sym(Nat, Nat.add(x2, x0), Nat.add(x0, x2), UL.nat_add_comm(x2, x0))) : {Nat.add(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), _)), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
236 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(x2, x0)), Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0), Nat.add(Nat.mul(x0, x2), Nat.add(x2, x0)), UL.nat_add_assoc(Nat.mul(x0, x2), x2, x0))) : {Nat.add(Nat.add(Nat.add(Nat.mul(x0, x1), _), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
237 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0)), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x2), x2), x0)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2), x0))) : {Nat.add(Nat.add(_, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
238 %Equal.sym(Nat, Nat.add(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), Equal.sym(Nat, Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), Nat.add(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), UL.nat_double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)))) : {Nat.add(_, x3) == Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x2), x2)), x0)), x3) : Nat}
239 {==}
240
241def wr.d3(+x0: Nat, +x1: Nat, +x2: Nat, +x3: Nat) -> {Nat.add(Nat.mul(Nat.add(Nat.double(x0), x1), x2), x3) == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}:
242 %Equal.sym(Nat, Nat.double(x0), Nat.add(x0, x0), UL.nat_double(x0)) : {Nat.add(Nat.mul(Nat.add(_, x1), x2), x3) == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}
243 %Equal.sym(Nat, Nat.add(Nat.add(x0, x0), x1), Nat.add(x0, Nat.add(x0, x1)), UL.nat_add_assoc(x0, x0, x1)) : {Nat.add(Nat.mul(_, x2), x3) == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}
244 %Equal.sym(Nat, Nat.mul(Nat.add(x0, Nat.add(x0, x1)), x2), Nat.add(Nat.mul(x0, x2), Nat.mul(Nat.add(x0, x1), x2)), UL.nat_add_mul(x0, Nat.add(x0, x1), x2)) : {Nat.add(_, x3) == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}
245 %Equal.sym(Nat, Nat.mul(Nat.add(x0, x1), x2), Nat.add(Nat.mul(x0, x2), Nat.mul(x1, x2)), UL.nat_add_mul(x0, x1, x2)) : {Nat.add(Nat.add(Nat.mul(x0, x2), _), x3) == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}
246 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.mul(x1, x2))), x3), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.mul(x1, x2)), x3)), UL.nat_add_assoc(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.mul(x1, x2)), x3)) : {_ == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}
247 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), Nat.mul(x1, x2)), x3), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x1, x2), x3)), UL.nat_add_assoc(Nat.mul(x0, x2), Nat.mul(x1, x2), x3)) : {Nat.add(Nat.mul(x0, x2), _) == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}
248 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x1, x2), x3))), Nat.add(Nat.add(Nat.mul(x0, x2), Nat.mul(x0, x2)), Nat.add(Nat.mul(x1, x2), x3)), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x2), Nat.mul(x0, x2)), Nat.add(Nat.mul(x1, x2), x3)), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x0, x2), Nat.add(Nat.mul(x1, x2), x3))), UL.nat_add_assoc(Nat.mul(x0, x2), Nat.mul(x0, x2), Nat.add(Nat.mul(x1, x2), x3)))) : {_ == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}
249 %Equal.sym(Nat, Nat.add(Nat.mul(x1, x2), x3), Nat.add(x3, Nat.mul(x1, x2)), Equal.sym(Nat, Nat.add(x3, Nat.mul(x1, x2)), Nat.add(Nat.mul(x1, x2), x3), UL.nat_add_comm(x3, Nat.mul(x1, x2)))) : {Nat.add(Nat.add(Nat.mul(x0, x2), Nat.mul(x0, x2)), _) == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}
250 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x2), Nat.mul(x0, x2)), Nat.double(Nat.mul(x0, x2)), Equal.sym(Nat, Nat.double(Nat.mul(x0, x2)), Nat.add(Nat.mul(x0, x2), Nat.mul(x0, x2)), UL.nat_double(Nat.mul(x0, x2)))) : {Nat.add(_, Nat.add(x3, Nat.mul(x1, x2))) == Nat.add(Nat.double(Nat.mul(x0, x2)), Nat.add(x3, Nat.mul(x1, x2))) : Nat}
251 {==}
252
253def wr.d4(+x0: Nat, +x1: Nat, +x2: Nat, +x3: Nat) -> {Nat.add(Nat.double(Nat.mul(x0, x1)), Nat.add(x2, Nat.double(x3))) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}:
254 %Equal.sym(Nat, Nat.double(Nat.mul(x0, x1)), Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x1)), UL.nat_double(Nat.mul(x0, x1))) : {Nat.add(_, Nat.add(x2, Nat.double(x3))) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
255 %Equal.sym(Nat, Nat.double(x3), Nat.add(x3, x3), UL.nat_double(x3)) : {Nat.add(Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x1)), Nat.add(x2, _)) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
256 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.mul(x0, x1)), Nat.add(x2, Nat.add(x3, x3))), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(x2, Nat.add(x3, x3)))), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.mul(x0, x1), Nat.add(x2, Nat.add(x3, x3)))) : {_ == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
257 %Equal.sym(Nat, Nat.add(x2, Nat.add(x3, x3)), Nat.add(x3, Nat.add(x2, x3)), Equal.sym(Nat, Nat.add(x3, Nat.add(x2, x3)), Nat.add(x2, Nat.add(x3, x3)), UL.nat_add_left_comm(x3, x2, x3))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), _)) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
258 %Equal.sym(Nat, Nat.add(x2, x3), Nat.add(x3, x2), Equal.sym(Nat, Nat.add(x3, x2), Nat.add(x2, x3), UL.nat_add_comm(x3, x2))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(x3, _))) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
259 %Equal.sym(Nat, Nat.add(x3, Nat.add(x3, x2)), Nat.add(Nat.add(x3, x3), x2), Equal.sym(Nat, Nat.add(Nat.add(x3, x3), x2), Nat.add(x3, Nat.add(x3, x2)), UL.nat_add_assoc(x3, x3, x2))) : {Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), _)) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
260 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(x3, x3), x2)), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(x3, x3)), x2), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(x3, x3)), x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(x3, x3), x2)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(x3, x3), x2))) : {Nat.add(Nat.mul(x0, x1), _) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
261 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(x3, x3)), x2)), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(x3, x3))), x2), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(x3, x3))), x2), Nat.add(Nat.mul(x0, x1), Nat.add(Nat.add(Nat.mul(x0, x1), Nat.add(x3, x3)), x2)), UL.nat_add_assoc(Nat.mul(x0, x1), Nat.add(Nat.mul(x0, x1), Nat.add(x3, x3)), x2))) : {_ == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
262 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x3, x3)), Nat.add(x3, Nat.add(Nat.mul(x0, x1), x3)), Equal.sym(Nat, Nat.add(x3, Nat.add(Nat.mul(x0, x1), x3)), Nat.add(Nat.mul(x0, x1), Nat.add(x3, x3)), UL.nat_add_left_comm(x3, Nat.mul(x0, x1), x3))) : {Nat.add(Nat.add(Nat.mul(x0, x1), _), x2) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
263 %Equal.sym(Nat, Nat.add(Nat.mul(x0, x1), Nat.add(x3, Nat.add(Nat.mul(x0, x1), x3))), Nat.add(Nat.add(Nat.mul(x0, x1), x3), Nat.add(Nat.mul(x0, x1), x3)), Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), x3), Nat.add(Nat.mul(x0, x1), x3)), Nat.add(Nat.mul(x0, x1), Nat.add(x3, Nat.add(Nat.mul(x0, x1), x3))), UL.nat_add_assoc(Nat.mul(x0, x1), x3, Nat.add(Nat.mul(x0, x1), x3)))) : {Nat.add(_, x2) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
264 %Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(x0, x1), x3), Nat.add(Nat.mul(x0, x1), x3)), Nat.double(Nat.add(Nat.mul(x0, x1), x3)), Equal.sym(Nat, Nat.double(Nat.add(Nat.mul(x0, x1), x3)), Nat.add(Nat.add(Nat.mul(x0, x1), x3), Nat.add(Nat.mul(x0, x1), x3)), UL.nat_double(Nat.add(Nat.mul(x0, x1), x3)))) : {Nat.add(_, x2) == Nat.add(Nat.double(Nat.add(Nat.mul(x0, x1), x3)), x2) : Nat}
265 {==}
266
267def wd.k(+N: Nat, +Q: Nat, +B: Nat, +R: Nat, +tx: Nat, +Sr: Nat, +tr: Nat, +R2: Nat, +Sq: Nat, +tq: Nat, +Q1: Nat, +R1: Nat, +T: Bool, +L: Bool, +g: Bool, +hR: {Nat.is_lt(R, B) == True{} : Bool}, +hB: {Nat.is_lt(B, U.U32Nat.dbl(N, 1n)) == True{} : Bool}, +hX: {Nat.is_lt(Nat.add(Nat.double(Nat.add(Nat.mul(Q, B), R)), tx), U.U32Nat.dbl(N, 1n)) == True{} : Bool}, +fr: {Nat.add(Sr, U.U32Nat.dbl(N, tr)) == Nat.double(R) : Nat}, +fq: {Nat.add(Sq, U.U32Nat.dbl(N, tq)) == Nat.double(Q) : Nat}, +er2: {R2 == Nat.add(Sr, tx) : Nat}, +eq1: {Q1 == Nat.add(Sq, U.U32Nat.bit(g)) : Nat}, +htx: {Nat.is_lt(tx, U.U32Nat.dbl(1n, 1n)) == True{} : Bool}, +htr: {Nat.is_lt(tr, U.U32Nat.dbl(1n, 1n)) == True{} : Bool}, +eT: {T == Nat.is_eq(tr, 1n) : Bool}, +eL: {Nat.is_lt(R2, B) == L : Bool}, +eg: {Bool.or(T, Bool.not(L)) == g : Bool}, +er1: {Nat.add(R1, Nat.mul(U.U32Nat.bit(g), B)) == Nat.add(R2, U.U32Nat.dbl(N, Nat.mul(U.U32Nat.bit(g), U.U32Nat.bit(L)))) : Nat}) -> {Nat.add(Nat.mul(Q1, B), R1) == Nat.add(Nat.double(Nat.add(Nat.mul(Q, B), R)), tx) : Nat} & {Nat.is_lt(R1, B) == True{} : Bool}:
268 +bT = Equal.trans(Nat, U.U32Nat.bit(T), U.U32Nat.bit(Nat.is_eq(tr, 1n)), tr, Equal.cong(Bool, Nat, zz => U.U32Nat.bit(zz), T, Nat.is_eq(tr, 1n), eT), wd.bt(tr, htr))
269 +eput = Equal.trans(Nat, Nat.add(R2, U.U32Nat.dbl(N, U.U32Nat.bit(T))), Nat.add(tx, Nat.add(Sr, U.U32Nat.dbl(N, tr))), Nat.add(tx, Nat.double(R)), Equal.trans(Nat, Nat.add(R2, U.U32Nat.dbl(N, U.U32Nat.bit(T))), Nat.add(Nat.add(Sr, tx), U.U32Nat.dbl(N, tr)), Nat.add(tx, Nat.add(Sr, U.U32Nat.dbl(N, tr))), Equal.trans(Nat, Nat.add(R2, U.U32Nat.dbl(N, U.U32Nat.bit(T))), Nat.add(Nat.add(Sr, tx), U.U32Nat.dbl(N, U.U32Nat.bit(T))), Nat.add(Nat.add(Sr, tx), U.U32Nat.dbl(N, tr)), Equal.cong(Nat, Nat, zz => Nat.add(zz, U.U32Nat.dbl(N, U.U32Nat.bit(T))), R2, Nat.add(Sr, tx), er2), Equal.cong(Nat, Nat, zz => Nat.add(Nat.add(Sr, tx), U.U32Nat.dbl(N, zz)), U.U32Nat.bit(T), tr, bT)), wr.d0(Sr, tx, N, tr)), Equal.cong(Nat, Nat, zz => Nat.add(tx, zz), Nat.add(Sr, U.U32Nat.dbl(N, tr)), Nat.double(R), fr))
270 +c1 = UL.divstep_value(N, R2, B, R, tx, R1, T, L, g, eput, eL, eg, er1, wd.lt2(tx, htx), hR, hB)
271 +c2 = UL.divstep_lt(N, R2, B, R, tx, R1, T, L, g, eput, eL, eg, er1, wd.lt2(tx, htx), hR, hB)
272 +qle = Equal.trans(Nat, Nat.add(Nat.add(Nat.mul(Q, Nat.sub(B, 1n+R)), Nat.add(Nat.mul(Q, R), R)), Q), Nat.add(Nat.mul(Q, Nat.add(Nat.sub(B, 1n+R), 1n+R)), R), Nat.add(Nat.mul(Q, B), R), wr.d1(Q, Nat.sub(B, 1n+R), R), Equal.cong(Nat, Nat, zz => Nat.add(Nat.mul(Q, zz), R), Nat.add(Nat.sub(B, 1n+R), 1n+R), B, UL.nat_lt_witness(R, B, hR)))
273 +hQ = UO.nat_le_lt_trans(Nat.double(Q), Nat.add(Nat.double(Nat.add(Nat.mul(Q, B), R)), tx), U.U32Nat.dbl(N, 1n), Equal.trans(Bool, Nat.is_le(Nat.double(Q), Nat.add(Nat.double(Nat.add(Nat.mul(Q, B), R)), tx)), Nat.is_le(Nat.double(Q), Nat.add(Nat.add(Nat.double(Nat.add(Nat.mul(Q, Nat.sub(B, 1n+R)), Nat.add(Nat.mul(Q, R), R))), tx), Nat.double(Q))), True{}, Equal.sym(Bool, Nat.is_le(Nat.double(Q), Nat.add(Nat.add(Nat.double(Nat.add(Nat.mul(Q, Nat.sub(B, 1n+R)), Nat.add(Nat.mul(Q, R), R))), tx), Nat.double(Q))), Nat.is_le(Nat.double(Q), Nat.add(Nat.double(Nat.add(Nat.mul(Q, B), R)), tx)), Equal.cong(Nat, Bool, zz => Nat.is_le(Nat.double(Q), zz), Nat.add(Nat.add(Nat.double(Nat.add(Nat.mul(Q, Nat.sub(B, 1n+R)), Nat.add(Nat.mul(Q, R), R))), tx), Nat.double(Q)), Nat.add(Nat.double(Nat.add(Nat.mul(Q, B), R)), tx), Equal.trans(Nat, Nat.add(Nat.add(Nat.double(Nat.add(Nat.mul(Q, Nat.sub(B, 1n+R)), Nat.add(Nat.mul(Q, R), R))), tx), Nat.double(Q)), Nat.add(Nat.double(Nat.add(Nat.add(Nat.mul(Q, Nat.sub(B, 1n+R)), Nat.add(Nat.mul(Q, R), R)), Q)), tx), Nat.add(Nat.double(Nat.add(Nat.mul(Q, B), R)), tx), wr.d2(Q, Nat.sub(B, 1n+R), R, tx), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(zz), tx), Nat.add(Nat.add(Nat.mul(Q, Nat.sub(B, 1n+R)), Nat.add(Nat.mul(Q, R), R)), Q), Nat.add(Nat.mul(Q, B), R), qle)))), UL.nat_le_add(Nat.double(Q), Nat.add(Nat.double(Nat.add(Nat.mul(Q, Nat.sub(B, 1n+R)), Nat.add(Nat.mul(Q, R), R))), tx))), hX)
274 +esq = UL.dbl_nowrap(N, tq, Sq, Nat.double(Q), Nat.double(Q), fq, UL.nat_le_refl(Nat.double(Q)), hQ)
275 (Equal.trans(Nat, Nat.add(Nat.mul(Q1, B), R1), Nat.add(Nat.double(Nat.mul(Q, B)), Nat.add(tx, Nat.double(R))), Nat.add(Nat.double(Nat.add(Nat.mul(Q, B), R)), tx), Equal.trans(Nat, Nat.add(Nat.mul(Q1, B), R1), Nat.add(Nat.double(Nat.mul(Q, B)), Nat.add(R1, Nat.mul(U.U32Nat.bit(g), B))), Nat.add(Nat.double(Nat.mul(Q, B)), Nat.add(tx, Nat.double(R))), Equal.trans(Nat, Nat.add(Nat.mul(Q1, B), R1), Nat.add(Nat.mul(Nat.add(Nat.double(Q), U.U32Nat.bit(g)), B), R1), Nat.add(Nat.double(Nat.mul(Q, B)), Nat.add(R1, Nat.mul(U.U32Nat.bit(g), B))), Equal.trans(Nat, Nat.add(Nat.mul(Q1, B), R1), Nat.add(Nat.mul(Nat.add(Sq, U.U32Nat.bit(g)), B), R1), Nat.add(Nat.mul(Nat.add(Nat.double(Q), U.U32Nat.bit(g)), B), R1), Equal.cong(Nat, Nat, zz => Nat.add(Nat.mul(zz, B), R1), Q1, Nat.add(Sq, U.U32Nat.bit(g)), eq1), Equal.cong(Nat, Nat, zz => Nat.add(Nat.mul(Nat.add(zz, U.U32Nat.bit(g)), B), R1), Sq, Nat.double(Q), esq)), wr.d3(Q, U.U32Nat.bit(g), B, R1)), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(Nat.mul(Q, B)), zz), Nat.add(R1, Nat.mul(U.U32Nat.bit(g), B)), Nat.add(tx, Nat.double(R)), c1)), wr.d4(Q, B, tx, R)), c2)
276
277def wr.d5(+x0: Nat) -> {Nat.mul(1n, x0) == x0 : Nat}:
278 %Equal.sym(Nat, Nat.mul(1n, x0), x0, UL.nat_one_mul(x0)) : {_ == x0 : Nat}
279 {==}
280
281def wr.d6(+x0: Nat) -> {x0 == Nat.mul(1n, x0) : Nat}:
282 %Equal.sym(Nat, x0, Nat.mul(1n, x0), Equal.sym(Nat, Nat.mul(1n, x0), x0, UL.nat_one_mul(x0))) : {_ == Nat.mul(1n, x0) : Nat}
283 {==}
284
285def wr.d7(+x0: Nat, +x1: Nat, +x2: Nat) -> {Nat.add(x0, Nat.mul(0n, x1)) == Nat.add(x0, U.U32Nat.dbl(64n, Nat.mul(0n, x2))) : Nat}:
286 %Equal.sym(Nat, Nat.add(x0, 0n), x0, UL.nat_add_zero(x0)) : {_ == Nat.add(x0, U.U32Nat.dbl(64n, Nat.mul(0n, x2))) : Nat}
287 %Equal.sym(Nat, x0, Nat.add(x0, 0n), Equal.sym(Nat, Nat.add(x0, 0n), x0, UL.nat_add_zero(x0))) : {_ == Nat.add(x0, U.U32Nat.dbl(64n, Nat.mul(0n, x2))) : Nat}
288 %Equal.sym(Nat, 0n, U.U32Nat.dbl(64n, 0n), Equal.sym(Nat, U.U32Nat.dbl(64n, 0n), 0n, UL.dbl_zero(64n))) : {Nat.add(x0, _) == Nat.add(x0, U.U32Nat.dbl(64n, Nat.mul(0n, x2))) : Nat}
289 {==}
290
291def wd.sel(g: Bool, +r2: W.W64, +b: W.W64) -> {Nat.add(W.W64.to_nat(W.W64.sel(g, W.W64.sub(r2, b), r2)), Nat.mul(U.U32Nat.bit(g), W.W64.to_nat(b))) == Nat.add(W.W64.to_nat(r2), U.U32Nat.dbl(64n, Nat.mul(U.U32Nat.bit(g), U.U32Nat.bit(W.W64.is_lt(r2, b))))) : Nat}:
292 match g:
293 case True{}:
294 Equal.trans(Nat, Nat.add(W.W64.to_nat(W.W64.sub(r2, b)), Nat.mul(1n, W.W64.to_nat(b))), Nat.add(W.W64.to_nat(r2), U.U32Nat.dbl(64n, U.U32Nat.bit(W.W64.is_lt(r2, b)))), Nat.add(W.W64.to_nat(r2), U.U32Nat.dbl(64n, Nat.mul(1n, U.U32Nat.bit(W.W64.is_lt(r2, b))))), Equal.trans(Nat, Nat.add(W.W64.to_nat(W.W64.sub(r2, b)), Nat.mul(1n, W.W64.to_nat(b))), Nat.add(W.W64.to_nat(W.W64.sub(r2, b)), W.W64.to_nat(b)), Nat.add(W.W64.to_nat(r2), U.U32Nat.dbl(64n, U.U32Nat.bit(W.W64.is_lt(r2, b)))), Equal.cong(Nat, Nat, zz => Nat.add(W.W64.to_nat(W.W64.sub(r2, b)), zz), Nat.mul(1n, W.W64.to_nat(b)), W.W64.to_nat(b), wr.d5(W.W64.to_nat(b))), WB.sub_wrap(r2, b)), Equal.cong(Nat, Nat, zz => Nat.add(W.W64.to_nat(r2), U.U32Nat.dbl(64n, zz)), U.U32Nat.bit(W.W64.is_lt(r2, b)), Nat.mul(1n, U.U32Nat.bit(W.W64.is_lt(r2, b))), wr.d6(U.U32Nat.bit(W.W64.is_lt(r2, b)))))
295 case False{}:
296 wr.d7(W.W64.to_nat(r2), W.W64.to_nat(b), U.U32Nat.bit(W.W64.is_lt(r2, b)))
297
298def wd.st(+x: Bool, +b: W.W64, +q: W.W64, +r: W.W64, +hR: {Nat.is_lt(W.W64.to_nat(r), W.W64.to_nat(b)) == True{} : Bool}, +hb: {Nat.is_lt(W.W64.to_nat(b), U.U32Nat.dbl(64n, 1n)) == True{} : Bool}, +hX: {Nat.is_lt(Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U.U32Nat.bit(x)), U.U32Nat.dbl(64n, 1n)) == True{} : Bool}) -> {Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.step(x, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.step(x, b, (q, r))))) == Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U.U32Nat.bit(x)) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.div.step(x, b, (q, r)))), W.W64.to_nat(b)) == True{} : Bool}:
299 (Equal.trans(Nat, Nat.add(Nat.mul(W.W64.to_nat(W.W64.or(W.W64.shl(q, 1n), W.W64.from_u32(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.sel(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.sub(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x)))))), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U32.to_nat(W.W64.bit(x))), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U.U32Nat.bit(x)), wd.p1(Nat.add(Nat.mul(W.W64.to_nat(W.W64.or(W.W64.shl(q, 1n), W.W64.from_u32(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.sel(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.sub(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x)))))), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U32.to_nat(W.W64.bit(x))), W.W64.to_nat(W.W64.sel(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.sub(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))))), W.W64.to_nat(b), wd.k(64n, W.W64.to_nat(q), W.W64.to_nat(b), W.W64.to_nat(r), U32.to_nat(W.W64.bit(x)), W.W64.to_nat(W.W64.shl(r, 1n)), U32.to_nat(U32.shrn(W.W64.hi(r), 31n)), W.W64.to_nat(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x)))), W.W64.to_nat(W.W64.shl(q, 1n)), U32.to_nat(U32.shrn(W.W64.hi(q), 31n)), W.W64.to_nat(W.W64.or(W.W64.shl(q, 1n), W.W64.from_u32(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))))), W.W64.to_nat(W.W64.sel(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.sub(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))))), U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_lt(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), hR, hb, Equal.trans(Bool, Nat.is_lt(Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U32.to_nat(W.W64.bit(x))), U.U32Nat.dbl(64n, 1n)), Nat.is_lt(Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U.U32Nat.bit(x)), U.U32Nat.dbl(64n, 1n)), True{}, Equal.cong(Nat, Bool, zz => Nat.is_lt(zz, U.U32Nat.dbl(64n, 1n)), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U32.to_nat(W.W64.bit(x))), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U.U32Nat.bit(x)), Equal.sym(Nat, Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U.U32Nat.bit(x)), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U32.to_nat(W.W64.bit(x))), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), zz), U.U32Nat.bit(x), U32.to_nat(W.W64.bit(x)), Equal.sym(Nat, U32.to_nat(W.W64.bit(x)), U.U32Nat.bit(x), wd.bv(x))))), hX), LB.shl_one_wrap(r), LB.shl_one_wrap(q), LBP.wb.or_bit(r, W.W64.bit(x), wd.bl(x)), Equal.trans(Nat, W.W64.to_nat(W.W64.or(W.W64.shl(q, 1n), W.W64.from_u32(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))))), Nat.add(W.W64.to_nat(W.W64.shl(q, 1n)), U32.to_nat(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))))), Nat.add(W.W64.to_nat(W.W64.shl(q, 1n)), U.U32Nat.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))), LBP.wb.or_bit(q, W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))), wd.bl(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))), Equal.cong(Nat, Nat, zz => Nat.add(W.W64.to_nat(W.W64.shl(q, 1n)), zz), U32.to_nat(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))), U.U32Nat.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))), wd.bv(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))))), wd.bl(x), wd.top(r), Equal.trans(Bool, U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), Nat.is_eq(U32.to_nat(U32.shrn(W.W64.hi(r), 31n)), U32.to_nat(1)), Nat.is_eq(U32.to_nat(U32.shrn(W.W64.hi(r), 31n)), 1n), UL.u32_eq_value(U32.shrn(W.W64.hi(r), 31n), 1), {==}), Equal.sym(Bool, W.W64.is_lt(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), Nat.is_lt(W.W64.to_nat(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x)))), W.W64.to_nat(b)), WB.lt_value(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), Equal.cong(Bool, Bool, zz => Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), zz), Bool.not(W.W64.is_lt(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), Equal.sym(Bool, W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), Bool.not(W.W64.is_lt(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), wn.ge_lt(W.W64.cmp(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))), wd.sel(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), zz), U32.to_nat(W.W64.bit(x)), U.U32Nat.bit(x), wd.bv(x))), wd.p2(Nat.add(Nat.mul(W.W64.to_nat(W.W64.or(W.W64.shl(q, 1n), W.W64.from_u32(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.sel(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.sub(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x)))))), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U32.to_nat(W.W64.bit(x))), W.W64.to_nat(W.W64.sel(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.sub(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))))), W.W64.to_nat(b), wd.k(64n, W.W64.to_nat(q), W.W64.to_nat(b), W.W64.to_nat(r), U32.to_nat(W.W64.bit(x)), W.W64.to_nat(W.W64.shl(r, 1n)), U32.to_nat(U32.shrn(W.W64.hi(r), 31n)), W.W64.to_nat(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x)))), W.W64.to_nat(W.W64.shl(q, 1n)), U32.to_nat(U32.shrn(W.W64.hi(q), 31n)), W.W64.to_nat(W.W64.or(W.W64.shl(q, 1n), W.W64.from_u32(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))))), W.W64.to_nat(W.W64.sel(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.sub(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))))), U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_lt(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), hR, hb, Equal.trans(Bool, Nat.is_lt(Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U32.to_nat(W.W64.bit(x))), U.U32Nat.dbl(64n, 1n)), Nat.is_lt(Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U.U32Nat.bit(x)), U.U32Nat.dbl(64n, 1n)), True{}, Equal.cong(Nat, Bool, zz => Nat.is_lt(zz, U.U32Nat.dbl(64n, 1n)), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U32.to_nat(W.W64.bit(x))), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U.U32Nat.bit(x)), Equal.sym(Nat, Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U.U32Nat.bit(x)), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), U32.to_nat(W.W64.bit(x))), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), zz), U.U32Nat.bit(x), U32.to_nat(W.W64.bit(x)), Equal.sym(Nat, U32.to_nat(W.W64.bit(x)), U.U32Nat.bit(x), wd.bv(x))))), hX), LB.shl_one_wrap(r), LB.shl_one_wrap(q), LBP.wb.or_bit(r, W.W64.bit(x), wd.bl(x)), Equal.trans(Nat, W.W64.to_nat(W.W64.or(W.W64.shl(q, 1n), W.W64.from_u32(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))))), Nat.add(W.W64.to_nat(W.W64.shl(q, 1n)), U32.to_nat(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))))), Nat.add(W.W64.to_nat(W.W64.shl(q, 1n)), U.U32Nat.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))), LBP.wb.or_bit(q, W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))), wd.bl(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))), Equal.cong(Nat, Nat, zz => Nat.add(W.W64.to_nat(W.W64.shl(q, 1n)), zz), U32.to_nat(W.W64.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))), U.U32Nat.bit(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))), wd.bv(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))))), wd.bl(x), wd.top(r), Equal.trans(Bool, U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), Nat.is_eq(U32.to_nat(U32.shrn(W.W64.hi(r), 31n)), U32.to_nat(1)), Nat.is_eq(U32.to_nat(U32.shrn(W.W64.hi(r), 31n)), 1n), UL.u32_eq_value(U32.shrn(W.W64.hi(r), 31n), 1), {==}), Equal.sym(Bool, W.W64.is_lt(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), Nat.is_lt(W.W64.to_nat(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x)))), W.W64.to_nat(b)), WB.lt_value(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), Equal.cong(Bool, Bool, zz => Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), zz), Bool.not(W.W64.is_lt(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), Equal.sym(Bool, W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b), Bool.not(W.W64.is_lt(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), wn.ge_lt(W.W64.cmp(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)))), wd.sel(Bool.or(U32.is_eq(U32.shrn(W.W64.hi(r), 31n), 1), W.W64.is_ge(W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b)), W.W64.or(W.W64.shl(r, 1n), W.W64.from_u32(W.W64.bit(x))), b))))
300
301def wr.d8(+x0: Nat, +x1: Nat, +x2: Nat, +x3: Nat, +x4: Nat, +x5: Nat) -> {Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}:
302 %Equal.sym(Nat, Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), UL.nat_double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4))) : {Nat.add(_, x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
303 %Equal.sym(Nat, U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), UL.dbl_add(x0, Nat.mul(x1, x2), x3)) : {Nat.add(Nat.add(Nat.add(_, x4), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
304 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x4), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), x4)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), x4)) : {Nat.add(Nat.add(_, Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
305 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x4), Nat.add(x4, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x4)) : {Nat.add(Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
306 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, U.U32Nat.dbl(x0, x3))) : {Nat.add(Nat.add(_, Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
307 %Equal.sym(Nat, U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), UL.dbl_add(x0, Nat.mul(x1, x2), x3)) : {Nat.add(Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(_, x4)), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
308 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x4), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), x4)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), x4)) : {Nat.add(Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), _), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
309 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x4), Nat.add(x4, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x4)) : {Nat.add(Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
310 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, U.U32Nat.dbl(x0, x3))) : {Nat.add(Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), _), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
311 %Equal.sym(Nat, Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))), UL.nat_add_assoc(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))) : {Nat.add(_, x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
312 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))) : {Nat.add(Nat.add(x4, _), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
313 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))) : {Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
314 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))) : {Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, _))), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
315 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))) : {Nat.add(Nat.add(x4, _), x5) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
316 %Equal.sym(Nat, Nat.add(Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), x5), Nat.add(x4, Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), x5)), UL.nat_add_assoc(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), x5)) : {_ == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
317 %Equal.sym(Nat, Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), x5), Nat.add(x4, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), x5)), UL.nat_add_assoc(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), x5)) : {Nat.add(x4, _) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
318 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), x5), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), x5)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), x5)) : {Nat.add(x4, Nat.add(x4, _)) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
319 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), x5), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), x5)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), x5)) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
320 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), x5), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, x3), x5)), UL.nat_add_assoc(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3), x5)) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
321 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x5), Nat.add(x5, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x5)) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), _))))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
322 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x5, U.U32Nat.dbl(x0, x3))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x5, U.U32Nat.dbl(x0, x3))) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
323 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
324 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))) : {Nat.add(x4, Nat.add(x4, _)) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
325 %Equal.sym(Nat, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))) : {Nat.add(x4, Nat.add(x4, _)) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
326 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))))) : {Nat.add(x4, _) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
327 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))))) : {_ == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
328 %Equal.sym(Nat, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x4, _))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
329 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, _)) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
330 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
331 %Equal.sym(Nat, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x5, U.U32Nat.dbl(x0, x3))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x5, U.U32Nat.dbl(x0, x3))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x5, U.U32Nat.dbl(x0, x3)))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(x4, _)))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
332 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x5, U.U32Nat.dbl(x0, x3)))), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x5, U.U32Nat.dbl(x0, x3)))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x5, U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x5, U.U32Nat.dbl(x0, x3)))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x4, Nat.add(x5, U.U32Nat.dbl(x0, x3))))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, _))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
333 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x5, U.U32Nat.dbl(x0, x3))))), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x4, Nat.add(x5, U.U32Nat.dbl(x0, x3))))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x4, Nat.add(x5, U.U32Nat.dbl(x0, x3))))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x5, U.U32Nat.dbl(x0, x3))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x4, Nat.add(x4, Nat.add(x5, U.U32Nat.dbl(x0, x3)))))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
334 %Equal.sym(Nat, Nat.add(x5, U.U32Nat.dbl(x0, x3)), Nat.add(U.U32Nat.dbl(x0, x3), x5), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x5), Nat.add(x5, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x5))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x4, _))))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
335 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), x5)), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, x5)), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, x5)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), x5)), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x4, x5))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, _)))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
336 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, x5))), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x4, x5))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x4, x5))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, x5))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x4, Nat.add(x4, x5)))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), _))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
337 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x4, x5)))), Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(x4, x5))), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(x4, x5))), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x4, x5)))), UL.nat_add_assoc(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(x4, x5))))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
338 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(x4, x5)))), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(x4, x5))), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(x4, x5))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(x4, x5)))), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(x4, x5))))) : {Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
339 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(x4, x5)))), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(x4, x5))), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(x4, x5))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(x4, x5)))), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(x4, x5))))) : {_ == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
340 %Equal.sym(Nat, Nat.add(x4, x5), Nat.add(x5, x4), Equal.sym(Nat, Nat.add(x5, x4), Nat.add(x4, x5), UL.nat_add_comm(x5, x4))) : {Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, _)) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
341 %Equal.sym(Nat, Nat.add(x4, Nat.add(x5, x4)), Nat.add(x5, Nat.add(x4, x4)), Equal.sym(Nat, Nat.add(x5, Nat.add(x4, x4)), Nat.add(x4, Nat.add(x5, x4)), UL.nat_add_left_comm(x5, x4, x4))) : {Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), _) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
342 %Equal.sym(Nat, Nat.add(x4, x4), Nat.double(x4), Equal.sym(Nat, Nat.double(x4), Nat.add(x4, x4), UL.nat_double(x4))) : {Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Nat.add(x5, _)) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
343 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))) : {Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _), Nat.add(x5, Nat.double(x4))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
344 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))) : {Nat.add(_, Nat.add(x5, Nat.double(x4))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
345 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Equal.sym(Nat, U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), UL.dbl_add(x0, Nat.mul(x1, x2), x3))) : {Nat.add(Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), _), Nat.add(x5, Nat.double(x4))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
346 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Equal.sym(Nat, U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), UL.dbl_add(x0, Nat.mul(x1, x2), x3))) : {Nat.add(Nat.add(_, U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
347 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Equal.sym(Nat, Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), UL.nat_double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))))) : {Nat.add(_, Nat.add(x5, Nat.double(x4))) == Nat.add(Nat.double(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3))), Nat.add(x5, Nat.double(x4))) : Nat}
348 {==}
349
350def wr.d9(+x0: Nat, +x1: Nat, +x2: Nat, +x3: Nat, +x4: Nat, +x5: Nat) -> {Nat.add(Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4), x5), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}:
351 %Equal.sym(Nat, U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), UL.dbl_add(x0, Nat.mul(x1, x2), x3)) : {Nat.add(Nat.add(Nat.add(_, x4), x5), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
352 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x4), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), x4)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), x4)) : {Nat.add(Nat.add(_, x5), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
353 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x4), Nat.add(x4, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x4)) : {Nat.add(Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _), x5), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
354 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, U.U32Nat.dbl(x0, x3))) : {Nat.add(Nat.add(_, x5), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
355 %Equal.sym(Nat, Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), x5), Nat.add(x4, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x5)), UL.nat_add_assoc(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x5)) : {Nat.add(_, Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
356 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x5), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), x5)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), x5)) : {Nat.add(Nat.add(x4, _), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
357 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x5), Nat.add(x5, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x5)) : {Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
358 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, U.U32Nat.dbl(x0, x3))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x5, U.U32Nat.dbl(x0, x3))) : {Nat.add(Nat.add(x4, _), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
359 %Equal.sym(Nat, U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), UL.dbl_add(x0, Nat.mul(x1, x2), x3)) : {Nat.add(Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(_, x4)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
360 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x4), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), x4)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), x4)) : {Nat.add(Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), _) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
361 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x4), Nat.add(x4, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x4)) : {Nat.add(Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
362 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, U.U32Nat.dbl(x0, x3))) : {Nat.add(Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), _) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
363 %Equal.sym(Nat, Nat.add(Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))), UL.nat_add_assoc(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))) : {_ == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
364 %Equal.sym(Nat, Nat.add(Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(x5, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))), UL.nat_add_assoc(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))) : {Nat.add(x4, _) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
365 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))) : {Nat.add(x4, Nat.add(x5, _)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
366 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))) : {Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _))) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
367 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))) : {Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, _)))) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
368 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))) : {Nat.add(x4, Nat.add(x5, _)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
369 %Equal.sym(Nat, Nat.add(x5, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), Nat.add(x4, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), UL.nat_add_left_comm(x5, x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))) : {Nat.add(x4, _) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
370 %Equal.sym(Nat, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))) : {Nat.add(x4, Nat.add(x4, _)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
371 %Equal.sym(Nat, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _))) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
372 %Equal.sym(Nat, Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x5, U.U32Nat.dbl(x0, x3))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x5, U.U32Nat.dbl(x0, x3))), Nat.add(x5, Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x5, U.U32Nat.dbl(x0, x3)))) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)))) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
373 %Equal.sym(Nat, Nat.add(x5, U.U32Nat.dbl(x0, x3)), Nat.add(U.U32Nat.dbl(x0, x3), x5), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x5), Nat.add(x5, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x5))) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), _))))) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
374 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, x3), x5)), Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), x5), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), x5), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, x3), x5)), UL.nat_add_assoc(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3), x5))) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)))) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
375 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), x5)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), x5), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), x5), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), x5)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)), x5))) : {Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _))) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
376 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), x5)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), x5), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), x5), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), x5)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), x5))) : {Nat.add(x4, Nat.add(x4, _)) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
377 %Equal.sym(Nat, Nat.add(x4, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), x5)), Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), x5), Equal.sym(Nat, Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), x5), Nat.add(x4, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), x5)), UL.nat_add_assoc(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))), x5))) : {Nat.add(x4, _) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
378 %Equal.sym(Nat, Nat.add(x4, Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), x5)), Nat.add(Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), x5), Equal.sym(Nat, Nat.add(Nat.add(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))), x5), Nat.add(x4, Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), x5)), UL.nat_add_assoc(x4, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), x5))) : {_ == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
379 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3)))))) : {Nat.add(Nat.add(x4, _), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
380 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))) : {Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, _))), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
381 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, x3), x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))) : {Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
382 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))))) : {Nat.add(Nat.add(x4, _), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
383 %Equal.sym(Nat, Nat.add(x4, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))), Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Equal.sym(Nat, Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))), Nat.add(x4, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))))), UL.nat_add_assoc(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)))))) : {Nat.add(_, x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
384 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, U.U32Nat.dbl(x0, x3))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, U.U32Nat.dbl(x0, x3)))) : {Nat.add(Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), _), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
385 %Equal.sym(Nat, Nat.add(x4, U.U32Nat.dbl(x0, x3)), Nat.add(U.U32Nat.dbl(x0, x3), x4), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x4), Nat.add(x4, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x4))) : {Nat.add(Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _)), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
386 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), x4)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x4), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x4), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), x4)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), x4))) : {Nat.add(Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), _), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
387 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Equal.sym(Nat, U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), UL.dbl_add(x0, Nat.mul(x1, x2), x3))) : {Nat.add(Nat.add(Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(_, x4)), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
388 %Equal.sym(Nat, Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, U.U32Nat.dbl(x0, x3))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(x4, U.U32Nat.dbl(x0, x3))), Nat.add(x4, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), x4, U.U32Nat.dbl(x0, x3)))) : {Nat.add(Nat.add(_, Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
389 %Equal.sym(Nat, Nat.add(x4, U.U32Nat.dbl(x0, x3)), Nat.add(U.U32Nat.dbl(x0, x3), x4), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, x3), x4), Nat.add(x4, U.U32Nat.dbl(x0, x3)), UL.nat_add_comm(U.U32Nat.dbl(x0, x3), x4))) : {Nat.add(Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), _), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
390 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), x4)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x4), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), x4), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(x0, x3), x4)), UL.nat_add_assoc(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3), x4))) : {Nat.add(Nat.add(_, Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
391 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Equal.sym(Nat, U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(x0, Nat.mul(x1, x2)), U.U32Nat.dbl(x0, x3)), UL.dbl_add(x0, Nat.mul(x1, x2), x3))) : {Nat.add(Nat.add(Nat.add(_, x4), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
392 %Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), Equal.sym(Nat, Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), Nat.add(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4), Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), UL.nat_double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)))) : {Nat.add(_, x5) == Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(x0, Nat.add(Nat.mul(x1, x2), x3)), x4)), x5) : Nat}
393 {==}
394
395def wd.bs(+p: Nat, +x: Bool, +hi: Word(p), +b: W.W64, +q: W.W64, +r: W.W64, +hb: {Nat.is_lt(W.W64.to_nat(b), U.U32Nat.dbl(64n, 1n)) == True{} : Bool}, +hX: {Nat.is_lt(Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), U.U32Nat.dbl(64n, 1n)) == True{} : Bool}, ih: {Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))))) == Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)) == True{} : Bool}) -> {Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(1n+p, WCon{x, hi}, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(1n+p, WCon{x, hi}, b, (q, r))))) == Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.div.bits(1n+p, WCon{x, hi}, b, (q, r)))), W.W64.to_nat(b)) == True{} : Bool}:
396 (+e, +l) = ih
397 %Equal.sym(W.W64 & W.W64, W.W64.div.bits(p, hi, b, (q, r)), (W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))), wd.eta(W.W64.div.bits(p, hi, b, (q, r)))) : {Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.step(x, b, _))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.step(x, b, _)))) == Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.div.step(x, b, _))), W.W64.to_nat(b)) == True{} : Bool}
398 (Equal.trans(Nat, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.step(x, b, (W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))))))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.step(x, b, (W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))))), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), wd.p1(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.step(x, b, (W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))))))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.step(x, b, (W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))))), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), W.W64.to_nat(W.W64.snd(W.W64.div.step(x, b, (W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))))))), W.W64.to_nat(b), wd.st(x, b, W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))), l, hb, Equal.trans(Bool, Nat.is_lt(Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), U.U32Nat.dbl(64n, 1n)), Nat.is_lt(Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), U.U32Nat.dbl(64n, 1n)), True{}, Equal.cong(Nat, Bool, zz => Nat.is_lt(zz, U.U32Nat.dbl(64n, 1n)), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Equal.sym(Nat, Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(zz), U.U32Nat.bit(x)), Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))))), Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), e), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Word.to_nat(1n+p, WCon{x, hi})), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi)))), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Word.to_nat(1n+p, WCon{x, hi})), wr.d8(p, W.W64.to_nat(q), W.W64.to_nat(b), W.W64.to_nat(r), Word.to_nat(p, hi), U.U32Nat.bit(x)), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), zz), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi))), Word.to_nat(1n+p, WCon{x, hi}), Equal.sym(Nat, Word.to_nat(1n+p, WCon{x, hi}), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi))), wd.wv(p, x, hi)))), {==}))))), hX))), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(zz), U.U32Nat.bit(x)), Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))))), Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), e), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Word.to_nat(1n+p, WCon{x, hi})), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi)))), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Word.to_nat(1n+p, WCon{x, hi})), wr.d8(p, W.W64.to_nat(q), W.W64.to_nat(b), W.W64.to_nat(r), Word.to_nat(p, hi), U.U32Nat.bit(x)), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), zz), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi))), Word.to_nat(1n+p, WCon{x, hi}), Equal.sym(Nat, Word.to_nat(1n+p, WCon{x, hi}), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi))), wd.wv(p, x, hi)))), {==}))), wd.p2(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.step(x, b, (W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))))))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.step(x, b, (W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))))), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), W.W64.to_nat(W.W64.snd(W.W64.div.step(x, b, (W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))))))), W.W64.to_nat(b), wd.st(x, b, W.W64.fst(W.W64.div.bits(p, hi, b, (q, r))), W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))), l, hb, Equal.trans(Bool, Nat.is_lt(Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), U.U32Nat.dbl(64n, 1n)), Nat.is_lt(Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), U.U32Nat.dbl(64n, 1n)), True{}, Equal.cong(Nat, Bool, zz => Nat.is_lt(zz, U.U32Nat.dbl(64n, 1n)), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Equal.sym(Nat, Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r)))))), U.U32Nat.bit(x)), Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(zz), U.U32Nat.bit(x)), Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(p, hi, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(p, hi, b, (q, r))))), Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), e), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Word.to_nat(1n+p, WCon{x, hi})), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi)))), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Word.to_nat(1n+p, WCon{x, hi})), wr.d8(p, W.W64.to_nat(q), W.W64.to_nat(b), W.W64.to_nat(r), Word.to_nat(p, hi), U.U32Nat.bit(x)), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), zz), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi))), Word.to_nat(1n+p, WCon{x, hi}), Equal.sym(Nat, Word.to_nat(1n+p, WCon{x, hi}), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi))), wd.wv(p, x, hi)))), {==}))))), hX))))
399
400def wd.bits(m: Nat, w: Word(m), +b: W.W64, +q: W.W64, +r: W.W64, +hR: {Nat.is_lt(W.W64.to_nat(r), W.W64.to_nat(b)) == True{} : Bool}, +hb: {Nat.is_lt(W.W64.to_nat(b), U.U32Nat.dbl(64n, 1n)) == True{} : Bool}, +hX: {Nat.is_lt(Nat.add(U.U32Nat.dbl(m, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(m, w)), U.U32Nat.dbl(64n, 1n)) == True{} : Bool}) -> {Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(m, w, b, (q, r)))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(m, w, b, (q, r))))) == Nat.add(U.U32Nat.dbl(m, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(m, w)) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.div.bits(m, w, b, (q, r)))), W.W64.to_nat(b)) == True{} : Bool}:
401 match m w:
402 case 0n WNil{}:
403 (Equal.sym(Nat, Nat.add(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)), 0n), Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)), UL.nat_add_zero(Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), hR)
404 case 1n+ +p WCon{+x, +hi}:
405 wd.bs(p, x, hi, b, q, r, hb, hX, wd.bits(p, hi, b, q, r, hR, hb, UO.nat_le_lt_trans(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), U.U32Nat.dbl(64n, 1n), Equal.trans(Bool, Nat.is_le(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi}))), Nat.is_le(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), Nat.add(Nat.add(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)))), True{}, Equal.sym(Bool, Nat.is_le(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), Nat.add(Nat.add(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)))), Nat.is_le(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi}))), Equal.cong(Nat, Bool, zz => Nat.is_le(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), zz), Nat.add(Nat.add(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.trans(Nat, Nat.add(Nat.add(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), wr.d9(p, W.W64.to_nat(q), W.W64.to_nat(b), W.W64.to_nat(r), Word.to_nat(p, hi), U.U32Nat.bit(x)), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Word.to_nat(1n+p, WCon{x, hi})), Nat.add(U.U32Nat.dbl(1n+p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(1n+p, WCon{x, hi})), Equal.trans(Nat, Nat.add(Nat.double(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi))), U.U32Nat.bit(x)), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi)))), Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), Word.to_nat(1n+p, WCon{x, hi})), wr.d8(p, W.W64.to_nat(q), W.W64.to_nat(b), W.W64.to_nat(r), Word.to_nat(p, hi), U.U32Nat.bit(x)), Equal.cong(Nat, Nat, zz => Nat.add(Nat.double(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r)))), zz), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi))), Word.to_nat(1n+p, WCon{x, hi}), Equal.sym(Nat, Word.to_nat(1n+p, WCon{x, hi}), Nat.add(U.U32Nat.bit(x), Nat.double(Word.to_nat(p, hi))), wd.wv(p, x, hi)))), {==})))), UL.nat_le_add(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), Nat.add(Nat.add(U.U32Nat.dbl(p, Nat.add(Nat.mul(W.W64.to_nat(q), W.W64.to_nat(b)), W.W64.to_nat(r))), Word.to_nat(p, hi)), U.U32Nat.bit(x)))), hX)))
406
407def wr.d10(+x0: Nat, +x1: Nat, +x2: Nat, +x3: Nat) -> {Nat.add(x0, U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3))) == Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3)), x0) : Nat}:
408 %Equal.sym(Nat, U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), U.U32Nat.dbl(32n, x3)), UL.dbl_add(32n, Nat.mul(x1, x2), x3)) : {Nat.add(x0, _) == Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3)), x0) : Nat}
409 %Equal.sym(Nat, Nat.add(x0, Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), U.U32Nat.dbl(32n, x3))), Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), Nat.add(x0, U.U32Nat.dbl(32n, x3))), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), Nat.add(x0, U.U32Nat.dbl(32n, x3))), Nat.add(x0, Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), U.U32Nat.dbl(32n, x3))), UL.nat_add_left_comm(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), x0, U.U32Nat.dbl(32n, x3)))) : {_ == Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3)), x0) : Nat}
410 %Equal.sym(Nat, Nat.add(x0, U.U32Nat.dbl(32n, x3)), Nat.add(U.U32Nat.dbl(32n, x3), x0), Equal.sym(Nat, Nat.add(U.U32Nat.dbl(32n, x3), x0), Nat.add(x0, U.U32Nat.dbl(32n, x3)), UL.nat_add_comm(U.U32Nat.dbl(32n, x3), x0))) : {Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), _) == Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3)), x0) : Nat}
411 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(32n, x3), x0)), Nat.add(Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), U.U32Nat.dbl(32n, x3)), x0), Equal.sym(Nat, Nat.add(Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), U.U32Nat.dbl(32n, x3)), x0), Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), Nat.add(U.U32Nat.dbl(32n, x3), x0)), UL.nat_add_assoc(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), U.U32Nat.dbl(32n, x3), x0))) : {_ == Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3)), x0) : Nat}
412 %Equal.sym(Nat, Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), U.U32Nat.dbl(32n, x3)), U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3)), Equal.sym(Nat, U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3)), Nat.add(U.U32Nat.dbl(32n, Nat.mul(x1, x2)), U.U32Nat.dbl(32n, x3)), UL.dbl_add(32n, Nat.mul(x1, x2), x3))) : {Nat.add(_, x0) == Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(x1, x2), x3)), x0) : Nat}
413 {==}
414
415def wd.dz2(+hw: Word(32n), +lw: Word(32n), +b: W.W64, +h: {W.W64.is_zero(b) == False{} : Bool}, i1: {Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))) == Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.zero()), W.W64.to_nat(b)), W.W64.to_nat(W.W64.zero()))), Word.to_nat(32n, hw)) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)) == True{} : Bool}) -> {Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.divmod.pick(False{}, W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(False{}, W.W64{U32{hw}, U32{lw}}, b)))) == W.W64.to_nat(W.W64{U32{hw}, U32{lw}}) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(False{}, W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b)) == True{} : Bool}:
416 (+e1, +l1) = i1
417 %Equal.sym(W.W64 & W.W64, W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())), (W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), wd.eta(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))) : {Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, lw, b, _))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, lw, b, _)))) == W.W64.to_nat(W.W64{U32{hw}, U32{lw}}) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, lw, b, _))), W.W64.to_nat(b)) == True{} : Bool}
418 (Equal.trans(Nat, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, lw, b, (W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, lw, b, (W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))))), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), wd.p1(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, lw, b, (W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, lw, b, (W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))))), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, lw, b, (W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), W.W64.to_nat(b), wd.bits(32n, lw, b, W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), l1, wv.lt64(b), Equal.trans(Bool, Nat.is_lt(Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), U.U32Nat.dbl(64n, 1n)), Nat.is_lt(W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), U.U32Nat.dbl(64n, 1n)), True{}, Equal.cong(Nat, Bool, zz => Nat.is_lt(zz, U.U32Nat.dbl(64n, 1n)), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Equal.sym(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), Equal.trans(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), Equal.trans(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Word.to_nat(32n, hw))), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), Equal.trans(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(U32.to_nat(U32{lw}), U.U32Nat.dbl(32n, U32.to_nat(U32{hw}))), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Word.to_nat(32n, hw))), WB.to_nat_parts(U32{hw}, U32{lw}), {==}), Equal.cong(Nat, Nat, zz => Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, zz)), Word.to_nat(32n, hw), Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))), Equal.sym(Nat, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))), Word.to_nat(32n, hw), Equal.trans(Nat, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.zero()), W.W64.to_nat(b)), W.W64.to_nat(W.W64.zero()))), Word.to_nat(32n, hw)), Word.to_nat(32n, hw), e1, {==})))), wr.d10(Word.to_nat(32n, lw), W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))))), wv.lt64(W.W64{U32{hw}, U32{lw}})))), Equal.sym(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), Equal.trans(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), Equal.trans(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Word.to_nat(32n, hw))), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), Equal.trans(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(U32.to_nat(U32{lw}), U.U32Nat.dbl(32n, U32.to_nat(U32{hw}))), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Word.to_nat(32n, hw))), WB.to_nat_parts(U32{hw}, U32{lw}), {==}), Equal.cong(Nat, Nat, zz => Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, zz)), Word.to_nat(32n, hw), Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))), Equal.sym(Nat, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))), Word.to_nat(32n, hw), Equal.trans(Nat, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.zero()), W.W64.to_nat(b)), W.W64.to_nat(W.W64.zero()))), Word.to_nat(32n, hw)), Word.to_nat(32n, hw), e1, {==})))), wr.d10(Word.to_nat(32n, lw), W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))))), wd.p2(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, lw, b, (W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, lw, b, (W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))))), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, lw, b, (W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), W.W64.to_nat(b), wd.bits(32n, lw, b, W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))), l1, wv.lt64(b), Equal.trans(Bool, Nat.is_lt(Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), U.U32Nat.dbl(64n, 1n)), Nat.is_lt(W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), U.U32Nat.dbl(64n, 1n)), True{}, Equal.cong(Nat, Bool, zz => Nat.is_lt(zz, U.U32Nat.dbl(64n, 1n)), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Equal.sym(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), Equal.trans(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))), Word.to_nat(32n, lw)), Equal.trans(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Word.to_nat(32n, hw))), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))))), Equal.trans(Nat, W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), Nat.add(U32.to_nat(U32{lw}), U.U32Nat.dbl(32n, U32.to_nat(U32{hw}))), Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, Word.to_nat(32n, hw))), WB.to_nat_parts(U32{hw}, U32{lw}), {==}), Equal.cong(Nat, Nat, zz => Nat.add(Word.to_nat(32n, lw), U.U32Nat.dbl(32n, zz)), Word.to_nat(32n, hw), Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))), Equal.sym(Nat, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))), Word.to_nat(32n, hw), Equal.trans(Nat, Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero()))))), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.zero()), W.W64.to_nat(b)), W.W64.to_nat(W.W64.zero()))), Word.to_nat(32n, hw)), Word.to_nat(32n, hw), e1, {==})))), wr.d10(Word.to_nat(32n, lw), W.W64.to_nat(W.W64.fst(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))), W.W64.to_nat(b), W.W64.to_nat(W.W64.snd(W.W64.div.bits(32n, hw, b, (W.W64.zero(), W.W64.zero())))))))), wv.lt64(W.W64{U32{hw}, U32{lw}})))))
419
420def wd.dz(+hw: Word(32n), +lw: Word(32n), +b: W.W64, z: Bool, ez: {W.W64.is_zero(b) == z : Bool}, +h: {W.W64.is_zero(b) == False{} : Bool}) -> {Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.divmod.pick(z, W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(z, W.W64{U32{hw}, U32{lw}}, b)))) == W.W64.to_nat(W.W64{U32{hw}, U32{lw}}) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(z, W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b)) == True{} : Bool}:
421 match z:
422 case True{}:
423 Empty.absurd({Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.divmod.pick(True{}, W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(True{}, W.W64{U32{hw}, U32{lw}}, b)))) == W.W64.to_nat(W.W64{U32{hw}, U32{lw}}) : Nat} & {Nat.is_lt(W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(True{}, W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b)) == True{} : Bool}, wn.tf(Equal.trans(Bool, True{}, W.W64.is_zero(b), False{}, Equal.sym(Bool, W.W64.is_zero(b), True{}, ez), h)))
424 case False{}:
425 wd.dz2(hw, lw, b, h, wd.bits(32n, hw, b, W.W64.zero(), W.W64.zero(), Equal.trans(Bool, Nat.is_lt(W.W64.to_nat(W.W64.zero()), W.W64.to_nat(b)), Nat.is_lt(0n, W.W64.to_nat(b)), True{}, {==}, wd.nz(W.W64.to_nat(b), Equal.trans(Bool, Nat.is_eq(W.W64.to_nat(b), 0n), W.W64.is_zero(b), False{}, Equal.sym(Bool, W.W64.is_zero(b), Nat.is_eq(W.W64.to_nat(b), 0n), WB.eq_value(b, W.W64.zero())), h))), wv.lt64(b), Equal.trans(Bool, Nat.is_lt(Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.zero()), W.W64.to_nat(b)), W.W64.to_nat(W.W64.zero()))), Word.to_nat(32n, hw)), U.U32Nat.dbl(64n, 1n)), Nat.is_lt(Word.to_nat(32n, hw), U.U32Nat.dbl(64n, 1n)), True{}, Equal.cong(Nat, Bool, zz => Nat.is_lt(zz, U.U32Nat.dbl(64n, 1n)), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.zero()), W.W64.to_nat(b)), W.W64.to_nat(W.W64.zero()))), Word.to_nat(32n, hw)), Word.to_nat(32n, hw), Equal.sym(Nat, Word.to_nat(32n, hw), Nat.add(U.U32Nat.dbl(32n, Nat.add(Nat.mul(W.W64.to_nat(W.W64.zero()), W.W64.to_nat(b)), W.W64.to_nat(W.W64.zero()))), Word.to_nat(32n, hw)), {==})), UO.nat_lt_le_trans(Word.to_nat(32n, hw), U.U32Nat.dbl(32n, 1n), U.U32Nat.dbl(64n, 1n), UL.word_value_lt(32n, hw), UL.dbl_le_exp(32n, 64n, 1n, {==})))))
426
427
428def Laws.divmod_value(a, b, h):
429 match a:
430 case W.W64{U32{+hw}, U32{+lw}}:
431 wd.p1(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.divmod.pick(W.W64.is_zero(b), W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(W.W64.is_zero(b), W.W64{U32{hw}, U32{lw}}, b)))), W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(W.W64.is_zero(b), W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b), wd.dz(hw, lw, b, W.W64.is_zero(b), {==}, h))
432
433def Laws.mod_lt(a, b, h):
434 match a:
435 case W.W64{U32{+hw}, U32{+lw}}:
436 wd.p2(Nat.add(Nat.mul(W.W64.to_nat(W.W64.fst(W.W64.divmod.pick(W.W64.is_zero(b), W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b)), W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(W.W64.is_zero(b), W.W64{U32{hw}, U32{lw}}, b)))), W.W64.to_nat(W.W64{U32{hw}, U32{lw}}), W.W64.to_nat(W.W64.snd(W.W64.divmod.pick(W.W64.is_zero(b), W.W64{U32{hw}, U32{lw}}, b))), W.W64.to_nat(b), wd.dz(hw, lw, b, W.W64.is_zero(b), {==}, h))
437
438def Laws.div_zero(a):
439 {==}
440
441def Laws.mod_zero(a):
442 {==}