Update from HH
[Flyspeck/.git] / text_formalization / packing / OXLZLEZ.hl
1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION                                              *)
3 (*                                                                            *)
4 (* Chapter: Packing                                                           *)
5 (* Lemma: OXLZLEZ                                                             *)
6 (* Author: Thomas C. Hales                                                    *)
7 (* Date: 2012-12-31                                                           *)
8 (* ========================================================================== *)
9
10 (* Combine all the OXLZLEZ lemmas into the final result *)
11
12 (*
13 When NQT finishes the cell cluster inequality section, this needs to be combined
14  with CELL_CLUSTER_ESTIMATE_PROPS to give OXLZLEZ
15
16 *)
17
18 (*
19 let WELLDEFINED_FUNCTION_3 = prove_by_refinement(
20   `!(f:C -> A->B) (s:C->A->bool) b. (!x i j. s x i /\ s x j ==> (f x i = f x j)) ==>
21    (?(g:C -> B). (!x. s x = {} ==> g x = b) /\ (!x i. s x i ==> g x = f x i))`,
22   (* {{{ proof *)
23   [
24   REPEAT WEAK_STRIP_TAC;
25   TYPED_ABBREV_TAC `(g:C->B) = \x. if (s x = {}) then b else (f x (@i. (s x i)))` ;
26   TYPIFY `g` EXISTS_TAC;
27   CONJ_TAC;
28     REPEAT WEAK_STRIP_TAC;
29     EXPAND_TAC "g";
30     BY(ASM_REWRITE_TAC[]);
31   REPEAT WEAK_STRIP_TAC;
32   EXPAND_TAC "g";
33   COND_CASES_TAC;
34     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN SET_TAC[]);
35   SELECT_TAC;
36     FIRST_X_ASSUM MATCH_MP_TAC;
37     BY(ASM_REWRITE_TAC[]);
38   BY(ASM_MESON_TAC[])
39   ]);;
40   (* }}} *)
41
42 let S_LEAF_FINITE = `!V ul.  packing V ==> FINITE (s_leaf V ul)`;;
43
44 let cc1 = `!V u0 u1 p n. saturated V /\ packing V /\ (n  = CARD (s_leaf V [u0;u1])) ==>
45     (?f.  IMAGE f (:num) = s_leaf V [u0;u1] /\ (!i. f (i + n) = f i) /\
46         (!i j. (i < j /\ j < n) ==> azim u0 u1 p (f i) < azim u0 u1 p (f j)))`;;
47
48 *)
49
50 module Oxlzlez = struct
51
52
53 open Hales_tactic;;
54 open Leaf_cell;;
55
56 parse_as_infix("<<",(18,"right"));;
57
58 (* DEFINITIONS *)
59
60 let s_leaf = new_definition `s_leaf V ul u <=>  
61     (leaf V [EL 0 ul;EL 1 ul;u] /\ (cc_ke V [EL 0 ul; EL 1 ul; u] = 4 \/ cc_ke V [EL 1 ul;EL 0 ul;u]  = 4))`;;
62
63 let gg_mcell = new_definition `gg_mcell V f u0 u1 i = 
64   sum 
65  { X | mcell_set V X /\ {u0,u1} IN edgeX V X /\ X SUBSET wedge_ge u0 u1 (f i) (f (SUC i))}
66   (\X.  gammaX V X lmfun * critical_weight V X + beta_bump_v1 V {u0,u1} X)`;;
67
68 let azim_mcell = new_definition `azim_mcell V f u0 u1 i = 
69   sum  { X | mcell_set V X /\ {u0,u1} IN edgeX V X /\ X SUBSET wedge_ge u0 u1 (f i) (f (SUC i))}
70   (\X. dihX V X (u0,u1))`;;
71
72 let cc_data_v8 = new_definition `cc_data_v8 V f u0 u1 = 
73 cc_v11 ([
74   (azim_mcell V f u0 u1);
75   (gg_mcell V f u0 u1);
76   (\i. gammaX V (cc_cell V [u0;u1;f i]) lmfun * critical_weight V (cc_cell V [u0;u1;f i]));
77   (\i. gammaX V (cc_cell V [u1;u0;f (SUC i)]) lmfun * critical_weight V (cc_cell V [u1;u0;f (SUC i)]))
78 ],
79 [
80 (\i. dist(f i,f(SUC i)) < &2 * hminus);
81 (\i. &2 * hminus <= dist (f i, f (SUC i)) /\ dist (f i,f(SUC i)) <= &2 * hplus);
82 (\i. &2 * hplus < dist (f i, f(SUC i)));
83 (\i. dist(u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus);
84 (\i. hl [u0;u1;f i] < #1.34);
85 (\i. ?ul. barV V 3 ul /\ {u0,u1} IN edgeX V (mcell4 V ul) /\ mcell4 V ul SUBSET (wedge_ge u0 u1 (f i) (f (SUC i))))
86 ],
87 CARD (s_leaf V [u0;u1]))`;;
88
89 let leaf_rank = new_definition `!V ul w0 n f. leaf_rank V ul w0 n f = 
90    (IMAGE f (:num) = s_leaf V ul /\
91                   (!i. f (i + n) = f i) /\
92                   (!i j.
93                        i < n /\ j < n /\ i < j
94                        ==> azim (EL 0 ul) (EL 1 ul) w0 (f i) <
95                            azim (EL 0 ul) (EL 1 ul) w0 (f j)))`;;
96
97
98 let cc_4 = new_definition `cc_4 V u0 u1 f i = (?ul. barV V 3 ul /\
99             {u0, u1} IN edgeX V (mcell4 V ul) /\
100             mcell4 V ul SUBSET wedge_ge u0 u1 (f i) (f (SUC i)))`;;
101
102 (* GENERIC RESULTS *)
103
104 let CARD_INSERT_INTER = prove_by_refinement(
105   `!(a:A) A B. FINITE B ==> CARD((a INSERT A) INTER B) = 
106       if (a IN B /\ ~(a IN A)) then SUC(CARD (A INTER B)) else CARD(A INTER B)`,
107   (* {{{ proof *)
108   [
109   REPEAT WEAKER_STRIP_TAC;
110   COND_CASES_TAC;
111     ASM_REWRITE_TAC[INSERT_INTER];
112     GMATCH_SIMP_TAC (CONJUNCT2 CARD_CLAUSES);
113     ASM_REWRITE_TAC[IN_INTER];
114     BY(ASM_MESON_TAC[FINITE_INTER]);
115   FIRST_X_ASSUM MP_TAC;
116   REWRITE_TAC[DE_MORGAN_THM];
117   DISCH_THEN DISJ_CASES_TAC;
118     BY(ASM_REWRITE_TAC[INSERT_INTER]);
119   ASM_REWRITE_TAC[INSERT_INTER];
120   COND_CASES_TAC;
121     GMATCH_SIMP_TAC (CONJUNCT2 CARD_CLAUSES);
122     ASM_REWRITE_TAC[IN_INTER];
123     BY(ASM_MESON_TAC[FINITE_INTER]);
124   BY(REWRITE_TAC[])
125   ]);;
126   (* }}} *)
127
128 let CARD_INSERT_INTER_ALT = prove_by_refinement(
129   `!(a:A) A B. FINITE B ==> CARD((a INSERT A) INTER B) = 
130       (if (a IN B /\ ~(a IN A)) then 1 else 0) + CARD(A INTER B)`,
131   (* {{{ proof *)
132   [
133   REPEAT WEAKER_STRIP_TAC;
134   ASM_SIMP_TAC [CARD_INSERT_INTER];
135   COND_CASES_TAC;
136     BY(REWRITE_TAC[arith `1 + x = SUC x`]);
137   BY(REWRITE_TAC[arith `0 + x = x`])
138   ]);;
139   (* }}} *)
140
141 let NUMSEG_LT = prove_by_refinement(
142   `!r. ~(r = 0) ==> (0.. (r - 1)) = {i | i < r}`,
143   (* {{{ proof *)
144   [
145   REWRITE_TAC[EXTENSION;IN_NUMSEG;IN_ELIM_THM];
146   BY(ARITH_TAC)
147   ]);;
148   (* }}} *)
149
150 let CARD4_IN_PAIRS = prove_by_refinement(
151   `!(a:A) b c d e f.
152     CARD {a,b,c,d} = 4 /\ {a,b,c,d} = {a,b,e,f} ==> {c,d} = {e,f}`,
153   (* {{{ proof *)
154   [
155   REPEAT WEAKER_STRIP_TAC;
156   REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
157   MATCH_MP_TAC Leaf_cell.LENGTH4_SET2;
158   REWRITE_TAC[set_of_list];
159   BY(ASM_MESON_TAC[])
160   ]);;
161   (* }}} *)
162
163 let initial_sublist_cons = prove_by_refinement(
164   `!(a:A) b x y. initial_sublist (CONS a x) (CONS b y) <=> (a = b) /\ initial_sublist x y`,
165   (* {{{ proof *)
166   [
167   REWRITE_TAC[Sphere.INITIAL_SUBLIST];
168   REPEAT WEAKER_STRIP_TAC;
169   REWRITE_TAC[APPEND];
170   REWRITE_TAC[CONS_11];
171   BY(MESON_TAC[])
172   ]);;
173   (* }}} *)
174
175 let COPLANAR_CONVEX_HULL_COPLANAR = prove_by_refinement(
176   `!(s:real^A->bool). coplanar (convex hull s) <=> coplanar s`,
177   (* {{{ proof *)
178   [
179   ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR];
180   GEN_TAC;
181   BY(REWRITE_TAC[AFFINE_HULL_CONVEX_HULL])
182   ]);;
183   (* }}} *)
184
185 (*
186 let STRICT_TOPOLOGICAL_SORT = prove_by_refinement(
187   `!((<<):(A->A->bool)).  (!x y. ~(x << y /\ y << x)) /\
188     (!x y. ~(x << y) ==> (x = y) \/ (y << x)) /\ 
189             (!x y z. x << y /\ y << z ==> x << z)
190             ==> (!n s.
191                      s HAS_SIZE n
192                      ==> (?f. s = IMAGE f (1..n) /\
193                               (!j k.
194                                    j IN 1..n /\ k IN 1..n /\ j < k
195                                    ==> (f j << f k))))`,
196   (* {{{ proof *)
197   [
198   REPEAT WEAK_STRIP_TAC;
199   INTRO_TAC TOPOLOGICAL_SORT [`\x y. (x = y) \/ ( x << y)`];
200   BETA_TAC;
201   ANTS_TAC;
202     BY(ASM_MESON_TAC[]);
203   REPEAT WEAK_STRIP_TAC;
204   FIRST_X_ASSUM (C INTRO_TAC [`n`;`s`]);
205   ASM_REWRITE_TAC[];
206   REPEAT WEAK_STRIP_TAC;
207   TYPIFY `f` EXISTS_TAC;
208   ASM_REWRITE_TAC[];
209   REPEAT WEAK_STRIP_TAC;
210   BY(ASM_MESON_TAC[])
211   ]);;
212   (* }}} *)
213 *)
214
215 let BARV3_SET_OF_LIST4 = prove_by_refinement(
216   `!V ul. packing V /\ barV V 3 ul ==>
217     set_of_list ul = {EL 0 ul,EL 1 ul, EL 2 ul, EL 3 ul}`,
218   (* {{{ proof *)
219   [
220   REPEAT WEAKER_STRIP_TAC;
221   INTRO_TAC Bump.set_of_list4 [`ul`];
222   ANTS_TAC;
223     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
224     BY(ASM_MESON_TAC[]);
225   BY(MESON_TAC[])
226   ]);;
227   (* }}} *)
228
229 let STRICT_SORT_FINITE = prove_by_refinement(
230   `!((<<):(A->A->bool)) s n.  (!x y. x IN s /\ y IN s /\ x << y /\ y << x ==> x = y) /\
231             (!x y z. x IN s /\ y IN s /\ z IN s /\ x << y /\ y << z ==> x << z) /\
232     s HAS_SIZE n ==>
233                     (?f. s = IMAGE f (1..n) /\
234                               (!j k.
235                                    j IN 1..n /\ k IN 1..n /\ j < k
236                                    ==> ~(f k << f j)))`,
237   (* {{{ proof *)
238   [
239   REPEAT WEAK_STRIP_TAC;
240   INTRO_TAC TOPOLOGICAL_SORT [`\x y. x IN s /\ y IN s /\ ((x = y) \/ x << y)`];
241   BETA_TAC;
242   ANTS_TAC;
243     BY(ASM_MESON_TAC[]);
244   REPEAT WEAK_STRIP_TAC;
245   FIRST_X_ASSUM (C INTRO_TAC [`n`;`s`]);
246   ASM_REWRITE_TAC[];
247   REPEAT WEAK_STRIP_TAC;
248   TYPIFY `f` EXISTS_TAC;
249   ASM_REWRITE_TAC[];
250   REPEAT WEAK_STRIP_TAC;
251   TYPIFY `f j IN s /\ f k IN s` (C SUBGOAL_THEN ASSUME_TAC);
252     FIRST_X_ASSUM_ST `IMAGE` MP_TAC;
253     REWRITE_TAC[IMAGE;EXTENSION;IN_ELIM_THM];
254     BY(ASM_MESON_TAC[]);
255   BY(ASM_MESON_TAC[])
256   ]);;
257   (* }}} *)
258
259 let MOD_INJ1_ALT = prove_by_refinement
260 (`!k n. ~( n = 0) /\ k < n /\ ~( k = 0) ==> (! x. ~( x MOD n = (x + k) MOD n)) `,
261 [
262   REPEAT STRIP_TAC;
263   INTRO_TAC Oxl_def.MOD_INJ [`n`;`x`;`x`;`x + (k:num)`];
264   ANTS_TAC;
265     ASM_REWRITE_TAC[IN_NUMSEG];
266     REPEAT (FIRST_X_ASSUM MP_TAC);
267     SIMP_TAC[LE_REFL; ARITH_RULE` ~( n = 0) ==> x <= n - 1 + x `; ARITH_RULE` a <= a + x:num `];
268     BY(ARITH_TAC);
269   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC)
270 ]);;
271
272 let MOD_PERIOD_BOUNDED_ALT = prove_by_refinement (
273 `!k n. ~( n = 0) /\ ~( k = 0) ==> (! x. (x + k) MOD n = x MOD n ==> n <= k ) `,
274 [
275   REPEAT STRIP_TAC;
276   PROOF_BY_CONTR_TAC;
277   INTRO_TAC MOD_INJ1_ALT [`k`;`n`];
278   ANTS_TAC;
279     BY(ASM_REWRITE_TAC[ARITH_RULE` a < (b:num) <=> ~(b <= a ) `]);
280   BY(ASM_MESON_TAC[])
281 ]);;
282
283 let MOD_REFL_ALT = REWRITE_RULE[MULT_CLAUSES] (SPECL [`m:num `;`1`] MOD_MULT);;
284
285
286 let periodic_o = prove_by_refinement(
287   `!(g:A->B) f n. periodic f n ==> periodic (g o f) n`,
288   (* {{{ proof *)
289   [
290   REWRITE_TAC[Oxl_def.periodic;o_DEF];
291   BY(MESON_TAC[])
292   ]);;
293   (* }}} *)
294
295 let periodic_shift = prove_by_refinement(
296   `!k (f:num->A) n. periodic f n ==> (periodic (\i. f (i + k)) n)`,
297   (* {{{ proof *)
298   [
299   REWRITE_TAC[Oxl_def.periodic];
300   REPEAT WEAKER_STRIP_TAC;
301   TYPIFY `(i + n) + (k:num) = (i + k) + n` (C SUBGOAL_THEN SUBST1_TAC);
302     BY(ARITH_TAC);
303   BY(ASM_MESON_TAC[])
304   ]);;
305   (* }}} *)
306
307 let PERIODIC_IMAGE = prove_by_refinement(
308   `!f n. ~(n = 0) /\ periodic (f:num->A) n ==>
309     IMAGE f {i | i < n} = IMAGE f (:num)`,
310   (* {{{ proof *)
311   [
312   REPEAT WEAKER_STRIP_TAC;
313   REWRITE_TAC[EXTENSION;IN_IMAGE;IN_UNIV;IN_ELIM_THM];
314   REPEAT WEAKER_STRIP_TAC;
315   REWRITE_TAC[Geomdetail.EQ_EXPAND];
316   CONJ_TAC;
317     REPEAT WEAKER_STRIP_TAC;
318     BY(ASM_MESON_TAC[]);
319   REPEAT WEAKER_STRIP_TAC;
320   TYPIFY `x' MOD n` EXISTS_TAC;
321   ASM_REWRITE_TAC[];
322   ASM_SIMP_TAC[GSYM Oxl_def.periodic_mod];
323   BY(ASM_MESON_TAC[DIVISION])
324   ]);;
325   (* }}} *)
326
327 let PERIODIC_REDUCE_MOD = prove_by_refinement(
328   `!(f:num->A) n i. 1 <= n /\ periodic f n ==> (?j. j < n /\ f i = f j /\ f (SUC i) = f (SUC j))`,
329   (* {{{ proof *)
330   [
331   REPEAT WEAKER_STRIP_TAC;
332   TYPIFY `i MOD n` EXISTS_TAC;
333   TYPIFY `~(n=0)` (C SUBGOAL_THEN ASSUME_TAC);
334     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
335   ASM_SIMP_TAC[DIVISION];
336   ASM_SIMP_TAC[GSYM Oxl_def.periodic_mod];
337   BY(ASM_MESON_TAC[Hypermap.lemma_suc_mod;Oxl_def.periodic_mod])
338   ]);;
339   (* }}} *)
340
341 (* renamed from PERIODIC_INJ *)
342
343 let PERIODIC_EQ_IMAGE = prove_by_refinement(
344   `!(f:num->A) n i j. ~(n=0) /\ periodic f n /\ (i MOD n = j MOD n) ==> (f i = f j)`,
345   (* {{{ proof *)
346   [
347   BY(ASM_MESON_TAC[Oxl_def.periodic_mod])
348   ]);;
349   (* }}} *)
350
351 let F_SUC_PRE = prove_by_refinement(
352   `!(f:num->A) n i. ~(n = 0) /\ periodic f n ==> f (SUC (i + n - 1)) = f i`,
353   (* {{{ proof *)
354   [
355   REPEAT WEAKER_STRIP_TAC;
356   MATCH_MP_TAC PERIODIC_EQ_IMAGE;
357   EXISTS_TAC `n:num`;
358   ASM_REWRITE_TAC[];
359   ASM_SIMP_TAC[arith `~(n=0) ==> SUC (i + n - 1) = 1 * n + i`];
360   BY(REWRITE_TAC[MOD_MULT_ADD])
361   ]);;
362   (* }}} *)
363
364 let F_DEMOD = prove_by_refinement(
365   `!f n i. periodic f n /\ 1 < n ==>
366     f (i MOD n) = f i /\ f (SUC (i MOD n)) = f (SUC i)`,
367   (* {{{ proof *)
368   [
369   REPEAT WEAKER_STRIP_TAC;
370   MP_TAC (arith `1 < n ==> ~(n =0)`);
371   ASM_REWRITE_TAC[];
372   REPEAT WEAKER_STRIP_TAC;
373   CONJ_TAC;
374     MATCH_MP_TAC PERIODIC_EQ_IMAGE;
375     TYPIFY `n` EXISTS_TAC;
376     BY(ASM_SIMP_TAC[MOD_MOD_REFL]);
377   MATCH_MP_TAC PERIODIC_EQ_IMAGE;
378   TYPIFY `n` EXISTS_TAC;
379   ASM_REWRITE_TAC[];
380   REWRITE_TAC[arith `SUC x = x + 1`];
381   BY(ASM_MESON_TAC[MOD_LT;MOD_ADD_MOD])
382   ]);;
383   (* }}} *)
384
385 let FM_DEMOD = prove_by_refinement(
386   `!f n i. periodic f n /\ 1 < n ==>  f (i MOD n) = f i /\
387     f (i MOD n + n - 1) = f (i + n - 1) `,
388   (* {{{ proof *)
389   [
390   REPEAT WEAKER_STRIP_TAC;
391   MP_TAC (arith `1 < n ==> ~(n =0)`);
392   ASM_REWRITE_TAC[];
393   REPEAT WEAKER_STRIP_TAC;
394   CONJ_TAC;
395     MATCH_MP_TAC PERIODIC_EQ_IMAGE;
396     TYPIFY `n` EXISTS_TAC;
397     BY(ASM_SIMP_TAC[MOD_MOD_REFL]);
398   MATCH_MP_TAC PERIODIC_EQ_IMAGE;
399   TYPIFY `n` EXISTS_TAC;
400   ASM_REWRITE_TAC[];
401   TYPIFY `n - 1 < n` (C SUBGOAL_THEN ASSUME_TAC);
402     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
403   BY(ASM_MESON_TAC[MOD_LT;MOD_ADD_MOD])
404   ]);;
405   (* }}} *)
406
407 let NULLSET_AFF_2_1 = prove_by_refinement(
408   `!x y z. NULLSET (aff_ge {x,y} {z})`,
409   (* {{{ proof *)
410   [
411   REPEAT WEAKER_STRIP_TAC;
412   MATCH_MP_TAC NEGLIGIBLE_SUBSET;
413   TYPIFY `affine hull {x,y,z}` EXISTS_TAC;
414   REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3];
415   TYPIFY `{x,y,z} = {x,y} UNION {z}` (C SUBGOAL_THEN SUBST1_TAC);
416     BY(SET_TAC[]);
417   BY(REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL])
418   ]);;
419   (* }}} *)
420
421 (* renamed from coplanar_dih_y -> coplanar_delta_y *)
422
423 let coplanar_delta_y = prove_by_refinement(
424   `!u0 u1 u2 (u3:real^3).
425      ~coplanar {u0, u1, u2, u3} <=>
426      &0 <
427      delta_y (dist (u0,u1)) (dist (u0,u2)) (dist (u0,u3)) (dist (u2,u3))
428      (dist (u1,u3))
429      (dist (u1,u2))`,
430   (* {{{ proof *)
431   [
432   REPEAT WEAKER_STRIP_TAC;
433   GMATCH_SIMP_TAC ( Leaf_cell.coplanar_eq_coplanar_alt);
434   REWRITE_TAC[DIMINDEX_3;arith `2 <= 3`];
435   REWRITE_TAC[REWRITE_RULE[TAUT `(a <=> ~b) <=> (b <=> ~a)`] (Collect_geom2.POS_EQ_NOT_COPLANANR)];
436   REWRITE_TAC[Merge_ineq.delta_delta_x];
437   BY(REWRITE_TAC[arith `x pow 2 = x * x`;GSYM Sphere.delta_y])
438   ]);;
439   (* }}} *)
440
441 let RADV_ETAY = prove_by_refinement(
442   `!u0 u1 (u2:real^3).  ~collinear {u0,u1,u2} ==>
443     radV {u0,u1,u2} = eta_y (dist(u0,u1)) (dist(u0,u2)) (dist(u1,u2))`,
444   (* {{{ proof *)
445   [
446   REPEAT WEAKER_STRIP_TAC;
447   INTRO_TAC Collect_geom.RADV_FORMULAR [`u2`;`u1`;`u0`];
448   ASM_REWRITE_TAC[];
449   TYPIFY `{u2,u1,u0} = {u0,u1,u2}` (C SUBGOAL_THEN SUBST1_TAC);
450     BY(SET_TAC[]);
451   ASM_REWRITE_TAC[];
452   DISCH_THEN SUBST1_TAC;
453   REWRITE_TAC[Geomdetail.dist3];
454   BY(MESON_TAC[DIST_SYM])
455   ]);;
456   (* }}} *)
457
458 let RADV2 = prove_by_refinement(
459   `!u (v:real^3). radV {u,v} = inv(&2) * dist(u,v)`,
460   (* {{{ proof *)
461   [
462   REPEAT WEAKER_STRIP_TAC;
463   INTRO_TAC Pack_defs.HL [`[u;v]`];
464   REWRITE_TAC[set_of_list;Marchal_cells_3.HL_2];
465   BY(MESON_TAC[])
466   ]);;
467   (* }}} *)
468
469 let GDRQXLGv3 = prove_by_refinement(
470   `!(v0:real^3) v1 v2 v3. (let s = {v0,v1,v2,v3} in             
471   let x1 = dist (v0,v1) pow 2 in
472             let x2 = dist (v0,v2) pow 2 in
473             let x3 = dist (v0,v3) pow 2 in
474             let x4 = dist (v2,v3) pow 2 in
475             let x5 = dist (v1,v3) pow 2 in
476             let x6 = dist (v1,v2) pow 2 in
477             ~coplanar s
478             ==> radV s pow 2 = rad2_x x1 x2 x3 x4 x5 x6)`,
479   (* {{{ proof *)
480   [
481   REWRITE_TAC[LET_DEF;LET_END_DEF];
482   REPEAT WEAKER_STRIP_TAC;
483   INTRO_TAC Merge_ineq.GDRQXLGv2 [`v0`;`v1`;`v2`;`v3`];
484   REWRITE_TAC[LET_DEF;LET_END_DEF];
485   DISCH_THEN MATCH_MP_TAC;
486   TYPIFY `coplanar {v0,v1,v2,v3} = coplanar_alt{v0,v1,v2,v3}` (C SUBGOAL_THEN MP_TAC);
487     MATCH_MP_TAC Leaf_cell.coplanar_eq_coplanar_alt;
488     BY(ASM_REWRITE_TAC[DIMINDEX_3;arith `2 <= 3`]);
489   ASM_REWRITE_TAC[];
490   DISCH_TAC;
491   BY(ASM_MESON_TAC[Collect_geom2.NOT_COPLANAR_IMP_CARD4])
492   ]);;
493   (* }}} *)
494
495 let DIST_IMP_COLLINEAR = prove_by_refinement(
496   `!(u0:real^3) u1 u2.  &2 <= dist(u0,u1) /\ &2 <= dist(u0,u2) /\ &2 <= dist(u1,u2) /\
497     dist(u0,u1) < &4 /\ dist(u0,u2) < &4 /\ dist(u1,u2) < &4 ==> ~collinear{u0,u1,u2}`,
498   (* {{{ proof *)
499   [
500   REWRITE_TAC[Collect_geom.COL_EQ_UPS_0;Trigonometry2.UPS_X_AND_HERON];
501   REPEAT WEAKER_STRIP_TAC;
502   FIRST_X_ASSUM MP_TAC;
503   REWRITE_TAC[];
504   MATCH_MP_TAC (arith `&0 < x ==> ~(x = &0)`);
505   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
506   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
507   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
508   ASM_SIMP_TAC[arith `&2 <= x /\ &2 <= y /\ &2 <= z ==> &0 < x + y + z`];
509   TYPIFY `!x y z. &2 <= x /\ &2 <= y /\ z < &4 ==> &0 < x + y - z` ENOUGH_TO_SHOW_TAC;
510     BY(ASM_MESON_TAC[]);
511   BY(REAL_ARITH_TAC)
512   ]);;
513   (* }}} *)
514
515 let UPS_X8_POS = prove_by_refinement(
516   `!y5 y6.
517     &2 <= y5 /\ y5 < &4 /\ &2 <= y6 /\ y6 < &4 ==>
518     &0 < ups_x (&8) (y5 * y5) (y6 * y6)`,
519   (* {{{ proof *)
520   [
521   REWRITE_TAC[GSYM Nonlinear_lemma.sqrt8_2;arith `&8 = #8.0`];
522   REPEAT WEAKER_STRIP_TAC;
523   MATCH_MP_TAC Merge_ineq.TRI_UPS_X_STRICT_POS;
524   MP_TAC Flyspeck_constants.bounds;
525   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
526   ]);;
527   (* }}} *)
528
529 let DIST_IMP_UPS_X_POS = prove_by_refinement(
530   `!(u0:real^3) u1 u2. &2 <= dist(u0,u1) /\ &2 <= dist(u0,u2) /\ &2 <= dist(u1,u2) /\
531     dist(u0,u1) < &4 /\ dist(u0,u2) < &4 /\ dist(u1,u2) < &4 ==>
532     &0 < ups_x (dist(u0,u1) pow 2) (dist (u0,u2) pow 2) (dist (u1,u2) pow 2)`,
533   (* {{{ proof *)
534   [
535   REPEAT WEAKER_STRIP_TAC;
536   REWRITE_TAC[GSYM Collect_geom2.NOT_COL_EQ_UPS_X_POS];
537   MATCH_MP_TAC DIST_IMP_COLLINEAR;
538   BY(ASM_REWRITE_TAC[])
539   ]);;
540   (* }}} *)
541
542 let INITIAL_SUBLIST_TRUNCATE = prove_by_refinement(
543   `!vl (ul:(real^3)list). LENGTH ul = 4 /\
544     initial_sublist vl ul /\ ~initial_sublist vl (truncate_simplex 2 ul) ==>
545     (vl = ul)`,
546   (* {{{ proof *)
547   [
548   REPEAT WEAKER_STRIP_TAC;
549   TYPIFY `ul = [EL 0 ul;EL 1 ul;EL 2 ul;EL 3 ul]` (C SUBGOAL_THEN ASSUME_TAC);
550     MATCH_MP_TAC Bump.LENGTH4;
551     BY(ASM_REWRITE_TAC[]);
552   PROOF_BY_CONTR_TAC;
553   FIRST_X_ASSUM_ST `initial_sublist` MP_TAC;
554   REWRITE_TAC[];
555   TYPIFY `truncate_simplex 2 ul = [EL 0 ul;EL 1 ul;EL 2 ul]` (C SUBGOAL_THEN SUBST1_TAC);
556     FIRST_X_ASSUM_ST `EL` SUBST1_TAC;
557     BY(REWRITE_TAC[Marchal_cells.TRUNCATE_SIMPLEX_EXPLICIT_2;Bump.EL_EXPLICIT]);
558   FIRST_X_ASSUM_ST `initial_sublist` MP_TAC;
559   INTRO_TAC Packing3.INITIAL_SUBLIST_APPEND_SING [`vl`;`[EL 0 ul;EL 1 ul;EL 2 ul]`;`EL 3 ul`];
560   TYPIFY `APPEND [EL 0 ul; EL 1 ul; EL 2 ul] [EL 3 ul] = [EL 0 ul; EL 1 ul; EL 2 ul; EL 3 ul]` (C SUBGOAL_THEN SUBST1_TAC);
561     BY(REWRITE_TAC[APPEND]);
562   BY(ASM_MESON_TAC[])
563   ]);;
564   (* }}} *)
565
566 let NOT_COPLANAR_AFF_3 = prove_by_refinement(
567   `!(s:real^3->bool). ~coplanar s ==> aff_dim s = &3`,
568   (* {{{ proof *)
569   [
570   REPEAT WEAKER_STRIP_TAC;
571   REWRITE_TAC[INT_ARITH `x = int_of_num 3 <=> x <= &3 /\ ~(x <= &2)`];
572   CONJ2_TAC;
573     BY(ASM_MESON_TAC[Rogers.AFF_DIM_LE_2_IMP_COPLANAR]);
574   BY(MESON_TAC[AFF_DIM_LE_UNIV;DIMINDEX_3])
575   ]);;
576   (* }}} *)
577
578 let AFF_DEP_COPLANAR = prove_by_refinement(
579   `!(a:real^3) b c d. CARD {a,b,c,d} = 4 ==> (affine_dependent {a,b,c,d} <=> coplanar {a,b,c,d})`,
580   (* {{{ proof *)
581   [
582   ONCE_REWRITE_TAC[TAUT `(a <=> b) <=> (~a <=> ~b)`];
583   REWRITE_TAC[AFFINE_INDEPENDENT_IFF_CARD;FINITE_INSERT;FINITE_EMPTY];
584   REPEAT WEAKER_STRIP_TAC;
585   ASM_REWRITE_TAC[INT_ARITH `int_of_num 4 - &1 = &3`];
586   BY(ASM_MESON_TAC[Leaf_cell.COPLANAR_IMP_AFF_DIM;NOT_COPLANAR_AFF_3;INT_ARITH `x = int_of_num 3 ==> ~(x <= &2)`])
587   ]);;
588   (* }}} *)
589
590 let HL_IMP_BARV = prove_by_refinement(
591   `!V ul. packing V /\ saturated V /\ ~coplanar (set_of_list ul) /\
592     set_of_list ul SUBSET V /\ hl ul < sqrt(&2) /\ barV V 2 (truncate_simplex 2 ul) /\
593   LENGTH ul = 4 ==>
594     barV V 3 ul`,
595   (* {{{ proof *)
596   [
597   REWRITE_TAC[Sphere.BARV;Sphere.VORONOI_NONDG;arith `2 + 1 = 3`;arith `3 + 1 = 4`];
598   REPEAT WEAKER_STRIP_TAC;
599   ASM_REWRITE_TAC[];
600   REPEAT WEAKER_STRIP_TAC;
601   COMMENT "preliminaries";
602   TYPIFY `initial_sublist vl (truncate_simplex 2 ul)` ASM_CASES_TAC;
603     BY(ASM_MESON_TAC[]);
604   TYPIFY `vl = ul` (C SUBGOAL_THEN ASSUME_TAC);
605     MATCH_MP_TAC INITIAL_SUBLIST_TRUNCATE;
606     BY(ASM_REWRITE_TAC[]);
607   ASM_REWRITE_TAC[arith `4 < 5`;arith `x + &4 = int_of_num 4 <=> x = &0`];
608   REWRITE_TAC[AFF_DIM_EQ_0];
609   TYPIFY `circumcenter (set_of_list ul)` EXISTS_TAC;
610   TYPIFY `!x y. x SUBSET {y} /\ y IN x ==> x = {(y:real^3)}` (C SUBGOAL_THEN MATCH_MP_TAC);
611     BY(SET_TAC[]);
612   TYPIFY `set_of_list ul = {EL 0 ul,EL 1 ul,EL 2 ul,EL 3 ul}` (C SUBGOAL_THEN ASSUME_TAC);
613     MATCH_MP_TAC Bump.set_of_list4;
614     BY(ASM_REWRITE_TAC[]);
615   TYPIFY `~coplanar_alt {EL 0 ul,EL 1 ul,EL 2 ul,EL 3 ul}` (C SUBGOAL_THEN ASSUME_TAC);
616     GMATCH_SIMP_TAC (GSYM Leaf_cell.coplanar_eq_coplanar_alt);
617     BY(ASM_MESON_TAC[DIMINDEX_3;arith `2 <= 3`]);
618   TYPIFY `~affine_dependent {EL 0 ul,EL 1 ul,EL 2 ul,EL 3 ul}` (C SUBGOAL_THEN ASSUME_TAC);
619     GMATCH_SIMP_TAC AFF_DEP_COPLANAR;
620     CONJ2_TAC;
621       BY(ASM_MESON_TAC[]);
622     MATCH_MP_TAC Collect_geom2.NOT_COPLANAR_IMP_CARD4;
623     BY(ASM_REWRITE_TAC[]);
624   CONJ2_TAC;
625     INTRO_TAC Rogers.CIRCUMCENTER_IN_VORONOI_SET [`V`;`set_of_list ul`];
626     ANTS_TAC;
627       ASM_REWRITE_TAC[];
628       BY(ASM_MESON_TAC[Pack_defs.HL]);
629     BY(REWRITE_TAC[Sphere.VORONOI_LIST]);
630   REWRITE_TAC[SUBSET;IN_SING];
631   REPEAT WEAKER_STRIP_TAC;
632   INTRO_TAC Rogers.OAPVION3 [`set_of_list ul`];
633   ANTS_TAC;
634     BY(ASM_MESON_TAC[]);
635   DISCH_THEN (C INTRO_TAC [`x`]);
636   DISCH_THEN MATCH_MP_TAC;
637   GMATCH_SIMP_TAC Tskajxy.NOT_COPLANAR_R3;
638   CONJ_TAC;
639     BY(ASM_MESON_TAC[]);
640   REWRITE_TAC[IN_UNIV];
641   FIRST_X_ASSUM MP_TAC;
642   REWRITE_TAC[Sphere.VORONOI_LIST;Sphere.VORONOI_SET];
643   REWRITE_TAC[IN_INTERS;IN_ELIM_THM];
644   DISCH_TAC;
645   TYPIFY `!w. w IN set_of_list ul ==> x IN voronoi_closed V w` (C SUBGOAL_THEN MP_TAC);
646     BY(ASM_MESON_TAC[]);
647   REWRITE_TAC[Sphere.voronoi_closed;IN_ELIM_THM];
648   DISCH_TAC;
649   TYPIFY `dist(x,EL 0 ul)` EXISTS_TAC;
650   REPEAT WEAKER_STRIP_TAC;
651   MATCH_MP_TAC (arith `x <= y /\ y <= x ==> x = y`);
652   CONJ_TAC;
653     FIRST_X_ASSUM (C INTRO_TAC [`w`]);
654     ASM_REWRITE_TAC[];
655     DISCH_THEN MATCH_MP_TAC;
656     BY(ASM_MESON_TAC[SUBSET;IN;IN_INSERT]);
657   FIRST_X_ASSUM (C INTRO_TAC [`EL 0 ul`]);
658   ANTS_TAC;
659     BY(ASM_MESON_TAC[IN_INSERT]);
660   DISCH_THEN MATCH_MP_TAC;
661   BY(ASM_MESON_TAC[SUBSET;IN])
662   ]);;
663   (* }}} *)
664
665 let EDGE_LE_2RAD = prove_by_refinement(
666   `!x1 x2 x3 x4 x5 x6.
667     &0 < delta_x x1 x2 x3 x4 x5 x6 /\
668     &0 < x4 /\ &0 < x5 /\ &0 < x6 /\ &0 < ups_x x4 x5 x6 ==>
669     x4 <= &4 * rad2_x x1 x2 x3 x4 x5 x6`,
670   (* {{{ proof *)
671   [
672   REPEAT WEAKER_STRIP_TAC;
673   MATCH_MP_TAC REAL_LE_TRANS;
674   TYPIFY `&4 * eta_x x4 x5 x6 pow 2` EXISTS_TAC;
675   CONJ2_TAC;
676     GMATCH_SIMP_TAC Real_ext.REAL_LE_LMUL_IMP;
677     CONJ_TAC;
678       BY(REAL_ARITH_TAC);
679     MATCH_MP_TAC Merge_ineq.rad2_x_eta_x;
680     BY(ASM_REWRITE_TAC[]);
681   INTRO_TAC Collect_geom.HVXIKHW [`sqrt x4`;`sqrt x5`;`sqrt x6`];
682   REWRITE_TAC[Collect_geom.ups_x_pow2];
683   REWRITE_TAC[Sphere.eta_y;LET_DEF;LET_END_DEF];
684   REPEAT (GMATCH_SIMP_TAC SQRT_POS_LE);
685   REPEAT (GMATCH_SIMP_TAC Merge_ineq.sqrtpow2);
686   ASM_SIMP_TAC [arith `&0 < x ==> &0 <= x`];
687   GMATCH_SIMP_TAC REAL_LE_LDIV_EQ;
688   CONJ_TAC;
689     BY(REAL_ARITH_TAC);
690   DISCH_TAC;
691   TYPIFY `x4 = sqrt(x4) pow 2` (C SUBGOAL_THEN MP_TAC);
692     GMATCH_SIMP_TAC SQRT_POW_2;
693     BY(ASM_SIMP_TAC[arith `&0 < x ==> &0 <= x`]);
694   DISCH_TAC;
695   ASM_SIMP_TAC [arith `x = y ==> (x <= &4 * z <=> y <= &4 * z)`];
696   TYPIFY `sqrt x4 pow 2 <= (&2 * eta_x x4 x5 x6) pow 2` ENOUGH_TO_SHOW_TAC;
697     BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
698   MATCH_MP_TAC Collect_geom2.POS_IMP_POW2;
699   CONJ_TAC;
700     GMATCH_SIMP_TAC SQRT_POS_LE;
701     BY(ASM_SIMP_TAC[arith `&0 < x ==> &0 <= x`]);
702   MATCH_MP_TAC REAL_LE_TRANS;
703   TYPIFY `max_real3 (sqrt x4) (sqrt x5) (sqrt x6)` EXISTS_TAC;
704   ASM_SIMP_TAC[arith `&2 * x = x * &2`];
705   REWRITE_TAC[Collect_geom.max_real3];
706   REWRITE_TAC[Misc_defs_and_lemmas.max_real];
707   BY(REPEAT COND_CASES_TAC THEN REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
708   ]);;
709   (* }}} *)
710
711 let RAD2_Y_SQRT8 = prove_by_refinement(
712   `!y1 y2 y3 y5 y6.
713     &2 <= y5 /\ &2 <= y6 /\ y5 < &4 /\ y6 < &4 /\
714     &0 < delta_y y1 y2 y3 (sqrt8) y5 y6 ==>
715     &2 <= rad2_y y1 y2 y3 (sqrt8) y5 y6`,
716   (* {{{ proof *)
717   [
718   REWRITE_TAC[Sphere.rad2_y;Sphere.delta_y;Sphere.y_of_x;Nonlinear_lemma.sqrt8_2;arith `#8.0 = &8`];
719   REPEAT WEAKER_STRIP_TAC;
720   REWRITE_TAC[arith `&2 <= x <=> &8 <= &4 * x`];
721   MATCH_MP_TAC EDGE_LE_2RAD;
722   REPEAT (GMATCH_SIMP_TAC REAL_LT_MUL_EQ);
723   ASM_SIMP_TAC[arith `&0 < &8`;arith `&2 <= x ==> &0 < x`];
724   MATCH_MP_TAC UPS_X8_POS;
725   BY(ASM_REWRITE_TAC[])
726   ]);;
727   (* }}} *)
728
729 (* renamed from DIH_X_LE_PI *)
730
731 let DIH_X_LT_PI = prove_by_refinement(
732   `!x1 x2 x3 x4 x5 x6. &0 < x1 /\ &0 < delta_x x1 x2 x3 x4 x5 x6 ==>
733     dih_x x1 x2 x3 x4 x5 x6 < pi`,
734   (* {{{ proof *)
735   [
736   REWRITE_TAC[Sphere.dih_x;LET_DEF;LET_END_DEF];
737   REPEAT WEAKER_STRIP_TAC;
738   REWRITE_TAC[arith `pi / &2 + x < pi <=> x < pi / &2`];
739   MATCH_MP_TAC Merge_ineq.ATN2_LE_PI2;
740   GMATCH_SIMP_TAC REAL_LT_RSQRT;
741   REWRITE_TAC[arith `&0 pow 2 = &0`];
742   REWRITE_TAC[arith `&0 < &4 * x <=> &0 < x`];
743   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
744   BY(ASM_REWRITE_TAC[])
745   ]);;
746   (* }}} *)
747
748 let DIH_Y_LT_PI = prove_by_refinement(
749   `!y1 y2 y3 y4 y5 y6. &0 < y1 /\ &0 < delta_y y1 y2 y3 y4 y5 y6 ==>
750     dih_y y1 y2 y3 y4 y5 y6 < pi`,
751   (* {{{ proof *)
752   [
753   REWRITE_TAC[Sphere.delta_y;Sphere.dih_y;LET_DEF;LET_END_DEF];
754   REPEAT WEAKER_STRIP_TAC;
755   MATCH_MP_TAC DIH_X_LT_PI;
756   ASM_REWRITE_TAC[];
757   GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
758   BY(ASM_REWRITE_TAC[])
759   ]);;
760   (* }}} *)
761
762 let DIHV_EQ_0_PI_EQ_COPLANAR_ALT = prove_by_refinement(
763   `!(v0:real^3) v1 w1 w2. ~coplanar {v0,v1,w1,w2} ==> ~(dihV v0 v1 w1 w2 = &0)`,
764   (* {{{ proof *)
765   [
766   REPEAT WEAKER_STRIP_TAC;
767   TYPIFY` ~collinear {v0,v1,w1} /\ ~collinear{v0,v1,w2}` (C SUBGOAL_THEN ASSUME_TAC);
768     CONJ_TAC THEN MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR;
769       BY(ASM_MESON_TAC[]);
770     TYPIFY `w1` EXISTS_TAC;
771     TYPIFY `{v0,v1,w2,w1} = {v0,v1,w1,w2}` (C SUBGOAL_THEN SUBST1_TAC);
772       BY(SET_TAC[]);
773     BY(ASM_REWRITE_TAC[]);
774   INTRO_TAC DIHV_EQ_0_PI_EQ_COPLANAR [`v0`;`v1`;`w1`;`w2`];
775   BY(ASM_MESON_TAC[])
776   ]);;
777   (* }}} *)
778
779 let AZIM_ZERO_SHIFT = prove_by_refinement(
780   `!u0 u1 u2 w w'.  ~collinear {u0,u1,u2} /\ ~collinear {u0,u1,w} /\ ~collinear {u0,u1,w'} ==>
781     (azim u0 u1 u2 w = azim u0 u1 u2 w' <=> azim u0 u1 w w' = &0)`,
782   (* {{{ proof *)
783   [
784   REPEAT WEAKER_STRIP_TAC;
785   MATCH_MP_TAC (TAUT `((a ==> b) /\ (b ==> a)) ==> (a = b)`);
786   CONJ_TAC;
787     REPEAT WEAKER_STRIP_TAC;
788     INTRO_TAC Fan.sum4_azim_fan [`u0`;`u1`;`u2`;`w`;`w'`];
789     ANTS_TAC;
790       ASM_REWRITE_TAC[];
791       BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
792     ASM_REWRITE_TAC[];
793     BY(REAL_ARITH_TAC);
794   DISCH_TAC;
795   INTRO_TAC Fan.sum5_azim_fan [`u0`;`u1`;`u2`;`w`;`w'`];
796   ANTS_TAC;
797     ASM_REWRITE_TAC[];
798     BY(REWRITE_TAC[Local_lemmas.AZIM_RANGE]);
799   ASM_REWRITE_TAC[];
800   BY(REAL_ARITH_TAC)
801   ]);;
802   (* }}} *)
803
804 let ORDER_AZIM_SUM2Pi0 = prove_by_refinement(
805   `!x y z n g.
806          ~collinear {x, y, z} /\
807          (!i. i < n ==> ~collinear {x, y, g i}) /\
808          g n = g 0 /\
809          1 < n /\
810          (!j k.
811               j < n /\ k < n /\ j < k
812               ==> azim x y z (g j) < azim x y z (g k))
813          ==> sum {i | i < n} (\i. azim x y (g i) (g (i + 1))) = &2 * pi`,
814   (* {{{ proof *)
815   [
816   REPEAT WEAKER_STRIP_TAC;
817   INTRO_TAC Counting_spheres.ORDER_AZIM_SUM2Pi [`x`;`y`;`z`;`n`;`g o PRE`];
818   ANTS_TAC;
819     ASM_REWRITE_TAC[o_THM];
820     REWRITE_TAC[IN_NUMSEG];
821     CONJ_TAC;
822       REPEAT WEAKER_STRIP_TAC;
823       BY(ASM_MESON_TAC[arith `1 <= i /\ i <= n ==> PRE i < n`]);
824     ASM_REWRITE_TAC[arith `PRE (n + 1) = n /\ PRE 1 = 0`];
825     REPEAT WEAKER_STRIP_TAC;
826     BY(ASM_MESON_TAC[arith `1 <= i /\ i <= n ==> PRE i < n`;arith `j < k /\ 1 <= j ==> PRE j < PRE k`]);
827   DISCH_THEN (SUBST1_TAC o GSYM);
828   TYPIFY `sum (1..n) (\i. azim x y ((g o PRE) i) ((g o PRE) (i + 1))) = sum (1..n) ((\i. azim x y (g i) (g (i + 1))) o PRE)` (C SUBGOAL_THEN SUBST1_TAC);
829     MATCH_MP_TAC SUM_EQ;
830     REWRITE_TAC[IN_NUMSEG;o_THM];
831     REPEAT WEAKER_STRIP_TAC;
832     BY(ASM_SIMP_TAC[arith `1 <= x' ==> (PRE (x' + 1) = PRE x' + 1)`]);
833   MATCH_MP_TAC (GSYM Bump.BIJ_SUM);
834   REWRITE_TAC[BIJ;SURJ;INJ;IN_NUMSEG;IN_ELIM_THM];
835   SUBCONJ_TAC;
836     BY(ARITH_TAC);
837   DISCH_THEN (unlist REWRITE_TAC);
838   REPEAT WEAKER_STRIP_TAC;
839   TYPIFY `SUC x'` EXISTS_TAC;
840   BY(FIRST_X_ASSUM MP_TAC THEN ARITH_TAC)
841   ]);;
842   (* }}} *)
843
844
845 (* MCELL FUNCTIONS *)
846
847 let CRITICAL_WEIGHT_POS_LE = prove_by_refinement(
848   `!V X. &0 <= critical_weight V X`,
849   (* {{{ proof *)
850   [
851   REWRITE_TAC[Pack_defs.critical_weight];
852   REPEAT WEAKER_STRIP_TAC;
853   REWRITE_TAC[real_div];
854   GMATCH_SIMP_TAC REAL_LE_MUL;
855   CONJ_TAC;
856     BY(REAL_ARITH_TAC);
857   REWRITE_TAC[REAL_LE_INV_EQ];
858   REWRITE_TAC[ REAL_OF_NUM_LE];
859   BY(ARITH_TAC)
860   ]);;
861   (* }}} *)
862
863 let GAMMAX_NO_BETA = prove_by_refinement(
864   `!V ul X e k.  packing V /\ saturated V /\ barV V 3 ul /\ X = mcell k V ul /\ 
865     ~NULLSET X /\
866     k < 4 /\ e IN critical_edgeX V X /\
867     gammaX V X lmfun >= &0 ==> gammaX V X lmfun * critical_weight V X + beta_bump_v1 V e X >= &0`,
868   (* {{{ proof *)
869   [
870   REPEAT WEAKER_STRIP_TAC;
871   INTRO_TAC Bump.MCELL_BUMP_0 [`V`;`ul`;`e`;`k`];
872   ANTS_TAC;
873     BY(ASM_MESON_TAC[]);
874   ASM_REWRITE_TAC[];
875   DISCH_THEN SUBST1_TAC;
876   FIRST_X_ASSUM MP_TAC;
877   ASM_REWRITE_TAC[arith `x + &0 = x /\ (x >= &0 <=> &0 <= x)`];
878   DISCH_TAC;
879   GMATCH_SIMP_TAC REAL_LE_MUL;
880   BY(ASM_REWRITE_TAC[CRITICAL_WEIGHT_POS_LE])
881   ]);;
882   (* }}} *)
883
884 (* LEAF RESULTS *)
885
886 let REUHADY = prove_by_refinement(
887   `!V u0 u1 v1 v2.
888     saturated V /\ packing V /\ leaf V [u0;u1;v1] /\ leaf V [u0;u1;v2] /\ 
889     ~(v1 =v2)  ==>
890    sum {X | mcell_set V X /\ {u0,u1} IN edgeX V X /\ X SUBSET wedge_ge u0 u1 v1 v2}
891              (\t. dihX V t (u0,u1)) = azim u0 u1 v1 v2`,
892   (* {{{ proof *)
893   [
894   REPEAT WEAK_STRIP_TAC;
895   MATCH_MP_TAC Reuhady.REUHADY1;
896   GEXISTL_TAC [`[u0;u1;v1]`;`[u0;u1;v2]`];
897   TYPIFY `EL 2 [u0;u1;v1] = v1 /\ EL 2 [u0;u1;v2] = v2` (C SUBGOAL_THEN (unlist REWRITE_TAC));
898     BY(REWRITE_TAC[Bump.EL_EXPLICIT]);
899   TYPIFY `(hl [u0;u1;v1] < sqrt2 /\ hl [u0;u1;v2] < sqrt2 /\ [u0;u1;v1] IN barV V 2 /\ [u0;u1;v2] IN barV V 2) /\ hl [u0;u1] < sqrt(&2)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
900     SUBCONJ_TAC;
901       BY(ASM_MESON_TAC[Leaf_cell.leaf;IN]);
902     REPEAT WEAK_STRIP_TAC;
903     INTRO_TAC Rogers.XNHPWAB4 [`V`;`[u0;u1;v1]`;`2`];
904     ASM_REWRITE_TAC[GSYM Sphere.sqrt2];
905     DISCH_THEN (C INTRO_TAC [`1`;`2`]);
906     REWRITE_TAC[arith `1 < 2 /\ 2 <= 2`;Marchal_cells.TRUNCATE_SIMPLEX_EXPLICIT_2;Marchal_cells.TRUNCATE_SIMPLEX_EXPLICIT_1];
907     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
908   ASM_REWRITE_TAC[];
909   TYPIFY `set_of_list (truncate_simplex 1 [u0; u1; v1]) = {u0, u1} /\  set_of_list (truncate_simplex 1 [u0; u1; v2]) = {u0, u1}` (C SUBGOAL_THEN (unlist REWRITE_TAC));
910     REWRITE_TAC[Marchal_cells.TRUNCATE_SIMPLEX_EXPLICIT_2;Marchal_cells.TRUNCATE_SIMPLEX_EXPLICIT_1];
911     BY(REWRITE_TAC[Bump.set_of_list2_explicit]);
912   TYPIFY `~([u0; u1; v1] = [u0; u1; v2])` (C SUBGOAL_THEN (unlist REWRITE_TAC));
913     BY(ASM_REWRITE_TAC[CONS_11]);
914   TYPIFY `~collinear {u0,u1,v1} /\ ~collinear {u0,u1,v2}` (C SUBGOAL_THEN ASSUME_TAC);
915     REWRITE_TAC[GSYM Bump.set_of_list3_explicit];
916     BY(ASM_MESON_TAC[GBEWYFX]);
917   ASM_SIMP_TAC[Leaf_cell.WEDGE_GE_ALMOST_DISJOINT];
918   TYPIFY `~(u0 = u1)` (C SUBGOAL_THEN ASSUME_TAC);
919     BY(ASM_MESON_TAC[Collect_geom.NOT_COLLINEAR_IMP_2_UNEQUAL]);
920   TYPIFY `u0 IN V /\ u1 IN V` (C SUBGOAL_THEN (unlist ASM_REWRITE_TAC));
921     INTRO_TAC Packing3.BARV_SUBSET [`V`;`2`;`[u0;u1;v1]`];
922     ANTS_TAC;
923       BY(ASM_MESON_TAC[leaf;IN;Sphere.BARV]);
924     REWRITE_TAC[Bump.set_of_list3_explicit];
925     BY(SET_TAC[]);
926   SUBCONJ_TAC;
927     ASM_SIMP_TAC[Local_lemmas.AZIM_EQ_0_GE_ALT2];
928     DISCH_TAC;
929     INTRO_TAC Leaf_cell.FCHKUGT [`V`;`u0`;`u1`;`v1`;`v2`];
930     ANTS_TAC;
931       ASM_REWRITE_TAC[cc_A0;Bump.EL_EXPLICIT];
932       MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
933       ASM_REWRITE_TAC[];
934       FIRST_X_ASSUM MP_TAC;
935       GMATCH_SIMP_TAC Collect_geom.IN_AFF_GE_INTERPRET_TO_AFF_GT_AND_AFF;
936       CONJ_TAC;
937         BY(ASM_SIMP_TAC[Fan.th3a]);
938       REWRITE_TAC[Collect_geom.aff];
939       TYPIFY `v2 IN affine hull {u0,u1}` ASM_CASES_TAC;
940         FIRST_X_ASSUM (MP_TAC o (MATCH_MP AFFINE_HULL_3_IMP_COLLINEAR));
941         BY(ASM_MESON_TAC[]);
942       BY(ASM_MESON_TAC[]);
943     BY(ASM_REWRITE_TAC[]);
944   DISCH_TAC;
945   REPEAT WEAK_STRIP_TAC;
946   MATCH_MP_TAC Leaf_cell.EWYBJUA;
947   TYPIFY `V` EXISTS_TAC;
948   BY(ASM_REWRITE_TAC[])
949   ]);;
950   (* }}} *)
951
952 let s_leaf_leaf = prove_by_refinement(
953   `!V ul x. x IN s_leaf V ul ==> leaf V [EL 0 ul;EL 1 ul;x]`,
954   (* {{{ proof *)
955   [
956   BY(MESON_TAC[IN;s_leaf])
957   ]);;
958   (* }}} *)
959
960 let s_leaf_collinear = prove_by_refinement(
961   `!V ul x. packing V /\ saturated V /\ x IN s_leaf V ul ==> ~(collinear {EL 0 ul,EL 1 ul,x})`,
962   (* {{{ proof *)
963   [
964   REPEAT WEAK_STRIP_TAC;
965   FIRST_X_ASSUM (MP_TAC o (MATCH_MP s_leaf_leaf));
966   DISCH_TAC;
967   INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[EL 0 ul;EL 1 ul;x]`];
968   REWRITE_TAC[Bump.set_of_list3_explicit];
969   BY(ASM_REWRITE_TAC[])
970   ]);;
971   (* }}} *)
972
973 let LEAF_RANKING_LEMMA = prove_by_refinement(
974   `!V ul w0 n.  0 < n /\ packing V /\ saturated V /\ 
975     s_leaf V ul HAS_SIZE n /\
976   ~collinear {EL 0 ul,EL 1 ul,w0} ==>
977     (?f.  IMAGE f (:num) = s_leaf V ul /\
978        (!i. f (i + n) = f i) /\
979        (!i j. i < n /\ j < n /\ i < j ==> azim (EL 0 ul) (EL 1 ul) w0 (f i) < azim (EL 0 ul) (EL 1 ul) w0 (f j)))`,
980   (* {{{ proof *)
981   [
982   REPEAT WEAK_STRIP_TAC;
983   TYPED_ABBREV_TAC  `(s:real^3->bool) = s_leaf V ul` ;
984   TYPIFY `!x. x IN s ==> ~(collinear {EL 0 ul,EL 1 ul,x})` (C SUBGOAL_THEN ASSUME_TAC);
985     BY(ASM_MESON_TAC[s_leaf_collinear]);
986   INTRO_TAC STRICT_SORT_FINITE [`\v w.  (azim (EL 0 ul) (EL 1 ul) w0 v <= azim (EL 0 ul) (EL 1 ul) w0 w)`;`s`;`n` ];
987   BETA_TAC;
988   ANTS_TAC;
989     ASM_REWRITE_TAC[];
990     CONJ2_TAC;
991       BY(REAL_ARITH_TAC);
992     REPEAT WEAK_STRIP_TAC;
993     TYPIFY `azim (EL 0 ul) (EL 1 ul) w0 x = azim (EL 0 ul) (EL 1 ul) w0 y ==> (x = y)` ENOUGH_TO_SHOW_TAC;
994       REPEAT WEAK_STRIP_TAC;
995       FIRST_X_ASSUM MATCH_MP_TAC;
996       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
997     DISCH_TAC;
998     MATCH_MP_TAC Leaf_cell.FCHKUGT;
999     GEXISTL_TAC [`V`;`EL 0 ul`;`EL 1 ul`];
1000     REWRITE_TAC[Leaf_cell.cc_A0];
1001     REWRITE_TAC[Bump.EL_EXPLICIT];
1002     FIRST_ASSUM (C INTRO_TAC [`x`]);
1003     FIRST_X_ASSUM (C INTRO_TAC [`y`]);
1004     ASM_REWRITE_TAC[];
1005     REPEAT WEAK_STRIP_TAC;
1006     FIRST_X_ASSUM_ST `azim` MP_TAC;
1007     ASM_SIMP_TAC[AZIM_EQ_ALT];
1008     BY(ASM_MESON_TAC[Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;s_leaf_leaf]);
1009   REPEAT WEAK_STRIP_TAC;
1010   TYPIFY `\i. f (SUC (i MOD n))` EXISTS_TAC;
1011   BETA_TAC;
1012   CONJ2_TAC;
1013     CONJ_TAC;
1014       REPEAT WEAK_STRIP_TAC;
1015       INTRO_TAC MOD_MULT_ADD [`1`;`n`;`i`];
1016       REWRITE_TAC[arith `1 * n + i = i + n`];
1017       DISCH_THEN SUBST1_TAC;
1018       BY(REWRITE_TAC[]);
1019     REPEAT WEAK_STRIP_TAC;
1020     ASM_SIMP_TAC[MOD_LT];
1021     FIRST_X_ASSUM (C INTRO_TAC [`SUC i`;`SUC j`]);
1022     REWRITE_TAC[arith `~(a <= b) <=> (b <a)`];
1023     DISCH_THEN MATCH_MP_TAC;
1024     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC);
1025   ASM_REWRITE_TAC[];
1026   REWRITE_TAC[EXTENSION;IMAGE;IN_ELIM_THM;IN_UNIV];
1027   GEN_TAC;
1028   MATCH_MP_TAC (TAUT `((a==> b) /\ (b ==> a)) ==> (a = b)`);
1029   CONJ_TAC;
1030     REPEAT WEAK_STRIP_TAC;
1031     TYPIFY `SUC (x' MOD n)` EXISTS_TAC;
1032     ASM_REWRITE_TAC[IN_NUMSEG];
1033     REWRITE_TAC[arith `1 <= SUC x`];
1034     REWRITE_TAC[arith `SUC x <= n <=> x < n`];
1035     BY(ASM_MESON_TAC[DIVISION;arith `~(n=0) <=> (0 < n)`]);
1036   REPEAT WEAK_STRIP_TAC;
1037   ASM_REWRITE_TAC[];
1038   TYPIFY `PRE x'` EXISTS_TAC;
1039   AP_TERM_TAC;
1040   TYPIFY `PRE x' MOD n = PRE x'` (C SUBGOAL_THEN SUBST1_TAC);
1041     MATCH_MP_TAC MOD_LT;
1042     FIRST_X_ASSUM_ST `IN` MP_TAC;
1043     REWRITE_TAC[IN_NUMSEG];
1044     BY(ARITH_TAC);
1045   FIRST_X_ASSUM_ST `IN` MP_TAC;
1046   REWRITE_TAC[IN_NUMSEG];
1047   BY(ARITH_TAC)
1048   ]);;
1049   (* }}} *)
1050
1051
1052 let S_LEAF_SET = prove_by_refinement(
1053   `!V ul. s_leaf V ul = { u | leaf V [EL 0 ul; EL 1 ul; u] /\
1054      (cc_ke V [EL 0 ul; EL 1 ul; u] = 4 \/ cc_ke V [EL 1 ul; EL 0 ul; u] = 4)}`,
1055   (* {{{ proof *)
1056   [
1057   BY(REWRITE_TAC[EXTENSION;IN_ELIM_THM;s_leaf;IN])
1058   ]);;
1059   (* }}} *)
1060
1061 (* renamed from LEAF_RANK_COLLINEAR: *)
1062
1063 let LEAF_RANK_COLLINEAR = prove_by_refinement(
1064  `!V ul w0 n f k. packing V /\ saturated V /\ leaf_rank V ul w0 n f ==> ~collinear {EL 0 ul,EL 1 ul,f k}`,
1065   (* {{{ proof *)
1066   [
1067   REWRITE_TAC[leaf_rank;IMAGE;IN_UNIV;EXTENSION;IN_ELIM_THM];
1068   REPEAT WEAKER_STRIP_TAC;
1069   FIRST_X_ASSUM MP_TAC THEN REWRITE_TAC[];
1070   MATCH_MP_TAC s_leaf_collinear;
1071   BY(ASM_MESON_TAC[])
1072   ]);;
1073   (* }}} *)
1074
1075 let S_LEAF_SUBSET_PACKING = prove_by_refinement(
1076   `!V ul. packing V /\ saturated V ==> s_leaf V ul SUBSET V`,
1077   (* {{{ proof *)
1078   [
1079   REPEAT WEAK_STRIP_TAC;
1080   REWRITE_TAC[S_LEAF_SET;leaf;SUBSET;IN_ELIM_THM;IN];
1081   REPEAT WEAKER_STRIP_TAC;
1082   FIRST_X_ASSUM (MP_TAC o (MATCH_MP Packing3.BARV_SUBSET));
1083   REWRITE_TAC[set_of_list];
1084   BY(SET_TAC[])
1085   ]);;
1086   (* }}} *)
1087
1088 let S_LEAF_BOUNDED = prove_by_refinement(
1089   `!V ul. packing V /\ saturated V  ==> s_leaf V ul SUBSET (ball(EL 0 ul, &2 * sqrt(&2) ))`,
1090   (* {{{ proof *)
1091   [
1092   REPEAT WEAKER_STRIP_TAC;
1093   REWRITE_TAC[S_LEAF_SET;SUBSET;IN_ELIM_THM;ball;leaf;IN;Sphere.sqrt2];
1094   REPEAT WEAKER_STRIP_TAC;
1095   INTRO_TAC Rogers.HL_PROPERTIES [`V`;`[EL 0 ul;EL 1 ul;x]`;`2`];
1096   ASM_REWRITE_TAC[set_of_list;IN_INSERT];
1097   TYPED_ABBREV_TAC  `(d:real^3) = circumcenter {EL 0 ul, EL 1 ul, x}` ;
1098   REPEAT WEAKER_STRIP_TAC;
1099   PROOF_BY_CONTR_TAC;
1100   FIRST_ASSUM (C INTRO_TAC [`EL 0 ul`]);
1101   REWRITE_TAC[];
1102   ONCE_REWRITE_TAC[DIST_SYM];
1103   FIRST_X_ASSUM (C INTRO_TAC [`x`]);
1104   ASM_REWRITE_TAC[];
1105   REPEAT WEAKER_STRIP_TAC;
1106   INTRO_TAC DIST_TRIANGLE [`EL 0 ul`;`d`;`x`];
1107   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
1108   ]);;
1109   (* }}} *)
1110
1111 let S_LEAF_FINITE = prove_by_refinement(
1112   `!V ul. packing V /\ saturated V ==> FINITE (s_leaf V ul)`,
1113   (* {{{ proof *)
1114   [
1115   REPEAT WEAKER_STRIP_TAC;
1116   MATCH_MP_TAC FINITE_SUBSET;
1117   TYPIFY `V INTER ball(EL 0 ul, &2 * sqrt(&2))` EXISTS_TAC;
1118   CONJ_TAC;
1119     MATCH_MP_TAC Packing3.KIUMVTC;
1120     BY(ASM_REWRITE_TAC[]);
1121   REWRITE_TAC[SUBSET_INTER];
1122   BY(ASM_MESON_TAC[S_LEAF_SUBSET_PACKING;S_LEAF_BOUNDED])
1123   ]);;
1124   (* }}} *)
1125
1126 let S_LEAF_SYM = prove_by_refinement(
1127 `!V u0 u1.
1128          packing V /\
1129          saturated V ==>
1130       s_leaf V [u1;u0] = s_leaf V [u0;u1]`,
1131   (* {{{ proof *)
1132   [
1133   REPEAT WEAKER_STRIP_TAC;
1134   ASM_REWRITE_TAC[EXTENSION;s_leaf;IN;Bump.EL_EXPLICIT];
1135   BY(ASM_MESON_TAC[Leaf_cell.ZASUVOR])
1136   ]);;
1137   (* }}} *)
1138
1139 let S_LEAF_TRUNCATE = prove_by_refinement(
1140   `!V ul. s_leaf V ul = s_leaf V [EL 0 ul;EL 1 ul]`,
1141   (* {{{ proof *)
1142   [
1143   BY(REWRITE_TAC[EXTENSION;s_leaf;IN;Bump.EL_EXPLICIT])
1144   ]);;
1145   (* }}} *)
1146
1147 let MCELL_AVOID_LEAVES = prove_by_refinement(
1148   `!V ul X.  packing V /\ saturated V /\ ~NULLSET X /\ mcell_set V X ==>
1149     ?v. v IN X /\ (!u. u IN s_leaf V ul ==> ~(v IN aff_ge {EL 0 ul,EL 1 ul} {u}))`,
1150   (* {{{ proof *)
1151   [
1152   REPEAT WEAKER_STRIP_TAC;
1153   PROOF_BY_CONTR_TAC;
1154   TYPIFY `X SUBSET UNIONS (IMAGE (\u.  aff_ge {EL 0 ul, EL 1 ul} {u}) (s_leaf V ul))` (C SUBGOAL_THEN ASSUME_TAC);
1155     REWRITE_TAC[SUBSET;IN_UNIONS;IN_IMAGE];
1156     FIRST_X_ASSUM MP_TAC;
1157     BY(SET_TAC[]);
1158   FIRST_X_ASSUM_ST `NULLSET` MP_TAC;
1159   REWRITE_TAC[];
1160   MATCH_MP_TAC NEGLIGIBLE_SUBSET;
1161   TYPIFY `UNIONS (IMAGE (\u. aff_ge {EL 0 ul, EL 1 ul} {u}) (s_leaf V ul))` EXISTS_TAC;
1162   ASM_REWRITE_TAC[];
1163   MATCH_MP_TAC NEGLIGIBLE_UNIONS;
1164   CONJ_TAC;
1165     MATCH_MP_TAC FINITE_IMAGE;
1166     MATCH_MP_TAC S_LEAF_FINITE;
1167     BY(ASM_REWRITE_TAC[]);
1168   REWRITE_TAC[IN_IMAGE];
1169   REPEAT WEAKER_STRIP_TAC;
1170   ASM_REWRITE_TAC[];
1171   BY(REWRITE_TAC[NULLSET_AFF_2_1])
1172   ]);;
1173   (* }}} *)
1174
1175 let MCELL_WEDGE_UNIQUE = prove_by_refinement(
1176   `!V ul w0 n f X.
1177          packing V /\
1178          saturated V /\
1179          s_leaf V ul HAS_SIZE n /\
1180          ~collinear {EL 0 ul, EL 1 ul, w0} /\
1181        leaf_rank V ul w0 n f /\ mcell_set V X /\
1182     ~NULLSET X /\ 
1183     {EL 0 ul,EL 1 ul} IN edgeX V X ==>
1184     (!i j. i < n /\ j < n /\ X SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) /\
1185        X SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f j) (f (SUC j)) ==> (i = j))`,
1186   (* {{{ proof *)
1187   [
1188   REPEAT WEAKER_STRIP_TAC;
1189   TYPIFY `n <= 1` ASM_CASES_TAC;
1190     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1191   PROOF_BY_CONTR_TAC;
1192   TYPIFY `!k. ~collinear {EL 0 ul,EL 1 ul, f  k}` (C SUBGOAL_THEN ASSUME_TAC);
1193     BY(ASM_MESON_TAC[LEAF_RANK_COLLINEAR]);
1194   TYPIFY `wedge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) INTER wedge (EL 0 ul) (EL 1 ul) (f j) (f (SUC j)) = {}` ENOUGH_TO_SHOW_TAC;
1195     INTRO_TAC Leaf_cell.WEDGE_WEDGE_GE [`EL 0 ul`;`EL 1 ul`;`f i`;`f (SUC i)`];
1196     ANTS_TAC;
1197       BY(ASM_MESON_TAC[]);
1198     INTRO_TAC Leaf_cell.WEDGE_WEDGE_GE [`EL 0 ul`;`EL 1 ul`;`f j`;`f (SUC j)`];
1199     ANTS_TAC;
1200       BY(ASM_MESON_TAC[]);
1201     REPEAT WEAKER_STRIP_TAC;
1202     TYPIFY `X SUBSET aff_ge {EL 0 ul, EL 1 ul} {f i} UNION aff_ge {EL 0 ul, EL 1 ul} {f (SUC i)} UNION aff_ge {EL 0 ul,EL 1 ul} {f j} UNION aff_ge {EL 0 ul, EL 1 ul} { f (SUC j)}` (C SUBGOAL_THEN ASSUME_TAC);
1203       REPEAT (FIRST_X_ASSUM MP_TAC);
1204       BY(SET_TAC[]);
1205     BY(ASM_MESON_TAC[NEGLIGIBLE_UNION;NEGLIGIBLE_SUBSET;NULLSET_AFF_2_1]);
1206   INTRO_TAC Counting_spheres.WEDGE_ORDER_DISJOINT [`EL 0 ul`;`EL 1 ul`;`w0`;`n`;`f o PRE`];
1207   REWRITE_TAC[o_THM];
1208   ANTS_TAC;
1209     ASM_REWRITE_TAC[];
1210     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
1211     REWRITE_TAC[leaf_rank];
1212     REWRITE_TAC[arith `PRE (n+1) = n /\ PRE 1 = 0`];
1213     REPEAT WEAKER_STRIP_TAC;
1214     CONJ_TAC;
1215       BY(ASM_MESON_TAC[arith `0 + n = n`]);
1216     REWRITE_TAC[IN_NUMSEG];
1217     REPEAT WEAKER_STRIP_TAC;
1218     FIRST_X_ASSUM MATCH_MP_TAC;
1219     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1220   DISCH_THEN (C INTRO_TAC [`SUC i`;`SUC j`]);
1221   ASM_REWRITE_TAC[IN_NUMSEG;arith `1 <= SUC l`;arith `SUC i = SUC j <=> i = j`;arith `PRE (SUC i) = i`;arith `PRE(SUC i + 1) = SUC i`];
1222   DISCH_THEN MATCH_MP_TAC;
1223   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC)
1224   ]);;
1225   (* }}} *)
1226
1227 let LEAF_RANK_PERIODIC = prove_by_refinement(
1228   `!V ul w0 n f. leaf_rank V ul w0 n f ==> periodic f n`,
1229   (* {{{ proof *)
1230   [
1231     BY(MESON_TAC[leaf_rank;Oxl_def.periodic])
1232   ]);;
1233   (* }}} *)
1234
1235 let LEAF_RANK_AZIM_INJ = prove_by_refinement(
1236   `!V ul w0 n f i j. saturated V /\ packing V /\ ~(n=0) /\
1237     ~collinear {EL 0 ul, EL 1 ul, w0} /\ leaf_rank V ul w0 n f ==> (
1238     azim (EL 0 ul) (EL 1 ul) (f i) (f j) = &0 <=> ((i MOD n) = (j MOD n)))`,
1239   (* {{{ proof *)
1240   [
1241   REPEAT WEAKER_STRIP_TAC;
1242   TYPIFY `!j. f j IN s_leaf V ul` (C SUBGOAL_THEN ASSUME_TAC);
1243     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
1244     REWRITE_TAC[leaf_rank;EXTENSION;IN_IMAGE;IN_UNIV];
1245     BY(MESON_TAC[]);
1246   TYPIFY `!j. leaf V [EL 0 ul; EL 1 ul; f j]` (C SUBGOAL_THEN ASSUME_TAC);
1247     GEN_TAC;
1248     MATCH_MP_TAC s_leaf_leaf;
1249     BY(ASM_REWRITE_TAC[]);
1250   TYPIFY `!j. ~collinear {EL 0 ul, EL 1 ul, f j}` (C SUBGOAL_THEN ASSUME_TAC);
1251     GEN_TAC;
1252     INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[EL 0 ul;EL 1 ul; f j]`];
1253     BY(ASM_REWRITE_TAC[set_of_list]);
1254   INTRO_TAC AZIM_ZERO_SHIFT [`EL 0 ul`;`EL 1 ul`;`w0`];
1255   DISCH_THEN ((unlist ASM_SIMP_TAC) o GSYM);
1256   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
1257     MATCH_MP_TAC LEAF_RANK_PERIODIC;
1258     BY(ASM_MESON_TAC[]);
1259   TYPIFY `!k. f k = f (k MOD n)` (C SUBGOAL_THEN ASSUME_TAC);
1260     BY(ASM_MESON_TAC[Oxl_def.periodic_mod]);
1261   ONCE_REWRITE_TAC[Geomdetail.EQ_EXPAND];
1262   CONJ2_TAC;
1263     BY(ASM_MESON_TAC[]);
1264   DISCH_TAC;
1265   PROOF_BY_CONTR_TAC;
1266   FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
1267   REWRITE_TAC[leaf_rank];
1268   REPEAT WEAKER_STRIP_TAC;
1269   TYPIFY `!k. k MOD n < n` (C SUBGOAL_THEN ASSUME_TAC);
1270     BY(ASM_MESON_TAC[DIVISION]);
1271   TYPIFY `i MOD n < j MOD n` ASM_CASES_TAC;
1272     BY(ASM_MESON_TAC[arith `x < y ==> ~(x = y)`]);
1273   TYPIFY `j MOD n < i MOD n` (C SUBGOAL_THEN ASSUME_TAC);
1274     FIRST_X_ASSUM MP_TAC;
1275     REWRITE_TAC[arith `~((i:num) < j) <=> (j < i \/ (i = j))`];
1276     BY(ASM_REWRITE_TAC[]);
1277   FIRST_X_ASSUM (C INTRO_TAC [`j MOD n`;`i MOD n`]);
1278   ANTS_TAC;
1279     BY(ASM_MESON_TAC[]);
1280   BY(ASM_MESON_TAC[arith `x < y ==> ~(x = y)`])
1281   ]);;
1282   (* }}} *)
1283
1284 let LEAF_RANK_AZIM_NZ = prove_by_refinement(
1285   `!V ul w0 n f i. saturated V /\ packing V /\ leaf_rank V ul w0 n f /\ 1 < n
1286    /\ ~collinear {EL 0 ul, EL 1 ul,w0}  ==> ~(azim (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) = &0)`,
1287   (* {{{ proof *)
1288   [
1289   REPEAT WEAKER_STRIP_TAC;
1290   INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`ul`;`w0`;`n`;`f`;`i`;`SUC i`];
1291   ASM_REWRITE_TAC[];
1292   ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`];
1293   BY(ASM_MESON_TAC[arith `SUC i = i + 1`;arith `1 < n ==> ~(n = 0)`;arith `~(1 = 0)`;arith `1 < n ==> ~(n <= 1)`;MOD_PERIOD_BOUNDED_ALT])
1294   ]);;
1295   (* }}} *)
1296
1297 let MCELL_IN_WEDGE = prove_by_refinement(
1298   `!V ul w0 n f X.
1299            1 < n /\
1300          packing V /\
1301          saturated V /\
1302          s_leaf V ul HAS_SIZE n /\
1303          ~collinear {EL 0 ul, EL 1 ul, w0} /\
1304        leaf_rank V ul w0 n f /\ mcell_set V X /\
1305     ~NULLSET X /\ 
1306     {EL 0 ul,EL 1 ul} IN edgeX V X ==>
1307     ?i. i < n /\ X SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))`,
1308   (* {{{ proof *)
1309   [
1310   REPEAT WEAKER_STRIP_TAC;
1311   INTRO_TAC MCELL_AVOID_LEAVES [`V`;`ul`;`X`];
1312   ASM_REWRITE_TAC[];
1313   REPEAT WEAKER_STRIP_TAC;
1314   TYPIFY `!j. f j IN s_leaf V ul` (C SUBGOAL_THEN ASSUME_TAC);
1315     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
1316     REWRITE_TAC[leaf_rank;EXTENSION;IN_IMAGE;IN_UNIV];
1317     BY(MESON_TAC[]);
1318   TYPIFY `!j. leaf V [EL 0 ul; EL 1 ul; f j]` (C SUBGOAL_THEN ASSUME_TAC);
1319     GEN_TAC;
1320     MATCH_MP_TAC s_leaf_leaf;
1321     BY(ASM_REWRITE_TAC[]);
1322   TYPIFY `!j. ~collinear {EL 0 ul, EL 1 ul, f j}` (C SUBGOAL_THEN ASSUME_TAC);
1323     GEN_TAC;
1324     INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[EL 0 ul;EL 1 ul; f j]`];
1325     BY(ASM_REWRITE_TAC[set_of_list]);
1326   COMMENT "reduce to v in wedge";
1327   TYPIFY `?i. i < n /\ v IN wedge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))` ENOUGH_TO_SHOW_TAC;
1328     REPEAT WEAKER_STRIP_TAC;
1329     TYPIFY `i` EXISTS_TAC;
1330     ASM_REWRITE_TAC[];
1331     MATCH_MP_TAC Leaf_cell.BDXKHTW;
1332     TYPIFY `V` EXISTS_TAC;
1333     ASM_REWRITE_TAC[];
1334     CONJ_TAC;
1335       BY(ASM_MESON_TAC[IN]);
1336     CONJ2_TAC;
1337       REWRITE_TAC[IN_INTER];
1338       BY(ASM_MESON_TAC[]);
1339     MATCH_MP_TAC LEAF_RANK_AZIM_NZ;
1340     BY(ASM_MESON_TAC[]);
1341   COMMENT "try top piece";
1342   TYPIFY `v IN wedge (EL 0 ul) (EL 1 ul) (f (PRE n)) (f 0)` ASM_CASES_TAC;
1343     TYPIFY `PRE n` EXISTS_TAC;
1344     CONJ_TAC;
1345       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1346     TYPIFY `f (SUC (PRE n)) = f 0` ENOUGH_TO_SHOW_TAC;
1347       DISCH_THEN SUBST1_TAC;
1348       BY(ASM_REWRITE_TAC[]);
1349     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
1350     REWRITE_TAC[leaf_rank];
1351     REPEAT WEAKER_STRIP_TAC;
1352     FIRST_X_ASSUM kill;
1353     FIRST_X_ASSUM (C INTRO_TAC [`0`]);
1354     TYPIFY `SUC (PRE n) = n` (C SUBGOAL_THEN SUBST1_TAC);
1355       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1356     BY(REWRITE_TAC[arith `0 + n = n`]);
1357   INTRO_TAC Leaf_cell.WEDGE_COMPLEMENT [`EL 0 ul`;`EL 1 ul`;`f (PRE n)`;`f 0`];
1358   ANTS_TAC;
1359     GMATCH_SIMP_TAC LEAF_RANK_AZIM_INJ;
1360     TYPIFY `n` EXISTS_TAC;
1361     CONJ_TAC;
1362       BY(ASM_MESON_TAC[arith `1 < n ==> ~(n = 0)`]);
1363     ASM_SIMP_TAC[MOD_0;arith `1 < n ==> ~(n=0)`];
1364     TYPIFY `PRE n MOD n = PRE n` (C SUBGOAL_THEN SUBST1_TAC);
1365       MATCH_MP_TAC MOD_LT;
1366       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1367     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1368   REWRITE_TAC[EXTENSION;IN_UNIV;IN_DIFF];
1369   DISCH_THEN (C INTRO_TAC [`v`]);
1370   ASM_REWRITE_TAC[];
1371   REWRITE_TAC[Local_lemmas.WEDGE_GE_AZIM_LE];
1372   DISCH_TAC;
1373   TYPED_ABBREV_TAC  `(A:num->bool) = {i | i < n /\ azim (EL 0 ul) (EL 1 ul) (f 0) (f i) < azim (EL 0 ul) (EL 1 ul) (f 0) v  }` ;
1374   TYPIFY `0 IN A` (C SUBGOAL_THEN ASSUME_TAC);
1375     EXPAND_TAC "A";
1376     REWRITE_TAC[IN_ELIM_THM;AZIM_REFL];
1377     CONJ_TAC;
1378       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1379     PROOF_BY_CONTR_TAC;
1380     TYPIFY `azim (EL 0 ul) (EL 1 ul) (f 0) v = &0` (C SUBGOAL_THEN ASSUME_TAC);
1381       MATCH_MP_TAC (arith `~(&0 < x) /\ (&0 <= x) ==> (x = &0)`);
1382       BY(ASM_REWRITE_TAC[Local_lemmas.AZIM_RANGE]);
1383     BY(ASM_MESON_TAC[Local_lemmas.AZIM_EQ_0_GE_ALT2]);
1384   INTRO_TAC num_MAX [`A`];
1385   DISCH_THEN (MP_TAC o MATCH_MP (TAUT `(a <=> b) ==> (a ==> b)`));
1386   ANTS_TAC;
1387     CONJ_TAC;
1388       BY(ASM_MESON_TAC[IN]);
1389     TYPIFY `n` EXISTS_TAC;
1390     EXPAND_TAC "A";
1391     REWRITE_TAC[IN_ELIM_THM];
1392     BY(ARITH_TAC);
1393   REPEAT WEAKER_STRIP_TAC;
1394   TYPIFY `m` EXISTS_TAC;
1395   TYPIFY `m < n /\ azim (EL 0 ul) (EL 1 ul) (f 0) (f m) < azim (EL 0 ul) (EL 1 ul) (f 0) v` (C SUBGOAL_THEN ASSUME_TAC);
1396     FIRST_X_ASSUM kill;
1397     FIRST_X_ASSUM MP_TAC;
1398     EXPAND_TAC "A";
1399     BY(REWRITE_TAC[IN_ELIM_THM]);
1400   ASM_REWRITE_TAC[];
1401   REWRITE_TAC[Reuhady.WEDGE_SIMPLE;IN_ELIM_THM];
1402   COMMENT "v not collinear";
1403   TYPIFY `~(EL 0 ul= EL 1 ul)` (C SUBGOAL_THEN ASSUME_TAC);
1404     BY(ASM_MESON_TAC[Collect_geom.NOT_COLLINEAR_IMP_2_UNEQUAL]);
1405   TYPIFY `~collinear {EL 0 ul,EL 1 ul,v}` (C SUBGOAL_THEN ASSUME_TAC);
1406     ASM_SIMP_TAC[COLLINEAR_3_AFFINE_HULL];
1407     DISCH_TAC;
1408     FIRST_X_ASSUM_ST `aff_ge` (C INTRO_TAC [`f 0`]);
1409     ASM_SIMP_TAC[];
1410     TYPIFY `affine hull {EL 0 ul,EL 1 ul} SUBSET aff_ge {EL 0 ul,EL 1 ul} {f 0}` ENOUGH_TO_SHOW_TAC;
1411       FIRST_X_ASSUM MP_TAC;
1412       BY(SET_TAC[]);
1413     MATCH_MP_TAC AFFINE_HULL_SUBSET_AFF_GE;
1414     MATCH_MP_TAC Fan.th3a;
1415     BY(ASM_MESON_TAC[]);
1416   COMMENT "do azim shifts";
1417   CONJ_TAC;
1418     INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`f 0 `;`f m`;`f m`;`v`];
1419     ANTS_TAC;
1420       ASM_SIMP_TAC[];
1421       BY(ASM_SIMP_TAC[arith `x <= x`;arith `x < y ==> x <= y`]);
1422     REWRITE_TAC[AZIM_REFL];
1423     BY(REPLICATE_TAC 5 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
1424   COMMENT "second azim ineq";
1425   TYPIFY `SUC m < n` (C SUBGOAL_THEN ASSUME_TAC);
1426     TYPIFY `~(m= PRE n)` ENOUGH_TO_SHOW_TAC;
1427       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
1428     DISCH_TAC;
1429     REPEAT (FIRST_X_ASSUM_ST `azim` MP_TAC);
1430     ASM_REWRITE_TAC[];
1431     BY(REAL_ARITH_TAC);
1432   TYPIFY `~(SUC m IN A)` (C SUBGOAL_THEN MP_TAC);
1433     BY(ASM_MESON_TAC[IN;arith `~(SUC m <= m)`]);
1434   EXPAND_TAC "A";
1435   ASM_REWRITE_TAC[IN_ELIM_THM];
1436   REWRITE_TAC[arith `~(x < y) <=> y <= x`];
1437   DISCH_TAC;
1438   INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`f 0 `;`f m`;`v`;`f (SUC m)`];
1439   ANTS_TAC;
1440     ASM_SIMP_TAC[arith `x < y ==> x <= y`];
1441     INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0 `;`f 0`;`f m`;`f (SUC m)`];
1442     ANTS_TAC;
1443       ASM_SIMP_TAC[];
1444       FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
1445       REWRITE_TAC[leaf_rank];
1446       REPEAT WEAKER_STRIP_TAC;
1447       CONJ_TAC;
1448         TYPIFY `m = 0` ASM_CASES_TAC;
1449           ASM_REWRITE_TAC[];
1450           BY(REAL_ARITH_TAC);
1451         FIRST_X_ASSUM (C INTRO_TAC [`0`;`m`]);
1452         BY(ASM_MESON_TAC[arith `1 < n ==> 0 < n`;arith `~(m=0) ==> 0 < m`;arith `x < y ==> x <= y`]);
1453       FIRST_X_ASSUM (C INTRO_TAC [`0`;`SUC m`]);
1454       BY(ASM_MESON_TAC[arith `1 < n ==> 0 < n`;arith ` 0 < SUC m`;arith `x < y ==> x <= y`]);
1455     REPEAT WEAKER_STRIP_TAC;
1456     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
1457     REWRITE_TAC[leaf_rank];
1458     REPEAT WEAKER_STRIP_TAC;
1459     FIRST_X_ASSUM (C INTRO_TAC [`m`;`SUC m`]);
1460     ANTS_TAC;
1461       BY(ASM_REWRITE_TAC[arith `m < SUC m`]);
1462     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
1463   ONCE_REWRITE_TAC [arith `x < y <=> &0 < y - x`];
1464   DISCH_THEN (SUBST1_TAC o GSYM);
1465   MATCH_MP_TAC (arith `~(x = y) /\ (x <= y) ==> &0 < y - x`);
1466   ASM_REWRITE_TAC[];
1467   ASM_SIMP_TAC[AZIM_ZERO_SHIFT];
1468   ONCE_REWRITE_TAC[Local_lemmas.AZIM_EQ_0_SYM2];
1469   BY(ASM_SIMP_TAC[AZIM_EQ_0_GE_ALT])
1470   ]);;
1471   (* }}} *)
1472
1473 let LEAF_RANK_REUHADY = prove_by_refinement(
1474   `!V ul w0 n f i.
1475     1 < n /\
1476     packing V /\ saturated V /\       s_leaf V ul HAS_SIZE n /\ 
1477     ~collinear {EL 0 ul, EL 1 ul, w0 } /\
1478     leaf_rank V ul w0 n f ==>
1479     azim_mcell V f (EL 0 ul) (EL 1 ul) i = azim (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))`,
1480   (* {{{ proof *)
1481   [
1482   REPEAT WEAKER_STRIP_TAC;
1483   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
1484     MATCH_MP_TAC LEAF_RANK_PERIODIC;
1485     BY(ASM_MESON_TAC[]);
1486   TYPIFY `!k. f (k MOD n) = f k` (C SUBGOAL_THEN ASSUME_TAC);
1487     BY(ASM_MESON_TAC[Oxl_def.periodic_mod;arith `1 < n ==> ~(n=0)`]);
1488   REWRITE_TAC[azim_mcell];
1489   INTRO_TAC REUHADY [`V`;`EL 0 ul`;`EL 1 ul`;`f i`;`f (SUC i)`];
1490   DISCH_THEN MATCH_MP_TAC;
1491   TYPIFY `!j. f j IN s_leaf V ul` (C SUBGOAL_THEN ASSUME_TAC);
1492     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
1493     REWRITE_TAC[leaf_rank;EXTENSION;IN_IMAGE;IN_UNIV];
1494     BY(MESON_TAC[]);
1495   TYPIFY `!j. leaf V [EL 0 ul; EL 1 ul; f j]` (C SUBGOAL_THEN ASSUME_TAC);
1496     GEN_TAC;
1497     MATCH_MP_TAC s_leaf_leaf;
1498     BY(ASM_REWRITE_TAC[]);
1499   ASM_SIMP_TAC[];
1500   DISCH_TAC;
1501   INTRO_TAC LEAF_RANK_AZIM_NZ [`V`;`ul`;`w0`;`n`;`f`;`i`];
1502   ANTS_TAC;
1503     BY(ASM_REWRITE_TAC[]);
1504   ASM_REWRITE_TAC[];
1505   BY(REWRITE_TAC[AZIM_REFL])
1506   ]);;
1507   (* }}} *)
1508
1509 let LEAF_RANK_BIJ = prove_by_refinement(
1510   `!V ul w0 n f.
1511     1 < n /\
1512     packing V /\ saturated V /\       s_leaf V ul HAS_SIZE n /\ 
1513     EL 0 ul IN V /\ EL 1 ul IN V /\
1514     ~collinear {EL 0 ul, EL 1 ul, w0 } /\
1515     leaf_rank V ul w0 n f  ==> 
1516     BIJ SND  {i,X | i < n /\
1517         mcell_set V X /\
1518         {EL 0 ul, EL 1 ul} IN edgeX V X /\
1519         X SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))} {X | mcell_set V X /\
1520         {EL 0 ul, EL 1 ul} IN edgeX V X }
1521 `,
1522   (* {{{ proof *)
1523   [
1524   REPEAT WEAKER_STRIP_TAC;
1525   REWRITE_TAC[BIJ;INJ];
1526   SUBCONJ_TAC;
1527     SUBCONJ_TAC;
1528       REWRITE_TAC[IN_ELIM_THM];
1529       REPEAT WEAKER_STRIP_TAC;
1530       BY(ASM_REWRITE_TAC[SND]);
1531     DISCH_TAC;
1532     REWRITE_TAC[IN_ELIM_THM];
1533     REPEAT WEAKER_STRIP_TAC;
1534     FIRST_X_ASSUM MP_TAC;
1535     ASM_REWRITE_TAC[SND];
1536     REWRITE_TAC[PAIR_EQ];
1537     DISCH_TAC;
1538     INTRO_TAC MCELL_WEDGE_UNIQUE [`V`;`ul`;`w0`;`n`;`f`;`X`];
1539     ANTS_TAC;
1540       ASM_REWRITE_TAC[];
1541       DISCH_TAC;
1542       FIRST_X_ASSUM_ST `mcell_set` MP_TAC;
1543       REWRITE_TAC[Pack_defs.mcell_set;IN_ELIM_THM];
1544       REPEAT WEAKER_STRIP_TAC;
1545       BY(ASM_MESON_TAC[Bump.RIJRIED;NOT_IN_EMPTY;IN]);
1546     ASM_REWRITE_TAC[];
1547     DISCH_THEN MATCH_MP_TAC;
1548     BY(ASM_MESON_TAC[]);
1549   DISCH_TAC;
1550   REWRITE_TAC[SURJ];
1551   ASM_REWRITE_TAC[];
1552   REWRITE_TAC[IN_ELIM_THM];
1553   REPEAT WEAKER_STRIP_TAC;
1554   INTRO_TAC MCELL_IN_WEDGE [`V`;`ul`;`w0`;`n`;`f`;`x`];
1555   ANTS_TAC;
1556     ASM_REWRITE_TAC[];
1557     FIRST_X_ASSUM_ST `mcell_set` MP_TAC;
1558     REWRITE_TAC[Pack_defs.mcell_set;IN_ELIM_THM];
1559     REPEAT WEAKER_STRIP_TAC;
1560     BY(ASM_MESON_TAC[Bump.RIJRIED;NOT_IN_EMPTY;IN]);
1561   REPEAT WEAKER_STRIP_TAC;
1562   TYPIFY `(i,x)` EXISTS_TAC;
1563   BY(ASM_MESON_TAC[SND])
1564   ]);;
1565   (* }}} *)
1566
1567 let LEAF_RANK_GRUTOTI = prove_by_refinement(
1568   `!V ul w0 n f.
1569     1 < n /\
1570     packing V /\ saturated V /\       s_leaf V ul HAS_SIZE n /\ 
1571     EL 0 ul IN V /\ EL 1 ul IN V /\
1572     ~collinear {EL 0 ul, EL 1 ul, w0 } /\
1573     leaf_rank V ul w0 n f /\
1574   hl [EL 0 ul;EL 1 ul] < sqrt (&2) ==>
1575     sum {i | i < n } (azim_mcell V f (EL 0 ul) (EL 1 ul)) = &2 * pi`,
1576   (* {{{ proof *)
1577   [
1578   REPEAT WEAKER_STRIP_TAC;
1579   TYPIFY `azim_mcell V f (EL 0 ul) (EL 1 ul) = (\i. azim_mcell V f (EL 0 ul) (EL 1 ul) i)` (C SUBGOAL_THEN SUBST1_TAC);
1580     BY(REWRITE_TAC[FUN_EQ_THM]);
1581   INTRO_TAC LEAF_RANK_REUHADY [`V`;`ul`;`w0`;`n`;`f`];
1582   ASM_REWRITE_TAC[];
1583   DISCH_THEN (unlist REWRITE_TAC);
1584   REWRITE_TAC[arith `SUC i = i + 1`];
1585   MATCH_MP_TAC ORDER_AZIM_SUM2Pi0;
1586   TYPIFY `w0` EXISTS_TAC;
1587   ASM_REWRITE_TAC[];
1588   CONJ_TAC;
1589     BY(ASM_MESON_TAC[LEAF_RANK_COLLINEAR]);
1590   FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
1591   REWRITE_TAC[leaf_rank];
1592   BY(MESON_TAC[arith `0 + n = n`])
1593   ]);;
1594   (* }}} *)
1595
1596 (*
1597 let LEAF_RANK_GRUTOTI_DEPRECATED = prove_by_refinement(
1598   `!V ul w0 n f.
1599     1 < n /\
1600     packing V /\ saturated V /\       s_leaf V ul HAS_SIZE n /\ 
1601     EL 0 ul IN V /\ EL 1 ul IN V /\
1602     ~collinear {EL 0 ul, EL 1 ul, w0 } /\
1603     leaf_rank V ul w0 n f /\
1604   hl [EL 0 ul;EL 1 ul] < sqrt (&2) ==>
1605     sum {i | i < n } (azim_mcell V f (EL 0 ul) (EL 1 ul)) = &2 * pi
1606 `,
1607   (* {{{ proof *)
1608   [
1609   REPEAT WEAKER_STRIP_TAC;
1610   TYPIFY `azim_mcell V f (EL 0 ul) (EL 1 ul) = (\i. azim_mcell V f (EL 0 ul) (EL 1 ul) i)` (C SUBGOAL_THEN SUBST1_TAC);
1611     BY(REWRITE_TAC[FUN_EQ_THM]);
1612   REWRITE_TAC[azim_mcell];
1613   GMATCH_SIMP_TAC SUM_SUM_PRODUCT;
1614   CONJ_TAC;
1615     REWRITE_TAC[FINITE_NUMSEG_LT];
1616     REWRITE_TAC[IN_ELIM_THM];
1617     REPEAT WEAKER_STRIP_TAC;
1618     MATCH_MP_TAC FINITE_SUBSET;
1619     TYPIFY `{X | mcell_set V X /\edgeX V X  {EL 0 ul, EL 1 ul} }` EXISTS_TAC;
1620     CONJ2_TAC;
1621       BY(SET_TAC[IN]);
1622     MATCH_MP_TAC Marchal_cells_3.FINITE_EDGE_X2;
1623     BY(ASM_MESON_TAC[]);
1624   REWRITE_TAC[IN_ELIM_THM];
1625   INTRO_TAC LEAF_RANK_BIJ [`V`;`ul`;`w0`;`n`;`f`];
1626   ANTS_TAC;
1627     BY(ASM_MESON_TAC[]);
1628   TYPIFY` (\ ((i:num),j). dihX V j (EL 0 ul,EL 1 ul)) = (\X. dihX V X (EL 0 ul, EL 1 ul)) o SND` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1629     BY(REWRITE_TAC[FUN_EQ_THM;o_THM;Bump.BETA_ORDERED_PAIR_THM]);
1630   DISCH_TAC;
1631   GMATCH_SIMP_TAC Bump.BIJ_SUM;
1632   TYPIFY `{X | mcell_set V X /\ {EL 0 ul, EL 1 ul} IN edgeX V X}` EXISTS_TAC;
1633   ASM_REWRITE_TAC[];
1634   MATCH_MP_TAC Grutoti.GRUTOTI;
1635   ASM_REWRITE_TAC[];
1636   BY(ASM_MESON_TAC[Collect_geom.NOT_COLLINEAR_IMP_2_UNEQUAL])
1637   ]);;
1638   (* }}} *)
1639 *)
1640
1641 let LEAF_RANK_GG_SUM = prove_by_refinement(
1642   `!V ul w0 n f.
1643     1 < n /\
1644     packing V /\ saturated V /\       s_leaf V ul HAS_SIZE n /\ 
1645     EL 0 ul IN V /\ EL 1 ul IN V /\
1646     ~collinear {EL 0 ul, EL 1 ul, w0 } /\
1647     leaf_rank V ul w0 n f ==>
1648     sum {i | i < n } (gg_mcell V f (EL 0 ul) (EL 1 ul)) = 
1649       sum { X | mcell_set V X /\ {EL 0 ul, EL 1 ul} IN edgeX V X }
1650         (\X. gammaX V X lmfun * critical_weight V X + beta_bump_v1 V {EL 0 ul, EL 1 ul} X )`,
1651   (* {{{ proof *)
1652   [
1653   REPEAT WEAKER_STRIP_TAC;
1654   TYPIFY `gg_mcell V f (EL 0 ul) (EL 1 ul) = (\i. gg_mcell V f (EL 0 ul) (EL 1 ul) i)` (C SUBGOAL_THEN SUBST1_TAC);
1655     BY(REWRITE_TAC[FUN_EQ_THM]);
1656   REWRITE_TAC[gg_mcell];
1657   GMATCH_SIMP_TAC SUM_SUM_PRODUCT;
1658   CONJ_TAC;
1659     REWRITE_TAC[FINITE_NUMSEG_LT];
1660     REWRITE_TAC[IN_ELIM_THM];
1661     REPEAT WEAKER_STRIP_TAC;
1662     MATCH_MP_TAC FINITE_SUBSET;
1663     TYPIFY `{X | mcell_set V X /\edgeX V X  {EL 0 ul, EL 1 ul} }` EXISTS_TAC;
1664     CONJ2_TAC;
1665       BY(SET_TAC[IN]);
1666     MATCH_MP_TAC Marchal_cells_3.FINITE_EDGE_X2;
1667     BY(ASM_MESON_TAC[]);
1668   REWRITE_TAC[IN_ELIM_THM];
1669   INTRO_TAC LEAF_RANK_BIJ [`V`;`ul`;`w0`;`n`;`f`];
1670   ANTS_TAC;
1671     BY(ASM_MESON_TAC[]);
1672   TYPIFY` (\ ((i:num),j). gammaX V j lmfun * critical_weight V j + beta_bump_v1 V {EL 0 ul, EL 1 ul} j)  = (\X. gammaX V X lmfun * critical_weight V X + beta_bump_v1 V {EL 0 ul, EL 1 ul} X) o SND` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1673     BY(REWRITE_TAC[FUN_EQ_THM;o_THM;Bump.BETA_ORDERED_PAIR_THM]);
1674   DISCH_TAC;
1675   GMATCH_SIMP_TAC Bump.BIJ_SUM;
1676   TYPIFY `{X | mcell_set V X /\ {EL 0 ul, EL 1 ul} IN edgeX V X}` EXISTS_TAC;
1677   BY(ASM_REWRITE_TAC[])
1678   ]);;
1679   (* }}} *)
1680
1681 let MCELL2_DIHX_POS = prove_by_refinement(
1682   `!V X ul. saturated V /\ packing V /\ barV V 3 ul /\ X = mcell2 V ul /\ {EL 0 ul,EL 1 ul} IN edgeX V X ==>
1683     &0 < dihX V X (EL 0 ul,EL 1 ul)`,
1684   (* {{{ proof *)
1685   [
1686   REPEAT WEAKER_STRIP_TAC;
1687   TYPIFY `~NULLSET X` (C SUBGOAL_THEN ASSUME_TAC);
1688     DISCH_TAC;
1689     INTRO_TAC Bump.RIJRIED [`V`;`ul`;`2`];
1690     ANTS_TAC;
1691       BY(ASM_MESON_TAC[Bump.MCELL2]);
1692     REWRITE_TAC[EXTENSION;NOT_IN_EMPTY];
1693     BY(ASM_MESON_TAC[Bump.MCELL2]);
1694   ASM_SIMP_TAC[Tskajxy.MCELL2_DIHX];
1695   MATCH_MP_TAC (arith `~(x = &0) /\ (&0 <= x) ==> &0 < x`);
1696   REWRITE_TAC[Upfzbzm_support_lemmas.DIHV_LE_0];
1697   MATCH_MP_TAC DIHV_EQ_0_PI_EQ_COPLANAR_ALT;
1698   INTRO_TAC Leaf_cell.MCELL2_SUBSET_AFF_GE [`V`;`ul`];
1699   ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR];
1700   REPEAT WEAKER_STRIP_TAC;
1701   TYPIFY `mcell2 V ul SUBSET affine hull {EL 0 ul, EL 1 ul, mxi V ul, omega_list_n V ul 3}` (C SUBGOAL_THEN ASSUME_TAC);
1702     MATCH_MP_TAC SUBSET_TRANS;
1703     TYPIFY `aff_ge {HD ul, HD (TL ul)} {mxi V ul, omega_list_n V ul 3}` EXISTS_TAC;
1704     ASM_REWRITE_TAC[];
1705     TYPIFY `!a b c (d:real^3). {a,b,c,d} = {a,b} UNION {c,d}` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1706       BY(SET_TAC[]);
1707     BY(REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL;EL;arith `1 = SUC 0`]);
1708   FIRST_X_ASSUM_ST `NULLSET` MP_TAC;
1709   REWRITE_TAC[];
1710   MATCH_MP_TAC NEGLIGIBLE_SUBSET;
1711   BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE])
1712   ]);;
1713   (* }}} *)
1714
1715 let MCELL3_CONVEX_HULL = prove_by_refinement(
1716   `!V ul.  packing V /\
1717          saturated V /\
1718      ul IN barV V 3 /\
1719       ~NULLSET (mcell3 V ul) ==> 
1720       mcell3 V ul = convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`,
1721   (* {{{ proof *)
1722   [
1723   REPEAT WEAKER_STRIP_TAC;
1724   INTRO_TAC Pack_defs.mcell3 [`V`;`ul`];
1725   COND_CASES_TAC;
1726     DISCH_THEN SUBST1_TAC;
1727     AP_TERM_TAC;
1728     TYPIFY `set_of_list(truncate_simplex 2 ul) = {EL 0 ul,EL 1 ul,EL 2 ul}` (C SUBGOAL_THEN SUBST1_TAC);
1729       MATCH_MP_TAC Bump.SET_OF_LIST_TRUNCATE_2;
1730       BY(ASM_MESON_TAC[IN;Sphere.BARV;arith `3 <= 3 + 1`]);
1731     BY(SET_TAC[]);
1732   BY(ASM_MESON_TAC[NEGLIGIBLE_EMPTY])
1733   ]);;
1734   (* }}} *)
1735
1736 let MCELL3_EXTREME_CARD = prove_by_refinement(
1737   `!V ul.    packing V /\
1738          saturated V /\
1739      ul IN barV V 3 /\
1740       ~NULLSET (mcell3 V ul) ==>
1741 CARD {EL 0 ul, EL 1 ul, EL 2 ul,mxi V ul} = 4`,
1742   (* {{{ proof *)
1743   [
1744   REPEAT WEAK_STRIP_TAC;
1745   MATCH_MP_TAC Collect_geom2.NOT_COPLANAR_IMP_CARD4;
1746   GMATCH_SIMP_TAC (GSYM coplanar_eq_coplanar_alt);
1747   REWRITE_TAC[DIMINDEX_3;arith `2 <= 3`];
1748   ONCE_REWRITE_TAC[GSYM COPLANAR_CONVEX_HULL_COPLANAR];
1749   TYPIFY `convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = mcell3 V ul` ENOUGH_TO_SHOW_TAC;
1750     DISCH_THEN SUBST1_TAC;
1751     BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE]);
1752   BY(ASM_MESON_TAC[MCELL3_CONVEX_HULL])
1753   ]);;
1754   (* }}} *)
1755
1756 let MCELL3_DIHX = prove_by_refinement(
1757 `!V X ul.
1758          saturated V /\
1759          packing V /\
1760          barV V 3 ul /\
1761          X = mcell3 V ul /\
1762     {EL 0 ul,EL 1 ul} IN edgeX V X /\
1763          ~NULLSET X
1764          ==> dihX V X (EL 0 ul,EL 1 ul) =
1765              dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul)`,
1766   (* {{{ proof *)
1767   [
1768   REPEAT WEAKER_STRIP_TAC;
1769   ASM_REWRITE_TAC[Pack_defs.dihX;LET_DEF;LET_END_DEF;Bump.BETA_ORDERED_PAIR_THM];
1770   INTRO_TAC Leaf_cell.MCELL_EDGE_FIRST [`V`;`ul`;`3`;`EL 0 ul`;`EL 1 ul`];
1771   ANTS_TAC;
1772     BY(ASM_MESON_TAC[IN;Bump.MCELL3]);
1773   REPEAT WEAKER_STRIP_TAC;
1774   INTRO_TAC Tskajxy.INITIAL_SUBLIST_2 [`vl`];
1775   ANTS_TAC;
1776     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
1777     BY(ASM_MESON_TAC[IN]);
1778   DISCH_TAC;
1779   INTRO_TAC Tskajxy.MCELL_PARAM_D_UL [`V`;`vl`;`[EL 0 ul;EL 1 ul]`;`SND (cell_params_d V X [EL 0 ul;EL 1 ul])`;`X`;`3`];
1780   ANTS_TAC;
1781     BY(ASM_MESON_TAC[IN;arith `3 <= 4`;Bump.MCELL3]);
1782   REPEAT WEAKER_STRIP_TAC;
1783   INTRO_TAC Tskajxy.MCELL_CELL_PARAMETERS_D_EXIST [`V`;`vl`;`[EL 0 ul;EL 1 ul]`;`3`;`X`];
1784   ANTS_TAC;
1785     BY(ASM_MESON_TAC[IN;arith `3 <= 4`;Bump.MCELL3]);
1786   ASM_REWRITE_TAC[];
1787   DISCH_THEN SUBST1_TAC;
1788   REWRITE_TAC[arith `~(3 = 2)`;Pack_defs.dihu3];
1789   REPEAT (FIRST_X_ASSUM_ST `SND` MP_TAC);
1790   ASM_REWRITE_TAC[];
1791   TYPED_ABBREV_TAC  `(wl:(real^3)list) = (SND (cell_params_d V (mcell3 V ul) [EL 0 vl; EL 1 vl]))` ;
1792   FIRST_X_ASSUM kill;
1793   REPEAT WEAKER_STRIP_TAC;
1794   COMMENT "match wl with vl";
1795   TYPIFY `EL 0 wl = EL 0 vl /\ EL 1 wl = EL 1 vl` (C SUBGOAL_THEN ASSUME_TAC);
1796     INTRO_TAC Bump.LENGTH4 [`wl`];
1797     ANTS_TAC;
1798       REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
1799       BY(ASM_MESON_TAC[IN]);
1800     DISCH_TAC;
1801     PROOF_BY_CONTR_TAC;
1802     FIRST_X_ASSUM_ST `initial_sublist` MP_TAC;
1803     FIRST_X_ASSUM_ST `CONS` SUBST1_TAC;
1804     REWRITE_TAC[initial_sublist_cons];
1805     BY(ASM_MESON_TAC[]);
1806   COMMENT "mcell3 as convex hull";
1807   INTRO_TAC MCELL3_CONVEX_HULL [`V`;`vl`];
1808   INTRO_TAC MCELL3_CONVEX_HULL [`V`;`wl`];
1809   ASM_REWRITE_TAC[];
1810   ANTS_TAC;
1811     BY(ASM_MESON_TAC[Bump.MCELL3]);
1812   DISCH_TAC;
1813   ANTS_TAC;
1814     BY(ASM_MESON_TAC[Bump.MCELL3]);
1815   DISCH_TAC;
1816   TYPIFY `convex hull {EL 0 vl, EL 1 vl, EL 2 wl, mxi V wl} = convex hull {EL 0 vl, EL 1 vl, EL 2 vl, mxi V vl}` (C SUBGOAL_THEN MP_TAC);
1817     BY(ASM_MESON_TAC[Bump.MCELL3]);
1818   GMATCH_SIMP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ;
1819   REWRITE_TAC[AFFINE_INDEPENDENT_IFF_CARD;FINITE_INSERT;FINITE_EMPTY];
1820   TYPIFY `CARD {EL 0 vl,EL 1 vl,EL 2 vl,mxi V vl}  = 4 /\ CARD {EL 0 vl,EL 1 vl,EL 2 wl,mxi V wl}  = 4 ` (C SUBGOAL_THEN ASSUME_TAC);
1821     BY(ASM_MESON_TAC[MCELL3_EXTREME_CARD;Bump.MCELL3]);
1822   REPEAT WEAKER_STRIP_TAC;
1823   TYPIFY `aff_dim {EL 0 vl, EL 1 vl, EL 2 wl, mxi V wl} = &3 /\ aff_dim {EL 0 vl, EL 1 vl, EL 2 vl, mxi V vl} = &3` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1824     REPEAT (GMATCH_SIMP_TAC NOT_COPLANAR_AFF_3);
1825     ONCE_REWRITE_TAC[GSYM COPLANAR_CONVEX_HULL_COPLANAR];
1826     BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE;Bump.MCELL3]);
1827   CONJ_TAC;
1828     BY(ASM_MESON_TAC[INT_ARITH `&3 = &4 - int_of_num 1`]);
1829   REPEAT WEAKER_STRIP_TAC;
1830   INTRO_TAC Leaf_cell.LENGTH4_SET2 [`EL 0 vl`;`EL 1 vl`;`EL 2 vl`;`mxi V vl`;`EL 2 wl`;`mxi V wl`];
1831   ANTS_TAC;
1832     REWRITE_TAC[set_of_list];
1833     BY(ASM_MESON_TAC[]);
1834   INTRO_TAC MCELL3_CONVEX_HULL [`V`;`ul`];
1835   ANTS_TAC;
1836     BY(ASM_MESON_TAC[Bump.MCELL3;IN]);
1837   DISCH_TAC;
1838   TYPIFY `convex hull {EL 0 vl, EL 1 vl, EL 2 wl, mxi V wl} = convex hull {EL 0 vl, EL 1 vl, EL 2 ul, mxi V ul}` (C SUBGOAL_THEN MP_TAC);
1839     BY(ASM_MESON_TAC[Bump.MCELL3]);
1840   GMATCH_SIMP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ;
1841   REWRITE_TAC[AFFINE_INDEPENDENT_IFF_CARD;FINITE_INSERT;FINITE_EMPTY];
1842   TYPIFY `CARD {EL 0 vl,EL 1 vl,EL 2 ul,mxi V ul}  = 4` (C SUBGOAL_THEN ASSUME_TAC);
1843     BY(ASM_MESON_TAC[IN;MCELL3_EXTREME_CARD;Bump.MCELL3]);
1844   REPEAT WEAKER_STRIP_TAC;
1845   TYPIFY `aff_dim {EL 0 vl, EL 1 vl, EL 2 wl, mxi V wl} = &3 /\ aff_dim {EL 0 vl, EL 1 vl, EL 2 ul, mxi V ul} = &3` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1846     REPEAT (GMATCH_SIMP_TAC NOT_COPLANAR_AFF_3);
1847     ONCE_REWRITE_TAC[GSYM COPLANAR_CONVEX_HULL_COPLANAR];
1848     BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE;Bump.MCELL3]);
1849   CONJ_TAC;
1850     BY(ASM_MESON_TAC[INT_ARITH `&3 = &4 - int_of_num 1`]);
1851   REPEAT WEAKER_STRIP_TAC;
1852   INTRO_TAC Leaf_cell.LENGTH4_SET2 [`EL 0 vl`;`EL 1 vl`;`EL 2 ul`;`mxi V ul`;`EL 2 wl`;`mxi V wl`];
1853   ANTS_TAC;
1854     REWRITE_TAC[set_of_list];
1855     BY(ASM_MESON_TAC[]);
1856   STRIP_TAC;
1857     BY(ASM_MESON_TAC[]);
1858   ASM_REWRITE_TAC[];
1859   BY(MESON_TAC[Trigonometry2.DIHV_SYM])
1860   ]);;
1861   (* }}} *)
1862
1863 let MCELL3_DIHX_POS = prove_by_refinement(
1864   `!V X ul. saturated V /\ packing V /\ barV V 3 ul /\ X = mcell3 V ul /\ {EL 0 ul,EL 1 ul} IN edgeX V X ==>
1865     &0 < dihX V X (EL 0 ul,EL 1 ul)`,
1866   (* {{{ proof *)
1867   [
1868   REPEAT WEAKER_STRIP_TAC;
1869   TYPIFY `~NULLSET X` (C SUBGOAL_THEN ASSUME_TAC);
1870     DISCH_TAC;
1871     INTRO_TAC Bump.RIJRIED [`V`;`ul`;`3`];
1872     ANTS_TAC;
1873       BY(ASM_MESON_TAC[Bump.MCELL3]);
1874     REWRITE_TAC[EXTENSION;NOT_IN_EMPTY];
1875     BY(ASM_MESON_TAC[Bump.MCELL3]);
1876   ASM_SIMP_TAC[MCELL3_DIHX];
1877   MATCH_MP_TAC (arith `~(x = &0) /\ (&0 <= x) ==> &0 < x`);
1878   REWRITE_TAC[Upfzbzm_support_lemmas.DIHV_LE_0];
1879   MATCH_MP_TAC DIHV_EQ_0_PI_EQ_COPLANAR_ALT;
1880   ONCE_REWRITE_TAC[GSYM COPLANAR_CONVEX_HULL_COPLANAR];
1881   GMATCH_SIMP_TAC (GSYM MCELL3_CONVEX_HULL);
1882   CONJ_TAC;
1883     BY(ASM_MESON_TAC[IN]);
1884   BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE])
1885   ]);;
1886   (* }}} *)
1887
1888 let MCELL3_DOMAIN = prove_by_refinement(
1889   `!V ul.          saturated V /\
1890          packing V /\
1891          barV V 3 ul /\
1892     ~(NULLSET (mcell3 V ul)) ==> 
1893  ~collinear {EL 0 ul,EL 1 ul,EL 2 ul} /\
1894  &2 <= dist (EL 1 ul,EL 2 ul) /\
1895  &2 <= dist (EL 0 ul,EL 2 ul) /\
1896  &2 <= dist (EL 0 ul,EL 1 ul) /\
1897  dist (EL 1 ul,EL 2 ul) < &2 * sqrt (&2) /\
1898  dist (EL 0 ul,EL 2 ul) < &2 * sqrt (&2) /\
1899  dist (EL 0 ul,EL 1 ul) < &2 * sqrt (&2) /\
1900  eta_y (dist (EL 0 ul,EL 1 ul)) (dist (EL 0 ul,EL 2 ul))
1901  (dist (EL 1 ul,EL 2 ul)) <
1902  sqrt (&2)`,
1903   (* {{{ proof *)
1904   [
1905   REPEAT WEAKER_STRIP_TAC;
1906   GMATCH_SIMP_TAC (GSYM RADV_ETAY);
1907   TYPIFY `hl (truncate_simplex 2 ul) < sqrt(&2)` (C SUBGOAL_THEN ASSUME_TAC);
1908     FIRST_X_ASSUM_ST `mcell3` MP_TAC;
1909     REWRITE_TAC[Pack_defs.mcell3];
1910     COND_CASES_TAC;
1911       BY(ASM_REWRITE_TAC[]);
1912     BY(ASM_MESON_TAC[NEGLIGIBLE_EMPTY]);
1913   COMMENT "deal with radV";
1914   TYPIFY `truncate_simplex 2 ul = [EL 0 ul;EL 1 ul;EL 2 ul]` (C SUBGOAL_THEN ASSUME_TAC);
1915     BY(ASM_MESON_TAC[Leaf_cell.BARV3_TRUNC2;IN]);
1916   TYPIFY `radV {EL 0 ul, EL 1 ul, EL 2 ul} < sqrt (&2)` (C SUBGOAL_THEN ASSUME_TAC);
1917     BY(FIRST_X_ASSUM_ST `hl` MP_TAC THEN ASM_REWRITE_TAC[Pack_defs.HL;set_of_list]);
1918   TYPIFY `~collinear {EL 0 ul,EL 1 ul,EL 2 ul}` (C SUBGOAL_THEN ASSUME_TAC);
1919     MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR;
1920     TYPIFY `mxi V ul` EXISTS_TAC;
1921     ONCE_REWRITE_TAC[GSYM COPLANAR_CONVEX_HULL_COPLANAR];
1922     GMATCH_SIMP_TAC (GSYM MCELL3_CONVEX_HULL);
1923     BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE;IN]);
1924   ASM_REWRITE_TAC[];
1925   TYPIFY `~affine_dependent {EL 0 ul,EL 1 ul,EL 2 ul}` (C SUBGOAL_THEN ASSUME_TAC);
1926     BY(ASM_MESON_TAC[AFFINE_DEPENDENT_IMP_COLLINEAR_3]);
1927   TYPIFY `!x y. {x,y} SUBSET {EL 0 ul,EL 1 ul,EL 2 ul} ==> dist(x,y) < &2 * sqrt(&2)` (C SUBGOAL_THEN ASSUME_TAC);
1928     REPEAT WEAKER_STRIP_TAC;
1929     REWRITE_TAC[arith `x < &2 * y <=> inv(&2) * x < y`];
1930     REWRITE_TAC[GSYM RADV2];
1931     MATCH_MP_TAC REAL_LET_TRANS;
1932     TYPIFY `radV {EL 0 ul, EL 1 ul, EL 2 ul}` EXISTS_TAC;
1933     ASM_REWRITE_TAC[];
1934     MATCH_MP_TAC Rogers.RADV_MONO;
1935     ASM_REWRITE_TAC[EXTENSION;IN_INSERT;NOT_IN_EMPTY];
1936     BY(MESON_TAC[]);
1937   INTRO_TAC Packing3.BARV_SUBSET [`V`;`3`;`ul`];
1938   ASM_REWRITE_TAC[];
1939   DISCH_TAC;
1940   TYPIFY `set_of_list ul = {EL 0 ul,EL 1 ul,EL 2 ul,EL 3 ul}` (C SUBGOAL_THEN ASSUME_TAC);
1941     MATCH_MP_TAC Bump.set_of_list4;
1942     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
1943     BY(ASM_MESON_TAC[]);
1944   TYPIFY `~(EL 0 ul = EL 1 ul) /\ ~(EL 1 ul = EL 2 ul) /\ ~(EL 0 ul = EL 2 ul)` (C SUBGOAL_THEN ASSUME_TAC);
1945     TYPIFY `{EL 0 ul,EL 1 ul, EL 2 ul} = {EL 1 ul,EL 2 ul,EL 0 ul}` (C SUBGOAL_THEN ASSUME_TAC);
1946       BY(SET_TAC[]);
1947     BY(ASM_MESON_TAC[Collect_geom.NOT_COLLINEAR_IMP_2_UNEQUAL]);
1948   TYPIFY `&2 <= dist (EL 1 ul,EL 2 ul) /\  &2 <= dist (EL 0 ul,EL 2 ul) /\ &2 <= dist (EL 0 ul,EL 1 ul)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
1949     FIRST_X_ASSUM_ST `packing` MP_TAC;
1950     REWRITE_TAC[Sphere.packing];
1951     FIRST_X_ASSUM_ST `SUBSET` MP_TAC;
1952     ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY];
1953     REWRITE_TAC[IN];
1954     BY(ASM_MESON_TAC[]);
1955   BY(REPEAT (CONJ_TAC THEN (TRY (FIRST_X_ASSUM MATCH_MP_TAC))) THEN SET_TAC[])
1956   ]);;
1957   (* }}} *)
1958
1959 let TSKAJXY_3 = Prove_by_refinement.prove_by_refinement(
1960  `!V X ul. pack_nonlinear_non_ox3q1h /\
1961          saturated V /\
1962          packing V /\
1963          barV V 3 ul /\
1964          X = mcell3 V ul /\
1965     ~(NULLSET X) 
1966          ==> gammaX V X lmfun >= &0`,
1967   (* {{{ proof *)
1968   [
1969   REPEAT WEAKER_STRIP_TAC;
1970   INTRO_TAC Tskajxy_lemmas.gammaX_gamma3f [`V`;`X`;`ul`;`EL 0 ul`;`EL 1 ul`;`EL 2 ul`;`EL 3 ul`;`dist(EL 1 ul,EL 2 ul)`;`dist(EL 0 ul,EL 2 ul)`;`dist(EL 0 ul,EL 1 ul)`];
1971   ANTS_TAC;
1972     ASM_REWRITE_TAC[];
1973     CONJ_TAC;
1974       BY(REWRITE_TAC[Bump.MCELL3]);
1975     MATCH_MP_TAC Bump.LENGTH4;
1976     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
1977     BY(ASM_MESON_TAC[]);
1978   DISCH_THEN (unlist REWRITE_TAC);
1979   INTRO_TAC Merge_ineq.cell3_from_ineq_thm_ALT [];
1980   ASM_REWRITE_TAC[arith `x >= &0 <=> &0 <= x`];
1981   DISCH_THEN MATCH_MP_TAC;
1982   TYPIFY `eta_y (dist (EL 1 ul,EL 2 ul)) (dist (EL 0 ul,EL 2 ul))  (dist (EL 0 ul,EL 1 ul)) = eta_y  (dist (EL 0 ul,EL 1 ul)) (dist (EL 0 ul,EL 2 ul))  (dist (EL 1 ul,EL 2 ul))` (C SUBGOAL_THEN SUBST1_TAC);
1983     BY(MESON_TAC[Collect_geom.ETA_Y_SYYM]);
1984   INTRO_TAC MCELL3_DOMAIN [`V`;`ul`];
1985   ANTS_TAC;
1986     BY(ASM_MESON_TAC[]);
1987   REPEAT WEAKER_STRIP_TAC;
1988   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
1989   ]);;
1990   (* }}} *)
1991
1992 let MCELL4_LEAF2 = prove_by_refinement(
1993   `!V ul. packing V /\ saturated V /\ barV V 3 ul /\ ~NULLSET (mcell4 V ul) ==>
1994     leaf V [EL 0 ul;EL 1 ul;EL 2 ul]`,
1995   (* {{{ proof *)
1996   [
1997   REWRITE_TAC[Leaf_cell.leaf;Pack_defs.mcell4];
1998   REPEAT GEN_TAC;
1999   COND_CASES_TAC;
2000     REPEAT WEAKER_STRIP_TAC;
2001     INTRO_TAC Packing3.TRUNCATE_SIMPLEX_BARV [`V`;`2`;`3`;`ul`];
2002     INTRO_TAC Rogers.HL_DECREASE [`V`;`ul`;`3`;`2`];
2003     ASM_REWRITE_TAC[arith `2 <= 3`;IN];
2004     INTRO_TAC Leaf_cell.BARV3_TRUNC2 [`V`;`ul`];
2005     ANTS_TAC;
2006       BY(ASM_MESON_TAC[IN]);
2007     DISCH_THEN SUBST1_TAC;
2008     REPEAT WEAKER_STRIP_TAC;
2009     ASM_REWRITE_TAC[];
2010     BY(ASM_MESON_TAC[arith `h < s /\ h' <= h ==> h' < s`;Sphere.sqrt2]);
2011   BY(MESON_TAC[NEGLIGIBLE_EMPTY])
2012   ]);;
2013   (* }}} *)
2014
2015 let MCELL4_CONVEX_HULL = prove_by_refinement(
2016   `!V ul. packing V /\ saturated V /\ barV V 3 ul /\ ~NULLSET (mcell4 V ul) ==>
2017     mcell4 V ul = convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul}`,
2018   (* {{{ proof *)
2019   [
2020   REWRITE_TAC[Pack_defs.mcell4];
2021   REPEAT GEN_TAC;
2022   COND_CASES_TAC;
2023     BY(MESON_TAC[BARV3_SET_OF_LIST4]);
2024   BY(REWRITE_TAC[NEGLIGIBLE_EMPTY])
2025   ]);;
2026   (* }}} *)
2027
2028 let MCELL4_CARD4 = prove_by_refinement(
2029   `!V ul. packing V /\ saturated V /\ barV V 3 ul /\ ~NULLSET (mcell4 V ul) ==>
2030     CARD ({EL 0 ul,EL 1 ul, EL 2 ul, EL 3 ul}) = 4`,
2031   (* {{{ proof *)
2032   [
2033   REPEAT WEAKER_STRIP_TAC;
2034   MATCH_MP_TAC Collect_geom2.NOT_COPLANAR_IMP_CARD4;
2035   GMATCH_SIMP_TAC (GSYM coplanar_eq_coplanar_alt);
2036   REWRITE_TAC[DIMINDEX_3;arith `2 <= 3`];
2037   ONCE_REWRITE_TAC[GSYM COPLANAR_CONVEX_HULL_COPLANAR];
2038   TYPIFY `convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = mcell4 V ul` ENOUGH_TO_SHOW_TAC;
2039     DISCH_THEN SUBST1_TAC;
2040     BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE]);
2041   BY(ASM_MESON_TAC[MCELL4_CONVEX_HULL])
2042   ]);;
2043   (* }}} *)
2044
2045 let MCELL4_LEAF3 = prove_by_refinement(
2046  `!V ul. packing V /\ saturated V /\ barV V 3 ul /\ ~NULLSET (mcell4 V ul) ==>
2047     leaf V [EL 0 ul;EL 1 ul;EL 3 ul]`,
2048   (* {{{ proof *)
2049   [
2050   REPEAT WEAKER_STRIP_TAC;
2051   INTRO_TAC Marchal_cells_3.LEFT_ACTION_LIST_3_EXISTS [`EL 0 ul`;`EL 1 ul`;`EL 2 ul`;`EL 3 ul`;`EL 0 ul`;`EL 1 ul`;`EL 3 ul`;`EL 2 ul`];
2052   ANTS_TAC;
2053     CONJ_TAC;
2054       MATCH_MP_TAC MCELL4_CARD4;
2055       BY(ASM_MESON_TAC[]);
2056     BY(SET_TAC[]);
2057   REPEAT WEAKER_STRIP_TAC;
2058   INTRO_TAC Rvfxzbu.RVFXZBU [`V`;`ul`;`4`;`p`];
2059   ASM_REWRITE_TAC[arith `4 - 1 = 3`];
2060   ANTS_TAC;
2061     BY(SET_TAC[]);
2062   INTRO_TAC Rogers.YIFVQDV_1 [`V`;`ul`;`3`;`p`];
2063   ASM_REWRITE_TAC[];
2064   ANTS_TAC;
2065     CONJ_TAC;
2066       BY(ASM_MESON_TAC[IN]);
2067     PROOF_BY_CONTR_TAC;
2068     FIRST_X_ASSUM_ST `NULLSET` MP_TAC;
2069     BY(ASM_REWRITE_TAC[Pack_defs.mcell4;NEGLIGIBLE_EMPTY]);
2070   REPEAT WEAKER_STRIP_TAC;
2071   INTRO_TAC Bump.LENGTH4 [`ul`];
2072   ANTS_TAC;
2073     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
2074     BY(ASM_MESON_TAC[]);
2075   DISCH_TAC;
2076   PROOF_BY_CONTR_TAC;
2077   FIRST_X_ASSUM_ST `left_action_list p (CONS x y)` MP_TAC;
2078   FIRST_X_ASSUM (SUBST1_TAC o GSYM);
2079   TYPED_ABBREV_TAC  `(wl:(real^3) list) = left_action_list p ul` ;
2080   FIRST_X_ASSUM kill;
2081   DISCH_TAC;
2082   INTRO_TAC MCELL4_LEAF2 [`V`;`wl`];
2083   ANTS_TAC;
2084     ASM_REWRITE_TAC[];
2085     BY(ASM_MESON_TAC[IN;Bump.MCELL4]);
2086   EXPAND_TAC "wl";
2087   BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT])
2088   ]);;
2089   (* }}} *)
2090
2091 let MCELL4_LEAF_S_LEAF = prove_by_refinement(
2092   `!V ul u. packing V /\ saturated V /\ barV V 3 ul /\ ~NULLSET (mcell4 V ul)  /\
2093     leaf V [EL 0 ul;EL 1 ul;u] /\ (u IN {EL 2 ul, EL 3 ul} ) ==> s_leaf V [EL 0 ul;EL 1 ul] u`,
2094   (* {{{ proof *)
2095   [
2096   REWRITE_TAC[s_leaf;Bump.EL_EXPLICIT;IN_INSERT;NOT_IN_EMPTY];
2097   REPEAT WEAKER_STRIP_TAC;
2098   ASM_REWRITE_TAC[];
2099   INTRO_TAC Leaf_cell.CFFONNL [`V`;`[EL 0 ul;EL 1 ul;u]`;`mcell4 V ul`];
2100   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
2101   REWRITE_TAC[TAUT `(a /\ b /\ c /\ ~d ==> e) <=> (a /\ b /\ c ==> (d \/ e))`];
2102   ANTS_TAC;
2103     CONJ_TAC;
2104       REWRITE_TAC[IN_ELIM_THM;Pack_defs.mcell_set];
2105       BY(ASM_MESON_TAC[IN;Bump.MCELL4]);
2106     CONJ_TAC;
2107       GMATCH_SIMP_TAC Bump.MCELL4_EDGE;
2108       ASM_REWRITE_TAC[];
2109       CONJ_TAC;
2110         MATCH_MP_TAC Marchal_cells_2_new.CARD4_IMP_DISTINCT;
2111         BY(ASM_MESON_TAC[MCELL4_CARD4]);
2112       GMATCH_SIMP_TAC BARV3_SET_OF_LIST4;
2113       CONJ_TAC;
2114         BY(ASM_MESON_TAC[]);
2115       BY(SET_TAC[]);
2116     REWRITE_TAC[EXTENSION;NOT_IN_EMPTY;IN_INTER;Leaf_cell.cc_A0;NOT_FORALL_THM;Bump.EL_EXPLICIT];
2117     TYPIFY `u` EXISTS_TAC;
2118     CONJ_TAC;
2119       GMATCH_SIMP_TAC MCELL4_CONVEX_HULL;
2120       ASM_REWRITE_TAC[];
2121       MATCH_MP_TAC Marchal_cells_2_new.IN_SET_IMP_IN_CONVEX_HULL_SET;
2122       BY(ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY]);
2123     MATCH_MP_TAC Local_lemmas.DISJOINT_IMP_Z_IN_AFF_GT;
2124     REWRITE_TAC[DISJOINT;EXTENSION;IN_SING;NOT_IN_EMPTY;IN_INTER;IN_INSERT];
2125     INTRO_TAC MCELL4_CARD4 [`V`;`ul`];
2126     ASM_REWRITE_TAC[];
2127     DISCH_THEN (MP_TAC o (MATCH_MP Leaf_cell.CARD4_ALL_DISTINCT));
2128     BY(ASM_MESON_TAC[]);
2129   REWRITE_TAC[Bump.MCELL4;Leaf_cell.cc_cell];
2130   STRIP_TAC;
2131     INTRO_TAC Ajripqn.AJRIPQN [`V`;`ul`;`cc_uh V [EL 0 ul;EL 1 ul;u]`;`4`;`cc_ke V [EL 0 ul; EL 1 ul; u]`];
2132     ANTS_TAC;
2133       ASM_REWRITE_TAC[];
2134       CONJ_TAC;
2135         BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
2136       CONJ_TAC;
2137         BY(SET_TAC[]);
2138       REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
2139       CONJ_TAC;
2140         BY(MESON_TAC[Leaf_cell.CC_KE_34]);
2141       REWRITE_TAC[INTER_IDEMPOT];
2142       BY(ASM_MESON_TAC[Bump.MCELL4]);
2143     BY(DISCH_THEN (unlist REWRITE_TAC));
2144   COMMENT "second case";
2145   INTRO_TAC Ajripqn.AJRIPQN [`V`;`ul`;`cc_uh V [EL 1 ul;EL 0 ul;u]`;`4`;`cc_ke V [EL 1 ul; EL 0 ul; u]`];
2146   ANTS_TAC;
2147     ASM_REWRITE_TAC[];
2148     CONJ_TAC;
2149       ONCE_REWRITE_TAC[GSYM IN];
2150       GMATCH_SIMP_TAC Leaf_cell.cc_uh;
2151       ASM_REWRITE_TAC[];
2152       BY(ASM_MESON_TAC[Leaf_cell.ZASUVOR]);
2153     CONJ_TAC;
2154       BY(SET_TAC[]);
2155     REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
2156     CONJ_TAC;
2157       BY(MESON_TAC[Leaf_cell.CC_KE_34]);
2158     REWRITE_TAC[INTER_IDEMPOT];
2159     BY(ASM_MESON_TAC[Bump.MCELL4]);
2160   BY(DISCH_THEN (unlist REWRITE_TAC))
2161   ]);;
2162   (* }}} *)
2163
2164 let S_LEAF_CARD2 = prove_by_refinement(
2165   `!V ul. packing V /\ saturated V /\ barV V 3 ul /\ ~NULLSET (mcell4 V ul) ==>
2166     2 <= CARD(s_leaf V [EL 0 ul;EL 1 ul])`,
2167   (* {{{ proof *)
2168   [
2169   REPEAT WEAKER_STRIP_TAC;
2170   TYPIFY `2 = CARD {EL 2 ul, EL 3 ul}` ((C SUBGOAL_THEN SUBST1_TAC) );
2171     MATCH_MP_TAC EQ_SYM;
2172     MATCH_MP_TAC Hypermap.CARD_TWO_ELEMENTS;
2173     INTRO_TAC MCELL4_CARD4 [`V`;`ul`];
2174     ASM_REWRITE_TAC[];
2175     TYPIFY `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {EL 2 ul, EL 3 ul, EL 0 ul, EL 1 ul}` (C SUBGOAL_THEN SUBST1_TAC);
2176       BY(SET_TAC[]);
2177     BY(MESON_TAC[Marchal_cells_2_new.CARD4_IMP_DISTINCT]);
2178   MATCH_MP_TAC CARD_SUBSET;
2179   ASM_SIMP_TAC[S_LEAF_FINITE];
2180   REWRITE_TAC[SUBSET];
2181   REPEAT WEAKER_STRIP_TAC;
2182   ONCE_REWRITE_TAC[IN];
2183   INTRO_TAC MCELL4_LEAF_S_LEAF [`V`;`ul`;`x`];
2184   DISCH_THEN MATCH_MP_TAC;
2185   ASM_REWRITE_TAC[];
2186   FIRST_X_ASSUM MP_TAC;
2187   REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
2188   BY(ASM_MESON_TAC[MCELL4_LEAF2;MCELL4_LEAF3])
2189   ]);;
2190   (* }}} *)
2191
2192 let LEAF_RANK_ONTO = prove_by_refinement(
2193   `!V ul w0 n f u. 
2194     packing V /\ saturated V /\ barV V 3 ul /\
2195     leaf_rank V [EL 0 ul;EL 1 ul] w0 n f /\ ~(n=0) /\ ~NULLSET(mcell4 V ul) /\
2196     (u IN {EL 2 ul,EL 3 ul}) ==>
2197     (?i. i < n /\ (u = f i))`,
2198   (* {{{ proof *)
2199   [
2200   REPEAT WEAKER_STRIP_TAC;
2201   INTRO_TAC LEAF_RANK_PERIODIC [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`];
2202   ASM_REWRITE_TAC[];
2203   DISCH_TAC;
2204   FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2205   REWRITE_TAC[leaf_rank;IMAGE;IN_UNIV;EXTENSION;IN_ELIM_THM;Bump.EL_EXPLICIT];
2206   INTRO_TAC MCELL4_LEAF_S_LEAF [`V`;`ul`;`u`];
2207   ANTS_TAC;
2208     ASM_REWRITE_TAC[];
2209     FIRST_X_ASSUM_ST `IN` MP_TAC;
2210     REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
2211     BY(ASM_MESON_TAC[MCELL4_LEAF2;MCELL4_LEAF3]);
2212   REPEAT WEAKER_STRIP_TAC;
2213   TYPIFY `?j. u =  f j` (C SUBGOAL_THEN MP_TAC);
2214     BY(ASM_MESON_TAC[IN]);
2215   REPEAT WEAKER_STRIP_TAC;
2216   TYPIFY `j MOD n` EXISTS_TAC;
2217   CONJ_TAC;
2218     BY(ASM_MESON_TAC[DIVISION]);
2219   BY(ASM_MESON_TAC[Oxl_def.periodic_mod])
2220   ]);;
2221   (* }}} *)
2222
2223 let S_LEAF_IN_WEDGE_GE = prove_by_refinement(
2224  `!V ul u w0 n f j i'.
2225     packing V /\ saturated V /\ leaf_rank V [EL 0 ul;EL 1 ul] w0 n f /\ leaf V [EL 0 ul;EL 1 ul;u] /\ 
2226     ~collinear {EL 0 ul,EL 1 ul,w0} /\
2227     (1<n) /\ 
2228     (u = f i') /\ (i' < n) /\
2229       u IN wedge_ge (EL 0 ul) (EL 1 ul) (f j) (f (SUC j)) ==> (u = f j \/ u = f (SUC j))`,
2230   (* {{{ proof *)
2231   [
2232   REPEAT WEAKER_STRIP_TAC;
2233   TYPIFY `?i. (i < n) /\ f j = f i /\ f (SUC j) = f (SUC i)` (C SUBGOAL_THEN MP_TAC);
2234     TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
2235       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2236     TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
2237       BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
2238     TYPIFY `j MOD n` EXISTS_TAC;
2239     BY(ASM_SIMP_TAC[F_DEMOD;DIVISION]);
2240   DISCH_THEN (fun t -> REPEAT (FIRST_X_ASSUM MP_TAC) THEN MP_TAC t);
2241   STRIP_TAC;
2242   ASM_REWRITE_TAC[];
2243   REPLICATE_TAC 2 (FIRST_X_ASSUM kill);
2244   REPEAT WEAKER_STRIP_TAC;
2245   COMMENT "restart";
2246   MATCH_MP_TAC (TAUT ` (~a /\ ~b ==> F) ==> a \/ b`);
2247   REPEAT WEAKER_STRIP_TAC;
2248   INTRO_TAC LEAF_RANK_COLLINEAR [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`];
2249   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
2250   DISCH_TAC;
2251   COMMENT "deal with i=n-1";
2252   TYPIFY `i = n - 1` ASM_CASES_TAC;
2253     FIRST_X_ASSUM_ST `wedge_ge` MP_TAC;
2254     REWRITE_TAC[];
2255     GMATCH_SIMP_TAC (GSYM Leaf_cell.WEDGE_COMPLEMENT);
2256     REWRITE_TAC[IN_DIFF;IN_UNIV];
2257     CONJ_TAC;
2258       ONCE_REWRITE_TAC[arith `(x:real) = y <=> y = x`];
2259       DISCH_TAC;
2260       FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2261       REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
2262       REPEAT WEAKER_STRIP_TAC;
2263       FIRST_X_ASSUM (C INTRO_TAC [`0`;`i`]);
2264       ANTS_TAC;
2265         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2266       DISCH_TAC;
2267       INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`w0`;`f 0`;`f i`];
2268       ANTS_TAC;
2269         BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
2270       FIRST_X_ASSUM_ST `SUC` MP_TAC;
2271       ASM_SIMP_TAC[arith `1 < n ==> SUC (n - 1) = n`];
2272       TYPIFY `f n = f 0` (C SUBGOAL_THEN SUBST1_TAC);
2273         BY(ASM_MESON_TAC[arith `0 + n = n`]);
2274       FIRST_X_ASSUM MP_TAC;
2275       ASM_REWRITE_TAC[];
2276       BY(REAL_ARITH_TAC);
2277     ASM_SIMP_TAC[arith `1 < n ==> SUC (n - 1) = n`];
2278     TYPIFY `f n = f 0` (C SUBGOAL_THEN SUBST1_TAC);
2279       BY(ASM_MESON_TAC[arith `0 + n = n`;leaf_rank]);
2280     REWRITE_TAC[Reuhady.WEDGE_SIMPLE;IN_ELIM_THM];
2281     TYPIFY `i' = 0 \/ (0 < i' /\ i' < (n-1)) \/ (i' = (n-1))` (C SUBGOAL_THEN ASSUME_TAC);
2282       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2283     FIRST_X_ASSUM DISJ_CASES_TAC;
2284       FIRST_X_ASSUM_ST `SUC` MP_TAC;
2285       ASM_REWRITE_TAC[];
2286       ASM_SIMP_TAC[arith `1 < n ==> SUC (n - 1) = n`];
2287       TYPIFY `f n = f 0` (C SUBGOAL_THEN SUBST1_TAC);
2288         BY(ASM_MESON_TAC[arith `0 + n = n`;leaf_rank]);
2289       BY(REWRITE_TAC[]);
2290     FIRST_X_ASSUM DISJ_CASES_TAC;
2291       FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2292       REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
2293       REPEAT WEAKER_STRIP_TAC;
2294       FIRST_ASSUM (C INTRO_TAC [`0`;`i'`]);
2295       ANTS_TAC;
2296         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2297       FIRST_X_ASSUM (C INTRO_TAC [`i'`;`n-1`]);
2298       ANTS_TAC;
2299         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2300       REPEAT WEAKER_STRIP_TAC;
2301       INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f 0`;`f 0`;`f i'`];
2302       ANTS_TAC;
2303         BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`;arith `x <= x`]);
2304       INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f 0`;`f i'`;`f (n-1)`];
2305       ANTS_TAC;
2306         ASM_SIMP_TAC [arith `x < y ==> x <= y`];
2307         BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2308       REWRITE_TAC[AZIM_REFL];
2309       BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2310     BY(ASM_MESON_TAC[]);
2311   COMMENT "done with i = n-1";
2312   COMMENT "deal with wedge_ge";
2313   FIRST_X_ASSUM_ST `wedge_ge` MP_TAC;
2314   REWRITE_TAC[Local_lemmas.WEDGE_GE_AZIM_LE];
2315   DISCH_TAC;
2316   FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2317   REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
2318   REPEAT WEAKER_STRIP_TAC;
2319   MP_TAC (arith `i' = i \/  i' = SUC i \/ SUC i < i' \/ i' < i `);
2320   DISCH_THEN DISJ_CASES_TAC;
2321     BY(ASM_MESON_TAC[]);
2322   FIRST_X_ASSUM DISJ_CASES_TAC;
2323     BY(ASM_MESON_TAC[]);
2324   FIRST_X_ASSUM DISJ_CASES_TAC;
2325     INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f i`;`f (SUC i)`;`f i'`];
2326     ANTS_TAC;
2327       ASM_SIMP_TAC[];
2328       CONJ_TAC;
2329         FIRST_X_ASSUM (C INTRO_TAC [`i`;`SUC i`]);
2330         ANTS_TAC;
2331           BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2332         BY(REAL_ARITH_TAC);
2333       FIRST_X_ASSUM (C INTRO_TAC [`i`;`i'`]);
2334       ANTS_TAC;
2335         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2336       BY(REAL_ARITH_TAC);
2337     FIRST_X_ASSUM (C INTRO_TAC [`SUC i`;`i'`]);
2338     ANTS_TAC;
2339       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2340     FIRST_X_ASSUM_ST `azim` MP_TAC;
2341     ASM_REWRITE_TAC[];
2342     BY(REAL_ARITH_TAC);
2343   COMMENT "last wedge case";
2344   INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`f i`;`f i'`;`f (SUC i)`];
2345   ANTS_TAC;
2346     ASM_SIMP_TAC[];
2347     BY(ASM_MESON_TAC[]);
2348   DISCH_TAC;
2349   INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`f i'`;`f i`;`f (SUC i)`];
2350   ANTS_TAC;
2351     ASM_SIMP_TAC[];
2352     INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f i'`;`f i`;`f (SUC i)`];
2353     ANTS_TAC;
2354       ASM_SIMP_TAC[];
2355       CONJ_TAC;
2356         FIRST_X_ASSUM (C INTRO_TAC [`i'`;`i`]);
2357         ANTS_TAC;
2358           BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2359         BY(REAL_ARITH_TAC);
2360       FIRST_X_ASSUM (C INTRO_TAC [`i'`;`SUC i`]);
2361       ANTS_TAC;
2362         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2363       BY(REAL_ARITH_TAC);
2364     FIRST_X_ASSUM (C INTRO_TAC [`i`;`SUC i`]);
2365     ANTS_TAC;
2366       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2367     BY(REAL_ARITH_TAC);
2368   DISCH_TAC;
2369   TYPIFY `azim (EL 0 ul) (EL 1 ul) (f i) (f i') = -- azim (EL 0 ul) (EL 1 ul) (f i') (f i)` (C SUBGOAL_THEN MP_TAC);
2370     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2371   REWRITE_TAC[arith `x = -- y <=> y + x = &0`];
2372   GMATCH_SIMP_TAC Leaf_cell.AZIM_POS_IMP_SUM_2PI_ALT;
2373   CONJ2_TAC;
2374     MATCH_MP_TAC (arith `&0 < x ==> ~(x = &0)`);
2375     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
2376     REWRITE_TAC[PI_POS];
2377     BY(REAL_ARITH_TAC);
2378   FIRST_X_ASSUM (C INTRO_TAC [`i'`;`i`]);
2379   ANTS_TAC;
2380     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2381   DISCH_TAC;
2382   INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`w0`;`f i'`;`f i`];
2383   ANTS_TAC;
2384     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
2385   BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC)
2386   ]);;
2387   (* }}} *)
2388
2389 (*
2390 let S_LEAF_IN_WEDGE_GE = prove_by_refinement(
2391  `!V ul u w0 n f i i'.
2392     packing V /\ saturated V /\ leaf_rank V [EL 0 ul;EL 1 ul] w0 n f /\ leaf V [EL 0 ul;EL 1 ul;u] /\ 
2393     ~collinear {EL 0 ul,EL 1 ul,w0} /\
2394     (1<n) /\ 
2395     (u = f i') /\ (i' < n) /\
2396     (i < n) /\ 
2397       u IN wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==> (u = f i \/ u = f (SUC i))`,
2398   (* {{{ proof *)
2399   [
2400   REPEAT WEAKER_STRIP_TAC;
2401   MATCH_MP_TAC (TAUT ` (~a /\ ~b ==> F) ==> a \/ b`);
2402   REPEAT WEAKER_STRIP_TAC;
2403   INTRO_TAC LEAF_RANK_COLLINEAR [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`];
2404   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
2405   DISCH_TAC;
2406   COMMENT "deal with i=n-1";
2407   TYPIFY `i = n - 1` ASM_CASES_TAC;
2408     FIRST_X_ASSUM_ST `wedge_ge` MP_TAC;
2409     REWRITE_TAC[];
2410     GMATCH_SIMP_TAC (GSYM Leaf_cell.WEDGE_COMPLEMENT);
2411     REWRITE_TAC[IN_DIFF;IN_UNIV];
2412     CONJ_TAC;
2413       ONCE_REWRITE_TAC[arith `(x:real) = y <=> y = x`];
2414       DISCH_TAC;
2415       FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2416       REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
2417       REPEAT WEAKER_STRIP_TAC;
2418       FIRST_X_ASSUM (C INTRO_TAC [`0`;`i`]);
2419       ANTS_TAC;
2420         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2421       DISCH_TAC;
2422       INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`w0`;`f 0`;`f i`];
2423       ANTS_TAC;
2424         BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
2425       FIRST_X_ASSUM_ST `SUC` MP_TAC;
2426       ASM_SIMP_TAC[arith `1 < n ==> SUC (n - 1) = n`];
2427       TYPIFY `f n = f 0` (C SUBGOAL_THEN SUBST1_TAC);
2428         BY(ASM_MESON_TAC[arith `0 + n = n`]);
2429       FIRST_X_ASSUM MP_TAC;
2430       ASM_REWRITE_TAC[];
2431       BY(REAL_ARITH_TAC);
2432     ASM_SIMP_TAC[arith `1 < n ==> SUC (n - 1) = n`];
2433     TYPIFY `f n = f 0` (C SUBGOAL_THEN SUBST1_TAC);
2434       BY(ASM_MESON_TAC[arith `0 + n = n`;leaf_rank]);
2435     REWRITE_TAC[Reuhady.WEDGE_SIMPLE;IN_ELIM_THM];
2436     TYPIFY `i' = 0 \/ (0 < i' /\ i' < (n-1)) \/ (i' = (n-1))` (C SUBGOAL_THEN ASSUME_TAC);
2437       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2438     FIRST_X_ASSUM DISJ_CASES_TAC;
2439       FIRST_X_ASSUM_ST `SUC` MP_TAC;
2440       ASM_REWRITE_TAC[];
2441       ASM_SIMP_TAC[arith `1 < n ==> SUC (n - 1) = n`];
2442       TYPIFY `f n = f 0` (C SUBGOAL_THEN SUBST1_TAC);
2443         BY(ASM_MESON_TAC[arith `0 + n = n`;leaf_rank]);
2444       BY(REWRITE_TAC[]);
2445     FIRST_X_ASSUM DISJ_CASES_TAC;
2446       FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2447       REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
2448       REPEAT WEAKER_STRIP_TAC;
2449       FIRST_ASSUM (C INTRO_TAC [`0`;`i'`]);
2450       ANTS_TAC;
2451         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2452       FIRST_X_ASSUM (C INTRO_TAC [`i'`;`n-1`]);
2453       ANTS_TAC;
2454         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2455       REPEAT WEAKER_STRIP_TAC;
2456       INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f 0`;`f 0`;`f i'`];
2457       ANTS_TAC;
2458         BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`;arith `x <= x`]);
2459       INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f 0`;`f i'`;`f (n-1)`];
2460       ANTS_TAC;
2461         ASM_SIMP_TAC [arith `x < y ==> x <= y`];
2462         BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2463       REWRITE_TAC[AZIM_REFL];
2464       BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2465     BY(ASM_MESON_TAC[]);
2466   COMMENT "done with i = n-1";
2467   COMMENT "deal with wedge_ge";
2468   FIRST_X_ASSUM_ST `wedge_ge` MP_TAC;
2469   REWRITE_TAC[Local_lemmas.WEDGE_GE_AZIM_LE];
2470   DISCH_TAC;
2471   FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2472   REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
2473   REPEAT WEAKER_STRIP_TAC;
2474   MP_TAC (arith `i' = i \/  i' = SUC i \/ SUC i < i' \/ i' < i `);
2475   DISCH_THEN DISJ_CASES_TAC;
2476     BY(ASM_MESON_TAC[]);
2477   FIRST_X_ASSUM DISJ_CASES_TAC;
2478     BY(ASM_MESON_TAC[]);
2479   FIRST_X_ASSUM DISJ_CASES_TAC;
2480     INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f i`;`f (SUC i)`;`f i'`];
2481     ANTS_TAC;
2482       ASM_SIMP_TAC[];
2483       CONJ_TAC;
2484         FIRST_X_ASSUM (C INTRO_TAC [`i`;`SUC i`]);
2485         ANTS_TAC;
2486           BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2487         BY(REAL_ARITH_TAC);
2488       FIRST_X_ASSUM (C INTRO_TAC [`i`;`i'`]);
2489       ANTS_TAC;
2490         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2491       BY(REAL_ARITH_TAC);
2492     FIRST_X_ASSUM (C INTRO_TAC [`SUC i`;`i'`]);
2493     ANTS_TAC;
2494       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2495     FIRST_X_ASSUM_ST `azim` MP_TAC;
2496     ASM_REWRITE_TAC[];
2497     BY(REAL_ARITH_TAC);
2498   COMMENT "last wedge case";
2499   INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`f i`;`f i'`;`f (SUC i)`];
2500   ANTS_TAC;
2501     ASM_SIMP_TAC[];
2502     BY(ASM_MESON_TAC[]);
2503   DISCH_TAC;
2504   INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`f i'`;`f i`;`f (SUC i)`];
2505   ANTS_TAC;
2506     ASM_SIMP_TAC[];
2507     INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f i'`;`f i`;`f (SUC i)`];
2508     ANTS_TAC;
2509       ASM_SIMP_TAC[];
2510       CONJ_TAC;
2511         FIRST_X_ASSUM (C INTRO_TAC [`i'`;`i`]);
2512         ANTS_TAC;
2513           BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2514         BY(REAL_ARITH_TAC);
2515       FIRST_X_ASSUM (C INTRO_TAC [`i'`;`SUC i`]);
2516       ANTS_TAC;
2517         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2518       BY(REAL_ARITH_TAC);
2519     FIRST_X_ASSUM (C INTRO_TAC [`i`;`SUC i`]);
2520     ANTS_TAC;
2521       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2522     BY(REAL_ARITH_TAC);
2523   DISCH_TAC;
2524   TYPIFY `azim (EL 0 ul) (EL 1 ul) (f i) (f i') = -- azim (EL 0 ul) (EL 1 ul) (f i') (f i)` (C SUBGOAL_THEN MP_TAC);
2525     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2526   REWRITE_TAC[arith `x = -- y <=> y + x = &0`];
2527   GMATCH_SIMP_TAC Leaf_cell.AZIM_POS_IMP_SUM_2PI_ALT;
2528   CONJ2_TAC;
2529     MATCH_MP_TAC (arith `&0 < x ==> ~(x = &0)`);
2530     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
2531     REWRITE_TAC[PI_POS];
2532     BY(REAL_ARITH_TAC);
2533   FIRST_X_ASSUM (C INTRO_TAC [`i'`;`i`]);
2534   ANTS_TAC;
2535     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2536   DISCH_TAC;
2537   INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`w0`;`f i'`;`f i`];
2538   ANTS_TAC;
2539     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
2540   BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC)
2541   ]);;
2542   (* }}} *)
2543 *)
2544
2545 let LEAF_IN_WEDGE_GE = prove_by_refinement(
2546   `!V ul u w0 n f i.
2547     packing V /\ saturated V /\ leaf_rank V [EL 0 ul;EL 1 ul] w0 n f /\ leaf V [EL 0 ul;EL 1 ul;u] /\ 
2548     barV V 3 ul /\
2549     ~collinear {EL 0 ul,EL 1 ul,w0} /\
2550     (1<n) /\ ~NULLSET(mcell4 V ul) /\
2551     (u IN {EL 2 ul,EL 3 ul}) /\
2552       u IN wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==> (u = f i \/ u = f (SUC i))`,
2553   (* {{{ proof *)
2554   [
2555   REPEAT WEAKER_STRIP_TAC;
2556   INTRO_TAC LEAF_RANK_ONTO [`V`;`ul`;`w0`;`n`;`f`;`u`];
2557   ANTS_TAC;
2558     BY(ASM_SIMP_TAC[arith `1 < n==> ~(n=0)`]);
2559   REPEAT WEAKER_STRIP_TAC;
2560   MATCH_MP_TAC S_LEAF_IN_WEDGE_GE;
2561   GEXISTL_TAC [`V`;`ul`;`w0`;`n`;`i'`];
2562   BY(ASM_REWRITE_TAC[])
2563 (*
2564   REPEAT WEAKER_STRIP_TAC;
2565   MATCH_MP_TAC (TAUT ` (~a /\ ~b ==> F) ==> a \/ b`);
2566   REPEAT WEAKER_STRIP_TAC;
2567   INTRO_TAC LEAF_RANK_COLLINEAR [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`];
2568   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
2569   DISCH_TAC;
2570   INTRO_TAC LEAF_RANK_ONTO [`V`;`ul`;`w0`;`n`;`f`;`u`];
2571   ANTS_TAC;
2572     BY(ASM_SIMP_TAC[arith `1 < n==> ~(n=0)`]);
2573   STRIP_TAC;
2574   COMMENT "deal with i=n-1";
2575   TYPIFY `i = n - 1` ASM_CASES_TAC;
2576     FIRST_X_ASSUM_ST `wedge_ge` MP_TAC;
2577     REWRITE_TAC[];
2578     GMATCH_SIMP_TAC (GSYM Leaf_cell.WEDGE_COMPLEMENT);
2579     REWRITE_TAC[IN_DIFF;IN_UNIV];
2580     CONJ_TAC;
2581       ONCE_REWRITE_TAC[arith `(x:real) = y <=> y = x`];
2582       DISCH_TAC;
2583       FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2584       REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
2585       REPEAT WEAKER_STRIP_TAC;
2586       FIRST_X_ASSUM (C INTRO_TAC [`0`;`i`]);
2587       ANTS_TAC;
2588         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2589       DISCH_TAC;
2590       INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`w0`;`f 0`;`f i`];
2591       ANTS_TAC;
2592         BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
2593       FIRST_X_ASSUM_ST `SUC` MP_TAC;
2594       ASM_SIMP_TAC[arith `1 < n ==> SUC (n - 1) = n`];
2595       TYPIFY `f n = f 0` (C SUBGOAL_THEN SUBST1_TAC);
2596         BY(ASM_MESON_TAC[arith `0 + n = n`]);
2597       FIRST_X_ASSUM MP_TAC;
2598       ASM_REWRITE_TAC[];
2599       BY(REAL_ARITH_TAC);
2600     ASM_SIMP_TAC[arith `1 < n ==> SUC (n - 1) = n`];
2601     TYPIFY `f n = f 0` (C SUBGOAL_THEN SUBST1_TAC);
2602       BY(ASM_MESON_TAC[arith `0 + n = n`;leaf_rank]);
2603     REWRITE_TAC[Reuhady.WEDGE_SIMPLE;IN_ELIM_THM];
2604     TYPIFY `i' = 0 \/ (0 < i' /\ i' < (n-1)) \/ (i' = (n-1))` (C SUBGOAL_THEN ASSUME_TAC);
2605       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2606     FIRST_X_ASSUM DISJ_CASES_TAC;
2607       FIRST_X_ASSUM_ST `SUC` MP_TAC;
2608       ASM_REWRITE_TAC[];
2609       ASM_SIMP_TAC[arith `1 < n ==> SUC (n - 1) = n`];
2610       TYPIFY `f n = f 0` (C SUBGOAL_THEN SUBST1_TAC);
2611         BY(ASM_MESON_TAC[arith `0 + n = n`;leaf_rank]);
2612       BY(REWRITE_TAC[]);
2613     FIRST_X_ASSUM DISJ_CASES_TAC;
2614       FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2615       REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
2616       REPEAT WEAKER_STRIP_TAC;
2617       FIRST_ASSUM (C INTRO_TAC [`0`;`i'`]);
2618       ANTS_TAC;
2619         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2620       FIRST_X_ASSUM (C INTRO_TAC [`i'`;`n-1`]);
2621       ANTS_TAC;
2622         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2623       REPEAT WEAKER_STRIP_TAC;
2624       INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f 0`;`f 0`;`f i'`];
2625       ANTS_TAC;
2626         BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`;arith `x <= x`]);
2627       INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f 0`;`f i'`;`f (n-1)`];
2628       ANTS_TAC;
2629         ASM_SIMP_TAC [arith `x < y ==> x <= y`];
2630         BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2631       REWRITE_TAC[AZIM_REFL];
2632       BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2633     BY(ASM_MESON_TAC[]);
2634   COMMENT "done with i = n-1";
2635   COMMENT "deal with wedge_ge";
2636   FIRST_X_ASSUM_ST `wedge_ge` MP_TAC;
2637   REWRITE_TAC[Local_lemmas.WEDGE_GE_AZIM_LE];
2638   DISCH_TAC;
2639   FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2640   REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
2641   REPEAT WEAKER_STRIP_TAC;
2642   MP_TAC (arith `i' = i \/  i' = SUC i \/ SUC i < i' \/ i' < i `);
2643   DISCH_THEN DISJ_CASES_TAC;
2644     BY(ASM_MESON_TAC[]);
2645   FIRST_X_ASSUM DISJ_CASES_TAC;
2646     BY(ASM_MESON_TAC[]);
2647   FIRST_X_ASSUM DISJ_CASES_TAC;
2648     INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f i`;`f (SUC i)`;`f i'`];
2649     ANTS_TAC;
2650       ASM_SIMP_TAC[];
2651       CONJ_TAC;
2652         FIRST_X_ASSUM (C INTRO_TAC [`i`;`SUC i`]);
2653         ANTS_TAC;
2654           BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2655         BY(REAL_ARITH_TAC);
2656       FIRST_X_ASSUM (C INTRO_TAC [`i`;`i'`]);
2657       ANTS_TAC;
2658         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2659       BY(REAL_ARITH_TAC);
2660     FIRST_X_ASSUM (C INTRO_TAC [`SUC i`;`i'`]);
2661     ANTS_TAC;
2662       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2663     FIRST_X_ASSUM_ST `azim` MP_TAC;
2664     ASM_REWRITE_TAC[];
2665     BY(REAL_ARITH_TAC);
2666   COMMENT "last wedge case";
2667   INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`f i`;`f i'`;`f (SUC i)`];
2668   ANTS_TAC;
2669     ASM_SIMP_TAC[];
2670     BY(ASM_MESON_TAC[]);
2671   DISCH_TAC;
2672   INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`f i'`;`f i`;`f (SUC i)`];
2673   ANTS_TAC;
2674     ASM_SIMP_TAC[];
2675     INTRO_TAC Leaf_cell.AZIM_BASE_SHIFT_LE [`EL 0 ul`;`EL 1 ul`;`w0`;`f i'`;`f i`;`f (SUC i)`];
2676     ANTS_TAC;
2677       ASM_SIMP_TAC[];
2678       CONJ_TAC;
2679         FIRST_X_ASSUM (C INTRO_TAC [`i'`;`i`]);
2680         ANTS_TAC;
2681           BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2682         BY(REAL_ARITH_TAC);
2683       FIRST_X_ASSUM (C INTRO_TAC [`i'`;`SUC i`]);
2684       ANTS_TAC;
2685         BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2686       BY(REAL_ARITH_TAC);
2687     FIRST_X_ASSUM (C INTRO_TAC [`i`;`SUC i`]);
2688     ANTS_TAC;
2689       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2690     BY(REAL_ARITH_TAC);
2691   DISCH_TAC;
2692   TYPIFY `azim (EL 0 ul) (EL 1 ul) (f i) (f i') = -- azim (EL 0 ul) (EL 1 ul) (f i') (f i)` (C SUBGOAL_THEN MP_TAC);
2693     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2694   REWRITE_TAC[arith `x = -- y <=> y + x = &0`];
2695   GMATCH_SIMP_TAC Leaf_cell.AZIM_POS_IMP_SUM_2PI_ALT;
2696   CONJ2_TAC;
2697     MATCH_MP_TAC (arith `&0 < x ==> ~(x = &0)`);
2698     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
2699     REWRITE_TAC[PI_POS];
2700     BY(REAL_ARITH_TAC);
2701   FIRST_X_ASSUM (C INTRO_TAC [`i'`;`i`]);
2702   ANTS_TAC;
2703     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
2704   DISCH_TAC;
2705   INTRO_TAC Fan.sum4_azim_fan [`EL 0 ul`;`EL 1 ul`;`w0`;`f i'`;`f i`];
2706   ANTS_TAC;
2707     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
2708   BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC)
2709 *)
2710   ]);;
2711   (* }}} *)
2712
2713 let MCELL4_FI_EL = prove_by_refinement(
2714 `!V ul w0 n f i.
2715          packing V /\
2716          saturated V /\
2717          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
2718          barV V 3 ul /\
2719          ~collinear {EL 0 ul, EL 1 ul, w0} /\
2720          1 < n /\
2721          ~NULLSET (mcell4 V ul) /\
2722          mcell4 V ul SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==>
2723     {EL 2 ul, EL 3 ul} = {f i, f (SUC i)}`,
2724   (* {{{ proof *)
2725   [
2726   REPEAT WEAKER_STRIP_TAC;
2727   INTRO_TAC MCELL4_CONVEX_HULL [`V`;`ul`];
2728   ANTS_TAC;
2729     BY(ASM_MESON_TAC[]);
2730   DISCH_TAC;
2731   TYPIFY `!(a:real^3) b c d. ~(a = b) /\ {a,b} SUBSET {c,d} ==> {a,b} = {c,d}` (C SUBGOAL_THEN MATCH_MP_TAC);
2732     BY(SET_TAC[]);
2733   SUBCONJ_TAC;
2734     INTRO_TAC MCELL4_CARD4 [`V`;`ul`];
2735     ASM_REWRITE_TAC[];
2736     BY(MESON_TAC[Leaf_cell.CARD4_ALL_DISTINCT]);
2737   DISCH_TAC;
2738   REWRITE_TAC[SUBSET];
2739   REPEAT WEAKER_STRIP_TAC;
2740   REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
2741   INTRO_TAC LEAF_IN_WEDGE_GE [`V`;`ul`;`x`;`w0`;`n`;`f`;`i`];
2742   DISCH_THEN MATCH_MP_TAC;
2743   ASM_REWRITE_TAC[];
2744   CONJ_TAC;
2745     FIRST_X_ASSUM MP_TAC;
2746     REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
2747     BY(ASM_MESON_TAC[MCELL4_LEAF2;MCELL4_LEAF3]);
2748   FIRST_X_ASSUM_ST `SUBSET` MP_TAC;
2749   REWRITE_TAC[SUBSET];
2750   DISCH_THEN MATCH_MP_TAC;
2751   ASM_REWRITE_TAC[];
2752   MATCH_MP_TAC Marchal_cells_2_new.IN_SET_IMP_IN_CONVEX_HULL_SET;
2753   FIRST_X_ASSUM MP_TAC;
2754   BY(SET_TAC[])
2755   ]);;
2756   (* }}} *)
2757
2758 let MCELL4_FI = prove_by_refinement(
2759   `!V ul w0 n f i.
2760      packing V /\
2761                    saturated V /\
2762                    leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
2763                    barV V 3 ul /\
2764                    ~collinear {EL 0 ul, EL 1 ul, w0} /\
2765                    1 < n /\
2766                    ~NULLSET (mcell4 V ul) /\
2767                    (mcell4 V ul) SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==>
2768     mcell4 V ul = convex hull {EL 0 ul,EL 1 ul, f i, f(SUC i)} `,
2769   (* {{{ proof *)
2770   [
2771   REPEAT WEAKER_STRIP_TAC;
2772   INTRO_TAC MCELL4_CONVEX_HULL [`V`;`ul`];
2773   ANTS_TAC;
2774     BY(ASM_MESON_TAC[]);
2775   DISCH_TAC;
2776   ASM_REWRITE_TAC[];
2777   AP_TERM_TAC;
2778   TYPIFY `{EL 2 ul,EL 3 ul} = {f i, f (SUC i)}` ENOUGH_TO_SHOW_TAC;
2779     BY(SET_TAC[]);
2780   MATCH_MP_TAC MCELL4_FI_EL;
2781   BY(ASM_MESON_TAC[])
2782   ]);;
2783   (* }}} *)
2784
2785 let MCELL4_BARV_FI = prove_by_refinement(
2786     `!V ul w0 n f i.
2787      packing V /\
2788                    saturated V /\
2789                    leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
2790                    barV V 3 ul /\
2791                    ~collinear {EL 0 ul, EL 1 ul, w0} /\
2792                    1 < n /\
2793                    ~NULLSET (mcell4 V ul) /\
2794                    (mcell4 V ul) SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==>
2795     barV V 3 [EL 0 ul;EL 1 ul; f i; f (SUC i)] /\
2796     mcell4 V ul = mcell4 V [EL 0 ul;EL 1 ul; f i; f (SUC i)]`,
2797   (* {{{ proof *)
2798   [
2799   REPEAT WEAKER_STRIP_TAC;
2800   INTRO_TAC Marchal_cells_3.LEFT_ACTION_LIST_3_EXISTS [`EL 0 ul`;`EL 1 ul`;`EL 2 ul`;`EL 3 ul`;`EL 0 ul`;`EL 1 ul`;`f i`;`f (SUC i)`];
2801   ANTS_TAC;
2802     CONJ_TAC;
2803       MATCH_MP_TAC MCELL4_CARD4;
2804       BY(ASM_MESON_TAC[]);
2805     INTRO_TAC MCELL4_FI_EL [`V`;`ul`;`w0`;`n`;`f`;`i`];
2806     ANTS_TAC;
2807       BY(ASM_MESON_TAC[]);
2808     BY(SET_TAC[]);
2809   REPEAT WEAKER_STRIP_TAC;
2810   INTRO_TAC Rogers.YIFVQDV_1 [`V`;`ul`;`3`;`p`];
2811   ASM_REWRITE_TAC[];
2812   INTRO_TAC Rvfxzbu.RVFXZBU [`V`;`ul`;`4`;`p`];
2813   ASM_REWRITE_TAC[arith `4 - 1 = 3`;IN_INSERT];
2814   FIRST_X_ASSUM MP_TAC;
2815   TYPIFY `[EL 0 ul; EL 1 ul; EL 2 ul; EL 3 ul] = ul` (C SUBGOAL_THEN SUBST1_TAC);
2816     MATCH_MP_TAC EQ_SYM;
2817     MATCH_MP_TAC Bump.LENGTH4;
2818     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
2819     BY(ASM_MESON_TAC[]);
2820   DISCH_THEN (SUBST1_TAC o GSYM);
2821   REWRITE_TAC[Bump.MCELL4];
2822   DISCH_THEN SUBST1_TAC;
2823   ASM_REWRITE_TAC[IN];
2824   DISCH_THEN MATCH_MP_TAC;
2825   PROOF_BY_CONTR_TAC;
2826   FIRST_X_ASSUM_ST `NULLSET` MP_TAC;
2827   REWRITE_TAC[];
2828   REWRITE_TAC[Pack_defs.mcell4];
2829   ASM_REWRITE_TAC[];
2830   BY(REWRITE_TAC[NEGLIGIBLE_EMPTY])
2831   ]);;
2832   (* }}} *)
2833
2834 let MCELL4_AZIM_LT_PI = prove_by_refinement(
2835 `!V ul w0 n f i.
2836      packing V /\
2837                    saturated V /\
2838                    leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
2839                    barV V 3 ul /\
2840                    ~collinear {EL 0 ul, EL 1 ul, w0} /\
2841                    1 < n /\
2842                    ~NULLSET (mcell4 V ul) /\
2843                    (mcell4 V ul) SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==>
2844   azim (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) < pi`,
2845   (* {{{ proof *)
2846   [
2847   REPEAT WEAKER_STRIP_TAC;
2848   INTRO_TAC MCELL4_FI [`V`;`ul`;`w0`;`n`;`f`;`i`];
2849   ASM_REWRITE_TAC[];
2850   DISCH_TAC;
2851   INTRO_TAC LEAF_RANK_COLLINEAR [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`];
2852   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
2853   DISCH_TAC;
2854   INTRO_TAC Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2 [`EL 0 ul`;`EL 1 ul`;`f i`;`f(SUC i)`];
2855   DISCH_TAC;
2856   MATCH_MP_TAC (arith `~(x = pi) /\ ~(pi < x) ==> x < pi`);
2857   CONJ_TAC;
2858     DISCH_TAC;
2859     TYPIFY `coplanar {EL 0 ul,EL 1 ul,f i, f (SUC i)}` (C SUBGOAL_THEN MP_TAC);
2860       MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR;
2861       BY(ASM_REWRITE_TAC[]);
2862     REWRITE_TAC[];
2863     ONCE_REWRITE_TAC[GSYM COPLANAR_CONVEX_HULL_COPLANAR];
2864     BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE]);
2865   DISCH_TAC;
2866   INTRO_TAC Leaf_cell.AZIM_POS_IMP_SUM_2PI_ALT [`EL 0 ul`;`EL 1 ul`;`f i`;`f (SUC i)`];
2867   ANTS_TAC;
2868     FIRST_X_ASSUM MP_TAC;
2869     MP_TAC PI_POS;
2870     BY(REAL_ARITH_TAC);
2871   DISCH_TAC;
2872   TYPIFY `azim (EL 0 ul) (EL 1 ul) (f (SUC i)) (f i) < pi` (C SUBGOAL_THEN ASSUME_TAC);
2873     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
2874   FIRST_X_ASSUM_ST `aff_ge` MP_TAC;
2875   TYPIFY `{f i,f (SUC i)} = {f (SUC i),f i}` (C SUBGOAL_THEN SUBST1_TAC);
2876     BY(SET_TAC[]);
2877   REWRITE_TAC[];
2878   GMATCH_SIMP_TAC (GSYM Local_lemmas.WEDGE_GE_EQ_AFF_GE);
2879   ASM_SIMP_TAC[];
2880   DISCH_TAC;
2881   INTRO_TAC Leaf_cell.WEDGE_GE_ALMOST_DISJOINT [`EL 0 ul`;`EL 1 ul`;`f i`;`f (SUC i)`];
2882   ASM_SIMP_TAC[];
2883   REWRITE_TAC[SUBSET;IN_INTER;IN_UNION];
2884   REPEAT WEAKER_STRIP_TAC;
2885   TYPIFY `mcell4 V ul SUBSET aff_ge {EL 0 ul, EL 1 ul} {f i} UNION aff_ge {EL 0 ul, EL 1 ul } {f (SUC i)}` (C SUBGOAL_THEN ASSUME_TAC);
2886     REWRITE_TAC[SUBSET;IN_UNION];
2887     REPEAT WEAKER_STRIP_TAC;
2888     FIRST_X_ASSUM MATCH_MP_TAC;
2889     FIRST_X_ASSUM_ST `convex` MP_TAC;
2890     TYPIFY `{EL 0 ul, EL 1 ul, f (SUC i), f i} = {EL 0 ul, EL 1 ul, f (i), f (SUC i)}` (C SUBGOAL_THEN SUBST1_TAC);
2891       BY(SET_TAC[]);
2892     BY(ASM_MESON_TAC[SUBSET]);
2893   FIRST_X_ASSUM_ST `NULLSET` MP_TAC;
2894   REWRITE_TAC[];
2895   MATCH_MP_TAC NEGLIGIBLE_SUBSET;
2896   TYPIFY `aff_ge {EL 0 ul, EL 1 ul} {f i} UNION       aff_ge {EL 0 ul, EL 1 ul} {f (SUC i)}` EXISTS_TAC;
2897   ASM_REWRITE_TAC[];
2898   MATCH_MP_TAC NEGLIGIBLE_UNION;
2899   BY(REWRITE_TAC[NULLSET_AFF_2_1])
2900   ]);;
2901   (* }}} *)
2902
2903 let MCELL4_DIHX_AZIM = prove_by_refinement(
2904  `!V ul w0 n f i.
2905          packing V /\
2906          saturated V /\
2907          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
2908          barV V 3 ul /\
2909          ~collinear {EL 0 ul, EL 1 ul, w0} /\
2910          1 < n /\
2911          ~NULLSET (mcell4 V ul) /\
2912          mcell4 V ul SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==>
2913    dihX V (mcell4 V ul) (EL 0 ul, EL 1 ul) = azim (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))`,
2914   (* {{{ proof *)
2915   [
2916   REPEAT WEAKER_STRIP_TAC;
2917   INTRO_TAC LEAF_RANK_COLLINEAR [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`];
2918   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
2919   DISCH_TAC;
2920   INTRO_TAC MCELL4_AZIM_LT_PI [`V`;`ul`;`w0`;`n`;`f`;`i`];
2921   ANTS_TAC;
2922     BY(ASM_REWRITE_TAC[]);
2923   DISCH_TAC;
2924   GMATCH_SIMP_TAC Local_lemmas.AZIM_LE_PI_EQ_DIHV;
2925   CONJ_TAC;
2926     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
2927   INTRO_TAC Merge_ineq.DIHV_EQ_DIH_Y [`EL 0 ul`;`EL 1 ul`;`f i`;`f (SUC i)`];
2928   REWRITE_TAC[LET_DEF;LET_END_DEF];
2929   ANTS_TAC;
2930     BY(ASM_REWRITE_TAC[]);
2931   DISCH_THEN SUBST1_TAC;
2932   INTRO_TAC Tskajxy_lemmas.DIHX_DIH_Y_lemma [`V`;`mcell4 V ul`;`[EL 0 ul;EL 1 ul;f i;f (SUC i)]`;`EL 0 ul`;`EL 1 ul`;`f i`;`f (SUC i)`;`4`;`dist(EL 0 ul,EL 1 ul)`;`dist(EL 0 ul,f i)`;`dist(EL 0 ul, f (SUC i))`;`dist(f i, f (SUC i))`;`dist(EL 1 ul,f (SUC i))`;`dist(EL 1 ul,f i)`];
2933   ANTS_TAC;
2934     ASM_REWRITE_TAC[arith `4 >= 4`];
2935     INTRO_TAC MCELL4_FI [`V`;`ul`;`w0`;`n`;`f`;`i`];
2936     ANTS_TAC;
2937       BY(ASM_REWRITE_TAC[]);
2938     DISCH_TAC;
2939     INTRO_TAC MCELL4_CONVEX_HULL [`V`;`ul`];
2940     ANTS_TAC;
2941       BY(ASM_REWRITE_TAC[]);
2942     DISCH_TAC;
2943     REWRITE_TAC[GSYM Bump.MCELL4];
2944     MATCH_MP_TAC MCELL4_BARV_FI;
2945     BY(ASM_MESON_TAC[]);
2946   BY(DISCH_THEN (unlist REWRITE_TAC))
2947   ]);;
2948   (* }}} *)
2949
2950 let LEAF_RANK_HAS_SIZE = prove_by_refinement(
2951   `!V ul w0 n f.  ~(n=0) /\ packing V /\ saturated V /\ leaf_rank V ul w0 n f  /\
2952     ~collinear {EL 0 ul, EL 1 ul, w0}
2953   ==>
2954     s_leaf V ul HAS_SIZE n`,
2955   (* {{{ proof *)
2956   [
2957   REWRITE_TAC[HAS_SIZE];
2958   REPEAT WEAKER_STRIP_TAC;
2959   SUBCONJ_TAC;
2960     BY(ASM_MESON_TAC[S_LEAF_FINITE]);
2961   DISCH_TAC;
2962   INTRO_TAC LEAF_RANK_PERIODIC [`V`;`ul`;`w0`;`n`;`f`];
2963   ASM_REWRITE_TAC[];
2964   DISCH_TAC;
2965   INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`ul`;`w0`;`n`;`f`];
2966   ASM_REWRITE_TAC[];
2967   DISCH_TAC;
2968   FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
2969   REWRITE_TAC[leaf_rank];
2970   GMATCH_SIMP_TAC (GSYM PERIODIC_IMAGE);
2971   TYPIFY `n` EXISTS_TAC;
2972   ASM_REWRITE_TAC[];
2973   REPEAT WEAKER_STRIP_TAC;
2974   MATCH_MP_TAC EQ_SYM;
2975   TYPIFY `n = CARD {i | i < n }` (C SUBGOAL_THEN SUBST1_TAC);
2976     BY(REWRITE_TAC[CARD_NUMSEG_LT]);
2977   MATCH_MP_TAC Misc_defs_and_lemmas.BIJ_CARD;
2978   TYPIFY `f` EXISTS_TAC;
2979   REWRITE_TAC[FINITE_NUMSEG_LT];
2980   REWRITE_TAC[BIJ;INJ];
2981   SUBCONJ_TAC;
2982     CONJ_TAC;
2983       FIRST_X_ASSUM_ST `IMAGE` MP_TAC;
2984       REWRITE_TAC[EXTENSION;IN_IMAGE];
2985       BY(MESON_TAC[]);
2986     REWRITE_TAC[IN_ELIM_THM];
2987     REPEAT WEAKER_STRIP_TAC;
2988     GMATCH_SIMP_TAC (GSYM MOD_LT);
2989     TYPIFY `n` EXISTS_TAC;
2990     ASM_REWRITE_TAC[];
2991     TYPIFY `y = y MOD n` (C SUBGOAL_THEN SUBST1_TAC);
2992       BY(ASM_MESON_TAC[MOD_LT]);
2993     TYPIFY `azim (EL 0 ul) (EL 1 ul) (f x) (f y) = &0` ENOUGH_TO_SHOW_TAC;
2994       BY(ASM_MESON_TAC[]);
2995     FIRST_X_ASSUM SUBST1_TAC;
2996     BY(REWRITE_TAC[AZIM_REFL]);
2997   REPEAT WEAKER_STRIP_TAC;
2998   ASM_REWRITE_TAC[SURJ];
2999   FIRST_X_ASSUM_ST `IMAGE` MP_TAC;
3000   REWRITE_TAC[EXTENSION;IN_IMAGE];
3001   BY(MESON_TAC[])
3002   ]);;
3003   (* }}} *)
3004
3005 let MCELL4_FULL_WEDGE = prove_by_refinement(
3006  `!V X ul w0 n f i.
3007          packing V /\
3008          saturated V /\
3009          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3010          barV V 3 ul /\
3011          ~collinear {EL 0 ul, EL 1 ul, w0} /\
3012          1 < n /\
3013          ~NULLSET (mcell4 V ul) /\
3014          mcell_set V X /\
3015          X SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) /\
3016          {EL 0 ul, EL 1 ul} IN edgeX V X /\
3017          mcell4 V ul SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==>
3018    (X = mcell4 V ul)`,
3019   (* {{{ proof *)
3020   [
3021   REPEAT WEAKER_STRIP_TAC;
3022   FIRST_X_ASSUM_ST `mcell_set` MP_TAC;
3023   REWRITE_TAC[Qzyzmjc.mcell_set_2;IN_ELIM_THM];
3024   REWRITE_TAC[IN];
3025   REWRITE_TAC[arith `!i. i <= 4 <=> i <= 1 \/  i = 4 \/ (i = 2 \/ i = 3)`];
3026   REPEAT WEAKER_STRIP_TAC;
3027   PROOF_BY_CONTR_TAC;
3028   COMMENT "case 1";
3029   FIRST_X_ASSUM DISJ_CASES_TAC;
3030     INTRO_TAC Bump.EDGE_IMP_K2 [`V`;`ul'`;`i'`];
3031     ASM_REWRITE_TAC[EXTENSION;NOT_IN_EMPTY];
3032     BY(ASM_MESON_TAC[]);
3033   COMMENT "case 4";
3034   FIRST_X_ASSUM DISJ_CASES_TAC;
3035     INTRO_TAC MCELL4_FI [`V`;`ul`;`w0`;`n`;`f`;`i`];
3036     ANTS_TAC;
3037       BY(ASM_SIMP_TAC[]);
3038     DISCH_TAC;
3039     INTRO_TAC Leaf_cell.MCELL_EDGE_FIRST [`V`;`ul'`;`4`;`EL 0 ul`;`EL 1 ul`];
3040     ANTS_TAC;
3041       BY(ASM_MESON_TAC[IN]);
3042     REPEAT WEAKER_STRIP_TAC;
3043     INTRO_TAC MCELL4_FI [`V`;`vl`;`w0`;`n`;`f`;`i`];
3044     ANTS_TAC;
3045       ASM_SIMP_TAC[];
3046       TYPIFY `~NULLSET (mcell4 V vl)` (C SUBGOAL_THEN ASSUME_TAC);
3047         DISCH_TAC;
3048         FIRST_X_ASSUM_ST `edgeX` MP_TAC;
3049         ASM_REWRITE_TAC[];
3050         GMATCH_SIMP_TAC Bump.RIJRIED;
3051         REWRITE_TAC[NOT_IN_EMPTY];
3052         BY(ASM_MESON_TAC[IN;Bump.MCELL4]);
3053       BY(ASM_MESON_TAC[IN;Bump.MCELL4]);
3054     DISCH_TAC;
3055     BY(ASM_MESON_TAC[Bump.MCELL4]);
3056   COMMENT "cases 2 and 3";
3057   INTRO_TAC LEAF_RANK_REUHADY [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`;`i`];
3058   REWRITE_TAC[Bump.EL_EXPLICIT];
3059   DISCH_THEN MP_TAC THEN ANTS_TAC;
3060     ASM_SIMP_TAC[];
3061     MATCH_MP_TAC LEAF_RANK_HAS_SIZE;
3062     REWRITE_TAC[Bump.EL_EXPLICIT];
3063     GEXISTL_TAC [`w0`;`f`];
3064     BY(ASM_MESON_TAC[arith `1 < n ==> ~(n = 0)`]);
3065   REWRITE_TAC[azim_mcell];
3066   TYPED_ABBREV_TAC  `(A:(real^3->bool)->bool) = {X | mcell_set V X /\         {EL 0 ul, EL 1 ul} IN edgeX V X /\         X SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))}` ;
3067   INTRO_TAC SUM_SUBSET_SIMPLE [`{X,mcell4 V ul}`;`A`;`(\X. dihX V X (EL 0 ul,EL 1 ul))`];
3068   ANTS_TAC;
3069     CONJ_TAC;
3070       EXPAND_TAC "A";
3071       MATCH_MP_TAC FINITE_SUBSET;
3072       TYPIFY `{X | mcell_set V X /\ edgeX V X {EL 0 ul, EL 1 ul} }` EXISTS_TAC;
3073       CONJ_TAC;
3074         MATCH_MP_TAC Marchal_cells_3.FINITE_EDGE_X2;
3075         BY(ASM_MESON_TAC[]);
3076       BY(SET_TAC[IN]);
3077     CONJ_TAC;
3078       EXPAND_TAC "A";
3079       REWRITE_TAC[SUBSET;IN_INSERT;IN_ELIM_THM;NOT_IN_EMPTY];
3080       GEN_TAC;
3081       STRIP_TAC;
3082         REWRITE_TAC[Qzyzmjc.mcell_set_2;IN_ELIM_THM];
3083         BY(ASM_MESON_TAC[SUBSET;IN;arith `2 <= 4 /\ 3 <= 4`]);
3084       REWRITE_TAC[Qzyzmjc.mcell_set_2;IN_ELIM_THM];
3085       CONJ_TAC;
3086         GEXISTL_TAC [`4`;`ul`];
3087         BY(ASM_MESON_TAC[IN;arith `4 <= 4`;Bump.MCELL4]);
3088       CONJ_TAC;
3089         FIRST_X_ASSUM SUBST1_TAC;
3090         GMATCH_SIMP_TAC Bump.MCELL4_EDGE;
3091         CONJ_TAC;
3092           BY(ASM_MESON_TAC[]);
3093         SUBCONJ_TAC;
3094           MATCH_MP_TAC Marchal_cells_2_new.CARD4_IMP_DISTINCT;
3095           GEXISTL_TAC [`EL 2 ul`;`EL 3 ul`];
3096           MATCH_MP_TAC MCELL4_CARD4;
3097           BY(ASM_MESON_TAC[]);
3098         DISCH_TAC;
3099         GMATCH_SIMP_TAC Bump.set_of_list4;
3100         CONJ2_TAC;
3101           BY(SET_TAC[]);
3102         REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
3103         BY(ASM_MESON_TAC[]);
3104       BY(ASM_MESON_TAC[SUBSET]);
3105     BY(REWRITE_TAC[Marchal_cells_3.DIHX_RANGE]);
3106   REPEAT WEAKER_STRIP_TAC;
3107   FIRST_X_ASSUM_ST `<=` MP_TAC;
3108   ASM_REWRITE_TAC[];
3109   REPLICATE_TAC 2 (FIRST_X_ASSUM kill);
3110   REWRITE_TAC[arith `~(x <= y) <=> (y < x)`];
3111   GMATCH_SIMP_TAC Geomdetail.SUM_DIS2;
3112   CONJ_TAC;
3113     BY(ASM_MESON_TAC[]);
3114   GMATCH_SIMP_TAC MCELL4_DIHX_AZIM;
3115   GEXISTL_TAC [`f`;`i`];
3116   CONJ_TAC;
3117     BY(ASM_MESON_TAC[]);
3118   REWRITE_TAC[arith `a < d + a <=> &0 < d`];
3119   FIRST_X_ASSUM DISJ_CASES_TAC;
3120     INTRO_TAC Leaf_cell.MCELL2_EDGE_FIRST [`V`;`ul'`;`EL 0 ul`;`EL 1 ul`];
3121     ANTS_TAC;
3122       BY(ASM_MESON_TAC[Bump.MCELL2;IN]);
3123     REWRITE_TAC[IN];
3124     REPEAT WEAKER_STRIP_TAC;
3125     TYPIFY `dihX V (mcell i' V ul') (EL 0 ul,EL 1 ul) = dihX V (mcell2 V vl) (EL 0 vl,EL 1 vl)` (C SUBGOAL_THEN SUBST1_TAC);
3126       BY(ASM_MESON_TAC[Bump.MCELL2]);
3127     MATCH_MP_TAC MCELL2_DIHX_POS;
3128     REWRITE_TAC[];
3129     ASM_REWRITE_TAC[];
3130     BY(ASM_MESON_TAC[Bump.MCELL2]);
3131   COMMENT "case 3";
3132   INTRO_TAC Leaf_cell.MCELL3_EDGE_FIRST [`V`;`ul'`;`EL 0 ul`;`EL 1 ul`];
3133   ANTS_TAC;
3134     BY(ASM_MESON_TAC[Bump.MCELL3;IN]);
3135   REWRITE_TAC[IN];
3136   REPEAT WEAKER_STRIP_TAC;
3137   TYPIFY `dihX V (mcell i' V ul') (EL 0 ul,EL 1 ul) = dihX V (mcell3 V vl) (EL 0 vl,EL 1 vl)` (C SUBGOAL_THEN SUBST1_TAC);
3138     BY(ASM_MESON_TAC[Bump.MCELL3]);
3139   MATCH_MP_TAC MCELL3_DIHX_POS;
3140   REWRITE_TAC[];
3141   ASM_REWRITE_TAC[];
3142   BY(ASM_MESON_TAC[Bump.MCELL3])
3143   ]);;
3144   (* }}} *)
3145
3146 let MCELL4_REPARAM = prove_by_refinement(
3147   `!V ul vl.  packing V /\ saturated V /\ CARD (set_of_list ul) = 4 /\ (set_of_list ul = set_of_list vl) /\
3148     LENGTH vl = 4 /\ ~(NULLSET (mcell4 V ul)) /\
3149     barV V 3 ul ==> mcell4 V ul = mcell4 V vl /\ barV V 3 vl`,
3150   (* {{{ proof *)
3151   [
3152   REPEAT WEAKER_STRIP_TAC;
3153   INTRO_TAC Marchal_cells_3.LEFT_ACTION_LIST_3_EXISTS [`EL 0 ul`;`EL 1 ul`;`EL 2 ul`;`EL 3 ul`;`EL 0 vl`;`EL 1 vl`;`EL 2 vl`;`EL 3 vl`];
3154   TYPIFY `set_of_list ul = {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul}` (C SUBGOAL_THEN ASSUME_TAC);
3155     MATCH_MP_TAC Bump.set_of_list4;
3156     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
3157     BY(ASM_MESON_TAC[]);
3158   TYPIFY `set_of_list vl = {EL 0 vl,EL 1 vl,EL 2 vl,EL 3 vl}` (C SUBGOAL_THEN ASSUME_TAC);
3159     MATCH_MP_TAC Bump.set_of_list4;
3160     BY(ASM_REWRITE_TAC[]);
3161   ANTS_TAC;
3162     BY(ASM_MESON_TAC[]);
3163   REPEAT WEAKER_STRIP_TAC;
3164   TYPIFY `ul = [EL 0 ul;EL 1 ul;EL 2 ul;EL 3 ul]` (C SUBGOAL_THEN ASSUME_TAC);
3165     MATCH_MP_TAC Bump.LENGTH4;
3166     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
3167     BY(ASM_MESON_TAC[]);
3168   TYPIFY `vl = [EL 0 vl;EL 1 vl;EL 2 vl;EL 3 vl]` (C SUBGOAL_THEN ASSUME_TAC);
3169     MATCH_MP_TAC Bump.LENGTH4;
3170     BY(ASM_REWRITE_TAC[]);
3171   INTRO_TAC Rvfxzbu.RVFXZBU [`V`;`ul`;`4`;`p`];
3172   ASM_REWRITE_TAC[IN_INSERT;arith `4 - 1 = 3`];
3173   DISCH_TAC;
3174   SUBCONJ_TAC;
3175     BY(ASM_MESON_TAC[Bump.MCELL4]);
3176   DISCH_TAC;
3177   INTRO_TAC Qzksykg.QZKSYKG1 [`V`;`ul`;`vl`;`4`;`p`];
3178   DISCH_THEN MATCH_MP_TAC;
3179   ASM_REWRITE_TAC[IN_INSERT;arith `4 - 1 = 3`];
3180   BY(ASM_MESON_TAC[Bump.MCELL4;NEGLIGIBLE_EMPTY])
3181   ]);;
3182   (* }}} *)
3183
3184 let MCELL4_GG = prove_by_refinement(
3185  `!V X ul w0 n f i.
3186          packing V /\
3187          saturated V /\
3188          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3189          barV V 3 ul /\
3190          ~collinear {EL 0 ul, EL 1 ul, w0} /\
3191          1 < n /\
3192         X = mcell4 V ul /\
3193          ~NULLSET X /\
3194          X SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==>
3195    gg_mcell V f (EL 0 ul) (EL 1 ul) i = 
3196              gammaX V X lmfun * critical_weight V X + beta_bump_v1 V {EL 0 ul,EL 1 ul} X`,
3197   (* {{{ proof *)
3198   [
3199   REPEAT WEAKER_STRIP_TAC;
3200   REWRITE_TAC[gg_mcell];
3201   TYPIFY `{X | mcell_set V X /\       {EL 0 ul, EL 1 ul} IN edgeX V X /\       X SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))} = {X}` ENOUGH_TO_SHOW_TAC;
3202     DISCH_THEN SUBST1_TAC;
3203     BY(REWRITE_TAC[SUM_SING]);
3204   ONCE_REWRITE_TAC[EXTENSION];
3205   REWRITE_TAC[IN_SING;IN_ELIM_THM];
3206   REWRITE_TAC[Geomdetail.EQ_EXPAND];
3207   REPEAT WEAKER_STRIP_TAC;
3208   CONJ2_TAC;
3209     DISCH_THEN SUBST1_TAC;
3210     ASM_SIMP_TAC[];
3211     REWRITE_TAC[Pack_defs.mcell_set];
3212     REWRITE_TAC[Pack_defs.mcell_set;IN_ELIM_THM];
3213     CONJ_TAC;
3214       BY(ASM_MESON_TAC[Bump.MCELL4;IN]);
3215     GMATCH_SIMP_TAC Bump.MCELL4_EDGE;
3216     CONJ_TAC;
3217       BY(ASM_MESON_TAC[]);
3218     SUBCONJ_TAC;
3219       MATCH_MP_TAC Marchal_cells_2_new.CARD4_IMP_DISTINCT;
3220       GEXISTL_TAC [`EL 2 ul`;`EL 3 ul`];
3221       MATCH_MP_TAC MCELL4_CARD4;
3222       BY(ASM_MESON_TAC[]);
3223     DISCH_TAC;
3224     GMATCH_SIMP_TAC Bump.set_of_list4;
3225     CONJ2_TAC;
3226       BY(SET_TAC[]);
3227     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
3228     BY(ASM_MESON_TAC[]);
3229   REPEAT WEAKER_STRIP_TAC;
3230   ASM_REWRITE_TAC[];
3231   MATCH_MP_TAC MCELL4_FULL_WEDGE;
3232   GEXISTL_TAC [`w0`;`n`;`f`;`i`];
3233   ASM_SIMP_TAC[];
3234   BY(ASM_MESON_TAC[])
3235   ]);;
3236   (* }}} *)
3237
3238 let LEAF_RANK_TRUNCATE = prove_by_refinement(
3239   `!V ul w0 n f. leaf_rank V ul w0 n f = leaf_rank V [EL 0 ul;EL 1 ul] w0 n f`,
3240   (* {{{ proof *)
3241   [
3242   REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT];
3243   BY(MESON_TAC[S_LEAF_TRUNCATE])
3244   ]);;
3245   (* }}} *)
3246
3247 let LEAF_RANK_S_LEAF = prove_by_refinement(
3248   `!V ul w0 n f i.  leaf_rank V ul w0 n f ==> s_leaf V ul (f i)`,
3249   (* {{{ proof *)
3250   [
3251   REWRITE_TAC[leaf_rank;IMAGE;EXTENSION;IN_ELIM_THM;IN_UNIV];
3252   BY(MESON_TAC[IN])
3253   ]);;
3254   (* }}} *)
3255
3256 let CC_CELL_SUBSET_WEDGE = prove_by_refinement(
3257   `!V ul u0 u1 w0 n f j.
3258          packing V /\
3259          saturated V /\
3260          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3261        (1 < n) /\
3262           {u0,u1} = {EL 0 ul,EL 1 ul} /\
3263          ~collinear {EL 0 ul, EL 1 ul, w0} ==>
3264        cc_cell V [u0;u1;f j] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f j) (f (SUC j)) \/
3265        cc_cell V [u0;u1;f j] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f (j+(n-1))) (f j)`,
3266   (* {{{ proof *)
3267   [
3268   REPEAT WEAKER_STRIP_TAC;
3269   TYPIFY `?i. (i < n) /\ f j = f i /\ f(SUC j) = f(SUC i) /\ f(j+(n-1)) = f(i+(n-1))` (C SUBGOAL_THEN MP_TAC);
3270     TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
3271       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
3272     TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
3273       BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
3274     TYPIFY `j MOD n` EXISTS_TAC;
3275     BY(ASM_SIMP_TAC[F_DEMOD;FM_DEMOD;DIVISION]);
3276   DISCH_THEN (fun t -> REPEAT (FIRST_X_ASSUM MP_TAC) THEN MP_TAC t);
3277   STRIP_TAC;
3278   ASM_REWRITE_TAC[];
3279   REPLICATE_TAC 3 (FIRST_X_ASSUM kill);
3280   REPEAT WEAKER_STRIP_TAC;
3281   COMMENT "restart";
3282   TYPIFY `!i. leaf V [EL 0 ul; EL 1 ul; f i]` (C SUBGOAL_THEN ASSUME_TAC);
3283     GEN_TAC;
3284     MATCH_MP_TAC s_leaf_leaf;
3285     REWRITE_TAC[IN];
3286     MATCH_MP_TAC LEAF_RANK_S_LEAF;
3287     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
3288   TYPIFY `leaf V [u0;u1;f i]` (C SUBGOAL_THEN ASSUME_TAC);
3289     FIRST_X_ASSUM_ST `=` MP_TAC;
3290     REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
3291     DISCH_THEN DISJ_CASES_TAC;
3292       BY(ASM_REWRITE_TAC[]);
3293     ASM_REWRITE_TAC[];
3294     INTRO_TAC Leaf_cell.ZASUVOR [`V`;`EL 0 ul`;`EL 1 ul`;`f i`];
3295     ANTS_TAC;
3296       BY(ASM_REWRITE_TAC[]);
3297     BY(MESON_TAC[]);
3298   COMMENT "f periodic";
3299   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
3300     BY(ASM_MESON_TAC[LEAF_RANK_PERIODIC]);
3301   COMMENT "mcell in wedge";
3302   INTRO_TAC MCELL_IN_WEDGE [`V`;` [EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`;`cc_cell V [u0;u1;f i]`];
3303   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3304   ANTS_TAC;
3305     CONJ_TAC;
3306       MATCH_MP_TAC LEAF_RANK_HAS_SIZE;
3307       REWRITE_TAC[Bump.EL_EXPLICIT];
3308       BY(ASM_MESON_TAC[arith `1 < n ==> ~(n=0)`]);
3309     CONJ_TAC;
3310       ONCE_REWRITE_TAC[GSYM IN];
3311       MATCH_MP_TAC Leaf_cell.CC_CELL_IN_MCELL_SET;
3312       BY(ASM_REWRITE_TAC[]);
3313     CONJ_TAC;
3314       BY(ASM_MESON_TAC[Leaf_cell.CC_CELL_NOT_NULLSET]);
3315     INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[u0;u1; f i]`];
3316     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
3317   REPEAT WEAKER_STRIP_TAC;
3318   COMMENT "f i' in wedge";
3319   INTRO_TAC Leaf_cell.U2_IN_CC_CELL [`V`;`[u0;u1;f i]`];
3320   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3321   DISCH_TAC;
3322   INTRO_TAC S_LEAF_IN_WEDGE_GE [`V`;`[EL 0 ul;EL 1 ul]`;`f i`;`w0`;`n`;`f`;`i'`;`i`];
3323   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3324   ANTS_TAC;
3325     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN SET_TAC[]);
3326   COMMENT "first case";
3327   DISCH_THEN DISJ_CASES_TAC;
3328     INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`;`i`;`i'`];
3329     ASM_REWRITE_TAC[Bump.EL_EXPLICIT;AZIM_REFL];
3330     ASM_SIMP_TAC[arith `1 < n ==> ~(n=0)`];
3331     DISCH_TAC;
3332     TYPIFY `f (SUC i') = f (SUC i)` ENOUGH_TO_SHOW_TAC;
3333       BY(ASM_MESON_TAC[]);
3334     GMATCH_SIMP_TAC Oxl_def.periodic_mod;
3335     TYPIFY `n` EXISTS_TAC;
3336     GMATCH_SIMP_TAC (GSYM Hypermap.lemma_suc_mod);
3337     FIRST_X_ASSUM (SUBST1_TAC o GSYM);
3338     BY(ASM_MESON_TAC[Hypermap.lemma_suc_mod;Oxl_def.periodic_mod;arith `1 < n ==> ~(n=0)`]);
3339   DISJ2_TAC;
3340   COMMENT "second case";
3341   TYPIFY `f i' = f (i + n - 1)` ENOUGH_TO_SHOW_TAC;
3342     BY(ASM_MESON_TAC[]);
3343   INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`;`i`;`SUC i'`];
3344   ASM_REWRITE_TAC[Bump.EL_EXPLICIT;AZIM_REFL];
3345   ASM_SIMP_TAC[arith `1 < n ==> ~(n=0)`];
3346   DISCH_TAC;
3347   TYPIFY `i' MOD n = (i + n - 1) MOD n` ENOUGH_TO_SHOW_TAC;
3348     DISCH_TAC;
3349     BY(ASM_MESON_TAC [Oxl_def.periodic_mod;arith `1 < n ==> ~(n = 0)`]);
3350   GMATCH_SIMP_TAC (GSYM MOD_ADD_MOD);
3351   ASM_REWRITE_TAC[];
3352   GMATCH_SIMP_TAC MOD_ADD_MOD;
3353   TYPIFY `SUC i' + n - 1 = 1*n + i'` (C SUBGOAL_THEN SUBST1_TAC);
3354     BY(FIRST_X_ASSUM_ST `1 < n` MP_TAC THEN ARITH_TAC);
3355   REWRITE_TAC[MOD_MULT_ADD];
3356   BY(ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`])
3357   ]);;
3358   (* }}} *)
3359
3360 (*
3361 let CC_CELL_SUBSET_WEDGE = prove_by_refinement(
3362   `!V ul u0 u1 w0 n f i.
3363          packing V /\
3364          saturated V /\
3365          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3366        (1 < n) /\
3367       (i < n) /\
3368           {u0,u1} = {EL 0 ul,EL 1 ul} /\
3369          ~collinear {EL 0 ul, EL 1 ul, w0} ==>
3370        cc_cell V [u0;u1;f i] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) \/
3371        cc_cell V [u0;u1;f i] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f (i+(n-1))) (f i)`,
3372   (* {{{ proof *)
3373   [
3374   REPEAT WEAKER_STRIP_TAC;
3375   TYPIFY `!i. leaf V [EL 0 ul; EL 1 ul; f i]` (C SUBGOAL_THEN ASSUME_TAC);
3376     GEN_TAC;
3377     MATCH_MP_TAC s_leaf_leaf;
3378     REWRITE_TAC[IN];
3379     MATCH_MP_TAC LEAF_RANK_S_LEAF;
3380     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
3381   TYPIFY `leaf V [u0;u1;f i]` (C SUBGOAL_THEN ASSUME_TAC);
3382     FIRST_X_ASSUM_ST `=` MP_TAC;
3383     REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
3384     DISCH_THEN DISJ_CASES_TAC;
3385       BY(ASM_REWRITE_TAC[]);
3386     ASM_REWRITE_TAC[];
3387     INTRO_TAC Leaf_cell.ZASUVOR [`V`;`EL 0 ul`;`EL 1 ul`;`f i`];
3388     ANTS_TAC;
3389       BY(ASM_REWRITE_TAC[]);
3390     BY(MESON_TAC[]);
3391   COMMENT "f periodic";
3392   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
3393     BY(ASM_MESON_TAC[LEAF_RANK_PERIODIC]);
3394   COMMENT "mcell in wedge";
3395   INTRO_TAC MCELL_IN_WEDGE [`V`;` [EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`;`cc_cell V [u0;u1;f i]`];
3396   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3397   ANTS_TAC;
3398     CONJ_TAC;
3399       MATCH_MP_TAC LEAF_RANK_HAS_SIZE;
3400       REWRITE_TAC[Bump.EL_EXPLICIT];
3401       BY(ASM_MESON_TAC[arith `1 < n ==> ~(n=0)`]);
3402     CONJ_TAC;
3403       ONCE_REWRITE_TAC[GSYM IN];
3404       MATCH_MP_TAC Leaf_cell.CC_CELL_IN_MCELL_SET;
3405       BY(ASM_REWRITE_TAC[]);
3406     CONJ_TAC;
3407       BY(ASM_MESON_TAC[Leaf_cell.CC_CELL_NOT_NULLSET]);
3408     INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[u0;u1; f i]`];
3409     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
3410   REPEAT WEAKER_STRIP_TAC;
3411   COMMENT "f i' in wedge";
3412   INTRO_TAC Leaf_cell.U2_IN_CC_CELL [`V`;`[u0;u1;f i]`];
3413   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3414   DISCH_TAC;
3415   INTRO_TAC S_LEAF_IN_WEDGE_GE [`V`;`[EL 0 ul;EL 1 ul]`;`f i`;`w0`;`n`;`f`;`i'`;`i`];
3416   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3417   ANTS_TAC;
3418     BY(REPLICATE_TAC 2 (FIRST_X_ASSUM MP_TAC) THEN SET_TAC[]);
3419   COMMENT "first case";
3420   DISCH_THEN DISJ_CASES_TAC;
3421     INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`;`i`;`i'`];
3422     ASM_REWRITE_TAC[Bump.EL_EXPLICIT;AZIM_REFL];
3423     ASM_SIMP_TAC[arith `1 < n ==> ~(n=0)`];
3424     DISCH_TAC;
3425     TYPIFY `f (SUC i') = f (SUC i)` ENOUGH_TO_SHOW_TAC;
3426       BY(ASM_MESON_TAC[]);
3427     GMATCH_SIMP_TAC Oxl_def.periodic_mod;
3428     TYPIFY `n` EXISTS_TAC;
3429     GMATCH_SIMP_TAC (GSYM Hypermap.lemma_suc_mod);
3430     FIRST_X_ASSUM (SUBST1_TAC o GSYM);
3431     BY(ASM_MESON_TAC[Hypermap.lemma_suc_mod;Oxl_def.periodic_mod;arith `1 < n ==> ~(n=0)`]);
3432   DISJ2_TAC;
3433   COMMENT "second case";
3434   TYPIFY `f i' = f (i + n - 1)` ENOUGH_TO_SHOW_TAC;
3435     BY(ASM_MESON_TAC[]);
3436   INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`;`i`;`SUC i'`];
3437   ASM_REWRITE_TAC[Bump.EL_EXPLICIT;AZIM_REFL];
3438   ASM_SIMP_TAC[arith `1 < n ==> ~(n=0)`];
3439   DISCH_TAC;
3440   TYPIFY `i' MOD n = (i + n - 1) MOD n` ENOUGH_TO_SHOW_TAC;
3441     DISCH_TAC;
3442     BY(ASM_MESON_TAC [Oxl_def.periodic_mod;arith `1 < n ==> ~(n = 0)`]);
3443   GMATCH_SIMP_TAC (GSYM MOD_ADD_MOD);
3444   ASM_REWRITE_TAC[];
3445   GMATCH_SIMP_TAC MOD_ADD_MOD;
3446   TYPIFY `SUC i' + n - 1 = 1*n + i'` (C SUBGOAL_THEN SUBST1_TAC);
3447     BY(FIRST_X_ASSUM_ST `1 < n` MP_TAC THEN ARITH_TAC);
3448   REWRITE_TAC[MOD_MULT_ADD];
3449   BY(ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`])
3450   ]);;
3451   (* }}} *)
3452 *)
3453
3454 let WEDGE_UNIQUE_CC_CELL = prove_by_refinement(
3455   `!V ul w0 n f i j.
3456          packing V /\
3457          saturated V /\
3458          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3459          1 < n /\
3460          ~collinear {EL 0 ul, EL 1 ul, w0} ==>
3461          (~(cc_cell V [EL 0 ul;EL 1 ul;f j] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f(SUC i))) \/
3462          ~(cc_cell V [EL 1 ul;EL 0 ul;f j] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f(SUC i))))`,
3463   (* {{{ proof *)
3464   [
3465   REWRITE_TAC[GSYM DE_MORGAN_THM];
3466   REPEAT WEAKER_STRIP_TAC;
3467   TYPIFY `cc_ke V [EL 0 ul;EL 1 ul;f j] = 4 \/ cc_ke V [EL 1 ul;EL 0 ul;f j] = 4` (C SUBGOAL_THEN ASSUME_TAC);
3468     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
3469     REWRITE_TAC[leaf_rank;IMAGE;EXTENSION;IN_UNIV;IN_ELIM_THM];
3470     REWRITE_TAC[IN;s_leaf;Bump.EL_EXPLICIT];
3471     BY(MESON_TAC[]);
3472   COMMENT "do symmetry reduction";
3473   TYPED_ABBREV_TAC  `(W:real^3->bool) = wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))` ;
3474   TYPIFY `!u0 u1. {u0,u1} = {EL 0 ul,EL 1 ul} /\ cc_ke V [u0;u1;f j] = 4 /\ cc_cell V [u0;u1;f j] SUBSET W /\ cc_cell V [u1;u0;f j] SUBSET W ==> F` ENOUGH_TO_SHOW_TAC;
3475     DISCH_THEN MATCH_MP_TAC;
3476     FIRST_X_ASSUM DISJ_CASES_TAC;
3477       GEXISTL_TAC [`EL 0 ul`;`EL 1 ul`];
3478       BY(ASM_REWRITE_TAC[]);
3479     GEXISTL_TAC [`EL 1 ul`;`EL 0 ul`];
3480     ASM_REWRITE_TAC[];
3481     BY(SET_TAC[]);
3482   REPEAT WEAKER_STRIP_TAC;
3483   COMMENT "basic facts";
3484   TYPIFY `!j. leaf V [EL 0 ul; EL 1 ul; f j]` (C SUBGOAL_THEN ASSUME_TAC);
3485     GEN_TAC;
3486     MATCH_MP_TAC s_leaf_leaf;
3487     REWRITE_TAC[IN];
3488     MATCH_MP_TAC LEAF_RANK_S_LEAF;
3489     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
3490   TYPIFY `leaf V [u0;u1;f j]` (C SUBGOAL_THEN ASSUME_TAC);
3491     FIRST_X_ASSUM_ST `{u0,u1} = {v0,v1}` MP_TAC;
3492     REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
3493     DISCH_THEN DISJ_CASES_TAC;
3494       BY(ASM_REWRITE_TAC[]);
3495     ASM_REWRITE_TAC[];
3496     INTRO_TAC Leaf_cell.ZASUVOR [`V`;`EL 0 ul`;`EL 1 ul`;`f j`];
3497     ANTS_TAC;
3498       BY(ASM_REWRITE_TAC[]);
3499     BY(MESON_TAC[]);
3500   TYPIFY `leaf V [u1;u0;f j]` (C SUBGOAL_THEN ASSUME_TAC);
3501     INTRO_TAC Leaf_cell.ZASUVOR [`V`;`u0`;`u1`;`f j`];
3502     ANTS_TAC;
3503       BY(ASM_REWRITE_TAC[]);
3504     BY(MESON_TAC[]);
3505   COMMENT "show 4-cell has standard form";
3506   INTRO_TAC Leaf_cell.MCELL4_EDGE_FIRST [`V`;`cc_uh V [u0;u1;f j]`;`EL 0 ul`;`EL 1 ul`];
3507   ANTS_TAC;
3508     ASM_REWRITE_TAC[];
3509     SUBCONJ_TAC;
3510       BY(ASM_MESON_TAC[Leaf_cell.cc_uh]);
3511     DISCH_TAC;
3512     INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[u0;u1;f j]`];
3513     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT;Leaf_cell.cc_cell;Bump.MCELL4]);
3514   REWRITE_TAC[];
3515   ONCE_REWRITE_TAC[EQ_SYM_EQ];
3516   REPEAT WEAKER_STRIP_TAC;
3517   TYPIFY `cc_cell V [u0;u1;f j] = mcell4 V vl` (C SUBGOAL_THEN ASSUME_TAC);
3518     BY(ASM_MESON_TAC[Leaf_cell.cc_cell;Bump.MCELL4]);
3519   INTRO_TAC MCELL4_FI [`V`;`vl`;`w0`;`n`;`f`;`i`];
3520   ANTS_TAC;
3521     BY(ASM_MESON_TAC[IN;Leaf_cell.CC_CELL_NOT_NULLSET]);
3522   COMMENT "show two cc cells are equal";
3523   DISCH_TAC;
3524   INTRO_TAC MCELL4_FULL_WEDGE [`V`;`cc_cell V [u1;u0;f j]`;`vl`;`w0`;`n`;`f`;`i`];
3525   ANTS_TAC;
3526     ASM_REWRITE_TAC[];
3527     CONJ_TAC;
3528       BY(ASM_MESON_TAC[IN]);
3529     CONJ_TAC;
3530       BY(ASM_MESON_TAC[IN;Leaf_cell.CC_CELL_NOT_NULLSET]);
3531     CONJ_TAC;
3532       BY(ASM_MESON_TAC[Leaf_cell.CC_CELL_IN_MCELL_SET;IN]);
3533     CONJ_TAC;
3534       INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[u1;u0;f j]`];
3535       ANTS_TAC;
3536         BY(ASM_REWRITE_TAC[]);
3537       ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3538       TYPIFY `{u1,u0} = {u0,u1}` (C SUBGOAL_THEN SUBST1_TAC);
3539         BY(SET_TAC[]);
3540       BY(ASM_REWRITE_TAC[]);
3541     BY(ASM_MESON_TAC[]);
3542   DISCH_TAC;
3543   COMMENT "deal with equality";
3544   TYPIFY `~(EL 0 ul = EL 1 ul)` (C SUBGOAL_THEN ASSUME_TAC);
3545     BY(ASM_MESON_TAC[Collect_geom.NOT_COLLINEAR_IMP_2_UNEQUAL]);
3546   TYPIFY `~(u0 = u1)` (C SUBGOAL_THEN ASSUME_TAC);
3547     FIRST_X_ASSUM_ST `{u0,u1} = {v0,v1}` MP_TAC;
3548     REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
3549     DISCH_THEN DISJ_CASES_TAC;
3550       BY(ASM_REWRITE_TAC[]);
3551     BY(ASM_REWRITE_TAC[]);
3552   INTRO_TAC Leaf_cell.FUEIMOV_4 [`V`;`[u0;u1;f j]`;`[u1;u0;f j]`];
3553   ASM_REWRITE_TAC[Bump.EL_EXPLICIT;CONS_11];
3554   DISCH_THEN MP_TAC THEN ANTS_TAC;
3555     TYPIFY `{u0,u1} = {u1,u0}` (C SUBGOAL_THEN ASSUME_TAC);
3556       BY(SET_TAC[]);
3557     REPEAT (GMATCH_SIMP_TAC Leaf_cell.STEM_OF_LEAF);
3558     REWRITE_TAC[Bump.EL_EXPLICIT];
3559     BY(ASM_MESON_TAC[]);
3560   DISCH_TAC;
3561   TYPIFY `EL 3 (cc_uh V [u1;u0;f j]) = f j` (C SUBGOAL_THEN ASSUME_TAC);
3562     FIRST_X_ASSUM SUBST1_TAC;
3563     BY(REWRITE_TAC[Bump.EL_EXPLICIT]);
3564   INTRO_TAC Leaf_cell.CC_CELL_NOT_NULLSET [`V`;`[u1;u0;f j]`];
3565   ANTS_TAC;
3566     BY(ASM_REWRITE_TAC[]);
3567   REWRITE_TAC[];
3568   PROOF_BY_CONTR_TAC;
3569   INTRO_TAC Leaf_cell.CC_CELL4 [`V`;`[u1;u0;f j]`];
3570   ANTS_TAC;
3571     ASM_REWRITE_TAC[];
3572     INTRO_TAC Ajripqn.AJRIPQN [`V`;`vl`;`cc_uh V [u1;u0;f j]`;`4`;`cc_ke V [u1;u0;f j]`];
3573     ANTS_TAC;
3574       TYPIFY `saturated V /\  packing V /\  barV V 3 vl` (C SUBGOAL_THEN (unlist REWRITE_TAC));
3575         BY(ASM_MESON_TAC[IN]);
3576       CONJ_TAC;
3577         BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
3578       CONJ_TAC;
3579         BY(SET_TAC[]);
3580       REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
3581       CONJ_TAC;
3582         BY(MESON_TAC[Leaf_cell.CC_KE_34]);
3583       TYPIFY `(mcell 4 V vl INTER    mcell (cc_ke V [u1; u0; f j]) V (cc_uh V [u1; u0; f j])) = cc_cell V [u1;u0; f j]` ENOUGH_TO_SHOW_TAC;
3584         DISCH_THEN SUBST1_TAC;
3585         BY(ASM_REWRITE_TAC[]);
3586       REWRITE_TAC[GSYM Bump.MCELL4];
3587       BY(ASM_MESON_TAC[INTER_IDEMPOT;Leaf_cell.cc_cell]);
3588     BY(MESON_TAC[]);
3589   DISCH_TAC;
3590   TYPIFY `set_of_list (cc_uh V [u1;u0;f j]) SUBSET affine hull {u1,u0,f j}` ENOUGH_TO_SHOW_TAC;
3591     DISCH_TAC;
3592     FIRST_X_ASSUM_ST `NULLSET` MP_TAC;
3593     REWRITE_TAC[];
3594     MATCH_MP_TAC NEGLIGIBLE_SUBSET;
3595     TYPIFY `affine hull {u1,u0,f j}` EXISTS_TAC;
3596     REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3];
3597     FIRST_X_ASSUM_ST `cc_cell V ul = x` SUBST1_TAC;
3598     FIRST_X_ASSUM (MP_TAC o (MATCH_MP Marchal_cells.CONVEX_HULL_SUBSET));
3599     BY(MESON_TAC[CONVEX_HULL_EQ;AFFINE_AFFINE_HULL;AFFINE_IMP_CONVEX]);
3600   MATCH_MP_TAC SUBSET_TRANS;
3601   TYPIFY `{u1,u0,f j}` EXISTS_TAC;
3602   REWRITE_TAC[Counting_spheres.SUBSET_P_HULL];
3603   INTRO_TAC Leaf_cell.EL_CC_UH [`V`;`[u1;u0;f j]`];
3604   ANTS_TAC;
3605     BY(ASM_REWRITE_TAC[]);
3606   REWRITE_TAC[Bump.EL_EXPLICIT];
3607   REPEAT WEAKER_STRIP_TAC;
3608   GMATCH_SIMP_TAC Bump.set_of_list4;
3609   CONJ_TAC;
3610     INTRO_TAC Leaf_cell.cc_uh [`V`;`[u1;u0;f j]`];
3611     ANTS_TAC;
3612       BY(ASM_MESON_TAC[]);
3613     BY(MESON_TAC[IN;Sphere.BARV;arith `3 + 1 = 4`]);
3614   ASM_REWRITE_TAC[];
3615   BY(SET_TAC[])
3616   ]);;
3617   (* }}} *)
3618
3619 (*
3620 let WEDGE_UNIQUE_CC_CELL_ALT = prove_by_refinement(
3621   `!V ul w0 n f i j.
3622          packing V /\
3623          saturated V /\
3624          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3625          1 < n /\
3626          ~collinear {EL 0 ul, EL 1 ul, w0} ==>
3627          (~(cc_cell V [EL 0 ul;EL 1 ul;f j] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f(SUC i))) \/
3628          ~(cc_cell V [EL 1 ul;EL 0 ul;f j] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f(SUC i))))`,
3629   (* {{{ proof *)
3630   [
3631   REPEAT WEAKER_STRIP_TAC;
3632   TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
3633     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
3634   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
3635     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
3636   INTRO_TAC WEDGE_UNIQUE_CC_CELL [`V`;`ul`;`w0`;`n`;`f`;`i MOD n`;`j`];
3637   BY(ASM_SIMP_TAC[DIVISION;F_DEMOD])
3638   ]);;
3639   (* }}} *)
3640 *)
3641
3642 let LEAF_RANK4_CHI_MSB = prove_by_refinement(
3643   `!V ul w0 n f i.  packing V /\
3644          saturated V /\
3645     barV V 3 ul /\
3646          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3647          ~collinear {EL 0 ul, EL 1 ul, w0} /\
3648          1 < n /\
3649          i < n /\ 
3650     ~NULLSET (mcell4 V ul) /\ 
3651      mcell4 V ul SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==>
3652     &0 < chi_msb [EL 0 ul;EL 1 ul;f i] (f (SUC i))`,
3653   (* {{{ proof *)
3654   [
3655   REPEAT WEAKER_STRIP_TAC;
3656   INTRO_TAC MCELL4_AZIM_LT_PI [`V`;`ul`;`w0`;`n`;`f`;`i`];
3657   ANTS_TAC;
3658     BY(ASM_REWRITE_TAC[]);
3659   DISCH_TAC;
3660   REWRITE_TAC[Leaf_cell.chi_msb;GSYM Local_lemmas.SIN_AZIM_MUTUAL_SROSS;Bump.EL_EXPLICIT];
3661   INTRO_TAC (GSYM AZIM_TRANSLATION) [`EL 0 ul`;`(vec 0):real^3`;`(EL 1 ul - EL 0 ul):real^3`;`(f i - EL 0 ul):real^3`;`(f (SUC i) - EL 0 ul):real^3`];
3662   REWRITE_TAC[varith `!(u:real^3) v.  v + u - v = u`;varith `!(u:real^3). u + vec 0 = u`];
3663   DISCH_THEN SUBST1_TAC;
3664   MATCH_MP_TAC SIN_POS_PI;
3665   ASM_REWRITE_TAC[];
3666   MATCH_MP_TAC (arith `~(x = &0) /\ (&0 <= x) ==> &0 < x`);
3667   REWRITE_TAC[Local_lemmas.AZIM_RANGE];
3668   GMATCH_SIMP_TAC LEAF_RANK_AZIM_INJ;
3669   TYPIFY `n` EXISTS_TAC;
3670   CONJ_TAC;
3671     GEXISTL_TAC [`V`;`w0`];
3672     ASM_SIMP_TAC[arith `1 < n ==> ~(n=0)`];
3673     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
3674   ASM_SIMP_TAC[MOD_LT];
3675   TYPIFY `SUC i < n \/ SUC i = n` (C SUBGOAL_THEN DISJ_CASES_TAC);
3676       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
3677     ASM_SIMP_TAC[MOD_LT];
3678     BY(ARITH_TAC);
3679   ASM_SIMP_TAC[MOD_REFL_ALT;arith `1 < n ==> ~(n  = 0)`];
3680   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC)
3681   ]);;
3682   (* }}} *)
3683
3684 let LEAF_RANK4_CHI_MSB_ALT = prove_by_refinement(
3685   `!V ul w0 n f i.  packing V /\
3686          saturated V /\
3687     barV V 3 ul /\
3688          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3689          ~collinear {EL 0 ul, EL 1 ul, w0} /\
3690          1 < n /\
3691     ~NULLSET (mcell4 V ul) /\ 
3692      mcell4 V ul SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) ==>
3693     &0 < chi_msb [EL 0 ul;EL 1 ul;f i] (f (SUC i))`,
3694   (* {{{ proof *)
3695   [
3696   REPEAT WEAKER_STRIP_TAC;
3697   INTRO_TAC PERIODIC_REDUCE_MOD [`f`;`n`;`i`];
3698   ANTS_TAC;
3699     ASM_SIMP_TAC[ arith `1 < n ==> 1 <= n`];
3700     BY(ASM_MESON_TAC[LEAF_RANK_PERIODIC]);
3701   REPEAT WEAKER_STRIP_TAC;
3702   INTRO_TAC LEAF_RANK4_CHI_MSB [`V`;`ul`;`w0`;`n`;`f`;`j`];
3703   ASM_REWRITE_TAC[];
3704   DISCH_THEN MATCH_MP_TAC;
3705   BY(ASM_MESON_TAC[])
3706   ]);;
3707   (* }}} *)
3708
3709 let CC_CELL_WEDGE_MATCH_UH = prove_by_refinement(
3710   `!V ul u0 u1 w0 n f i j.  packing V /\
3711          saturated V /\
3712          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3713          ~collinear {EL 0 ul, EL 1 ul, w0} /\
3714          1 < n /\
3715     {u0,u1} = {EL 0 ul,EL 1 ul} /\
3716     cc_cell V [u0;u1;f j] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) /\
3717     cc_ke V [u0;u1;f j] = 4 ==>
3718     {f j, EL 3 (cc_uh V [u0;u1;f j])} = {f i, f (SUC i)}`,
3719   (* {{{ proof *)
3720   [
3721   REPEAT WEAKER_STRIP_TAC;
3722   COMMENT "basic facts";
3723   TYPIFY `!j. leaf V [EL 0 ul; EL 1 ul; f j]` (C SUBGOAL_THEN ASSUME_TAC);
3724     GEN_TAC;
3725     MATCH_MP_TAC s_leaf_leaf;
3726     REWRITE_TAC[IN];
3727     MATCH_MP_TAC LEAF_RANK_S_LEAF;
3728     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
3729   TYPIFY `leaf V [u0;u1;f j]` (C SUBGOAL_THEN ASSUME_TAC);
3730     FIRST_X_ASSUM_ST `{u0,u1} = {v0,v1}` MP_TAC;
3731     REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
3732     DISCH_THEN DISJ_CASES_TAC;
3733       BY(ASM_REWRITE_TAC[]);
3734     ASM_REWRITE_TAC[];
3735     INTRO_TAC Leaf_cell.ZASUVOR [`V`;`EL 0 ul`;`EL 1 ul`;`f j`];
3736     ANTS_TAC;
3737       BY(ASM_REWRITE_TAC[]);
3738     BY(MESON_TAC[]);
3739   TYPIFY `leaf V [u1;u0;f j]` (C SUBGOAL_THEN ASSUME_TAC);
3740     INTRO_TAC Leaf_cell.ZASUVOR [`V`;`u0`;`u1`;`f j`];
3741     ANTS_TAC;
3742       BY(ASM_REWRITE_TAC[]);
3743     BY(MESON_TAC[]);
3744   INTRO_TAC Leaf_cell.EL_CC_UH [`V`;`[u0;u1;f j]`];
3745   ANTS_TAC;
3746     BY(ASM_REWRITE_TAC[]);
3747   REWRITE_TAC[Bump.EL_EXPLICIT];
3748   REPEAT WEAKER_STRIP_TAC;
3749   TYPIFY `~(NULLSET (cc_cell V [u0;u1;f j]))` (C SUBGOAL_THEN ASSUME_TAC);
3750     BY(ASM_MESON_TAC[IN;Leaf_cell.CC_CELL_NOT_NULLSET]);
3751   COMMENT "show 4-cell has standard form";
3752   PROOF_BY_CONTR_TAC;
3753   INTRO_TAC Leaf_cell.MCELL4_EDGE_FIRST [`V`;`cc_uh V [u0;u1;f j]`;`EL 0 ul`;`EL 1 ul`];
3754   ANTS_TAC;
3755     ASM_REWRITE_TAC[];
3756     SUBCONJ_TAC;
3757       BY(ASM_MESON_TAC[Leaf_cell.cc_uh]);
3758     DISCH_TAC;
3759     INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[u0;u1;f j]`];
3760     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT;Leaf_cell.cc_cell;Bump.MCELL4]);
3761   REWRITE_TAC[];
3762   ONCE_REWRITE_TAC[EQ_SYM_EQ];
3763   REPEAT WEAKER_STRIP_TAC;
3764   TYPIFY `cc_cell V [u0;u1;f j] = mcell4 V vl` (C SUBGOAL_THEN ASSUME_TAC);
3765     BY(ASM_MESON_TAC[Leaf_cell.cc_cell;Bump.MCELL4]);
3766   INTRO_TAC MCELL4_FI [`V`;`vl`;`w0`;`n`;`f`;`i`];
3767   ANTS_TAC;
3768     BY(ASM_MESON_TAC[IN]);
3769   DISCH_TAC;
3770   COMMENT "show two cc cells are equal";
3771   INTRO_TAC Leaf_cell.CC_CELL4 [`V`;`[u0;u1;f j]`];
3772   ANTS_TAC;
3773     BY(ASM_REWRITE_TAC[]);
3774   DISCH_TAC;
3775   TYPIFY `convex hull {EL 0 vl, EL 1 vl, f i, f (SUC i)} = convex hull set_of_list (cc_uh V [u0; u1; f j])` (C SUBGOAL_THEN MP_TAC);
3776     BY(ASM_MESON_TAC[]);
3777   DISCH_TAC;
3778   TYPIFY `affine hull {EL 0 vl, EL 1 vl, f i, f (SUC i)} = affine hull set_of_list (cc_uh V [u0; u1; f j])` (C SUBGOAL_THEN ASSUME_TAC);
3779     BY(ASM_MESON_TAC[AFFINE_HULL_CONVEX_HULL]);
3780   TYPIFY `aff_dim {EL 0 vl, EL 1 vl, f i, f (SUC i)} = aff_dim (set_of_list (cc_uh V [u0; u1; f j]))` (C SUBGOAL_THEN ASSUME_TAC);
3781     BY(ASM_MESON_TAC[AFF_DIM_AFFINE_HULL]);
3782   INTRO_TAC Leaf_cell.SET_OF_LIST_CC_UH [`V`;`[u0;u1;f j]`];
3783   ANTS_TAC;
3784     BY(ASM_MESON_TAC[]);
3785   REWRITE_TAC[Bump.EL_EXPLICIT];
3786   DISCH_TAC;
3787   TYPIFY `CARD {u0,u1,f j,EL 3 (cc_uh V [u0;u1;f j])} = 4` (C SUBGOAL_THEN ASSUME_TAC);
3788     INTRO_TAC MCELL4_CARD4 [`V`;`cc_uh V [u0;u1;f j]`];
3789     ANTS_TAC;
3790       BY(ASM_MESON_TAC[IN;Leaf_cell.cc_uh]);
3791     BY(ASM_REWRITE_TAC[]);
3792   COMMENT "show two lists are equal";
3793   INTRO_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ [`{EL 0 vl, EL 1 vl, f i, f (SUC i)}`;`set_of_list (cc_uh V [u0; u1; f j])`];
3794   TYPIFY `(~affine_dependent {EL 0 vl, EL 1 vl, f i, f (SUC i)} /\   ~affine_dependent (set_of_list (cc_uh V [u0; u1; f j])))` ENOUGH_TO_SHOW_TAC;
3795     DISCH_THEN (unlist REWRITE_TAC);
3796     ASM_REWRITE_TAC[];
3797     DISCH_TAC;
3798     FIRST_X_ASSUM_ST `~` MP_TAC;
3799     REWRITE_TAC[];
3800     MATCH_MP_TAC CARD4_IN_PAIRS;
3801     GEXISTL_TAC [`u0`;`u1`];
3802     ASM_REWRITE_TAC[];
3803     FIRST_X_ASSUM (SUBST1_TAC o GSYM);
3804     FIRST_X_ASSUM_ST `{a,b} = {c,d}` MP_TAC;
3805     BY(SET_TAC[]);
3806   ASM_REWRITE_TAC[AFFINE_INDEPENDENT_IFF_CARD];
3807   REWRITE_TAC[FINITE_INSERT;FINITE_EMPTY];
3808   TYPIFY `aff_dim {u0, u1, f j, EL 3 (cc_uh V [u0; u1; f j])} = &3` (C SUBGOAL_THEN ASSUME_TAC);
3809     MATCH_MP_TAC NOT_COPLANAR_AFF_3;
3810     ONCE_REWRITE_TAC[GSYM COPLANAR_CONVEX_HULL_COPLANAR];
3811     DISCH_THEN (MP_TAC o (MATCH_MP COPLANAR_IMP_NEGLIGIBLE));
3812     BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE]);
3813   ASM_REWRITE_TAC[];
3814   REWRITE_TAC[INT_ARITH `!(x:int). &3 = x - &1 <=> x = &4`];
3815   REWRITE_TAC[INT_OF_NUM_EQ];
3816   MATCH_MP_TAC (arith `x <= 4 /\ ~(x <= 3) ==> (x = 4)`);
3817   REWRITE_TAC[Geomdetail.CARD4];
3818   DISCH_TAC;
3819   INTRO_TAC AFF_DIM_LE_CARD [`{EL 0 ul, EL 1 ul, f i, f (SUC i)}`];
3820   REWRITE_TAC[FINITE_INSERT;FINITE_EMPTY];
3821   MATCH_MP_TAC (INT_ARITH `c <= &3 /\ a = int_of_num 3 ==> ~(a <= c - int_of_num 1)`);
3822   ASM_REWRITE_TAC[INT_OF_NUM_LE];
3823   BY(ASM_MESON_TAC[])
3824   ]);;
3825   (* }}} *)
3826
3827 (*
3828 let CC_CELL_WEDGE_MATCH_UH_ALT = prove_by_refinement(
3829   `!V ul u0 u1 w0 n f i j.  packing V /\
3830          saturated V /\
3831          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3832          ~collinear {EL 0 ul, EL 1 ul, w0} /\
3833          1 < n /\
3834     {u0,u1} = {EL 0 ul,EL 1 ul} /\
3835     cc_cell V [u0;u1;f j] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i)) /\
3836     cc_ke V [u0;u1;f j] = 4 ==>
3837     {f j, EL 3 (cc_uh V [u0;u1;f j])} = {f i, f (SUC i)}`,
3838   (* {{{ proof *)
3839   [
3840   REPEAT WEAKER_STRIP_TAC;
3841   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
3842     BY(ASM_MESON_TAC[LEAF_RANK_PERIODIC]);
3843   INTRO_TAC PERIODIC_REDUCE_MOD [`f`;`n`;`i`];
3844   ASM_SIMP_TAC[arith `1 < n ==> 1 <= n`];
3845   DISCH_THEN (fun t -> REPEAT (FIRST_X_ASSUM MP_TAC) THEN MP_TAC ( t));
3846   STRIP_TAC;
3847   ASM_REWRITE_TAC[];
3848   REPEAT WEAKER_STRIP_TAC;
3849   INTRO_TAC CC_CELL_WEDGE_MATCH_UH [`V`;`ul`;`u0`;`u1`;`w0`;`n`;`f`;`j'`;`j`];
3850   BY(ASM_MESON_TAC[])
3851   ]);;
3852   (* }}} *)
3853 *)
3854
3855 let K4_CC_WI_ALT = prove_by_refinement(
3856   `!V ul w0 n f i.  packing V /\
3857          saturated V /\
3858          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3859          ~collinear {EL 0 ul, EL 1 ul, w0} /\
3860          1 < n /\
3861     cc_ke V [EL 0 ul;EL 1 ul;f i] = 4 ==>
3862      cc_cell V [EL 0 ul;EL 1 ul;f i] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))`,
3863   (* {{{ proof *)
3864   [
3865   REPEAT WEAKER_STRIP_TAC;
3866   COMMENT "preliminaries";
3867   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
3868     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
3869   TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
3870     BY(FIRST_X_ASSUM_ST `1 < n` MP_TAC THEN ARITH_TAC);
3871   TYPIFY `f (SUC (i + n - 1)) = f i` (C SUBGOAL_THEN ASSUME_TAC);
3872     BY(ASM_SIMP_TAC[F_SUC_PRE]);
3873   INTRO_TAC CC_CELL_SUBSET_WEDGE [`V`;`ul`;`EL 0 ul`;`EL 1 ul`;`w0`;`n`;`f`;`i`];
3874   ANTS_TAC;
3875     BY(ASM_MESON_TAC[]);
3876   MATCH_MP_TAC (TAUT `~b ==> (a \/ b ==> a)`);
3877   DISCH_TAC;
3878   TYPIFY `!j. leaf V [EL 0 ul; EL 1 ul; f j]` (C SUBGOAL_THEN ASSUME_TAC);
3879     GEN_TAC;
3880     MATCH_MP_TAC s_leaf_leaf;
3881     REWRITE_TAC[IN];
3882     MATCH_MP_TAC LEAF_RANK_S_LEAF;
3883     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
3884   INTRO_TAC Leaf_cell.EL_CC_UH [`V`;`[EL 0 ul;EL 1 ul;f i]`];
3885   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3886   REPEAT WEAKER_STRIP_TAC;
3887   TYPIFY `&0 < chi_msb [EL 0 (cc_uh V [EL 0 ul;EL 1 ul;f i]); EL 1 (cc_uh V [EL 0 ul;EL 1 ul;f i]); f(i + n - 1)] (f (SUC (i + n - 1)))` (C SUBGOAL_THEN MP_TAC);
3888     MATCH_MP_TAC LEAF_RANK4_CHI_MSB_ALT;
3889     GEXISTL_TAC [`V`;`w0`;`n`];
3890     ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3891     CONJ_TAC;
3892       BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
3893     TYPIFY `mcell4 V (cc_uh V [EL 0 ul;EL 1 ul; f i]) = cc_cell V [EL 0 ul;EL 1 ul;f i]` (C SUBGOAL_THEN SUBST1_TAC);
3894       REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL4];
3895       BY(ASM_MESON_TAC[]);
3896     CONJ_TAC;
3897       MATCH_MP_TAC Leaf_cell.CC_CELL_NOT_NULLSET;
3898       BY(ASM_MESON_TAC[]);
3899     BY(ASM_REWRITE_TAC[]);
3900   ASM_REWRITE_TAC[];
3901   DISCH_TAC;
3902   COMMENT "now compute chi a second way via 0 < chi cc_cell";
3903   INTRO_TAC Leaf_cell.K4_CHI_MSB_POS [`V`;`[EL 0 ul;EL 1 ul;f (i)]`];
3904   ASM_REWRITE_TAC[];
3905   ONCE_REWRITE_TAC[Leaf_cell.chi_msb_swap_23];
3906   TYPIFY `EL 3 (cc_uh V [EL 0 ul; EL 1 ul; f i]) = f (i + n - 1)` ENOUGH_TO_SHOW_TAC;
3907     DISCH_THEN SUBST1_TAC;
3908     BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
3909   INTRO_TAC CC_CELL_WEDGE_MATCH_UH [`V`;`ul`;`EL 0 ul`;`EL 1 ul`;`w0`;`n`;`f`;`(i + n - 1)`;`i`];
3910   ASM_REWRITE_TAC[];
3911   REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
3912   DISCH_THEN DISJ_CASES_TAC;
3913     PROOF_BY_CONTR_TAC;
3914     FIRST_X_ASSUM_ST `/\` MP_TAC;
3915     REPEAT WEAKER_STRIP_TAC;
3916     INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[EL 0 ul;EL 1 ul;f i]`;`w0`;`n`;`f`;`i`;`i + n - 1`];
3917     ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`;Bump.EL_EXPLICIT;AZIM_REFL];
3918     DISCH_THEN MP_TAC THEN ANTS_TAC;
3919       BY(ASM_MESON_TAC[]);
3920     BY(ASM_MESON_TAC[MOD_INJ1_ALT;arith `1 < n ==> ~(n = 0) /\ 1 < n ==> (n - 1) < n /\ 1 < n ==> ~(n - 1 = 0)`]);
3921   BY(ASM_MESON_TAC[])
3922   ]);;
3923   (* }}} *)
3924
3925 (*
3926 let K4_CC_WI_ALT = prove_by_refinement(
3927   `!V ul w0 n f i.  packing V /\
3928          saturated V /\
3929          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3930          ~collinear {EL 0 ul, EL 1 ul, w0} /\
3931          1 < n /\
3932     cc_ke V [EL 0 ul;EL 1 ul;f i] = 4 ==>
3933      cc_cell V [EL 0 ul;EL 1 ul;f i] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))`,
3934   (* {{{ proof *)
3935   [
3936   REPEAT WEAKER_STRIP_TAC;
3937   TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
3938     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
3939   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
3940     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
3941   INTRO_TAC K4_CC_WI [`V`;`ul`;`w0`;`n`;`f`;`i MOD n`];
3942   BY(ASM_SIMP_TAC[DIVISION;F_DEMOD])
3943   ]);;
3944   (* }}} *)
3945 *)
3946
3947 let K4_CC_WIM = prove_by_refinement(
3948   `!V ul w0 n f i.  packing V /\
3949          saturated V /\
3950          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
3951          ~collinear {EL 0 ul, EL 1 ul, w0} /\
3952          1 < n /\
3953     cc_ke V [EL 1 ul;EL 0 ul;f i] = 4 ==>
3954      cc_cell V [EL 1 ul;EL 0 ul;f i] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f (i + n - 1)) (f  i)`,
3955   (* {{{ proof *)
3956   [
3957   REPEAT WEAKER_STRIP_TAC;
3958   COMMENT "preliminaries";
3959   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
3960     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
3961   TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
3962     BY(FIRST_X_ASSUM_ST `1 < n` MP_TAC THEN ARITH_TAC);
3963   TYPIFY `f (SUC (i + n - 1)) = f i` (C SUBGOAL_THEN ASSUME_TAC);
3964     BY(ASM_SIMP_TAC[F_SUC_PRE]);
3965   TYPIFY `{EL 1 ul,EL 0 ul} = {EL 0 ul,EL 1 ul}` (C SUBGOAL_THEN ASSUME_TAC);
3966     BY(SET_TAC[]);
3967   INTRO_TAC CC_CELL_SUBSET_WEDGE [`V`;`ul`;`EL 1 ul`;`EL 0 ul`;`w0`;`n`;`f`;`i`];
3968   ANTS_TAC;
3969     BY(ASM_MESON_TAC[]);
3970   MATCH_MP_TAC (TAUT `~a ==> (a \/ b ==> b)`);
3971   DISCH_TAC;
3972   TYPIFY `!j. leaf V [EL 0 ul; EL 1 ul; f j]` (C SUBGOAL_THEN ASSUME_TAC);
3973     GEN_TAC;
3974     MATCH_MP_TAC s_leaf_leaf;
3975     REWRITE_TAC[IN];
3976     MATCH_MP_TAC LEAF_RANK_S_LEAF;
3977     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
3978   TYPIFY `!j. leaf V [EL 1 ul;EL 0 ul; f j]` (C SUBGOAL_THEN ASSUME_TAC);
3979     GEN_TAC;
3980     INTRO_TAC Leaf_cell.ZASUVOR [`V`;`EL 0 ul`;`EL 1 ul`;`f j`];
3981     ANTS_TAC;
3982       BY(ASM_REWRITE_TAC[]);
3983     BY(MESON_TAC[]);
3984   INTRO_TAC Leaf_cell.EL_CC_UH [`V`;`[EL 1 ul;EL 0 ul;f i]`];
3985   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
3986   REPEAT WEAKER_STRIP_TAC;
3987   INTRO_TAC Leaf_cell.CC_CELL_NOT_NULLSET [`V`;`[EL 1 ul; EL 0 ul; f i]`];
3988   ANTS_TAC;
3989     BY(ASM_REWRITE_TAC[]);
3990   DISCH_TAC;
3991   COMMENT "reparametrize";
3992   INTRO_TAC MCELL4_REPARAM [`V`;`cc_uh V [EL 1 ul;EL 0 ul;f i]`;`[EL 0 ul;EL 1 ul;f i; EL 3 (cc_uh V [EL 1 ul;EL 0 ul;f i])]`];
3993   COMMENT "long list of ants";
3994   ANTS_TAC;
3995     ASM_REWRITE_TAC[LENGTH;arith `SUC(SUC(SUC(SUC 0))) = 4`];
3996     INTRO_TAC Leaf_cell.CC_CELL_EXTREME_CARD [`V`;`[EL 1 ul;EL 0 ul;f i]`;`EL 3 (cc_uh V [EL 1 ul;EL 0 ul;f i])`];
3997     ANTS_TAC;
3998       BY(ASM_REWRITE_TAC[arith `~(4 = 3)`]);
3999     REWRITE_TAC[Bump.EL_EXPLICIT];
4000     DISCH_TAC;
4001     TYPIFY `barV V 3 (cc_uh V [EL 1 ul; EL 0 ul; f i])` (C SUBGOAL_THEN ASSUME_TAC);
4002       BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
4003     INTRO_TAC BARV3_SET_OF_LIST4 [`V`;`cc_uh V [EL 1 ul; EL 0 ul; f i]`];
4004     ASM_REWRITE_TAC[];
4005     DISCH_TAC;
4006     CONJ_TAC;
4007       BY(ASM_MESON_TAC[]);
4008     CONJ_TAC;
4009       ASM_REWRITE_TAC[set_of_list];
4010       BY(SET_TAC[]);
4011     BY(ASM_MESON_TAC[Leaf_cell.cc_cell;Bump.MCELL4;IN]);
4012   REPEAT WEAKER_STRIP_TAC;
4013   TYPED_ABBREV_TAC  `(vl:(real^3)list) =  [EL 0 ul; EL 1 ul; f i; EL 3 (cc_uh V [EL 1 ul; EL 0 ul; f i])]` ;
4014   TYPIFY `EL 0 vl = EL 0 ul /\ EL 1 vl = EL 1 ul` (C SUBGOAL_THEN ASSUME_TAC);
4015     EXPAND_TAC "vl";
4016     BY(REWRITE_TAC[Bump.EL_EXPLICIT]);
4017   COMMENT "compute chi_msb";
4018   INTRO_TAC LEAF_RANK4_CHI_MSB_ALT [`V`;`vl`;`w0`;`n`;`f`;`i`];
4019   ANTS_TAC;
4020     ASM_REWRITE_TAC[];
4021     BY(ASM_MESON_TAC[Leaf_cell.cc_cell;Bump.MCELL4]);
4022   ASM_REWRITE_TAC[];
4023   DISCH_TAC;
4024   COMMENT "now compute chi a second way via 0 < chi cc_cell";
4025   INTRO_TAC Leaf_cell.K4_CHI_MSB_POS [`V`;`[EL 1 ul;EL 0 ul;f (i)]`];
4026   ASM_REWRITE_TAC[];
4027   ONCE_REWRITE_TAC[Leaf_cell.chi_msb_swap_01];
4028   TYPIFY `EL 3 (cc_uh V [EL 1 ul; EL 0 ul; f i]) = f (SUC i)` ENOUGH_TO_SHOW_TAC;
4029     DISCH_THEN SUBST1_TAC;
4030     BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
4031   INTRO_TAC CC_CELL_WEDGE_MATCH_UH [`V`;`ul`;`EL 1 ul`;`EL 0 ul`;`w0`;`n`;`f`;`i`;`i`];
4032   ASM_REWRITE_TAC[];
4033   REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
4034   DISCH_THEN DISJ_CASES_TAC;
4035     BY(ASM_REWRITE_TAC[]);
4036   PROOF_BY_CONTR_TAC;
4037   FIRST_X_ASSUM_ST `/\` MP_TAC;
4038   REPEAT WEAKER_STRIP_TAC;
4039   INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[EL 0 ul;EL 1 ul]`;`w0`;`n`;`f`;`i`;`SUC i`];
4040   ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`;Bump.EL_EXPLICIT;AZIM_REFL];
4041   REWRITE_TAC[arith `SUC i = (i + 1)`];
4042   BY(ASM_MESON_TAC[MOD_INJ1_ALT;arith `1 < n ==> ~(n = 0) /\ ~(1 = 0)`])
4043   ]);;
4044   (* }}} *)
4045
4046 (*
4047 let K4_CC_WIM = prove_by_refinement(
4048   `!V ul w0 n f i.  packing V /\
4049          saturated V /\
4050          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
4051          ~collinear {EL 0 ul, EL 1 ul, w0} /\
4052          1 < n /\
4053     cc_ke V [EL 1 ul;EL 0 ul;f i] = 4 ==>
4054      cc_cell V [EL 1 ul;EL 0 ul;f i] SUBSET wedge_ge (EL 0 ul) (EL 1 ul) (f (i + n - 1)) (f  i)`,
4055   (* {{{ proof *)
4056   [
4057   REPEAT WEAKER_STRIP_TAC;
4058   TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
4059     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
4060   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
4061     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
4062   INTRO_TAC K4_CC_WI_MINUS [`V`;`ul`;`w0`;`n`;`f`;`i MOD n`];
4063   BY(ASM_SIMP_TAC[DIVISION;FM_DEMOD])
4064   ]);;
4065   (* }}} *)
4066 *)
4067
4068 let K3_CC_WI_ALT = prove_by_refinement(
4069   `!V ul w0 n f i.
4070          packing V /\
4071          saturated V /\
4072          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
4073          ~collinear {EL 0 ul, EL 1 ul, w0} /\
4074          1 < n /\
4075          cc_ke V [EL 0 ul; EL 1 ul; f i] = 3
4076          ==> cc_cell V [EL 0 ul; EL 1 ul; f i] SUBSET
4077              wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))`,
4078   (* {{{ proof *)
4079   [
4080   REPEAT WEAKER_STRIP_TAC;
4081   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
4082     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
4083   INTRO_TAC CC_CELL_SUBSET_WEDGE [`V`;`ul`;`EL 0 ul`;`EL 1 ul`;`w0`;`n`;`f`;`i`];
4084   ASM_REWRITE_TAC[];
4085   DISCH_THEN DISJ_CASES_TAC;
4086     BY(ASM_REWRITE_TAC[]);
4087   PROOF_BY_CONTR_TAC;
4088   TYPIFY `~(n=0)` (C SUBGOAL_THEN ASSUME_TAC);
4089     BY(FIRST_X_ASSUM_ST `1 < n` MP_TAC THEN ARITH_TAC);
4090   TYPIFY `cc_ke V [EL 1 ul;EL 0 ul;f i] = 4` (C SUBGOAL_THEN ASSUME_TAC);
4091     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
4092     REWRITE_TAC[leaf_rank];
4093     REWRITE_TAC[IMAGE;EXTENSION;IN_IMAGE;IN_UNIV;IN_ELIM_THM;s_leaf];
4094     REWRITE_TAC[IN;s_leaf;Bump.EL_EXPLICIT];
4095     BY(ASM_MESON_TAC[arith `~(3 = 4)`]);
4096   INTRO_TAC K4_CC_WIM [`V`;`ul`;`w0`;`n`;`f`;`i`];
4097   ANTS_TAC;
4098     BY(ASM_REWRITE_TAC[]);
4099   DISCH_TAC;
4100   INTRO_TAC WEDGE_UNIQUE_CC_CELL [`V`;`ul`;`w0`;`n`;`f`;`(i + n - 1) MOD n`;`i`];
4101   ANTS_TAC;
4102     BY(ASM_SIMP_TAC[DIVISION]);
4103   ASM_SIMP_TAC[F_DEMOD];
4104   REWRITE_TAC[DE_MORGAN_THM];
4105   TYPIFY `f (SUC (i + n - 1)) = f i` ENOUGH_TO_SHOW_TAC;
4106     DISCH_THEN SUBST1_TAC;
4107     BY(ASM_REWRITE_TAC[]);
4108   MATCH_MP_TAC F_SUC_PRE;
4109   BY(ASM_REWRITE_TAC[])
4110   ]);;
4111   (* }}} *)
4112
4113 (*
4114 let K3_CC_WI_ALT = prove_by_refinement(
4115   `!V ul w0 n f i.
4116          packing V /\
4117          saturated V /\
4118          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
4119          ~collinear {EL 0 ul, EL 1 ul, w0} /\
4120          1 < n /\
4121          cc_ke V [EL 0 ul; EL 1 ul; f i] = 3
4122          ==> cc_cell V [EL 0 ul; EL 1 ul; f i] SUBSET
4123              wedge_ge (EL 0 ul) (EL 1 ul) (f i) (f (SUC i))`,
4124   (* {{{ proof *)
4125   [
4126   REPEAT WEAKER_STRIP_TAC;
4127   TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
4128     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
4129   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
4130     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
4131   INTRO_TAC K3_CC_WI [`V`;`ul`;`w0`;`n`;`f`;`i MOD n`];
4132   BY(ASM_SIMP_TAC[DIVISION;F_DEMOD])
4133   ]);;
4134   (* }}} *)
4135 *)
4136
4137 let K3_CC_WIM_ALT = prove_by_refinement(
4138   `!V ul w0 n f i.
4139          packing V /\
4140          saturated V /\
4141          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
4142          ~collinear {EL 0 ul, EL 1 ul, w0} /\
4143          1 < n /\
4144          cc_ke V [EL 1 ul; EL 0 ul; f i] = 3
4145          ==> cc_cell V [EL 1 ul; EL 0 ul; f i] SUBSET
4146              wedge_ge (EL 0 ul) (EL 1 ul) (f (i + n - 1)) (f  i)`,
4147   (* {{{ proof *)
4148   [
4149   REPEAT WEAKER_STRIP_TAC;
4150   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
4151     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
4152   INTRO_TAC CC_CELL_SUBSET_WEDGE [`V`;`ul`;`EL 1 ul`;`EL 0 ul`;`w0`;`n`;`f`;`i`];
4153   ASM_REWRITE_TAC[];
4154   ANTS_TAC;
4155     BY(SET_TAC[]);
4156   MATCH_MP_TAC (TAUT `~a ==> (a \/ b ==> b)`);
4157   DISCH_TAC;
4158   TYPIFY `~(n=0)` (C SUBGOAL_THEN ASSUME_TAC);
4159     BY(FIRST_X_ASSUM_ST `1 < n` MP_TAC THEN ARITH_TAC);
4160   TYPIFY `cc_ke V [EL 0 ul;EL 1 ul;f i] = 4` (C SUBGOAL_THEN ASSUME_TAC);
4161     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
4162     REWRITE_TAC[leaf_rank];
4163     REWRITE_TAC[IMAGE;EXTENSION;IN_IMAGE;IN_UNIV;IN_ELIM_THM];
4164     REWRITE_TAC[IN;s_leaf;Bump.EL_EXPLICIT];
4165     BY(ASM_MESON_TAC[arith `~(3 = 4)`]);
4166   INTRO_TAC K4_CC_WI_ALT [`V`;`ul`;`w0`;`n`;`f`;`i`];
4167   ANTS_TAC;
4168     BY(ASM_REWRITE_TAC[]);
4169   DISCH_TAC;
4170   INTRO_TAC WEDGE_UNIQUE_CC_CELL [`V`;`ul`;`w0`;`n`;`f`;`i`;`i`];
4171   ANTS_TAC;
4172     BY(ASM_REWRITE_TAC[]);
4173   BY(ASM_REWRITE_TAC[DE_MORGAN_THM])
4174   ]);;
4175   (* }}} *)
4176
4177 (*
4178 let K3_CC_WIM_ALT = prove_by_refinement(
4179   `!V ul w0 n f i.
4180          packing V /\
4181          saturated V /\
4182          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
4183          ~collinear {EL 0 ul, EL 1 ul, w0} /\
4184          1 < n /\
4185          cc_ke V [EL 1 ul; EL 0 ul; f i] = 3
4186          ==> cc_cell V [EL 1 ul; EL 0 ul; f i] SUBSET
4187              wedge_ge (EL 0 ul) (EL 1 ul) (f (i + n - 1)) (f  i)`,
4188   (* {{{ proof *)
4189   [
4190   REPEAT WEAKER_STRIP_TAC;
4191   TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
4192     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
4193   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
4194     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
4195   INTRO_TAC K3_CC_WIM [`V`;`ul`;`w0`;`n`;`f`;`i MOD n`];
4196   BY(ASM_SIMP_TAC[DIVISION;FM_DEMOD])
4197   ]);;
4198   (* }}} *)
4199 *)
4200
4201 let NO_4CELL_IMP_K3 = prove_by_refinement(
4202   `!V W ul w0 n f i.
4203          packing V /\
4204          saturated V /\
4205          leaf_rank V [EL 0 ul; EL 1 ul] w0 n f /\
4206          ~collinear {EL 0 ul, EL 1 ul, w0} /\
4207          W = wedge_ge (EL 0 ul) (EL 1 ul) (f i ) (f (SUC i)) /\
4208          1 < n /\
4209     ~(?vl. barV V 3 vl /\ {EL 0 ul,EL 1 ul} IN edgeX V (mcell4 V vl) /\ mcell4 V vl SUBSET W) ==>
4210          cc_ke V [EL 1 ul; EL 0 ul; f (SUC i)] = 3 /\
4211           cc_ke V [EL 0 ul;EL 1 ul; f i ] = 3 /\
4212           cc_cell V [EL 0 ul;EL 1 ul;f i] SUBSET W /\
4213           cc_cell V [EL 1 ul;EL 0 ul; f(SUC i)] SUBSET W /\
4214           ~(cc_cell V [EL 0 ul;EL 1 ul;f i ] = cc_cell V [EL 1 ul;EL 0 ul;f (SUC i)])`,
4215   (* {{{ proof *)
4216   [
4217   REPEAT WEAKER_STRIP_TAC;
4218   COMMENT "preliminaries";
4219   TYPIFY `!j. leaf V [EL 0 ul; EL 1 ul; f j]` (C SUBGOAL_THEN ASSUME_TAC);
4220     GEN_TAC;
4221     MATCH_MP_TAC s_leaf_leaf;
4222     REWRITE_TAC[IN];
4223     MATCH_MP_TAC LEAF_RANK_S_LEAF;
4224     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
4225   TYPIFY `!j. leaf V [EL 1 ul;EL 0 ul;f j]` (C SUBGOAL_THEN ASSUME_TAC);
4226     GEN_TAC;
4227     INTRO_TAC Leaf_cell.ZASUVOR [`V`;`EL 0 ul`;`EL 1 ul`;`f j`];
4228     ANTS_TAC;
4229       BY(ASM_REWRITE_TAC[]);
4230     BY(ASM_MESON_TAC[]);
4231   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
4232     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
4233   TYPIFY `{EL 0 ul,EL 1 ul} = {EL 1 ul,EL 0 ul}` (C SUBGOAL_THEN ASSUME_TAC);
4234     BY(SET_TAC[]);
4235   COMMENT "k- = 3";
4236   SUBCONJ_TAC;
4237     INTRO_TAC Leaf_cell.CC_KE_34 [`V`;`[EL 1 ul;EL 0 ul;f(SUC i)]`];
4238     DISCH_THEN DISJ_CASES_TAC;
4239       BY(ASM_REWRITE_TAC[]);
4240     INTRO_TAC K4_CC_WIM [`V`;`ul`;`w0`;`n`;`f`;`SUC i`];
4241     ASM_REWRITE_TAC[];
4242     TYPIFY `f (SUC i + n - 1) = f i` (C SUBGOAL_THEN SUBST1_TAC);
4243       MATCH_MP_TAC PERIODIC_EQ_IMAGE;
4244       TYPIFY `n` EXISTS_TAC;
4245       ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`;arith `1 < n ==> SUC i + n - 1 = 1 *n + i`];
4246       BY(REWRITE_TAC[MOD_MULT_ADD]);
4247     REWRITE_TAC[arith `~(4 = 3)`];
4248     DISCH_TAC;
4249     FIRST_X_ASSUM_ST `?` MP_TAC;
4250     ASM_REWRITE_TAC[];
4251     TYPIFY `cc_uh V [EL 1 ul;EL 0 ul;f(SUC i)]` EXISTS_TAC;
4252     SUBCONJ_TAC;
4253       BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
4254     DISCH_TAC;
4255     TYPIFY ` mcell4 V (cc_uh V [EL 1 ul;EL 0 ul;f (SUC i)])  = cc_cell V [EL 1 ul;EL 0 ul;f (SUC i)]` (C SUBGOAL_THEN SUBST1_TAC);
4256       BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL4]);
4257     ASM_REWRITE_TAC[];
4258     INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[EL 1 ul;EL 0 ul;f (SUC i)]`];
4259     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
4260   DISCH_TAC;
4261   COMMENT "k+ = 3";
4262   SUBCONJ_TAC;
4263     INTRO_TAC Leaf_cell.CC_KE_34 [`V`;`[EL 0 ul;EL 1 ul;f i]`];
4264     DISCH_THEN DISJ_CASES_TAC;
4265       BY(ASM_REWRITE_TAC[]);
4266     INTRO_TAC K4_CC_WI_ALT [`V`;`ul`;`w0`;`n`;`f`;`i`];
4267     ASM_REWRITE_TAC[];
4268     REWRITE_TAC[arith `~(4 = 3)`];
4269     DISCH_TAC;
4270     FIRST_X_ASSUM_ST `?` MP_TAC;
4271     ASM_REWRITE_TAC[];
4272     TYPIFY `cc_uh V [EL 0 ul;EL 1 ul;f( i)]` EXISTS_TAC;
4273     SUBCONJ_TAC;
4274       BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
4275     DISCH_TAC;
4276     TYPIFY ` mcell4 V (cc_uh V [EL 0 ul;EL 1 ul;f ( i)])  = cc_cell V [EL 0 ul;EL 1 ul;f ( i)]` (C SUBGOAL_THEN SUBST1_TAC);
4277       BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL4]);
4278     ASM_REWRITE_TAC[];
4279     INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[EL 0 ul;EL 1 ul;f ( i)]`];
4280     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
4281   DISCH_TAC;
4282   COMMENT "cc_cell3+";
4283   CONJ_TAC;
4284     ASM_REWRITE_TAC[];
4285     MATCH_MP_TAC K3_CC_WI_ALT;
4286     BY(ASM_MESON_TAC[]);
4287   COMMENT "cc_cell3-";
4288   CONJ_TAC;
4289     ASM_REWRITE_TAC[];
4290     INTRO_TAC K3_CC_WIM_ALT [`V`;`ul`;`w0`;`n`;`f`;`SUC i`];
4291     ASM_REWRITE_TAC[];
4292     TYPIFY `f (SUC i + n - 1) = f i` (C SUBGOAL_THEN SUBST1_TAC);
4293       MATCH_MP_TAC PERIODIC_EQ_IMAGE;
4294       TYPIFY `n` EXISTS_TAC;
4295       BY(ASM_SIMP_TAC[arith `1 < n ==> ~(n =0)`;arith `1 < n ==> SUC i + n - 1 = 1*n + i`;MOD_MULT_ADD]);
4296     BY(REWRITE_TAC[]);
4297   COMMENT "inequality";
4298   DISCH_TAC;
4299   INTRO_TAC Leaf_cell.FUEIMOV_3 [`V`;`[EL 0 ul;EL 1 ul;f i]`;`[EL 1 ul;EL 0 ul;f (SUC i)]`];
4300   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
4301   REWRITE_TAC[CONS_11];
4302   BY(ASM_MESON_TAC[Collect_geom.NOT_COLLINEAR_IMP_2_UNEQUAL])
4303   ]);;
4304   (* }}} *)
4305
4306 let JSPEVYT_EXPLICIT = prove_by_refinement(
4307   `!(u0:real^3) u1 u2.
4308     pack_nonlinear_non_ox3q1h /\ 
4309     ~collinear {u0,u1,u2} /\
4310     hl [u0;u1;u2] <= #1.34 /\ &2 * hminus <= dist(u0,u1) /\ &2 <= dist (u0,u2) ==>
4311     dist(u1,u2) < &2 * hminus`,
4312   (* {{{ proof *)
4313   [
4314   REWRITE_TAC[Pack_defs.HL;set_of_list];
4315   REPEAT WEAKER_STRIP_TAC;
4316   FIRST_X_ASSUM_ST `radV` MP_TAC;
4317   ASM_SIMP_TAC[RADV_ETAY];
4318   DISCH_TAC;
4319   INTRO_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "JSPEVYT") [`&1`;`&1`;`&1`;`dist(u0,u1)`;`dist(u1,u2)`;`dist(u0,u2)`];
4320   REWRITE_TAC[Sphere.ineq;arith `&1 <= &1`];
4321   REPEAT WEAKER_STRIP_TAC;
4322   TYPIFY `~affine_dependent {u0,u1,u2}` (C SUBGOAL_THEN ASSUME_TAC);
4323     BY(ASM_MESON_TAC[AFFINE_DEPENDENT_IMP_COLLINEAR_3]);
4324   INTRO_TAC Rogers.RADV_MONO [`{u0,u1,u2}`;`{u0,u1}`];
4325   INTRO_TAC Rogers.RADV_MONO [`{u0,u1,u2}`;`{u0,u2}`];
4326   INTRO_TAC Rogers.RADV_MONO [`{u0,u1,u2}`;`{u1,u2}`];
4327   ASM_SIMP_TAC[RADV_ETAY];
4328   REWRITE_TAC[RADV2];
4329   REPEAT (ANTS_TAC THENL [SET_TAC[];DISCH_TAC]);
4330   TYPIFY `&0 <= ups_x (dist (u0,u1) pow 2) (dist (u1,u2) pow 2) (dist (u0,u2) pow 2)` (C SUBGOAL_THEN MP_TAC);
4331     BY(REWRITE_TAC[Collect_geom.TROI_OI_DAT_HOI]);
4332   REWRITE_TAC[REAL_POW_2];
4333   DISCH_TAC;
4334   REWRITE_TAC[arith `x < y <=> ~(y <= x)`];
4335   DISCH_TAC;
4336   FIRST_X_ASSUM_ST `#1.34` MP_TAC;
4337   TYPIFY `eta_y (dist (u0,u1)) (dist (u1,u2)) (dist (u0,u2)) = eta_y (dist (u0,u1)) (dist (u0,u2)) (dist (u1,u2))` (C SUBGOAL_THEN SUBST1_TAC);
4338     BY(ASM_MESON_TAC[Collect_geom.ETA_Y_SYM]);
4339   INTRO_TAC Merge_ineq.eta_y_nn [`dist(u0,u1)`;`dist(u0,u2)`;`dist(u1,u2)`];
4340   ANTS_TAC;
4341     BY(ASM_MESON_TAC[Collect_geom.UPS_X_SYM]);
4342   DISCH_TAC;
4343   TYPED_ABBREV_TAC  `(eta:real) = eta_y (dist (u0,u1)) (dist (u0,u2)) (dist (u1,u2))` ;
4344   ASM_REWRITE_TAC[];
4345   TYPIFY `!x. inv (&2) * x <= eta ==> x <= sqrt8` (C SUBGOAL_THEN (unlist ASM_SIMP_TAC));
4346     GEN_TAC;
4347     FIRST_X_ASSUM_ST `#1.34` MP_TAC;
4348     MP_TAC Flyspeck_constants.bounds;
4349     BY(REAL_ARITH_TAC);
4350   MATCH_MP_TAC (arith `x <= y ==> ~(x > y)`);
4351   MATCH_MP_TAC Collect_geom2.POS_IMP_POW2;
4352   BY(ASM_REWRITE_TAC[])
4353   ]);;
4354   (* }}} *)
4355
4356 let CELL_CLUSTER_ESTIMATE_REDUCE = prove_by_refinement(
4357 `!V. packing V /\ saturated V /\
4358   (!u0 u1. ~(u0 = u1) /\ hminus <= hl [u0;u1] /\ hl [u0;u1] <= hplus ==>
4359   &0 <= sum {X | {u0,u1} IN edgeX V X /\ mcell_set V X} 
4360   (\X. gammaX V X lmfun * critical_weight V X + beta_bump_v1 V {u0,u1} X))
4361   ==>  cell_cluster_estimate_v1 V`,
4362   (* {{{ proof *)
4363   [
4364   REPEAT WEAKER_STRIP_TAC;
4365   REWRITE_TAC[Pack_defs.cell_cluster_estimate_v1;Pack_defs.cluster_gamma_v1;Pack_defs.cell_cluster];
4366   GEN_TAC;
4367   TYPIFY `{X | e IN critical_edgeX V X /\ mcell_set V X} = {}` ASM_CASES_TAC;
4368     ASM_REWRITE_TAC[SUM_CLAUSES];
4369     BY(REAL_ARITH_TAC);
4370   FIRST_X_ASSUM (MP_TAC o (REWRITE_RULE[EXTENSION;NOT_IN_EMPTY;IN_ELIM_THM;NOT_FORALL_THM]));
4371   DISCH_THEN (MP_TAC o (REWRITE_RULE[Pack_defs.critical_edgeX;IN_ELIM_THM]));
4372   REPEAT WEAKER_STRIP_TAC;
4373   TYPIFY `u = v` ASM_CASES_TAC;
4374     PROOF_BY_CONTR_TAC;
4375     FIRST_X_ASSUM (MP_TAC o (MATCH_MP Bump.EDGE_MCELL_EL));
4376     REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
4377     ASM_REWRITE_TAC[];
4378     BY(MESON_TAC[]);
4379   FIRST_X_ASSUM (C INTRO_TAC [`u`;`v`]);
4380   ASM_REWRITE_TAC[arith `x >= &0 <=> &0 <= x`];
4381   TYPIFY `!X. {u, v} IN critical_edgeX V X <=> {u,v} IN edgeX V X` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4382   REWRITE_TAC[Pack_defs.critical_edgeX;IN_ELIM_THM];
4383   BY(ASM_MESON_TAC[])
4384   ]);;
4385   (* }}} *)
4386
4387 let cc_card_data = prove_by_refinement(
4388   `!V f u0 u1. cc_card_v11 (cc_data_v8 V f u0 u1) = CARD(s_leaf V [u0;u1])`,
4389   (* {{{ proof *)
4390   [
4391     BY(REWRITE_TAC[Oxl_def.cc_card_v11;cc_data_v8;Oxl_def.cc_v11])
4392   ]);;
4393   (* }}} *)
4394
4395 let cc_real_data = prove_by_refinement(
4396   `!V f u0 u1. cc_azim_v11 (cc_data_v8 V f u0 u1) = azim_mcell V f u0 u1 /\
4397      cc_gg_v11 (cc_data_v8 V f u0 u1) = gg_mcell V f u0 u1 /\
4398      cc_gg3a_v11 (cc_data_v8 V f u0 u1) = (\i. gammaX V (cc_cell V [u0;u1;f i]) lmfun * critical_weight V (cc_cell V [u0;u1;f i])) /\
4399     cc_gg3b_v11 (cc_data_v8 V f u0 u1) = (\i. gammaX V (cc_cell V [u1;u0;f(SUC i)]) lmfun * critical_weight V (cc_cell V [u1;u0;f (SUC i)]))`,
4400   (* {{{ proof *)
4401   [
4402     BY(REWRITE_TAC[FUN_EQ_THM;Oxl_def.cc_azim_v11;Oxl_def.cc_gg_v11;Oxl_def.cc_gg3a_v11;Oxl_def.cc_gg3b_v11;Oxl_def.cc_real_v11;cc_data_v8;Oxl_def.cc_v11;Bump.EL_EXPLICIT])
4403   ]);;
4404   (* }}} *)
4405
4406 let cc_bool_data = prove_by_refinement(
4407   `!V f u0 u1. cc_subcrit_v11 (cc_data_v8 V f u0 u1) = (\i. dist(f i,f(SUC i)) < &2 * hminus) 
4408  /\
4409  cc_crit_v11 (cc_data_v8 V f u0 u1) = (\i. &2 * hminus <= dist (f i, f (SUC i)) /\ dist (f i,f(SUC i)) <= &2 *hplus) /\
4410  cc_supercrit_v11 (cc_data_v8 V f u0 u1) = (\i. &2 *hplus < dist (f i, f(SUC i))) /\
4411  cc_small_v11 (cc_data_v8 V f u0 u1) = (\i. dist(u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
4412  cc_small_eta_v11 (cc_data_v8 V f u0 u1) = (\i. hl [u0;u1;f i] < #1.34) /\
4413  cc_4cell_v11 (cc_data_v8 V f u0 u1) = 
4414  (\i. ?ul. barV V 3 ul /\ {u0,u1} IN edgeX V (mcell4 V ul) /\ mcell4 V ul SUBSET (wedge_ge u0 u1 (f i) (f (SUC i))))
4415 `,
4416   (* {{{ proof *)
4417   [
4418   BY(REWRITE_TAC[FUN_EQ_THM;Oxl_def.cc_subcrit_v11;Oxl_def.cc_crit_v11;Oxl_def.cc_supercrit_v11;Oxl_def.cc_small_v11;Oxl_def.cc_small_eta_v11;Oxl_def.cc_4cell_v11;Oxl_def.cc_bool_v11;cc_data_v8;Oxl_def.cc_v11;Bump.EL_EXPLICIT])
4419   ]);;
4420   (* }}} *)
4421
4422 let cc_bool_model_data = prove_by_refinement(
4423   `!V f w0 n u0 u1.
4424     pack_nonlinear_non_ox3q1h /\
4425     1 < n /\
4426     packing V /\ saturated V /\       s_leaf V [u0;u1] HAS_SIZE n /\ 
4427     u0 IN V /\ u1 IN V /\
4428     ~collinear {u0, u1, w0 } /\
4429     critical_edge_y (dist(u0,u1)) /\
4430     leaf_rank V [u0;u1] w0 n f ==>
4431     cc_bool_model_v11 (cc_data_v8 V f u0 u1)`,
4432   (* {{{ proof *)
4433   [
4434   REWRITE_TAC[Oxl_def.cc_bool_model_v11;cc_card_data];
4435   REWRITE_TAC[HAS_SIZE];
4436   REPEAT WEAKER_STRIP_TAC;
4437   ASM_REWRITE_TAC[];
4438   CONJ_TAC;
4439     BY(ASM_SIMP_TAC[arith `1 < n==> ~(n = 0)`]);
4440   TYPIFY `(!i. ~(cc_crit_v11 (cc_data_v8 V f u0 u1) i /\        cc_supercrit_v11 (cc_data_v8 V f u0 u1) i)) /\ (!i. ~(cc_crit_v11 (cc_data_v8 V f u0 u1) i /\        cc_subcrit_v11 (cc_data_v8 V f u0 u1) i)) /\ (!i. ~(cc_supercrit_v11 (cc_data_v8 V f u0 u1) i /\        cc_subcrit_v11 (cc_data_v8 V f u0 u1) i))` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4441     REWRITE_TAC[cc_bool_data];
4442     INTRO_TAC Merge_ineq.hminus_lt_hplus [];
4443     BY(REAL_ARITH_TAC);
4444   TYPIFY `periodic (cc_subcrit_v11 (cc_data_v8 V f u0 u1)) n /\ periodic (cc_crit_v11 (cc_data_v8 V f u0 u1)) n /\ periodic (cc_supercrit_v11 (cc_data_v8 V f u0 u1)) n /\ periodic (cc_small_v11 (cc_data_v8 V f u0 u1)) n /\ periodic (cc_small_eta_v11 (cc_data_v8 V f u0 u1)) n /\ periodic (cc_4cell_v11 (cc_data_v8 V f u0 u1)) n` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4445     REWRITE_TAC[Oxl_def.periodic;cc_bool_data;cc_real_data];
4446     REWRITE_TAC[arith `!i. SUC(i + n) = SUC i + n`];
4447     INTRO_TAC LEAF_RANK_PERIODIC [`V`;`[u0;u1]`;`w0`;`n`;`f`];
4448     ANTS_TAC;
4449       BY(ASM_REWRITE_TAC[]);
4450     REWRITE_TAC[Oxl_def.periodic];
4451     BY(MESON_TAC[]);
4452   CONJ_TAC;
4453     REPEAT WEAKER_STRIP_TAC;
4454     REWRITE_TAC[cc_bool_data];
4455     BY(REAL_ARITH_TAC);
4456   REWRITE_TAC[cc_bool_data];
4457   REPEAT WEAKER_STRIP_TAC;
4458   TYPIFY `f i IN s_leaf V [u0;u1]` (C SUBGOAL_THEN MP_TAC);
4459     FIRST_X_ASSUM_ST `leaf_rank` MP_TAC;
4460     REWRITE_TAC[leaf_rank;EXTENSION;IN_IMAGE;IN_UNIV];
4461     BY(MESON_TAC[]);
4462   REWRITE_TAC[IN;s_leaf;Bump.EL_EXPLICIT];
4463   REPEAT WEAKER_STRIP_TAC;
4464   TYPIFY `f i IN V` (C SUBGOAL_THEN ASSUME_TAC);
4465     FIRST_X_ASSUM_ST `leaf` MP_TAC;
4466     REWRITE_TAC[Leaf_cell.leaf;IN];
4467     REPEAT WEAKER_STRIP_TAC;
4468     FIRST_X_ASSUM (MP_TAC o (MATCH_MP Packing3.BARV_SUBSET));
4469     REWRITE_TAC[set_of_list;SUBSET;IN_INSERT;NOT_IN_EMPTY];
4470     BY(MESON_TAC[IN]);
4471   TYPIFY `~collinear {u0,u1,f i}` (C SUBGOAL_THEN ASSUME_TAC);
4472     INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[u0;u1;f i]`];
4473     BY(ASM_REWRITE_TAC[set_of_list]);
4474   COMMENT "symmetry reduction";
4475   TYPIFY `!v0 v1 ff. v0 IN V /\ v1 IN V /\ ~collinear {v0,v1,ff} /\ ff IN V /\ critical_edge_y( dist(v0,v1)) /\ dist(v0,ff) <= dist(v1,ff) /\ hl [v0;v1;ff] < #1.34 ==> dist(v1,ff) < &2 * hminus` ENOUGH_TO_SHOW_TAC;
4476     DISCH_TAC;
4477     TYPIFY `dist(u0,f i) <= dist(u1,f i)` ASM_CASES_TAC;
4478       FIRST_X_ASSUM (C INTRO_TAC [`u0`;`u1`;`f i`]);
4479       ANTS_TAC;
4480         BY(ASM_REWRITE_TAC[]);
4481       BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
4482     COMMENT "second half of symmetry reduction";
4483     FIRST_X_ASSUM (ASSUME_TAC o (MATCH_MP (arith `~(x <= y) ==> (y <= x)`)));
4484     FIRST_X_ASSUM (C INTRO_TAC [`u1`;`u0`;`f i`]);
4485     ANTS_TAC;
4486       ASM_REWRITE_TAC[];
4487       CONJ_TAC;
4488         TYPIFY `{u1,u0,f i} = {u0,u1,f i}` (C SUBGOAL_THEN SUBST1_TAC);
4489           BY(SET_TAC[]);
4490         BY(ASM_REWRITE_TAC[]);
4491       CONJ_TAC;
4492         BY(ASM_MESON_TAC[DIST_SYM]);
4493       FIRST_X_ASSUM_ST `hl` MP_TAC;
4494       REWRITE_TAC[Pack_defs.HL;set_of_list];
4495       TYPIFY `{u0,u1,f i } = {u1,u0, f i}` (C SUBGOAL_THEN SUBST1_TAC);
4496         BY(SET_TAC[]);
4497       BY(REWRITE_TAC[]);
4498     BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
4499   COMMENT "symmetry reduction complete";
4500   REPEAT WEAKER_STRIP_TAC;
4501   MATCH_MP_TAC JSPEVYT_EXPLICIT;
4502   TYPIFY `v0` EXISTS_TAC;
4503   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
4504   CONJ_TAC;
4505     FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
4506     REWRITE_TAC[Sphere.critical_edge_y];
4507     BY(REAL_ARITH_TAC);
4508   TYPIFY `~(v0 = ff)` (C SUBGOAL_THEN ASSUME_TAC);
4509     BY(ASM_MESON_TAC[Collect_geom.NOT_COLLINEAR_IMP_2_UNEQUAL]);
4510   FIRST_X_ASSUM_ST `packing` MP_TAC;
4511   REWRITE_TAC[Sphere.packing];
4512   DISCH_THEN MATCH_MP_TAC;
4513   BY(ASM_MESON_TAC[IN])
4514   ]);;
4515   (* }}} *)
4516
4517 let cc_prep_model_data = prove_by_refinement(
4518   `!V f w0 n u0 u1.
4519     1 < n /\
4520     packing V /\ saturated V /\   
4521     ~collinear {u0, u1, w0 } /\
4522     leaf_rank V [u0;u1] w0 n f ==>
4523     cc_bool_prep_v11 (cc_data_v8 V f u0 u1)`,
4524   (* {{{ proof *)
4525   [
4526   REPEAT WEAKER_STRIP_TAC;
4527   REWRITE_TAC[Oxl_def.cc_bool_prep_v11;Oxl_def.cc_qy_v11;cc_bool_data];
4528   REPEAT WEAKER_STRIP_TAC;
4529   TYPIFY `periodic f n` (C SUBGOAL_THEN ASSUME_TAC);
4530     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
4531   TYPIFY `~(n = 0)` (C SUBGOAL_THEN ASSUME_TAC);
4532     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN ARITH_TAC);
4533   TYPIFY `cc_uh V [u0;u1;f (i + 1)]` EXISTS_TAC;
4534   TYPIFY `!j. leaf V [u0; u1; f j]` (C SUBGOAL_THEN ASSUME_TAC);
4535     GEN_TAC;
4536     INTRO_TAC s_leaf_leaf[`V`;`[u0;u1]`;`f j`];
4537     REWRITE_TAC[Bump.EL_EXPLICIT];
4538     DISCH_THEN MATCH_MP_TAC;
4539     REWRITE_TAC[IN];
4540     MATCH_MP_TAC LEAF_RANK_S_LEAF;
4541     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
4542   SUBCONJ_TAC;
4543     BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
4544   DISCH_TAC;
4545   FIRST_X_ASSUM_ST `?` (MP_TAC o (REWRITE_RULE[NOT_EXISTS_THM]));
4546   DISCH_TAC;
4547   INTRO_TAC Leaf_cell.CC_KE_34 [`V`;`[u0;u1;f(i+1)]`];
4548   DISCH_THEN (MP_TAC o (MATCH_MP (TAUT `a \/ b ==> b \/ a`)));
4549   DISCH_THEN DISJ_CASES_TAC;
4550     TYPIFY `mcell4 V (cc_uh V [u0;u1;f(i+1)]) = cc_cell V [u0;u1;f (i + 1)]` (C SUBGOAL_THEN SUBST1_TAC);
4551       BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL4]);
4552     INTRO_TAC Leaf_cell.EL_CC_UH [`V`;`[u0;u1;f (i+1)]`];
4553     ASM_REWRITE_TAC[];
4554     REWRITE_TAC[Bump.EL_EXPLICIT];
4555     REPEAT WEAKER_STRIP_TAC;
4556     SUBCONJ_TAC;
4557       INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[u0;u1;f(i+1)]`];
4558       BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
4559     DISCH_TAC;
4560     INTRO_TAC K4_CC_WI_ALT [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i+1`];
4561     REWRITE_TAC[Bump.EL_EXPLICIT];
4562     BY(ASM_REWRITE_TAC[]);
4563   COMMENT "now k=3";
4564   TYPIFY `cc_ke V [u1;u0;f (i+1)] = 4` (C SUBGOAL_THEN ASSUME_TAC);
4565     TYPIFY `s_leaf V [u0;u1] (f(i+1))` (C SUBGOAL_THEN MP_TAC);
4566       BY(ASM_MESON_TAC[LEAF_RANK_S_LEAF]);
4567     GMATCH_SIMP_TAC S_LEAF_SYM;
4568     ASM_REWRITE_TAC[];
4569     REWRITE_TAC[s_leaf;Bump.EL_EXPLICIT];
4570     BY(ASM_MESON_TAC[arith `~(3=4)`]);
4571   INTRO_TAC K4_CC_WIM [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i+1`];
4572   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
4573   TYPIFY `wedge_ge u0 u1 (f ((i + 1) + n - 1)) (f (i + 1)) = wedge_ge u0 u1 (f i) (f (SUC i))` (C SUBGOAL_THEN SUBST1_TAC);
4574     REWRITE_TAC[arith `i + 1 = SUC i`];
4575     ASM_SIMP_TAC[arith `1 < n ==> SUC i + n - 1 = 1*n + i`];
4576     TYPIFY `f (1 * n + i) = f i` ENOUGH_TO_SHOW_TAC;
4577       BY(MESON_TAC[]);
4578     MATCH_MP_TAC PERIODIC_EQ_IMAGE;
4579     TYPIFY `n` EXISTS_TAC;
4580     BY(ASM_REWRITE_TAC[MOD_MULT_ADD]);
4581   FIRST_X_ASSUM (C INTRO_TAC [`cc_uh V [u1;u0;f (i+1)]`]);
4582   TYPIFY `mcell4 V (cc_uh V [u1; u0; f (i + 1)]) = cc_cell V [u1; u0; f (i + 1)]` (C SUBGOAL_THEN SUBST1_TAC);
4583     BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL4]);
4584   REPEAT WEAKER_STRIP_TAC;
4585   PROOF_BY_CONTR_TAC;
4586   FIRST_X_ASSUM_ST `barV` MP_TAC;
4587   ASM_REWRITE_TAC[];
4588   TYPIFY `leaf V [u1;u0;f (i+1)]` (C SUBGOAL_THEN ASSUME_TAC);
4589     INTRO_TAC Leaf_cell.ZASUVOR [`V`;`u0`;`u1`;`f (i+1)`];
4590     ANTS_TAC;
4591       BY(ASM_REWRITE_TAC[]);
4592     BY(MESON_TAC[]);
4593   CONJ_TAC;
4594     BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
4595   INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[u1;u0;f(i+1)]`];
4596   ANTS_TAC;
4597     BY(ASM_REWRITE_TAC[]);
4598   REWRITE_TAC[Bump.EL_EXPLICIT];
4599   TYPIFY `{u1,u0} = {u0,u1}` (C SUBGOAL_THEN SUBST1_TAC);
4600     BY(SET_TAC[]);
4601   BY(REWRITE_TAC[])
4602   ]);;
4603   (* }}} *)
4604
4605 let LEAF_DOMAIN = prove_by_refinement(
4606   `!V ul.          saturated V /\
4607          packing V /\
4608     leaf V ul ==>
4609  ~collinear {EL 0 ul,EL 1 ul,EL 2 ul} /\
4610  &2 <= dist (EL 1 ul,EL 2 ul) /\
4611  &2 <= dist (EL 0 ul,EL 2 ul) /\
4612  &2 <= dist (EL 0 ul,EL 1 ul) /\
4613  dist (EL 1 ul,EL 2 ul) < &2 * sqrt (&2) /\
4614  dist (EL 0 ul,EL 2 ul) < &2 * sqrt (&2) /\
4615  dist (EL 0 ul,EL 1 ul) < &2 * sqrt (&2) /\
4616  eta_y (dist (EL 0 ul,EL 1 ul)) (dist (EL 0 ul,EL 2 ul))
4617  (dist (EL 1 ul,EL 2 ul)) <
4618  sqrt (&2)`,
4619   (* {{{ proof *)
4620   [
4621   REPEAT WEAKER_STRIP_TAC;
4622   TYPIFY `barV V 2 ul` (C SUBGOAL_THEN ASSUME_TAC);
4623     FIRST_X_ASSUM MP_TAC;
4624     REWRITE_TAC[Leaf_cell.leaf;IN];
4625     BY(MESON_TAC[]);
4626   TYPIFY `ul = [EL 0 ul;EL 1 ul;EL 2 ul]` (C SUBGOAL_THEN ASSUME_TAC);
4627     MATCH_MP_TAC Bump.LENGTH3;
4628     REWRITE_TAC[arith `3 = 2 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
4629     BY(ASM_MESON_TAC[]);
4630   TYPIFY `truncate_simplex 2 ul = ul` (C SUBGOAL_THEN ASSUME_TAC);
4631     FIRST_X_ASSUM SUBST1_TAC;
4632     BY(REWRITE_TAC[Marchal_cells.TRUNCATE_SIMPLEX_EXPLICIT_2]);
4633   GMATCH_SIMP_TAC (GSYM RADV_ETAY);
4634   TYPIFY `hl ( ul) < sqrt(&2)` (C SUBGOAL_THEN ASSUME_TAC);
4635     FIRST_X_ASSUM_ST `leaf` MP_TAC;
4636     REWRITE_TAC[Leaf_cell.leaf];
4637     BY(MESON_TAC[Sphere.sqrt2]);
4638   COMMENT "deal with radV";
4639   TYPIFY `radV {EL 0 ul, EL 1 ul, EL 2 ul} < sqrt (&2)` (C SUBGOAL_THEN ASSUME_TAC);
4640     (FIRST_X_ASSUM_ST `hl` MP_TAC THEN ASM_REWRITE_TAC[Pack_defs.HL;set_of_list]);
4641     BY(FIRST_X_ASSUM_ST `EL` SUBST1_TAC THEN REWRITE_TAC[set_of_list;Bump.EL_EXPLICIT]);
4642   TYPIFY `~collinear {EL 0 ul,EL 1 ul,EL 2 ul}` (C SUBGOAL_THEN ASSUME_TAC);
4643     INTRO_TAC Leaf_cell.GBEWYFX [`V`;`ul`];
4644     FIRST_ASSUM_ST `CONS (EL 0 ul)` SUBST1_TAC;
4645     REWRITE_TAC[Bump.EL_EXPLICIT;set_of_list];
4646     DISCH_THEN MATCH_MP_TAC;
4647     BY(ASM_MESON_TAC[]);
4648   ASM_REWRITE_TAC[];
4649   TYPIFY `~affine_dependent {EL 0 ul,EL 1 ul,EL 2 ul}` (C SUBGOAL_THEN ASSUME_TAC);
4650     BY(ASM_MESON_TAC[AFFINE_DEPENDENT_IMP_COLLINEAR_3]);
4651   TYPIFY `!x y. {x,y} SUBSET {EL 0 ul,EL 1 ul,EL 2 ul} ==> dist(x,y) < &2 * sqrt(&2)` (C SUBGOAL_THEN ASSUME_TAC);
4652     REPEAT WEAKER_STRIP_TAC;
4653     REWRITE_TAC[arith `x < &2 * y <=> inv(&2) * x < y`];
4654     REWRITE_TAC[GSYM RADV2];
4655     MATCH_MP_TAC REAL_LET_TRANS;
4656     TYPIFY `radV {EL 0 ul, EL 1 ul, EL 2 ul}` EXISTS_TAC;
4657     ASM_REWRITE_TAC[];
4658     MATCH_MP_TAC Rogers.RADV_MONO;
4659     ASM_REWRITE_TAC[EXTENSION;IN_INSERT;NOT_IN_EMPTY];
4660     BY(MESON_TAC[]);
4661   INTRO_TAC Packing3.BARV_SUBSET [`V`;`2`;`ul`];
4662   ASM_REWRITE_TAC[];
4663   DISCH_TAC;
4664   TYPIFY `set_of_list ul = {EL 0 ul,EL 1 ul,EL 2 ul}` (C SUBGOAL_THEN ASSUME_TAC);
4665     FIRST_ASSUM_ST `CONS (EL 0 ul)` SUBST1_TAC;
4666     BY(REWRITE_TAC[Bump.EL_EXPLICIT;set_of_list]);
4667   TYPIFY `~(EL 0 ul = EL 1 ul) /\ ~(EL 1 ul = EL 2 ul) /\ ~(EL 0 ul = EL 2 ul)` (C SUBGOAL_THEN ASSUME_TAC);
4668     TYPIFY `{EL 0 ul,EL 1 ul, EL 2 ul} = {EL 1 ul,EL 2 ul,EL 0 ul}` (C SUBGOAL_THEN ASSUME_TAC);
4669       BY(SET_TAC[]);
4670     BY(ASM_MESON_TAC[Collect_geom.NOT_COLLINEAR_IMP_2_UNEQUAL]);
4671   TYPIFY `&2 <= dist (EL 1 ul,EL 2 ul) /\  &2 <= dist (EL 0 ul,EL 2 ul) /\ &2 <= dist (EL 0 ul,EL 1 ul)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
4672     FIRST_X_ASSUM_ST `packing` MP_TAC;
4673     REWRITE_TAC[Sphere.packing];
4674     FIRST_X_ASSUM_ST `SUBSET` MP_TAC;
4675     ASM_REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY];
4676     REWRITE_TAC[IN];
4677     BY(ASM_MESON_TAC[]);
4678   BY(REPEAT (CONJ_TAC THEN (TRY (FIRST_X_ASSUM MATCH_MP_TAC))) THEN SET_TAC[])
4679   ]);;
4680   (* }}} *)
4681
4682 let CELL_CLUSTER_N_LE_1 = prove_by_refinement(
4683   `!V u0 u1. pack_nonlinear_non_ox3q1h /\ packing V /\ saturated V /\          hminus <= hl [u0; u1] /\
4684               hl [u0; u1] <= hplus /\ CARD(s_leaf V [u0;u1]) <= 1 ==> 
4685               &0 <= sum {X | {u0, u1} IN edgeX V X /\ mcell_set V X}
4686               (\X. gammaX V X lmfun * critical_weight V X +
4687                    beta_bump_v1 V {u0, u1} X)`,
4688   (* {{{ proof *)
4689   [
4690   REPEAT WEAKER_STRIP_TAC;
4691   TYPIFY `?ul. {u0,u1} IN edgeX V (mcell4 V ul) /\ barV V 3 ul` ASM_CASES_TAC;
4692     FIRST_X_ASSUM MP_TAC;
4693     REPEAT WEAKER_STRIP_TAC;
4694     INTRO_TAC Leaf_cell.MCELL4_EDGE_FIRST [`V`;`ul`;`u0`;`u1`];
4695     ANTS_TAC;
4696       BY(ASM_REWRITE_TAC[IN]);
4697     REPEAT WEAKER_STRIP_TAC;
4698     INTRO_TAC S_LEAF_CARD2 [`V`;`vl`];
4699     ANTS_TAC;
4700       ASM_REWRITE_TAC[];
4701       CONJ_TAC;
4702         BY(ASM_MESON_TAC[IN]);
4703       FIRST_X_ASSUM (SUBST1_TAC o GSYM);
4704       REWRITE_TAC[Bump.MCELL4];
4705       DISCH_THEN (MP_TAC o (MATCH_MP Bump.RIJRIED));
4706       REWRITE_TAC[EXTENSION;NOT_IN_EMPTY];
4707       BY(ASM_MESON_TAC[Bump.MCELL4]);
4708     FIRST_X_ASSUM_ST `CARD` MP_TAC;
4709     ASM_REWRITE_TAC[];
4710     BY(ARITH_TAC);
4711   COMMENT "now sum over 0--3 sums and use positivity.";
4712   MATCH_MP_TAC SUM_POS_LE;
4713   CONJ_TAC;
4714     REWRITE_TAC[IN];
4715     ONCE_REWRITE_TAC[TAUT `!a b. a /\ b <=> b /\ a`];
4716     MATCH_MP_TAC Marchal_cells_3.FINITE_EDGE_X2;
4717     BY(ASM_MESON_TAC[]);
4718   REWRITE_TAC[IN_ELIM_THM;Qzyzmjc.mcell_set_2];
4719   REPEAT WEAKER_STRIP_TAC;
4720   FIRST_X_ASSUM_ST `edgeX` MP_TAC;
4721   FIRST_X_ASSUM_ST `mcell` SUBST1_TAC;
4722   REPEAT WEAKER_STRIP_TAC;
4723   FIRST_X_ASSUM_ST `i <= 4` MP_TAC;
4724   REWRITE_TAC[arith `i <= 4 <=> (i <= 1) \/ (i = 4) \/ (i = 2) \/ (i = 3)`];
4725   DISCH_THEN DISJ_CASES_TAC;
4726     BY(ASM_MESON_TAC[Bump.EDGE_IMP_K2;NOT_IN_EMPTY;IN]);
4727   FIRST_X_ASSUM DISJ_CASES_TAC;
4728     BY(ASM_MESON_TAC[IN;Bump.MCELL4]);
4729   REWRITE_TAC[arith `&0 <= x <=> x >= &0`];
4730   MATCH_MP_TAC GAMMAX_NO_BETA;
4731   GEXISTL_TAC [`ul`;`i`];
4732   ASM_SIMP_TAC[arith `i = 2 \/ i = 3 ==> i < 4`];
4733   CONJ_TAC;
4734     BY(ASM_MESON_TAC[IN]);
4735   CONJ_TAC;
4736     BY(ASM_MESON_TAC[Bump.RIJRIED;NOT_IN_EMPTY]);
4737   CONJ_TAC;
4738     REWRITE_TAC[Pack_defs.critical_edgeX;IN_ELIM_THM];
4739     BY(ASM_MESON_TAC[]);
4740   FIRST_X_ASSUM DISJ_CASES_TAC;
4741     MATCH_MP_TAC Tskajxy.TSKAJXY_2;
4742     BY(ASM_MESON_TAC[IN;Bump.MCELL2]);
4743   TYPIFY `~NULLSET (mcell 3 V ul)` (C SUBGOAL_THEN ASSUME_TAC);
4744     BY(ASM_MESON_TAC[Bump.RIJRIED;NOT_IN_EMPTY]);
4745   MATCH_MP_TAC TSKAJXY_3;
4746   BY(ASM_MESON_TAC[IN;Bump.MCELL3])
4747   ]);;
4748   (* }}} *)
4749
4750 let RAD_PI_IMP_WEDGE4 = prove_by_refinement(
4751   `!V f w0 n i u0 u1.
4752     1 < n /\
4753     packing V /\ saturated V /\   
4754     ~collinear {u0, u1, w0 } /\
4755     leaf_rank V [u0;u1] w0 n f /\
4756     azim u0 u1 (f i) (f (SUC i)) < pi /\
4757     radV {u0,u1,f i,f (SUC i)} < sqrt(&2)  ==>
4758     (?ul. mcell4 V ul SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\
4759        barV V 3 ul /\
4760     {u0,u1} IN edgeX V (mcell4 V ul))`,
4761   (* {{{ proof *)
4762   [
4763   REPEAT WEAKER_STRIP_TAC;
4764   TYPIFY `~coplanar {u0,u1,f i , f (SUC i)}` (C SUBGOAL_THEN ASSUME_TAC);
4765     REWRITE_TAC[ (GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR)];
4766     DISCH_THEN DISJ_CASES_TAC;
4767       INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`;`SUC i`];
4768       ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
4769       ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`;arith `SUC i = i + 1`];
4770       BY(ASM_MESON_TAC[ MOD_INJ1_ALT;arith `1 < n ==> ~(n = 0) /\ ~(1 = 0)`]);
4771     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
4772   TYPIFY `!j. leaf V [u0; u1; f j]` (C SUBGOAL_THEN ASSUME_TAC);
4773     GEN_TAC;
4774     INTRO_TAC s_leaf_leaf[`V`;`[u0;u1]`;`f j`];
4775     REWRITE_TAC[Bump.EL_EXPLICIT];
4776     DISCH_THEN MATCH_MP_TAC;
4777     REWRITE_TAC[IN];
4778     MATCH_MP_TAC LEAF_RANK_S_LEAF;
4779     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
4780   INTRO_TAC HL_IMP_BARV [`V`;`[u0;u1;f i;f (SUC i)]`];
4781   ANTS_TAC;
4782     ASM_REWRITE_TAC[set_of_list];
4783     REWRITE_TAC[LENGTH;arith `SUC(SUC(SUC(SUC 0))) = 4`];
4784     TYPIFY `set_of_list [u0;u1;f i] SUBSET V` (C SUBGOAL_THEN MP_TAC);
4785       MATCH_MP_TAC Packing3.BARV_SUBSET;
4786       TYPIFY `2` EXISTS_TAC;
4787       FIRST_X_ASSUM (C INTRO_TAC [`i`]);
4788       REWRITE_TAC[Leaf_cell.leaf;IN];
4789       BY(MESON_TAC[]);
4790     TYPIFY `set_of_list [u0;u1;f (SUC i)] SUBSET V` (C SUBGOAL_THEN MP_TAC);
4791       MATCH_MP_TAC Packing3.BARV_SUBSET;
4792       TYPIFY `2` EXISTS_TAC;
4793       FIRST_X_ASSUM (C INTRO_TAC [`SUC i`]);
4794       REWRITE_TAC[Leaf_cell.leaf;IN];
4795       BY(MESON_TAC[]);
4796     REWRITE_TAC[set_of_list;SUBSET;IN_INSERT;NOT_IN_EMPTY];
4797     REPEAT WEAKER_STRIP_TAC;
4798     CONJ_TAC;
4799       BY(ASM_MESON_TAC[]);
4800     CONJ_TAC;
4801       BY(ASM_REWRITE_TAC[Pack_defs.HL;set_of_list]);
4802     REWRITE_TAC[Marchal_cells.TRUNCATE_SIMPLEX_EXPLICIT_2];
4803     FIRST_X_ASSUM (C INTRO_TAC [`i`]);
4804     REWRITE_TAC[Leaf_cell.leaf];
4805     BY(MESON_TAC[IN]);
4806   DISCH_TAC;
4807   COMMENT "now pick ul";
4808   TYPIFY `[u0;u1;f i;f(SUC i)]` EXISTS_TAC;
4809   TYPIFY `~NULLSET (mcell4 V [u0; u1; f i; f (SUC i)])` (C SUBGOAL_THEN ASSUME_TAC);
4810     ASM_REWRITE_TAC[Pack_defs.mcell4;Pack_defs.HL;set_of_list];
4811     FIRST_X_ASSUM (MP_TAC o (MATCH_MP Leaf_cell.ZWVCBMN));
4812     BY(MESON_TAC[Vol1.VOLUME_PROPS_NULLSET;arith `x = &0 ==> ~(&0 < x)`]);
4813   ASM_REWRITE_TAC[];
4814   CONJ2_TAC;
4815     GMATCH_SIMP_TAC Bump.MCELL4_EDGE;
4816     CONJ_TAC;
4817       BY(ASM_REWRITE_TAC[]);
4818     CONJ2_TAC;
4819       REWRITE_TAC[set_of_list];
4820       BY(SET_TAC[]);
4821     BY(ASM_MESON_TAC[Collect_geom.NOT_COLLINEAR_IMP_2_UNEQUAL]);
4822   (COMMENT "now place it in wedge");
4823   GMATCH_SIMP_TAC MCELL4_CONVEX_HULL;
4824   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
4825   GMATCH_SIMP_TAC Local_lemmas.WEDGE_GE_EQ_AFF_GE;
4826   ASM_REWRITE_TAC[];
4827   INTRO_TAC LEAF_RANK_COLLINEAR [`V`;`[u0;u1]`;`w0`;`n`;`f`];
4828   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
4829   DISCH_TAC;
4830   ASM_REWRITE_TAC[];
4831   BY(REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2])
4832   ]);;
4833   (* }}} *)
4834
4835 let LEAF_RANK_SUC_INJ = prove_by_refinement(
4836   `!V u0 u1 w0 n f i.
4837     packing V /\
4838     saturated V /\
4839     leaf_rank V [u0;u1]  w0 n f /\
4840     ~collinear {u0,u1,w0} /\
4841     1 < n  ==>
4842     ~(f i = f (SUC i))`,
4843   (* {{{ proof *)
4844   [
4845   REPEAT WEAKER_STRIP_TAC;
4846   INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`;`SUC i`];
4847   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
4848   ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`;arith `SUC i = i + 1`];
4849   REWRITE_TAC[AZIM_REFL];
4850   BY(ASM_MESON_TAC[ MOD_INJ1_ALT;arith `1 < n ==> ~(n = 0) /\ ~(1 = 0)`])
4851   ]);;
4852   (* }}} *)
4853
4854 let DIST_I_SUCI = prove_by_refinement(
4855   `!V u0 u1 w0 n f i.  pack_nonlinear_non_ox3q1h /\
4856     1 < n /\
4857     packing V /\ saturated V /\   
4858     ~collinear {u0, u1, w0 } /\
4859     leaf_rank V [u0;u1] w0 n f ==>
4860     &2 <= dist (f i,f (SUC i))`,
4861   (* {{{ proof *)
4862   [
4863   REPEAT WEAKER_STRIP_TAC;
4864   TYPIFY `!j. leaf V [u0; u1; f j]` (C SUBGOAL_THEN ASSUME_TAC);
4865     GEN_TAC;
4866     INTRO_TAC s_leaf_leaf[`V`;`[u0;u1]`;`f j`];
4867     REWRITE_TAC[Bump.EL_EXPLICIT];
4868     DISCH_THEN MATCH_MP_TAC;
4869     REWRITE_TAC[IN];
4870     MATCH_MP_TAC LEAF_RANK_S_LEAF;
4871     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
4872   INTRO_TAC Packing3.BARV_SUBSET [`V`;`2`;`[u0;u1;f i]`];
4873   ANTS_TAC;
4874     BY(ASM_MESON_TAC[Leaf_cell.leaf;IN]);
4875   INTRO_TAC Packing3.BARV_SUBSET [`V`;`2`;`[u0;u1;f (SUC i)]`];
4876   ANTS_TAC;
4877     BY(ASM_MESON_TAC[Leaf_cell.leaf;IN]);
4878   REWRITE_TAC[set_of_list];
4879   REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY];
4880   REPEAT WEAKER_STRIP_TAC;
4881   TYPIFY `~(f i = f (SUC i))` (C SUBGOAL_THEN ASSUME_TAC);
4882   ASM_MESON_TAC[LEAF_RANK_SUC_INJ];
4883   FIRST_X_ASSUM_ST `packing` MP_TAC;
4884   REWRITE_TAC[Sphere.packing];
4885   BY(ASM_MESON_TAC[IN])
4886   ]);;
4887   (* }}} *)
4888
4889 let WEDGE3_Y4 = prove_by_refinement(
4890    `!V f w0 n i u0 u1 y1 y2 y3 y5 y6.
4891      pack_nonlinear_non_ox3q1h /\
4892     1 < n /\
4893     packing V /\ saturated V /\   
4894     ~collinear {u0, u1, w0 } /\
4895     leaf_rank V [u0;u1] w0 n f /\
4896      critical_edge_y (dist(u0,u1)) /\ 
4897     ~(?vl. barV V 3 vl /\ {u0,u1} IN edgeX V (mcell4 V vl) /\ 
4898         mcell4 V vl SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) )  /\
4899      y1 = dist(u0,u1) /\
4900      y2 = dist(u0,f i) /\
4901      y3 = dist(u0,f (SUC i)) /\
4902     y5 = dist(u1,f (SUC i)) /\
4903     y6 = dist(u1,f i)
4904 ==> (?y4. 
4905        &2 <= y4 /\ y4 <= &2 * sqrt(&2) /\
4906        &0 < delta_y y1 y2 y3 y4 y5 y6 /\
4907        dih_y y1 y2 y3 y4 y5 y6 <= azim u0 u1 (f i) (f (SUC i)) /\
4908        &2 <= rad2_y y1 y2 y3 y4 y5 y6 /\
4909       (azim u0 u1 (f i) (f (SUC i)) < pi /\ dist(f i,f (SUC i)) <= &2 * sqrt(&2) ==> y4 = dist(f i,f(SUC i))))`,
4910   (* {{{ proof *)
4911   [
4912   REWRITE_TAC[Pack_defs.critical_edge_y];
4913   REPEAT WEAKER_STRIP_TAC;
4914   TYPIFY `!j. leaf V [u0; u1; f j]` (C SUBGOAL_THEN ASSUME_TAC);
4915     GEN_TAC;
4916     INTRO_TAC s_leaf_leaf[`V`;`[u0;u1]`;`f j`];
4917     REWRITE_TAC[Bump.EL_EXPLICIT];
4918     DISCH_THEN MATCH_MP_TAC;
4919     REWRITE_TAC[IN];
4920     MATCH_MP_TAC LEAF_RANK_S_LEAF;
4921     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
4922   INTRO_TAC LEAF_DOMAIN [`V`;`[u0;u1;f i]`];
4923   INTRO_TAC LEAF_DOMAIN [`V`;`[u0;u1;f (SUC i)]`];
4924   REWRITE_TAC[Bump.EL_EXPLICIT];
4925   ASM_REWRITE_TAC[];
4926   REPEAT WEAKER_STRIP_TAC;
4927   COMMENT "delta with delta";
4928   TYPIFY `!y4. &2 <= y4 /\ y4 <= &2 * sqrt(&2) ==> &0 <      delta_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i))) y4      (dist (u1,f (SUC i)))      (dist (u1,f i))` (C SUBGOAL_THEN ASSUME_TAC);
4929     REPEAT WEAKER_STRIP_TAC;
4930     MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "FWGKMBZ");
4931     REWRITE_TAC[Sphere.y_of_x;GSYM Sphere.delta_y];
4932     REWRITE_TAC[Sphere.ineq];
4933     DISCH_THEN (C INTRO_TAC [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`]);
4934     REWRITE_TAC[arith `x > &0 <=> &0 < x`];
4935     ASM_REWRITE_TAC[TAUT `x ==> b ==> c <=> x /\ b ==> c`];
4936     DISCH_THEN MATCH_MP_TAC;
4937     REWRITE_TAC[Nonlinear_lemma.sqrt8_sqrt2;Sphere.sqrt2];
4938     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
4939   TYPIFY `&2 <= &2 * sqrt(&2)` (C SUBGOAL_THEN ASSUME_TAC);
4940     REWRITE_TAC[GSYM Sphere.sqrt2];
4941     MP_TAC Flyspeck_constants.bounds;
4942     BY(REAL_ARITH_TAC);
4943   COMMENT "first case";
4944   TYPIFY `pi <= azim u0 u1 (f i) (f (SUC i))` ASM_CASES_TAC;
4945     TYPIFY `&2 * sqrt(&2)` EXISTS_TAC;
4946     ASM_SIMP_TAC[arith `pi <= x ==> ~(x < pi)`;arith `x <= x`];
4947     CONJ_TAC;
4948       MATCH_MP_TAC REAL_LE_TRANS;
4949       TYPIFY `pi` EXISTS_TAC;
4950       ASM_REWRITE_TAC[];
4951       MATCH_MP_TAC (arith `x < y ==> x <= y`);
4952       MATCH_MP_TAC DIH_Y_LT_PI;
4953       CONJ2_TAC;
4954         FIRST_X_ASSUM MATCH_MP_TAC;
4955         BY(ASM_REWRITE_TAC[arith `x <= x`]);
4956       FIRST_X_ASSUM_ST `hminus` MP_TAC;
4957       BY(MP_TAC Nonlinear_lemma.hminus_gt THEN REAL_ARITH_TAC);
4958     REWRITE_TAC[GSYM Sphere.sqrt2;GSYM Nonlinear_lemma.sqrt8_sqrt2];
4959     MATCH_MP_TAC RAD2_Y_SQRT8;
4960     ASM_SIMP_TAC[];
4961     TYPIFY `!y. y < &2 * sqrt(&2) ==> y < &4` (C SUBGOAL_THEN ASSUME_TAC);
4962       REWRITE_TAC[GSYM Sphere.sqrt2];
4963       MP_TAC Flyspeck_constants.bounds;
4964       BY(REAL_ARITH_TAC);
4965     ASM_SIMP_TAC[];
4966     FIRST_X_ASSUM MATCH_MP_TAC;
4967     BY(ASM_REWRITE_TAC[arith `x <= x`;Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2]);
4968   FIRST_X_ASSUM MP_TAC;
4969   REWRITE_TAC[arith `~(pi <= x) <=> x < pi`];
4970   DISCH_TAC;
4971   COMMENT "second case";
4972   TYPIFY `&2 * sqrt(&2) < dist(f i,f (SUC i))` ASM_CASES_TAC;
4973     TYPIFY `&2 * sqrt(&2)` EXISTS_TAC;
4974     ASM_SIMP_TAC[arith `x <= x`;arith `s < d ==> ~(d <= s)`];
4975     CONJ2_TAC;
4976       REWRITE_TAC[GSYM Sphere.sqrt2;GSYM Nonlinear_lemma.sqrt8_sqrt2];
4977       MATCH_MP_TAC RAD2_Y_SQRT8;
4978       ASM_SIMP_TAC[];
4979       TYPIFY `!y. y < &2 * sqrt(&2) ==> y < &4` (C SUBGOAL_THEN ASSUME_TAC);
4980         REWRITE_TAC[GSYM Sphere.sqrt2];
4981         MP_TAC Flyspeck_constants.bounds;
4982         BY(REAL_ARITH_TAC);
4983       ASM_SIMP_TAC[];
4984       FIRST_X_ASSUM MATCH_MP_TAC;
4985       BY(ASM_REWRITE_TAC[arith `x <= x`;Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2]);
4986     MATCH_MP_TAC REAL_LE_TRANS;
4987     TYPIFY `dihV u0 u1 (f i) (f (SUC i))` EXISTS_TAC;
4988     CONJ2_TAC;
4989       MATCH_MP_TAC Rogers.DIHV_LE_AZIM;
4990       BY(ASM_REWRITE_TAC[]);
4991     INTRO_TAC Merge_ineq.DIHV_EQ_DIH_Y [`u0`;`u1`;`f i`;`f(SUC i)`];
4992     ASM_SIMP_TAC[LET_DEF;LET_END_DEF];
4993     DISCH_THEN SUBST1_TAC;
4994     REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF];
4995     MATCH_MP_TAC (arith `x < y ==> x <= y`);
4996     MATCH_MP_TAC Tame_inequalities.DIH_X_MONO_LT_4;
4997     REWRITE_TAC[GSYM Sphere.delta_y];
4998     CONJ_TAC;
4999       GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE;
5000       BY(ASM_SIMP_TAC [arith `&2 <= x ==> abs(x ) = x`]);
5001     CONJ_TAC;
5002       GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
5003       FIRST_X_ASSUM_ST `hminus` MP_TAC;
5004       BY(MP_TAC Nonlinear_lemma.hminus_gt THEN REAL_ARITH_TAC);
5005     CONJ_TAC;
5006       FIRST_X_ASSUM MATCH_MP_TAC;
5007       BY(ASM_REWRITE_TAC[arith `x <= x`]);
5008     TYPIFY `~coplanar {u0,u1,f i , f (SUC i)}` (C SUBGOAL_THEN ASSUME_TAC);
5009       REWRITE_TAC[ (GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR)];
5010       DISCH_THEN DISJ_CASES_TAC;
5011         INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`;`SUC i`];
5012         ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5013         ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`;arith `SUC i = i + 1`];
5014         BY(ASM_MESON_TAC[ MOD_INJ1_ALT;arith `1 < n ==> ~(n = 0) /\ ~(1 = 0)`]);
5015       BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
5016     BY(ASM_REWRITE_TAC[GSYM coplanar_delta_y]);
5017   COMMENT "last case";
5018   FIRST_X_ASSUM MP_TAC;
5019   REWRITE_TAC[arith `~(x < d) <=> (d <= x)`];
5020   DISCH_TAC;
5021   TYPIFY `dist(f i,f (SUC i))` EXISTS_TAC;
5022   ASM_SIMP_TAC[];
5023   TYPIFY `~(f i = f (SUC i))` (C SUBGOAL_THEN ASSUME_TAC);
5024     DISCH_TAC;
5025     INTRO_TAC LEAF_RANK_AZIM_INJ [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`;`SUC i`];
5026     ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5027     ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`;arith `SUC i = i + 1`];
5028     REWRITE_TAC[AZIM_REFL];
5029     BY(ASM_MESON_TAC[ MOD_INJ1_ALT;arith `1 < n ==> ~(n = 0) /\ ~(1 = 0)`]);
5030   TYPIFY `!i. V (f i)` (C SUBGOAL_THEN ASSUME_TAC);
5031     GEN_TAC;
5032     FIRST_X_ASSUM_ST `leaf` MP_TAC;
5033     REWRITE_TAC[Leaf_cell.leaf;IN];
5034     DISCH_THEN (C INTRO_TAC [`i'`]);
5035     REPEAT WEAKER_STRIP_TAC;
5036     INTRO_TAC Packing3.BARV_SUBSET [`V`;`2`;`[u0;u1;f i']`];
5037     ASM_REWRITE_TAC[set_of_list;SUBSET;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
5038     BY(MESON_TAC[IN]);
5039   SUBCONJ_TAC;
5040     FIRST_X_ASSUM_ST `packing` MP_TAC;
5041     REWRITE_TAC[Sphere.packing];
5042     DISCH_THEN MATCH_MP_TAC;
5043     BY(ASM_MESON_TAC[]);
5044   DISCH_TAC;
5045   SUBCONJ_TAC;
5046     FIRST_X_ASSUM MATCH_MP_TAC;
5047     BY(ASM_REWRITE_TAC[]);
5048   DISCH_TAC;
5049   COMMENT "azim on last case";
5050   CONJ_TAC;
5051     INTRO_TAC Rogers.DIHV_LE_AZIM [`u0`;`u1`;`f i`;`f(SUC i)`];
5052     ANTS_TAC;
5053       BY(ASM_REWRITE_TAC[]);
5054     MATCH_MP_TAC (arith `x = y ==> (x <= a ==> y <= a)`);
5055     INTRO_TAC Merge_ineq.DIHV_EQ_DIH_Y [`u0`;`u1`;`f i`;`f(SUC i)`];
5056     ANTS_TAC;
5057       BY(ASM_REWRITE_TAC[]);
5058     BY(REWRITE_TAC[LET_DEF;LET_END_DEF]);
5059   COMMENT "deal with rad";
5060   MATCH_MP_TAC (arith `~(x < y) ==> y <= x`);
5061   REWRITE_TAC[Sphere.rad2_y;Sphere.y_of_x;arith `x * x = x pow 2`];
5062   INTRO_TAC (GSYM GDRQXLGv3) [`u0`;`u1`;`f i`;`f (SUC i)`];
5063   REWRITE_TAC[LET_DEF;LET_END_DEF];
5064   ANTS_TAC;
5065     FIRST_X_ASSUM MP_TAC;
5066     BY(MESON_TAC[coplanar_delta_y]);
5067   DISCH_THEN SUBST1_TAC;
5068   DISCH_TAC;
5069   TYPIFY `radV {u0,u1,f i, f(SUC i)} < sqrt(&2)` ENOUGH_TO_SHOW_TAC;
5070     REPEAT WEAKER_STRIP_TAC;
5071     INTRO_TAC RAD_PI_IMP_WEDGE4 [`V`;`f`;`w0`;`n`;`i`;`u0`;`u1`];
5072     ASM_REWRITE_TAC[];
5073     FIRST_X_ASSUM_ST `edgeX` MP_TAC;
5074     BY(MESON_TAC[]);
5075   FIRST_X_ASSUM MP_TAC;
5076   REWRITE_TAC[arith `x < y <=> ~(y <= x)`];
5077   REPEAT WEAKER_STRIP_TAC;
5078   FIRST_X_ASSUM_ST `~` MP_TAC;
5079   REWRITE_TAC[];
5080   ONCE_REWRITE_TAC[GSYM Nonlin_def.sqrt2_sqrt2];
5081   REWRITE_TAC[Sphere.sqrt2;arith `x pow 2 = x * x`];
5082   GMATCH_SIMP_TAC Misc_defs_and_lemmas.ABS_SQUARE_LE;
5083   GMATCH_SIMP_TAC Trigonometry2.LT_IMP_ABS_REFL;
5084   ASM_REWRITE_TAC[];
5085   GMATCH_SIMP_TAC REAL_LT_RSQRT;
5086   BY(REAL_ARITH_TAC)
5087   ]);;
5088   (* }}} *)
5089
5090 let cc_4_cc_ke4 = prove_by_refinement(
5091   `!V u0 u1 w0 n f i.
5092     packing V /\     saturated V /\
5093     leaf_rank V [u0;u1]  w0 n f /\
5094     ~collinear {u0,u1,w0} /\
5095     periodic f n /\
5096     1 < n /\
5097     leaf V [u0;u1;f i] /\ 
5098     cc_4 V u0 u1 f i ==>
5099     cc_ke V [u0;u1;f i] = 4`,
5100   (* {{{ proof *)
5101   [
5102   REWRITE_TAC[cc_4];
5103   REPEAT WEAKER_STRIP_TAC;
5104   INTRO_TAC Leaf_cell.MCELL4_EDGE_FIRST [`V`;`ul`;`u0`;`u1`];
5105   ANTS_TAC;
5106     BY(ASM_MESON_TAC[IN]);
5107   REPEAT WEAKER_STRIP_TAC;
5108   INTRO_TAC Leaf_cell.CC_KE_34 [`V`;`[u0;u1;f i]`];
5109   DISCH_THEN (MP_TAC o (MATCH_MP (TAUT `a \/ b ==> b \/ a`)));
5110   DISCH_THEN DISJ_CASES_TAC;
5111     BY(ASM_REWRITE_TAC[]);
5112   INTRO_TAC K3_CC_WI_ALT [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
5113   ASM_SIMP_TAC[Bump.EL_EXPLICIT];
5114   ANTS_TAC;
5115     BY(ASM_MESON_TAC[]);
5116   DISCH_TAC;
5117   TYPIFY `?j. j< n /\ (f i) = (f j) /\ (f (SUC j) = f (SUC i))` (C SUBGOAL_THEN MP_TAC);
5118     TYPIFY `i MOD n` EXISTS_TAC;
5119     INTRO_TAC F_DEMOD [`f`;`n`;`i`];
5120     BY(ASM_MESON_TAC[DIVISION;arith `1 < n ==> ~(n = 0)`]);
5121   REPEAT WEAKER_STRIP_TAC;
5122   INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[u0;u1;f i]`];
5123   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5124   DISCH_TAC;
5125   INTRO_TAC MCELL4_FULL_WEDGE [`V`;`cc_cell V [u0;u1;f i]`;`vl`;`w0`;`n`;`f`;`j`];
5126   ANTS_TAC;
5127     ASM_SIMP_TAC[];
5128     BY(ASM_MESON_TAC[Bump.RIJRIED;NOT_IN_EMPTY;Bump.MCELL4;Leaf_cell.CC_CELL_IN_MCELL_SET;IN]);
5129   DISCH_TAC;
5130   INTRO_TAC Ajripqn.AJRIPQN [`V`;`vl`;`cc_uh V [u0;u1;f i]`;`4`;`3`];
5131   ASM_REWRITE_TAC[arith `~(4 = 3) /\ ~(3 = 4)`;IN_INSERT];
5132   CONJ_TAC;
5133     BY(ASM_MESON_TAC[IN]);
5134   CONJ_TAC;
5135     BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
5136   REWRITE_TAC[GSYM Bump.MCELL4];
5137   TYPIFY `mcell 3 V (cc_uh V [EL 0 vl; EL 1 vl; f j]) = mcell4 V vl` (C SUBGOAL_THEN SUBST1_TAC);
5138     FIRST_X_ASSUM (SUBST1_TAC o GSYM);
5139     REWRITE_TAC[Leaf_cell.cc_cell];
5140     BY(ASM_MESON_TAC[]);
5141   REWRITE_TAC[INTER_IDEMPOT];
5142   BY(ASM_MESON_TAC[Bump.RIJRIED;NOT_IN_EMPTY;IN;Bump.MCELL4])
5143   ]);;
5144   (* }}} *)
5145
5146 let cc_4_cc_cell = prove_by_refinement(
5147   `!V u0 u1 w0 n f i. 
5148     packing V /\
5149     saturated V /\
5150     periodic f n /\
5151     leaf V [u0;u1;f i] /\
5152     leaf_rank V [u0;u1]  w0 n f /\
5153     ~collinear {u0,u1,w0} /\
5154     1 < n /\
5155     cc_4 V u0 u1 f i ==>
5156        gg_mcell V f u0 u1 i =
5157                 gammaX V (cc_cell V [u0;u1;f i]) lmfun * critical_weight V (cc_cell V [u0;u1;f i]) +
5158                 beta_bump_v1 V {u0,u1} (cc_cell V [u0;u1;f i])`,
5159   (* {{{ proof *)
5160   [
5161   REPEAT WEAKER_STRIP_TAC;
5162   INTRO_TAC cc_4_cc_ke4 [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5163   ANTS_TAC;
5164     BY(ASM_REWRITE_TAC[]);
5165   DISCH_TAC;
5166   INTRO_TAC Leaf_cell.EL_CC_UH [`V`;`[u0;u1;f i]`];
5167   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5168   REPEAT WEAKER_STRIP_TAC;
5169   TYPED_ABBREV_TAC `j = (i:num)`;
5170   TYPIFY `mcell4 V (cc_uh V [u0;u1;f j]) = cc_cell V [u0;u1;f j]` (C SUBGOAL_THEN ASSUME_TAC);
5171     BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL4]);
5172   INTRO_TAC MCELL4_GG [`V`;`cc_cell V [u0;u1;f i]`;`cc_uh V [u0;u1;f i]`;`w0`;`n`;`f`;`j`];
5173   ASM_SIMP_TAC[];
5174   ANTS_TAC;
5175     CONJ_TAC;
5176       BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
5177     CONJ_TAC;
5178       MATCH_MP_TAC Leaf_cell.CC_CELL_NOT_NULLSET;
5179       BY(ASM_MESON_TAC[]);
5180     INTRO_TAC K4_CC_WI_ALT [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
5181     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
5182   DISCH_THEN (SUBST1_TAC o GSYM);
5183   BY(REWRITE_TAC[])
5184   ]);;
5185   (* }}} *)
5186
5187 let LEAF_RANK_PROPS = prove_by_refinement(
5188   `!V. packing V /\ saturated V /\  ~cell_cluster_estimate_v1 V /\ pack_nonlinear_non_ox3q1h 
5189     ==> (?u0 u1 n w0 f. 
5190     1 < n /\
5191    s_leaf V [u0;u1] HAS_SIZE n /\
5192    ~(u0 = u1) /\
5193     hminus <= hl [u0;u1] /\ hl [u0;u1] <= hplus /\
5194    ~collinear {u0, u1, w0 } /\
5195     leaf_rank V [u0;u1] w0 n f /\
5196     u0 IN V /\ u1 IN V /\
5197    periodic f n /\
5198    (!j. leaf V [u0; u1; f j]) /\
5199    critical_edge_y (dist(u0,u1)) /\
5200     sum {i | i < n} (gg_mcell V f (u0) (u1)) < &0 /\ 
5201     sum {i | i < n} (azim_mcell V f (u0) (u1)) = &2 * pi /\
5202     (!i. azim_mcell V f u0 u1 i = azim (u0) (u1) (f i) (f (SUC i))) /\
5203    cc_bool_model_v11 (cc_data_v8 V f u0 u1) /\
5204    cc_bool_prep_v11 (cc_data_v8 V f u0 u1)
5205     ) `,
5206   (* {{{ proof *)
5207   [
5208   REPEAT WEAKER_STRIP_TAC;
5209   INTRO_TAC CELL_CLUSTER_ESTIMATE_REDUCE [`V`];
5210   ASM_REWRITE_TAC[NOT_FORALL_THM];
5211   REPEAT WEAKER_STRIP_TAC;
5212   FIRST_X_ASSUM (MP_TAC o (MATCH_MP (TAUT `~(a /\ b /\ d ==>c) ==> a /\ b /\ d /\ ~c`)));
5213   REWRITE_TAC[arith `~(a <= b) <=> b < a`];
5214   REPEAT WEAKER_STRIP_TAC;
5215   GEXISTL_TAC [`u0`;`u1`];
5216   TYPED_ABBREV_TAC `(n:num) = CARD(s_leaf V [u0;u1])`;
5217   EXISTS_TAC `n:num`;
5218   TYPIFY `?w0. ~collinear {u0,u1,w0}` (C SUBGOAL_THEN MP_TAC);
5219     MATCH_MP_TAC Trigonometry2.TOW_DISTINCT_POINTS_EXISTS_RD_NOT_COLLINEAR;
5220     BY(ASM_REWRITE_TAC[]);
5221   REPEAT WEAKER_STRIP_TAC;
5222   TYPIFY `w0` EXISTS_TAC;
5223   INTRO_TAC CELL_CLUSTER_N_LE_1 [`V`;`u0`;`u1`];
5224   ASM_REWRITE_TAC[arith `&0 <= x <=> ~(x < &0)`;arith `~(n <= 1) <=> 1 < n`];
5225   DISCH_TAC;
5226   TYPIFY `s_leaf V [u0;u1] HAS_SIZE n` (C SUBGOAL_THEN ASSUME_TAC);
5227     ASM_REWRITE_TAC[ HAS_SIZE];
5228     MATCH_MP_TAC S_LEAF_FINITE;
5229     BY(ASM_REWRITE_TAC[]);
5230   INTRO_TAC LEAF_RANKING_LEMMA [`V`;`[u0;u1]`;`w0`;`n`];
5231   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5232   ASM_SIMP_TAC[arith `1 < n ==> 0 < n`];
5233   REPEAT WEAKER_STRIP_TAC;
5234   TYPIFY `f` EXISTS_TAC;
5235   SUBCONJ_TAC;
5236     BY(ASM_REWRITE_TAC[leaf_rank;Bump.EL_EXPLICIT]);
5237   DISCH_TAC;
5238   TYPIFY `!j. leaf V [u0; u1; f j]` (C SUBGOAL_THEN ASSUME_TAC);
5239     GEN_TAC;
5240     INTRO_TAC s_leaf_leaf[`V`;`[u0;u1]`;`f j`];
5241     REWRITE_TAC[Bump.EL_EXPLICIT];
5242     DISCH_THEN MATCH_MP_TAC;
5243     REWRITE_TAC[IN];
5244     MATCH_MP_TAC LEAF_RANK_S_LEAF;
5245     BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE]);
5246   TYPIFY `critical_edge_y (dist(u0,u1))` (C SUBGOAL_THEN ASSUME_TAC);
5247     REWRITE_TAC[Pack_defs.critical_edge_y];
5248     REPEAT (FIRST_X_ASSUM_ST `hl` MP_TAC);
5249     REWRITE_TAC[Marchal_cells_3.HL_2];
5250     BY(REAL_ARITH_TAC);
5251   TYPIFY `u0 IN V /\ u1 IN V` (C SUBGOAL_THEN ASSUME_TAC);
5252     TYPIFY `u0 IN V /\ u1 IN V` (C SUBGOAL_THEN (unlist ASM_REWRITE_TAC));
5253     INTRO_TAC Packing3.BARV_SUBSET [`V`;`2`;`[u0;u1;f 0]`];
5254     ANTS_TAC;
5255       BY(ASM_MESON_TAC[Leaf_cell.leaf;IN;Sphere.BARV]);
5256     REWRITE_TAC[Bump.set_of_list3_explicit];
5257     BY(SET_TAC[]);
5258   ASM_REWRITE_TAC[];
5259   INTRO_TAC LEAF_RANK_GG_SUM [`V`;`[u0;u1]`;`w0`;`n`;`f`];
5260   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5261   DISCH_THEN SUBST1_TAC;
5262   ASM_REWRITE_TAC[];
5263   CONJ_TAC;
5264     BY(ASM_MESON_TAC[ LEAF_RANK_PERIODIC]);
5265   CONJ_TAC;
5266     ONCE_REWRITE_TAC[TAUT `!a b. a /\ b <=> b /\ a`];
5267     BY(ASM_REWRITE_TAC[]);
5268   CONJ_TAC;
5269     INTRO_TAC LEAF_RANK_GRUTOTI [`V`;`[u0;u1]`;`w0`;`n`;`f`];
5270     ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5271     DISCH_THEN MATCH_MP_TAC;
5272     MATCH_MP_TAC REAL_LET_TRANS;
5273     TYPIFY `hplus` EXISTS_TAC;
5274     ASM_REWRITE_TAC[];
5275     MP_TAC Flyspeck_constants.bounds;
5276     BY(REAL_ARITH_TAC);
5277   CONJ_TAC;
5278     GEN_TAC;
5279     INTRO_TAC LEAF_RANK_REUHADY [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
5280     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
5281   CONJ_TAC;
5282     MATCH_MP_TAC cc_bool_model_data;
5283     GEXISTL_TAC [`w0`;`n`];
5284     BY(ASM_REWRITE_TAC[]);
5285   MATCH_MP_TAC cc_prep_model_data;
5286   BY(ASM_MESON_TAC[])
5287   ]);;
5288   (* }}} *)
5289
5290 let cc_real_dat_def = prove_by_refinement(
5291   `!V f u0 u1.
5292      cc_qx_v11 (cc_data_v8 V f u0 u1) =
5293      (\i. cc_4 V u0 u1 f i /\ 
5294             ~(dist (u0,f i) < &2 * hminus /\
5295             dist (u1,f i) < &2 * hminus /\
5296             dist (u0,f (i + 1)) < &2 * hminus /\
5297             dist (u1,f (i + 1)) < &2 * hminus /\
5298             dist (f i,f (SUC i)) < &2 * hminus)) /\
5299      cc_qy_v11 (cc_data_v8 V f u0 u1) = (\i. ~cc_4 V u0 u1 f i) /\
5300      cc_qu_v11 (cc_data_v8 V f u0 u1) =
5301      (\i. cc_4 V u0 u1 f i /\
5302           (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
5303           dist (u0,f (i + 1)) < &2 * hminus /\
5304           dist (u1,f (i + 1)) < &2 * hminus /\
5305           dist (f i,f (SUC i)) < &2 * hminus) /\
5306      cc_hassmall_v11 (cc_data_v8 V f u0 u1) =
5307      (\i. (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
5308           dist (u0,f (i + 1)) < &2 * hminus /\
5309           dist (u1,f (i + 1)) < &2 * hminus)`,
5310   (* {{{ proof *)
5311   [
5312   REWRITE_TAC[FUN_EQ_THM;Oxl_def.cc_subcrit_v11;Oxl_def.cc_crit_v11;Oxl_def.cc_supercrit_v11;Oxl_def.cc_small_v11;Oxl_def.cc_small_eta_v11;Oxl_def.cc_4cell_v11;Oxl_def.cc_bool_v11;cc_data_v8;Oxl_def.cc_v11;Bump.EL_EXPLICIT;Oxl_def.cc_qx_v11;Oxl_def.cc_qy_v11;Oxl_def.cc_hassmall_v11;Oxl_def.cc_qu_v11;GSYM cc_4];
5313   REPEAT WEAKER_STRIP_TAC;
5314   BY(MESON_TAC[])
5315   ]);;
5316   (* }}} *)
5317
5318 let real_periodic_data = prove_by_refinement(
5319   `!V u0 u1 f n .
5320     periodic f n ==>
5321 periodic (azim_mcell V f u0 u1) n /\ 
5322  periodic (gg_mcell V f u0 u1) n /\ 
5323  periodic (\i. gammaX V (cc_cell V [u0; u1; f i]) lmfun) n /\
5324  periodic (\i. gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun) n /\
5325  periodic (\i. gammaX V (cc_cell V [u0; u1; f i]) lmfun * critical_weight V (cc_cell V [u0; u1; f i])) n /\
5326  periodic (\i. gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun * critical_weight V (cc_cell V [u1; u0; f (SUC i)])) n 
5327 `,
5328   (* {{{ proof *)
5329   [
5330   REWRITE_TAC[Oxl_def.periodic;azim_mcell;gg_mcell;Pack_defs.critical_weight];
5331   REPEAT WEAKER_STRIP_TAC;
5332   REWRITE_TAC[arith `!i. SUC (i+n) = SUC i + n`];
5333   BY(ASM_REWRITE_TAC[])
5334   ]);;
5335   (* }}} *)
5336
5337 let LEAF_RANK_LEAF = prove_by_refinement(
5338   `!V u0 u1 w0 n f i.
5339     leaf_rank V [u0;u1] w0 n f 
5340      ==>
5341     leaf V [u0;u1;f i]`,
5342   (* {{{ proof *)
5343   [
5344   REPEAT WEAKER_STRIP_TAC;
5345   INTRO_TAC s_leaf_leaf[`V`;`[u0;u1]`;`f i`];
5346   REWRITE_TAC[Bump.EL_EXPLICIT];
5347   DISCH_THEN MATCH_MP_TAC;
5348   REWRITE_TAC[IN];
5349   MATCH_MP_TAC LEAF_RANK_S_LEAF;
5350   BY(ASM_MESON_TAC[LEAF_RANK_TRUNCATE])
5351   ]);;
5352   (* }}} *)
5353
5354
5355 let cc_4_UL = prove_by_refinement(
5356   `!V u0 u1 w0 n f i.
5357     packing V /\
5358     saturated V /\
5359     leaf_rank V [u0;u1]  w0 n f /\
5360     ~collinear {u0,u1,w0} /\
5361     1 < n /\
5362     cc_4 V u0 u1 f i 
5363   ==>
5364     cc_cell V [u0;u1;f i] = mcell4 V [u0;u1;f i; f (SUC i)]
5365     `,
5366   (* {{{ proof *)
5367   [
5368   REPEAT WEAKER_STRIP_TAC;
5369   INTRO_TAC cc_4_cc_ke4 [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5370   ASM_SIMP_TAC[];
5371   ANTS_TAC;
5372     BY(ASM_MESON_TAC[LEAF_RANK_PERIODIC;LEAF_RANK_LEAF]);
5373   DISCH_TAC;
5374   INTRO_TAC CC_CELL_WEDGE_MATCH_UH [`V`;`[u0;u1;f i]`;`u0`;`u1`;`w0`;`n`;`f`;`i`;`i`];
5375   ANTS_TAC;
5376     ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5377     INTRO_TAC K4_CC_WI_ALT [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
5378     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
5379   ASM_SIMP_TAC[Geomdetail.PAIR_EQ_EXPAND];
5380   DISCH_THEN DISJ_CASES_TAC;
5381     INTRO_TAC Leaf_cell.LIST_OF_CC_UH [`V`;`[u0;u1;f i]`];
5382     ASM_REWRITE_TAC[Leaf_cell.cc_cell];
5383     ANTS_TAC;
5384       MATCH_MP_TAC LEAF_RANK_LEAF;
5385       BY(ASM_MESON_TAC[]);
5386     DISCH_THEN SUBST1_TAC;
5387     BY(REWRITE_TAC[Bump.MCELL4;Bump.EL_EXPLICIT]);
5388   BY(ASM_MESON_TAC[LEAF_RANK_SUC_INJ])
5389   ]);;
5390   (* }}} *)
5391
5392 let EDGEX_PAIR = prove_by_refinement(
5393   `!V X e. e IN edgeX V X ==> (?u v. e = {u,v} /\ ~(u = v))`,
5394   (* {{{ proof *)
5395   [
5396   REWRITE_TAC[Pack_defs.edgeX;IN_ELIM_THM];
5397   BY(MESON_TAC[])
5398   ]);;
5399   (* }}} *)
5400
5401 let MCELL4_EDGE_EXPLICIT = prove_by_refinement(
5402   `!V u0 u1 u2 u3.
5403     packing V /\ saturated V /\ ~NULLSET (mcell4 V [u0;u1;u2;u3]) /\ barV V 3 [u0;u1;u2;u3] ==>
5404     edgeX V (mcell4 V [u0;u1;u2;u3]) = {{u0,u1},{u0,u2},{u0,u3},{u1,u2},{u1,u3},{u2,u3}}`,
5405   (* {{{ proof *)
5406   [
5407   REPEAT WEAKER_STRIP_TAC;
5408   REWRITE_TAC[EXTENSION];
5409   GEN_TAC;
5410   TYPIFY `~(?u v. x = {u,v})` ASM_CASES_TAC;
5411     REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
5412     BY(ASM_MESON_TAC[EDGEX_PAIR]);
5413   FIRST_X_ASSUM MP_TAC;
5414   REWRITE_TAC[];
5415   REPEAT WEAKER_STRIP_TAC;
5416   ASM_REWRITE_TAC[];
5417   INTRO_TAC Bump.MCELL4_EDGE [`V`;`[u0;u1;u2;u3]`;`u`;`v`];
5418   ANTS_TAC;
5419     BY(ASM_REWRITE_TAC[]);
5420   DISCH_THEN SUBST1_TAC;
5421   REWRITE_TAC[set_of_list];
5422   INTRO_TAC MCELL4_CARD4 [`V`;`[u0;u1;u2;u3]`];
5423   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5424   DISCH_THEN (MP_TAC o (MATCH_MP Leaf_cell.CARD4_ALL_DISTINCT));
5425   REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
5426   REPEAT WEAKER_STRIP_TAC;
5427   REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
5428   REWRITE_TAC[IN_INSERT;SUBSET;NOT_IN_EMPTY];
5429   TYPIFY `(u = u0)` ASM_CASES_TAC;
5430     ASM_REWRITE_TAC[];
5431     BY(ASM_MESON_TAC[]);
5432   TYPIFY `(u = u1)` ASM_CASES_TAC;
5433     ASM_REWRITE_TAC[];
5434     BY(ASM_MESON_TAC[]);
5435   TYPIFY `(u = u2)` ASM_CASES_TAC;
5436     ASM_REWRITE_TAC[];
5437     BY(ASM_MESON_TAC[]);
5438   TYPIFY `(u= u3)` ASM_CASES_TAC;
5439     ASM_REWRITE_TAC[];
5440     BY(ASM_MESON_TAC[]);
5441   ASM_REWRITE_TAC[];
5442   BY(ASM_MESON_TAC[])
5443   ]);;
5444   (* }}} *)
5445
5446 let CC_4_PROPS = prove_by_refinement(
5447   `!V u0 u1 w0 n f i.
5448     packing V /\
5449     saturated V /\
5450     leaf_rank V [u0;u1]  w0 n f /\
5451     ~collinear {u0,u1,w0} /\
5452     1 < n /\
5453     cc_4 V u0 u1 f i ==>
5454     cc_ke V [u0; u1; f i] = 4 /\
5455         hl [u0;u1;f i;f (SUC i)] < sqrt(&2) /\
5456         convex hull {u0,u1,f i,f (SUC i)} = cc_cell V [u0;u1;f i] /\
5457    ~coplanar {u0,u1,f i, f (SUC i)} /\
5458     cc_cell V [u0; u1; f i] SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\
5459     cc_cell V [u0; u1; f i] = mcell4 V [u0; u1; f i; f (SUC i)] /\
5460     ~collinear {u0,u1,f i} /\
5461     ~collinear {u0,u1,f (SUC i)} /\
5462     leaf V [u0; u1; f i] /\
5463     leaf V [u0; u1; f (SUC i)] /\
5464     ~NULLSET (cc_cell V [u0; u1; f i]) /\
5465     barV V 3 [u0;u1;f i;f (SUC i)]`,
5466   (* {{{ proof *)
5467   [
5468   REPEAT WEAKER_STRIP_TAC;
5469   PROOF_BY_CONTR_TAC;
5470   INTRO_TAC LEAF_RANK_LEAF [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5471   ANTS_TAC;
5472     BY(ASM_REWRITE_TAC[]);
5473   DISCH_TAC;
5474   INTRO_TAC LEAF_RANK_LEAF [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
5475   ANTS_TAC;
5476     BY(ASM_REWRITE_TAC[]);
5477   DISCH_TAC;
5478   INTRO_TAC cc_4_cc_ke4 [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5479   ASM_SIMP_TAC[];
5480   DISCH_THEN MP_TAC THEN ANTS_TAC;
5481     BY(ASM_MESON_TAC[LEAF_RANK_PERIODIC]);
5482   DISCH_TAC;
5483   INTRO_TAC K4_CC_WI_ALT [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
5484   ANTS_TAC;
5485     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
5486   REWRITE_TAC[Bump.EL_EXPLICIT];
5487   DISCH_TAC;
5488   INTRO_TAC cc_4_UL [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5489   ASM_REWRITE_TAC[];
5490   DISCH_TAC;
5491   INTRO_TAC Leaf_cell.EL_CC_UH [`V`;`[u0;u1;f i]`];
5492   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5493   REPEAT WEAKER_STRIP_TAC;
5494   INTRO_TAC Leaf_cell.CC_CELL_NOT_NULLSET [`V`;`[u0;u1;f i]`];
5495   ANTS_TAC;
5496     BY(ASM_REWRITE_TAC[]);
5497   DISCH_TAC;
5498   TYPIFY `hl [u0;u1;f i;f (SUC i)] < sqrt(&2)` (C SUBGOAL_THEN ASSUME_TAC);
5499     PROOF_BY_CONTR_TAC;
5500     FIRST_X_ASSUM_ST `NULLSET` MP_TAC;
5501     ASM_REWRITE_TAC[];
5502     BY(ASM_REWRITE_TAC[Pack_defs.mcell4;NEGLIGIBLE_EMPTY]);
5503   TYPIFY `convex hull {u0,u1,f i,f (SUC i)} = cc_cell V [u0;u1;f i]` (C SUBGOAL_THEN ASSUME_TAC);
5504     ASM_REWRITE_TAC[];
5505     BY(ASM_REWRITE_TAC[Pack_defs.mcell4;set_of_list]);
5506   TYPIFY `~coplanar {u0,u1,f i,f (SUC i)}` (C SUBGOAL_THEN ASSUME_TAC);
5507     ONCE_REWRITE_TAC[GSYM COPLANAR_CONVEX_HULL_COPLANAR];
5508     DISCH_THEN (MP_TAC o (MATCH_MP COPLANAR_IMP_NEGLIGIBLE));
5509     BY(ASM_MESON_TAC[COPLANAR_IMP_NEGLIGIBLE]);
5510   INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[u0;u1;f (SUC i)]`];
5511   ASM_REWRITE_TAC[set_of_list];
5512   PROOF_BY_CONTR_TAC;
5513   INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[u0;u1;f i]`];
5514   ASM_REWRITE_TAC[set_of_list];
5515   PROOF_BY_CONTR_TAC;
5516   COMMENT "barV";
5517   INTRO_TAC MCELL4_BARV_FI [`V`;`cc_uh V [u0;u1;f i]`;`w0`;`n`;`f`;`i`];
5518   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5519   DISCH_THEN MP_TAC THEN ANTS_TAC;
5520     CONJ_TAC;
5521       BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
5522     TYPIFY `mcell4 V (cc_uh V [u0; u1; f i]) = cc_cell V [u0;u1;f i]` (C SUBGOAL_THEN ASSUME_TAC);
5523       BY(ASM_MESON_TAC[Leaf_cell.cc_cell;Bump.MCELL4]);
5524     ASM_REWRITE_TAC[];
5525     CONJ_TAC;
5526       BY(ASM_MESON_TAC[]);
5527     BY(ASM_MESON_TAC[]);
5528   BY(ASM_MESON_TAC[])
5529   ]);;
5530   (* }}} *)
5531
5532 let CC_4_BETA_BUMP_EXPLICIT = prove_by_refinement(
5533   `!V u0 u1 w0 n f i.
5534     packing V /\
5535     saturated V /\
5536     leaf_rank V [u0;u1]  w0 n f /\
5537     ~collinear {u0,u1,w0} /\
5538     1 < n /\
5539     cc_4 V u0 u1 f i /\  
5540     critical_edge_y (dist(u0,u1)) /\
5541     critical_edge_y (dist(f i, f (SUC i))) /\
5542     dist(u0,f i) < &2 * hminus /\
5543     dist(u0,f(SUC i)) < &2 * hminus /\
5544     dist(u1,f i) < &2 * hminus /\
5545     dist(u1,f(SUC i)) < &2 * hminus ==>
5546     beta_bump_v1 V {u0,u1} (cc_cell V [u0;u1;f i]) =
5547       bump (dist(u0,u1)/ &2) - bump (dist(f i,f (SUC i))/ &2)
5548     `,
5549   (* {{{ proof *)
5550   [
5551   REPEAT WEAKER_STRIP_TAC;
5552   PROOF_BY_CONTR_TAC;
5553   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5554   ANTS_TAC;
5555     BY(ASM_REWRITE_TAC[]);
5556   REPEAT WEAKER_STRIP_TAC;
5557   FIRST_X_ASSUM_ST `beta_bump_v1` MP_TAC;
5558   REWRITE_TAC[];
5559   INTRO_TAC Bump.BETA_BUMP_ALT [`V`;`cc_cell V [u0;u1;f i]`;`(\e. VX V (cc_cell V [u0;u1;f i]) DIFF e)`;`{u0,u1}`];
5560   ANTS_TAC;
5561     REWRITE_TAC[];
5562     TYPIFY `packing V /\ saturated V` (C SUBGOAL_THEN (unlist REWRITE_TAC));
5563       BY(ASM_REWRITE_TAC[]);
5564     ONCE_REWRITE_TAC[GSYM IN];
5565     MATCH_MP_TAC Leaf_cell.CC_CELL_IN_MCELL_SET;
5566     BY(ASM_REWRITE_TAC[]);
5567   DISCH_THEN SUBST1_TAC;
5568   ASM_REWRITE_TAC[];
5569   INTRO_TAC Bump.MCELL4_EDGE_OPP [`V`;`[u0;u1;f i;f (SUC i)]`];
5570   REWRITE_TAC[Bump.EL_EXPLICIT];
5571   ANTS_TAC;
5572     ASM_REWRITE_TAC[];
5573     BY(ASM_MESON_TAC[]);
5574   DISCH_THEN SUBST1_TAC;
5575   COND_CASES_TAC;
5576     BY(REWRITE_TAC[RADV2;arith `inv (&2) *x = x/ &2`]);
5577   PROOF_BY_CONTR_TAC;
5578   FIRST_X_ASSUM_ST `subcritical_edgeX` MP_TAC;
5579   REWRITE_TAC[];
5580   REWRITE_TAC[Bump.CRITICAL_EDGEX_ALT];
5581   REWRITE_TAC[Bump.SUBCRITICAL_EDGEX_ALT];
5582   REWRITE_TAC[RADV2;arith `inv (&2) *x <= y <=> x <= &2 * y`;arith `y <= inv(&2) * x <=> &2 * y <= x`];
5583   INTRO_TAC MCELL4_EDGE_EXPLICIT [`V`;`u0`;`u1`;`f i`;`f(SUC i)`];
5584   ANTS_TAC;
5585     ASM_REWRITE_TAC[];
5586     BY(ASM_MESON_TAC[]);
5587   DISCH_THEN SUBST1_TAC;
5588   REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
5589   REPEAT (FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC);
5590   REWRITE_TAC[Sphere.critical_edge_y];
5591   REPEAT (DISCH_THEN (unlist REWRITE_TAC));
5592   REPEAT WEAKER_STRIP_TAC;
5593   ASM_REWRITE_TAC[];
5594   BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC THEN ASM_REWRITE_TAC[RADV2;arith `inv (&2) *x < hminus <=> x < &2 * hminus`]))
5595   ]);;
5596   (* }}} *)
5597
5598 let CC_4_BETA_BUMP_0 = prove_by_refinement(
5599   `!V u0 u1 w0 n f i.
5600     packing V /\
5601     saturated V /\
5602     leaf_rank V [u0;u1]  w0 n f /\
5603     ~collinear {u0,u1,w0} /\
5604     1 < n /\
5605     cc_4 V u0 u1 f i /\  
5606     ~(critical_edge_y (dist(u0,u1)) /\
5607     critical_edge_y (dist(f i, f (SUC i))) /\
5608     dist(u0,f i) < &2 * hminus /\
5609     dist(u0,f(SUC i)) < &2 * hminus /\
5610     dist(u1,f i) < &2 * hminus /\
5611     dist(u1,f(SUC i)) < &2 * hminus) ==>
5612     beta_bump_v1 V {u0,u1} (cc_cell V [u0;u1;f i]) = &0
5613     `,
5614   (* {{{ proof *)
5615   [
5616   REPEAT WEAKER_STRIP_TAC;
5617   PROOF_BY_CONTR_TAC;
5618   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5619   ANTS_TAC;
5620     BY(ASM_REWRITE_TAC[]);
5621   REPEAT WEAKER_STRIP_TAC;
5622   FIRST_X_ASSUM_ST `beta_bump_v1` MP_TAC;
5623   REWRITE_TAC[];
5624   INTRO_TAC Bump.BETA_BUMP_ALT [`V`;`cc_cell V [u0;u1;f i]`;`(\e. VX V (cc_cell V [u0;u1;f i]) DIFF e)`;`{u0,u1}`];
5625   ANTS_TAC;
5626     REWRITE_TAC[];
5627     TYPIFY `packing V /\ saturated V` (C SUBGOAL_THEN (unlist REWRITE_TAC));
5628       BY(ASM_REWRITE_TAC[]);
5629     ONCE_REWRITE_TAC[GSYM IN];
5630     MATCH_MP_TAC Leaf_cell.CC_CELL_IN_MCELL_SET;
5631     BY(ASM_REWRITE_TAC[]);
5632   DISCH_THEN SUBST1_TAC;
5633   ASM_REWRITE_TAC[];
5634   INTRO_TAC Bump.MCELL4_EDGE_OPP [`V`;`[u0;u1;f i;f (SUC i)]`];
5635   REWRITE_TAC[Bump.EL_EXPLICIT];
5636   ANTS_TAC;
5637     ASM_REWRITE_TAC[];
5638     BY(ASM_MESON_TAC[]);
5639   DISCH_THEN SUBST1_TAC;
5640   COND_CASES_TAC;
5641     PROOF_BY_CONTR_TAC;
5642     FIRST_X_ASSUM_ST `subcritical_edgeX` MP_TAC;
5643     REWRITE_TAC[Bump.CRITICAL_EDGEX_ALT;Bump.SUBCRITICAL_EDGEX_ALT];
5644     REWRITE_TAC[RADV2;arith `inv (&2) *x <= y <=> x <= &2 * y`;arith `y <= inv(&2) * x <=> &2 * y <= x`];
5645     INTRO_TAC MCELL4_EDGE_EXPLICIT [`V`;`u0`;`u1`;`f i`;`f(SUC i)`];
5646     ANTS_TAC;
5647       ASM_REWRITE_TAC[];
5648       BY(ASM_MESON_TAC[]);
5649     DISCH_THEN SUBST1_TAC;
5650     REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
5651     REPEAT WEAKER_STRIP_TAC;
5652     REPEAT (FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC);
5653     ASM_REWRITE_TAC[Sphere.critical_edge_y];
5654     FIRST_X_ASSUM MP_TAC;
5655     REWRITE_TAC[GSYM RADV2;arith ` x < &2 * hminus <=> inv (&2) *x < hminus`];
5656     INTRO_TAC MCELL4_CARD4 [`V`;`[u0;u1;f i;f (SUC i)]`];
5657     ANTS_TAC;
5658       BY(ASM_MESON_TAC[]);
5659     REWRITE_TAC[Bump.EL_EXPLICIT];
5660     DISCH_THEN (MP_TAC o (MATCH_MP Leaf_cell.CARD4_ALL_DISTINCT));
5661     REPEAT WEAKER_STRIP_TAC;
5662     TYPIFY `!g. (g = {u0, f i} \/ g = {u0, f (SUC i)} \/ g = {u1, f i} \/ g = {u1 , f(SUC i)}) /\ ~(g = {u0,u1}) /\ ~(g = {f i,f(SUC i)}) ==> radV g < hminus` (C SUBGOAL_THEN ASSUME_TAC);
5663       BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[]);
5664     BY(REPEAT (CONJ_TAC THEN TRY( (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN ASM_REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND])));
5665   BY(REWRITE_TAC[])
5666   ]);;
5667   (* }}} *)
5668
5669
5670 let critical_edgeX_critical_edge_y = prove_by_refinement(
5671   `!V X u v. {u,v} IN critical_edgeX V X <=> {u,v} IN edgeX V X /\ critical_edge_y (dist(u,v))`,
5672   (* {{{ proof *)
5673   [
5674   REWRITE_TAC[Pack_defs.critical_edgeX;IN_ELIM_THM;Marchal_cells_3.HL_2;Sphere.critical_edge_y];
5675   REPEAT WEAKER_STRIP_TAC;
5676   MATCH_MP_TAC (TAUT `((a==> b) /\ (b ==> a)) ==> (a = b)`);
5677   CONJ2_TAC;
5678     REWRITE_TAC[arith `!x y. inv(&2) * x <= y <=> x <= &2 * y`; arith `!x y. y <= inv (&2) * x <=> &2 * y <= x`];
5679     BY(MESON_TAC[]);
5680   REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
5681   REWRITE_TAC[arith `!x y. inv(&2) * x <= y <=> x <= &2 * y`; arith `!x y. y <= inv (&2) * x <=> &2 * y <= x`];
5682   REPEAT WEAKER_STRIP_TAC;
5683   FIRST_X_ASSUM DISJ_CASES_TAC;
5684     BY(ASM_REWRITE_TAC[]);
5685   TYPIFY `{u,v} = {u',v'}` (C SUBGOAL_THEN SUBST1_TAC);
5686     ASM_REWRITE_TAC[];
5687     BY(SET_TAC[]);
5688   BY(ASM_MESON_TAC[DIST_SYM])
5689   ]);;
5690   (* }}} *)
5691
5692 let critical_weight_wtcount6_y = prove_by_refinement(
5693   `!V u0 u1 w0 n f i.
5694     packing V /\
5695     saturated V /\
5696     leaf_rank V [u0;u1]  w0 n f /\
5697     ~collinear {u0,u1,w0} /\
5698     1 < n /\
5699     cc_4 V u0 u1 f i /\  
5700     critical_edge_y (dist(u0,u1)) ==>
5701        critical_weight V (cc_cell V [u0;u1;f i]) = 
5702          &1 / & (wtcount6_y (dist(u0,u1)) (dist(u0,f i)) (dist (u0,f (SUC i))) (dist (f i, f (SUC i)))
5703            (dist(u1, f (SUC i))) (dist (u1, f i)))`,
5704   (* {{{ proof *)
5705   [
5706   REWRITE_TAC[Pack_defs.critical_edge_y;Pack_defs.critical_weight;arith `&1/ x = inv(x)`;REAL_EQ_INV2;REAL_OF_NUM_EQ];
5707   REPEAT WEAKER_STRIP_TAC;
5708   INTRO_TAC Upfzbzm_support_lemmas.FINITE_critical_edgeX [`V`;`cc_cell V [u0;u1;f i]`];
5709   DISCH_TAC;
5710   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5711   ANTS_TAC;
5712     BY(ASM_REWRITE_TAC[]);
5713   REPEAT WEAKER_STRIP_TAC;
5714   TYPED_ABBREV_TAC  `ee = critical_edgeX V (cc_cell V [u0; u1; f i])` ;
5715   INTRO_TAC MCELL4_EDGE_EXPLICIT [`V`;`u0`;`u1`;`f i`;`f (SUC i)`];
5716   ANTS_TAC;
5717     BY(ASM_MESON_TAC[]);
5718   REPEAT WEAKER_STRIP_TAC;
5719   TYPIFY `ee = {{u0, u1}, {u0, f i}, {u0, f (SUC i)}, {u1, f i}, {u1, f (SUC i)}, {      f i, f (SUC i)}}  INTER ee` (C SUBGOAL_THEN SUBST1_TAC);
5720     MATCH_MP_TAC (SET_RULE `!a b. b SUBSET a ==> b = a INTER b`);
5721     EXPAND_TAC "ee";
5722     REWRITE_TAC[Pack_defs.critical_edgeX;SUBSET;IN_ELIM_THM];
5723     REPEAT WEAKER_STRIP_TAC;
5724     BY(ASM_MESON_TAC[]);
5725   TYPED_ABBREV_TAC  `ex = edgeX V (cc_cell V [u0;u1;f i])` ;
5726   TYPIFY `!u v. {u,v} IN ee <=> {u,v} IN ex /\ critical_edge_y (dist(u,v))` (C SUBGOAL_THEN ASSUME_TAC);
5727     EXPAND_TAC "ee";
5728     EXPAND_TAC "ex";
5729     BY(REWRITE_TAC[critical_edgeX_critical_edge_y]);
5730   TYPIFY `{u0,u1} IN ex /\ {u0, f i} IN ex /\ {u0, f (SUC i)} IN ex /\ {u1, f i} IN ex /\ {u1, f (SUC i)} IN ex /\ {f i, f (SUC i)} IN ex` (C SUBGOAL_THEN ASSUME_TAC);
5731     EXPAND_TAC "ex";
5732     FIRST_X_ASSUM_ST `edgeX` kill;
5733     BY(ASM_REWRITE_TAC[IN_INSERT]);
5734   INTRO_TAC MCELL4_CARD4 [`V`;`[u0;u1;f i;f (SUC i)]`];
5735   ANTS_TAC;
5736     BY(ASM_MESON_TAC[]);
5737   REWRITE_TAC[Bump.EL_EXPLICIT];
5738   DISCH_THEN (ASSUME_TAC o (MATCH_MP Leaf_cell.CARD4_ALL_DISTINCT));
5739   REPLICATE_TAC 6 (ONCE_ASM_SIMP_TAC[CARD_INSERT_INTER_ALT] THEN ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY;Geomdetail.PAIR_EQ_EXPAND]);
5740   REWRITE_TAC[Pack_defs.wtcount6_y;INTER_EMPTY;Pack_defs.wtcount3_y;CARD_CLAUSES;arith `x + 0 = x`];
5741   BY(ARITH_TAC)
5742   ]);;
5743   (* }}} *)
5744
5745 (* 3q1h case *)
5746
5747 (*
5748 let ox3q1h_data = prove_by_refinement(
5749  `!V f w0 n u0 u1. ox3q1h /\
5750          1 < n /\
5751          packing V /\
5752          saturated V /\
5753          s_leaf V [u0; u1] HAS_SIZE n /\
5754          u0 IN V /\
5755          u1 IN V /\
5756         periodic f n /\
5757          ~collinear {u0, u1, w0} /\
5758          critical_edge_y (dist (u0,u1)) /\
5759          leaf_rank V [u0; u1] w0 n f /\ CARD (s_leaf V [u0; u1]) = 4 /\
5760   (?i. cc_4 V u0 u1 f i /\
5761        (hminus <= dist (f i,f (SUC i)) /\ dist (f i,f (SUC i)) <= hplus) /\
5762        (cc_4 V u0 u1 f (i + 1) /\
5763         (dist (u0,f (i + 1)) < &2 * hminus /\
5764          dist (u1,f (i + 1)) < &2 * hminus) /\
5765         dist (u0,f ((i + 1) + 1)) < &2 * hminus /\
5766         dist (u1,f ((i + 1) + 1)) < &2 * hminus /\
5767         dist (f (i + 1),f (SUC (i + 1))) < hminus) /\
5768        (cc_4 V u0 u1 f (i + 2) /\
5769         (dist (u0,f (i + 2)) < &2 * hminus /\
5770          dist (u1,f (i + 2)) < &2 * hminus) /\
5771         dist (u0,f ((i + 2) + 1)) < &2 * hminus /\
5772         dist (u1,f ((i + 2) + 1)) < &2 * hminus /\
5773         dist (f (i + 2),f (SUC (i + 2))) < hminus) /\
5774        cc_4 V u0 u1 f (i + 3) /\
5775        (dist (u0,f (i + 3)) < &2 * hminus /\
5776         dist (u1,f (i + 3)) < &2 * hminus) /\
5777        dist (u0,f ((i + 3) + 1)) < &2 * hminus /\
5778        dist (u1,f ((i + 3) + 1)) < &2 * hminus /\
5779        dist (f (i + 3),f (SUC (i + 3))) < hminus)
5780   ==> &0 <= sum {i | i < n} (gg_mcell V f u0 u1) `,
5781   (* {{{ proof *)
5782   [
5783   st/r
5784   ]);;
5785   (* }}} *)
5786 *)
5787
5788 let c_4_azim_mcell_dih_y = prove_by_refinement(
5789   `!V u0 u1 w0 n f i. 
5790        1 < n /\
5791          packing V /\
5792          saturated V /\
5793          s_leaf V [u0; u1] HAS_SIZE n /\
5794          u0 IN V /\
5795          u1 IN V /\
5796         periodic f n /\
5797          ~collinear {u0, u1, w0} /\
5798          critical_edge_y (dist (u0,u1)) /\
5799          leaf_rank V [u0; u1] w0 n f /\
5800   cc_4 V u0 u1 f i ==>
5801     azim_mcell V f u0 u1 i = dih_y (dist(u0,u1)) (dist(u0,f i)) (dist (u0, f(SUC i)))
5802              (dist(f i, f (SUC i))) (dist (u1,f (SUC i))) (dist (u1, f i))`,
5803   (* {{{ proof *)
5804   [
5805   REPEAT WEAKER_STRIP_TAC;
5806   INTRO_TAC LEAF_RANK_REUHADY [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
5807   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5808   DISCH_THEN SUBST1_TAC;
5809   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5810   ASM_REWRITE_TAC[];
5811   REPEAT WEAKER_STRIP_TAC;
5812   INTRO_TAC MCELL4_AZIM_LT_PI [`V`;`[u0;u1;f i;f(SUC i)]`;`w0`;`n`;`f`;`i`];
5813   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
5814   ANTS_TAC;
5815     BY(ASM_MESON_TAC[]);
5816   DISCH_TAC;
5817   INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[u0;u1;f i]`];
5818   ASM_REWRITE_TAC[set_of_list];
5819   INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[u0;u1;f (SUC i)]`];
5820   ASM_REWRITE_TAC[set_of_list];
5821   REPEAT WEAKER_STRIP_TAC;
5822   INTRO_TAC AZIM_DIHV_SAME [`u0`;`u1`;`f i`;`f(SUC i)`];
5823   ASM_REWRITE_TAC[];
5824   DISCH_THEN SUBST1_TAC;
5825   INTRO_TAC Merge_ineq.DIHV_EQ_DIH_Y [`u0`;`u1`;`f i`;`f (SUC i)`];
5826   BY(ASM_REWRITE_TAC[LET_DEF;LET_END_DEF])
5827   ]);;
5828   (* }}} *)
5829
5830 let NOT_COPLANAR_IMP_CARD4_ALT = prove_by_refinement(
5831   `!(u0:real^3) u1 u2 u3. ~coplanar {u0,u1,u2,u3} ==> CARD {u0,u1,u2,u3} = 4`,
5832   (* {{{ proof *)
5833   [
5834   REPEAT WEAKER_STRIP_TAC;
5835   MATCH_MP_TAC Collect_geom2.NOT_COPLANAR_IMP_CARD4;
5836   BY(ASM_MESON_TAC[Leaf_cell.coplanar_eq_coplanar_alt;DIMINDEX_3;arith `2 <= 3`])
5837   ]);;
5838   (* }}} *)
5839
5840 let radius_le_circumradius = prove_by_refinement(
5841   `!(u0:real^3) u1 u2 u3. ~coplanar {u0,u1,u2,u3} ==>
5842     dist(u0,u1) <= &2 * radV {u0,u1,u2,u3}`,
5843   (* {{{ proof *)
5844   [
5845   REPEAT WEAKER_STRIP_TAC;
5846   INTRO_TAC NOT_COPLANAR_IMP_CARD4_ALT [`u0`;`u1`;`u2`;`u3`];
5847   ASM_REWRITE_TAC[];
5848   DISCH_TAC;
5849   INTRO_TAC Rogers.AFFINE_HULL_RADV [`{u0,u1,u2,u3}`;`{u0,u1}`];
5850   ANTS_TAC;
5851     CONJ_TAC;
5852       BY(ASM_MESON_TAC[AFF_DEP_COPLANAR]);
5853     BY(SET_TAC[]);
5854   REWRITE_TAC[RADV2];
5855   REPEAT WEAKER_STRIP_TAC;
5856   REWRITE_TAC[arith `x <= &2 * y <=> inv (&2) * x <= y`];
5857   TYPED_ABBREV_TAC  `d = inv(&2) * dist(u0,u1)` ;
5858   TYPED_ABBREV_TAC  `r = radV {u0,u1,u2,u3}` ;
5859   TYPIFY `d pow 2 <= r pow 2` (C SUBGOAL_THEN ASSUME_TAC);
5860     ASM_REWRITE_TAC[];
5861     REWRITE_TAC[arith `x <= x + y <=> &0 <= y`];
5862     BY(REWRITE_TAC[ REAL_LE_POW_2]);
5863   GMATCH_SIMP_TAC Collect_geom.POW2_COND;
5864   BY(ASM_REWRITE_TAC[])
5865   ]);;
5866   (* }}} *)
5867
5868 let radius_le_circumradius_all = prove_by_refinement(
5869   `!(u0:real^3) u1 u2 u3. ~coplanar {u0,u1,u2,u3} ==>
5870     dist(u0,u1) <= &2 * radV {u0,u1,u2,u3} /\
5871     dist(u0,u2) <= &2 * radV {u0,u1,u2,u3} /\
5872     dist(u0,u3) <= &2 * radV {u0,u1,u2,u3} /\
5873     dist(u1,u2) <= &2 * radV {u0,u1,u2,u3} /\
5874     dist(u1,u3) <= &2 * radV {u0,u1,u2,u3} /\
5875     dist(u2,u3) <= &2 * radV {u0,u1,u2,u3}
5876 `,
5877   (* {{{ proof *)
5878   [
5879   REPEAT WEAKER_STRIP_TAC;
5880   FIRST_ASSUM (ASSUME_TAC o (MATCH_MP NOT_COPLANAR_IMP_CARD4_ALT ));
5881   TYPIFY `!u v. ~(u= v) /\ {u,v} SUBSET {u0,u1,u2,u3} ==> dist(u,v) <= &2 * radV {u0,u1,u2,u3}` (C SUBGOAL_THEN ASSUME_TAC);
5882     REPEAT WEAKER_STRIP_TAC;
5883     INTRO_TAC Leaf_cell.SET2_INSERT2 [`u`;`v`;`u0`;`u1`;`u2`;`u3`];
5884     ASM_REWRITE_TAC[];
5885     REPEAT WEAKER_STRIP_TAC;
5886     ASM_REWRITE_TAC[];
5887     MATCH_MP_TAC radius_le_circumradius;
5888     BY(ASM_MESON_TAC[]);
5889   FIRST_X_ASSUM (ASSUME_TAC o (MATCH_MP Leaf_cell.CARD4_ALL_DISTINCT));
5890   BY(REPLICATE_TAC 6 (TRY CONJ_TAC THEN TRY (FIRST_X_ASSUM MATCH_MP_TAC) THEN ASM_REWRITE_TAC[] THEN TRY (SET_TAC[])))
5891   ]);;
5892   (* }}} *)
5893
5894 let MCELL4_DOMAIN = prove_by_refinement(
5895   `!V u0 u1 w0 n f i.  pack_nonlinear_non_ox3q1h /\ 
5896          1 < n /\
5897          packing V /\
5898          saturated V /\
5899          s_leaf V [u0; u1] HAS_SIZE n /\
5900          u0 IN V /\
5901          u1 IN V /\
5902         periodic f n /\
5903          ~collinear {u0, u1, w0} /\
5904          critical_edge_y (dist (u0,u1)) /\
5905          leaf_rank V [u0; u1] w0 n f /\
5906     cc_4 V u0 u1 f i
5907    ==> 
5908     &2 * hminus <= dist(u0,u1) /\ dist(u0,u1) <= &2 * hplus /\
5909     &2 <= dist(u0,f i) /\ dist(u0,f i) < &2 * sqrt(&2) /\
5910     &2 <= dist(u0,f (SUC i)) /\ dist(u0,f (SUC i)) < &2 * sqrt(&2) /\
5911     &2 <= dist(f i, f (SUC i)) /\ dist(f i,f (SUC i)) < &2 * sqrt(&2) /\
5912     &2 <= dist(u1,f i) /\ dist(u1,f i) < &2 * sqrt(&2) /\
5913     &2 <= dist(u1,f (SUC i)) /\ dist(u1,f (SUC i)) < &2 * sqrt(&2) /\
5914     rad2_y (dist(u0,u1)) (dist(u0,f i)) (dist (u0, f(SUC i)))
5915              (dist(f i, f (SUC i))) (dist (u1,f (SUC i))) (dist (u1, f i)) < &2 /\
5916     &0 < delta_y (dist(u0,u1)) (dist(u0,f i)) (dist (u0, f(SUC i)))
5917              (dist(f i, f (SUC i))) (dist (u1,f (SUC i))) (dist (u1, f i))
5918 `,
5919   (* {{{ proof *)
5920   [
5921   REPEAT WEAKER_STRIP_TAC;
5922   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
5923   ANTS_TAC;
5924     BY(ASM_REWRITE_TAC[]);
5925   REPEAT WEAKER_STRIP_TAC;
5926   INTRO_TAC GDRQXLGv3 [`u0`;`u1`;`f i`;`f (SUC i)`];
5927   ASM_REWRITE_TAC[LET_DEF;LET_END_DEF];
5928   DISCH_TAC;
5929   INTRO_TAC coplanar_delta_y [`u0`;`u1`;`f i`;`f (SUC i)`];
5930   ASM_REWRITE_TAC[];
5931   DISCH_TAC;
5932   ASM_REWRITE_TAC[];
5933   INTRO_TAC NOT_COPLANAR_NOT_COLLINEAR [`u0`;`f i`;`f (SUC i)`;`u1`];
5934   ANTS_TAC;
5935     TYPIFY `{u0, f i, f (SUC i), u1} = {u0,u1,f i,f (SUC i)}` (C SUBGOAL_THEN SUBST1_TAC);
5936       BY(SET_TAC[]);
5937     BY(ASM_REWRITE_TAC[]);
5938   REWRITE_TAC[Collect_geom2.NOT_COL_EQ_UPS_X_POS];
5939   DISCH_TAC;
5940   INTRO_TAC Packing3.BARV_SUBSET [`V`;`3`;`[u0;u1;f i;f (SUC i)]`];
5941   ASM_REWRITE_TAC[set_of_list];
5942   REWRITE_TAC[SUBSET;IN_INSERT;NOT_IN_EMPTY];
5943   REPEAT WEAKER_STRIP_TAC;
5944   INTRO_TAC MCELL4_CARD4 [`V`;`[u0;u1;f i;f (SUC i)]`];
5945   ANTS_TAC;
5946     BY(ASM_MESON_TAC[]);
5947   REWRITE_TAC[Bump.EL_EXPLICIT];
5948   DISCH_THEN (ASSUME_TAC o (MATCH_MP Leaf_cell.CARD4_ALL_DISTINCT));
5949   TYPIFY `&2 <= dist(u0,u1) /\ &2 <= dist (u0,f i) /\ &2 <= dist(u0,f(SUC i)) /\ &2 <= dist(u1, f i) /\ &2 <= dist(u1,f(SUC i)) /\ &2 <= dist (f i, f (SUC i))` (C SUBGOAL_THEN ASSUME_TAC);
5950     TYPIFY `!u v. u IN V /\ v IN V /\ ~(u = v) ==> &2 <= dist(u,v)` ENOUGH_TO_SHOW_TAC;
5951       DISCH_TAC;
5952       BY(ASM_MESON_TAC[]);
5953     REWRITE_TAC[IN];
5954     REPEAT WEAKER_STRIP_TAC;
5955     FIRST_X_ASSUM_ST `packing` MP_TAC;
5956     REWRITE_TAC[Sphere.packing];
5957     DISCH_THEN MATCH_MP_TAC;
5958     BY(ASM_REWRITE_TAC[]);
5959   ASM_REWRITE_TAC[];
5960   TYPIFY `&2 * hminus <= dist (u0,u1) /\ dist (u0,u1) <= &2 * hplus` (C SUBGOAL_THEN ASSUME_TAC);
5961     FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
5962     BY(MESON_TAC[Sphere.critical_edge_y]);
5963   ASM_REWRITE_TAC[];
5964   REWRITE_TAC[Sphere.rad2_y;Sphere.y_of_x];
5965   FIRST_ASSUM (MP_TAC o (MATCH_MP radius_le_circumradius_all));
5966   REPEAT WEAKER_STRIP_TAC;
5967   REWRITE_TAC[arith `x * x = x pow 2`];
5968   FIRST_X_ASSUM_ST `rad2_x` (SUBST1_TAC o GSYM);
5969   TYPIFY `radV {u0,u1,f i,f (SUC i)} < sqrt(&2)` (C SUBGOAL_THEN ASSUME_TAC);
5970     FIRST_X_ASSUM_ST `hl` MP_TAC;
5971     BY(REWRITE_TAC[Pack_defs.HL;set_of_list]);
5972   TYPED_ABBREV_TAC  `r = radV {u0,u1,f i,f (SUC i)}` ;
5973   TYPIFY `!x. x <= &2 * r /\ r < sqrt(&2) ==> x < &2 * sqrt(&2)` (C SUBGOAL_THEN ASSUME_TAC);
5974     BY(REAL_ARITH_TAC);
5975   ASM_SIMP_TAC[];
5976   REWRITE_TAC[GSYM Nonlin_def.sqrt2_sqrt2;GSYM Sphere.sqrt2;arith `x * x = x pow 2`];
5977   GMATCH_SIMP_TAC (GSYM Collect_geom2.LT_POW2_COND);
5978   ASM_REWRITE_TAC[Sphere.sqrt2];
5979   GMATCH_SIMP_TAC SQRT_POS_LE;
5980   FIRST_X_ASSUM_ST `dist(u0,u1) <= &2 * r` MP_TAC;
5981   BY(MESON_TAC[arith `&0 <= d /\ d <= &2 * r ==> &0 <= r`;arith `&0 <= &2`;DIST_POS_LE])
5982   ]);;
5983   (* }}} *)
5984
5985 let real_model_azim_c4 = prove_by_refinement(
5986   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
5987          1 < n /\
5988          packing V /\
5989          saturated V /\
5990          s_leaf V [u0; u1] HAS_SIZE n /\
5991          u0 IN V /\
5992          u1 IN V /\
5993         periodic f n /\
5994          ~collinear {u0, u1, w0} /\
5995          critical_edge_y (dist (u0,u1)) /\
5996          leaf_rank V [u0; u1] w0 n f
5997      ==> (!i. cc_4 V u0 u1 f i ==> azim_mcell V f u0 u1 i <  #2.8)`,
5998   (* {{{ proof *)
5999   [
6000   REPEAT WEAKER_STRIP_TAC;
6001   INTRO_TAC c_4_azim_mcell_dih_y [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6002   ASM_REWRITE_TAC[];
6003   DISCH_THEN SUBST1_TAC;
6004   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6005   ASM_REWRITE_TAC[];
6006   REPEAT WEAKER_STRIP_TAC;
6007   INTRO_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "BIXPCGW 6652007036 a2") [];
6008   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
6009   DISCH_THEN MATCH_MP_TAC;
6010   REWRITE_TAC[Nonlinear_lemma.sqrt8_sqrt2;Sphere.sqrt2];
6011   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
6012   ]);;
6013   (* }}} *)
6014
6015 (* renamed from gammaX_gamm4fgcy_ALT *)
6016
6017 let gammaX_gamma4fgcy_ALT = prove_by_refinement(
6018   `!V X u0 u1 u2 u3.
6019             saturated V /\
6020             packing V /\
6021             barV V 3 [u0;u1;u2;u3] /\
6022             X = mcell4 V [u0;u1;u2;u3] /\
6023             ~NULLSET X
6024              ==> gammaX V X lmfun = 
6025                  gamma4fgcy (dist(u0,u1)) (dist(u0,u2)) (dist(u0,u3)) (dist(u2,u3)) (dist(u1,u3)) (dist(u1,u2)) lmfun`,
6026   (* {{{ proof *)
6027   [
6028   REPEAT WEAKER_STRIP_TAC;
6029   BY(ASM_MESON_TAC[arith `4 >= 4`;Bump.MCELL4;Tskajxy_lemmas.gammaX_gamm4fgcy])
6030   ]);;
6031   (* }}} *)
6032
6033 let GG_MCELL_QUARTER = prove_by_refinement(
6034   `!V u0 u1 w0 n f i.  pack_nonlinear_non_ox3q1h /\ 
6035          1 < n /\
6036          packing V /\
6037          saturated V /\
6038          s_leaf V [u0; u1] HAS_SIZE n /\
6039          u0 IN V /\
6040          u1 IN V /\
6041         periodic f n /\
6042          ~collinear {u0, u1, w0} /\
6043          critical_edge_y (dist (u0,u1)) /\
6044     cc_4 V u0 u1 f i /\
6045       (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
6046       dist (u0,f (SUC i)) < &2 * hminus /\
6047       dist (u1,f (SUC i)) < &2 * hminus /\
6048       dist (f i,f (SUC i)) < &2 * hminus /\
6049          leaf_rank V [u0; u1] w0 n f ==>
6050     gg_mcell V f u0 u1 i = gamma4fgcy (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))
6051  (dist (f i,f (SUC i)))
6052  (dist (u1,f (SUC i)))
6053  (dist (u1,f i))
6054  lmfun`,
6055   (* {{{ proof *)
6056   [
6057   REPEAT WEAKER_STRIP_TAC;
6058   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6059   ANTS_TAC;
6060     BY(ASM_REWRITE_TAC[]);
6061   REPEAT WEAKER_STRIP_TAC;
6062   GMATCH_SIMP_TAC cc_4_cc_cell;
6063   CONJ_TAC;
6064     BY(ASM_MESON_TAC[]);
6065   GMATCH_SIMP_TAC gammaX_gamma4fgcy_ALT;
6066   GEXISTL_TAC [`u0`;`f (SUC i)`;`u1`;`f i`];
6067   CONJ_TAC;
6068     BY(ASM_MESON_TAC[]);
6069   GMATCH_SIMP_TAC critical_weight_wtcount6_y;
6070   CONJ_TAC;
6071     BY(ASM_MESON_TAC[]);
6072   GMATCH_SIMP_TAC CC_4_BETA_BUMP_0;
6073   CONJ_TAC;
6074     GEXISTL_TAC [`w0`;`n`];
6075     ASM_REWRITE_TAC[Sphere.critical_edge_y];
6076     BY(ASM_MESON_TAC[arith `d < t ==> ~(t <= d)`]);
6077   TYPIFY `(wtcount6_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))    (dist (f i,f (SUC i)))   (dist (u1,f (SUC i)))  (dist (u1,f i))) = 1` (C SUBGOAL_THEN SUBST1_TAC);
6078     ASM_REWRITE_TAC[Sphere.wtcount6_y;Sphere.wtcount3_y];
6079     ASM_REWRITE_TAC[arith `x <= y <=> ~(y < x)`;Sphere.critical_edge_y];
6080     BY(ARITH_TAC);
6081   BY(REAL_ARITH_TAC)
6082   ]);;
6083   (* }}} *)
6084
6085 let GG_MCELL_BETA = prove_by_refinement(
6086   `!V u0 u1 w0 n f i.  pack_nonlinear_non_ox3q1h /\ 
6087          1 < n /\
6088          packing V /\
6089          saturated V /\
6090          s_leaf V [u0; u1] HAS_SIZE n /\
6091          u0 IN V /\
6092          u1 IN V /\
6093         periodic f n /\
6094          ~collinear {u0, u1, w0} /\
6095          critical_edge_y (dist (u0,u1)) /\
6096     cc_4 V u0 u1 f i /\
6097       (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
6098       dist (u0,f (SUC i)) < &2 * hminus /\
6099       dist (u1,f (SUC i)) < &2 * hminus /\
6100     critical_edge_y (dist(f i, f (SUC i))) /\
6101          leaf_rank V [u0; u1] w0 n f ==>
6102     gg_mcell V f u0 u1 i = (gamma4fgcy (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))  
6103       (dist (f i,f (SUC i)))
6104       (dist (u1,f (SUC i)))
6105       (dist (u1,f i))
6106       lmfun)         / &2 +
6107    bump (dist (u0,u1) / &2) - bump (dist (f i,f (SUC i)) / &2)
6108 `,
6109   (* {{{ proof *)
6110   [
6111   REPEAT WEAKER_STRIP_TAC;
6112   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6113   ANTS_TAC;
6114     BY(ASM_REWRITE_TAC[]);
6115   REPEAT WEAKER_STRIP_TAC;
6116   GMATCH_SIMP_TAC cc_4_cc_cell;
6117   CONJ_TAC;
6118     BY(ASM_MESON_TAC[]);
6119   GMATCH_SIMP_TAC gammaX_gamma4fgcy_ALT;
6120   GEXISTL_TAC [`u0`;`f (SUC i)`;`u1`;`f i`];
6121   CONJ_TAC;
6122     BY(ASM_MESON_TAC[]);
6123   GMATCH_SIMP_TAC critical_weight_wtcount6_y;
6124   CONJ_TAC;
6125     BY(ASM_MESON_TAC[]);
6126   GMATCH_SIMP_TAC CC_4_BETA_BUMP_EXPLICIT;
6127   CONJ_TAC;
6128     GEXISTL_TAC [`w0`;`n`];
6129     BY(ASM_REWRITE_TAC[]);
6130   TYPIFY `(wtcount6_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))    (dist (f i,f (SUC i)))   (dist (u1,f (SUC i)))  (dist (u1,f i))) = 2` (C SUBGOAL_THEN SUBST1_TAC);
6131     ASM_REWRITE_TAC[Sphere.wtcount6_y;Sphere.wtcount3_y];
6132     ASM_REWRITE_TAC[arith `x <= y <=> ~(y < x)`;Sphere.critical_edge_y];
6133     BY(ARITH_TAC);
6134   BY(REAL_ARITH_TAC)
6135   ]);;
6136   (* }}} *)
6137
6138 let beta_bumpA_y_NONBETA = prove_by_refinement(
6139   `!y1 y2 y3 y4 y5 y6.  ~(critical_edge_y y1 /\ critical_edge_y y4 /\ y2 < &2 * hminus /\ y3 < &2 * hminus /\ y5 < &2 * hminus /\ y6 < &2 * hminus)
6140     ==> beta_bumpA_y y1 y2 y3 y4 y5 y6 = &0`,
6141   (* {{{ proof *)
6142   [
6143   REWRITE_TAC[Sphere.beta_bumpA_y];
6144   REWRITE_TAC[Sphere.beta_bumpA_y;DE_MORGAN_THM];
6145   REPEAT WEAKER_STRIP_TAC;
6146   BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC THEN ASM_REWRITE_TAC[] THEN TRY REAL_ARITH_TAC))
6147   ]);;
6148   (* }}} *)
6149
6150 let GG_MCELL_NONBETA = prove_by_refinement(
6151   `!V u0 u1 w0 n f i.  pack_nonlinear_non_ox3q1h /\ 
6152          1 < n /\
6153          packing V /\
6154          saturated V /\
6155          s_leaf V [u0; u1] HAS_SIZE n /\
6156          u0 IN V /\
6157          u1 IN V /\
6158         periodic f n /\
6159          ~collinear {u0, u1, w0} /\
6160          critical_edge_y (dist (u0,u1)) /\
6161     cc_4 V u0 u1 f i /\
6162       ~((dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
6163       dist (u0,f (SUC i)) < &2 * hminus /\
6164       dist (u1,f (SUC i)) < &2 * hminus /\
6165     critical_edge_y (dist(f i, f (SUC i)))) /\
6166          leaf_rank V [u0; u1] w0 n f ==>
6167     gg_mcell V f u0 u1 i = (gamma4fgcy (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))  
6168       (dist (f i,f (SUC i)))
6169       (dist (u1,f (SUC i)))
6170       (dist (u1,f i))
6171       lmfun)         / 
6172     &(wtcount6_y (dist(u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))    
6173         (dist (f i,f (SUC i)))   (dist (u1,f (SUC i)))  (dist (u1,f i)))
6174 `,
6175   (* {{{ proof *)
6176   [
6177   REPEAT WEAKER_STRIP_TAC;
6178   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6179   ANTS_TAC;
6180     BY(ASM_REWRITE_TAC[]);
6181   REPEAT WEAKER_STRIP_TAC;
6182   GMATCH_SIMP_TAC cc_4_cc_cell;
6183   CONJ_TAC;
6184     BY(ASM_MESON_TAC[]);
6185   GMATCH_SIMP_TAC gammaX_gamma4fgcy_ALT;
6186   GEXISTL_TAC [`u0`;`f (SUC i)`;`u1`;`f i`];
6187   CONJ_TAC;
6188     BY(ASM_MESON_TAC[]);
6189   GMATCH_SIMP_TAC critical_weight_wtcount6_y;
6190   CONJ_TAC;
6191     BY(ASM_MESON_TAC[]);
6192   REWRITE_TAC[arith `g * &1/ w  + b = g / w <=> b = &0`];
6193   GMATCH_SIMP_TAC CC_4_BETA_BUMP_0;
6194   GEXISTL_TAC [`w0`;`n`];
6195   ASM_REWRITE_TAC[];
6196   REPEAT WEAKER_STRIP_TAC;
6197   FIRST_X_ASSUM_ST `/\` MP_TAC;
6198   BY(ASM_REWRITE_TAC[])
6199   ]);;
6200   (* }}} *)
6201
6202 let GG_MCELL_GENERAL = prove_by_refinement(
6203   `!V u0 u1 w0 n f i.  pack_nonlinear_non_ox3q1h /\ 
6204          1 < n /\
6205          packing V /\
6206          saturated V /\
6207          s_leaf V [u0; u1] HAS_SIZE n /\
6208          u0 IN V /\
6209          u1 IN V /\
6210         periodic f n /\
6211          ~collinear {u0, u1, w0} /\
6212          critical_edge_y (dist (u0,u1)) /\
6213     cc_4 V u0 u1 f i /\
6214          leaf_rank V [u0; u1] w0 n f ==>
6215     gg_mcell V f u0 u1 i = 
6216 gamma4fgcy (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))
6217  (dist (f i,f (SUC i)))
6218  (dist (u1,f (SUC i)))
6219  (dist (u1,f i))
6220  lmfun /
6221  &(wtcount6_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))
6222    (dist (f i,f (SUC i)))
6223    (dist (u1,f (SUC i)))
6224   (dist (u1,f i))) +
6225   beta_bumpA_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))
6226    (dist (f i,f (SUC i)))
6227    (dist (u1,f (SUC i)))
6228   (dist (u1,f i))`,
6229   (* {{{ proof *)
6230   [
6231   REPEAT WEAKER_STRIP_TAC;
6232   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6233   ANTS_TAC;
6234     BY(ASM_REWRITE_TAC[]);
6235   REPEAT WEAKER_STRIP_TAC;
6236   GMATCH_SIMP_TAC cc_4_cc_cell;
6237   CONJ_TAC;
6238     BY(ASM_MESON_TAC[]);
6239   GMATCH_SIMP_TAC gammaX_gamma4fgcy_ALT;
6240   GEXISTL_TAC [`u0`;`f (SUC i)`;`u1`;`f i`];
6241   CONJ_TAC;
6242     BY(ASM_MESON_TAC[]);
6243   GMATCH_SIMP_TAC critical_weight_wtcount6_y;
6244   CONJ_TAC;
6245     BY(ASM_MESON_TAC[]);
6246   REWRITE_TAC[arith `x * &1 / w = x / w`;arith `g + b = g + b' <=> b = b'`];
6247   REWRITE_TAC[Sphere.beta_bumpA_y];
6248   TYPIFY`critical_edge_y (dist (u0,u1)) /\       (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\      dist (u0,f (SUC i)) < &2 * hminus /\      dist (u1,f (SUC i)) < &2 * hminus /\    critical_edge_y (dist(f i, f (SUC i)))` ASM_CASES_TAC;
6249     ASM_REWRITE_TAC[];
6250     FIRST_X_ASSUM_ST `mcell4` (SUBST1_TAC o GSYM);
6251     GMATCH_SIMP_TAC CC_4_BETA_BUMP_EXPLICIT;
6252     CONJ_TAC;
6253       GEXISTL_TAC [`w0`;`n`];
6254       BY(ASM_REWRITE_TAC[]);
6255     BY(REAL_ARITH_TAC);
6256   ASM_REWRITE_TAC[];
6257   FIRST_X_ASSUM_ST `mcell4` (SUBST1_TAC o GSYM);
6258   GMATCH_SIMP_TAC CC_4_BETA_BUMP_0;
6259   CONJ_TAC;
6260     GEXISTL_TAC [`w0`;`n`];
6261     ASM_REWRITE_TAC[Sphere.critical_edge_y];
6262     BY(ASM_MESON_TAC[Sphere.critical_edge_y;arith `d < t ==> ~(t <= d)`]);
6263   FIRST_X_ASSUM (ASSUME_TAC o (REWRITE_RULE[DE_MORGAN_THM;Sphere.critical_edge_y]));
6264   FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
6265   REWRITE_TAC[Sphere.critical_edge_y];
6266   BY(REPEAT (FIRST_X_ASSUM DISJ_CASES_TAC THEN ASM_REWRITE_TAC[] THEN TRY REAL_ARITH_TAC))
6267   ]);;
6268   (* }}} *)
6269
6270 let real_model_gamma_qu = prove_by_refinement(
6271   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
6272          1 < n /\
6273          packing V /\
6274          saturated V /\
6275          s_leaf V [u0; u1] HAS_SIZE n /\
6276          u0 IN V /\
6277          u1 IN V /\
6278         periodic f n /\
6279          ~collinear {u0, u1, w0} /\
6280          critical_edge_y (dist (u0,u1)) /\
6281          leaf_rank V [u0; u1] w0 n f
6282      ==> 
6283 (!i. cc_4 V u0 u1 f i /\
6284       (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
6285       dist (u0,f (SUC i)) < &2 * hminus /\
6286       dist (u1,f (SUC i)) < &2 * hminus /\
6287       dist (f i,f (SUC i)) < &2 * hminus
6288       ==> -- #0.0057 <= gg_mcell V f u0 u1 i)
6289 `,
6290   (* {{{ proof *)
6291   [
6292   REPEAT WEAKER_STRIP_TAC;
6293   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6294   ASM_REWRITE_TAC[];
6295   REPEAT WEAKER_STRIP_TAC;
6296   REWRITE_TAC[Oxl_def.cc_eps];
6297   MATCH_MP_TAC (arith `y > -- #0.00569 ==> -- #0.0057 <= y`);
6298   INTRO_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "BIXPCGW 9455898160") [];
6299   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
6300   GMATCH_SIMP_TAC GG_MCELL_QUARTER;
6301   CONJ_TAC;
6302     BY(ASM_MESON_TAC[]);
6303   DISCH_THEN MATCH_MP_TAC;
6304   ASM_REWRITE_TAC[];
6305   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
6306   ]);;
6307   (* }}} *)
6308
6309 let ETA_Y_POS_LE_ALT = prove_by_refinement(
6310   `!u0 u1 (u2:real^3). &0 <= eta_y (dist (u0,u1)) (dist (u0,u2)) (dist (u1,u2)) `,
6311   (* {{{ proof *)
6312   [
6313   BY(MESON_TAC[Collect_geom2.ETA_Y_POS_LE;Geomdetail.dist3])
6314   ]);;
6315   (* }}} *)
6316
6317 let ETA_Y_LEMMA = prove_by_refinement(
6318   `!u0 u1 (u2:real^3) r.  ~collinear {u0,u1,u2} /\ &0 < r /\ r <= hl[u0;u1;u2] ==>
6319     r pow 2 <= eta_y (dist (u0,u1)) (dist (u0,u2)) (dist (u1,u2)) pow 2 `,
6320   (* {{{ proof *)
6321   [
6322   REPEAT WEAKER_STRIP_TAC;
6323   GMATCH_SIMP_TAC (GSYM Collect_geom.POW2_COND_LT);
6324   MATCH_MP_TAC (TAUT `a /\ b ==> b /\ a`);
6325   SUBCONJ_TAC;
6326     GMATCH_SIMP_TAC (GSYM RADV_ETAY);
6327     ASM_REWRITE_TAC[];
6328     FIRST_X_ASSUM_ST `hl` MP_TAC;
6329     BY(REWRITE_TAC[Pack_defs.HL;set_of_list]);
6330   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
6331   ]);;
6332   (* }}} *)
6333
6334 let ETA_Y_LEMMA_ALT = prove_by_refinement(
6335   `!u0 u1 (u2:real^3) r.  ~collinear {u0,u1,u2} /\  hl[u0;u1;u2] <= r ==>
6336     eta_y (dist (u0,u1)) (dist (u0,u2)) (dist (u1,u2)) pow 2 <= r pow 2`,
6337   (* {{{ proof *)
6338   [
6339   REPEAT WEAKER_STRIP_TAC;
6340   GMATCH_SIMP_TAC (GSYM Collect_geom.POW2_COND);
6341   MATCH_MP_TAC (TAUT `a /\ b ==> b /\ a`);
6342   SUBCONJ_TAC;
6343     GMATCH_SIMP_TAC (GSYM RADV_ETAY);
6344     ASM_REWRITE_TAC[];
6345     FIRST_X_ASSUM_ST `hl` MP_TAC;
6346     BY(REWRITE_TAC[Pack_defs.HL;set_of_list]);
6347   DISCH_TAC;
6348   SUBCONJ_TAC;
6349     BY(ASM_REWRITE_TAC[ETA_Y_POS_LE_ALT]);
6350   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
6351   ]);;
6352   (* }}} *)
6353
6354 let real_model_fhbv2  = prove_by_refinement(
6355   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
6356          1 < n /\
6357          packing V /\
6358          saturated V /\
6359          s_leaf V [u0; u1] HAS_SIZE n /\
6360          u0 IN V /\
6361          u1 IN V /\
6362         periodic f n /\
6363          ~collinear {u0, u1, w0} /\
6364          critical_edge_y (dist (u0,u1)) /\
6365          leaf_rank V [u0; u1] w0 n f
6366      ==> 
6367  (!i. (cc_4 V u0 u1 f i /\
6368        (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
6369        dist (u0,f (SUC i)) < &2 * hminus /\
6370        dist (u1,f (SUC i)) < &2 * hminus /\
6371        dist (f i,f (SUC i)) < &2 * hminus) /\
6372       ~(hl [u0; u1; f (SUC i)] <  #1.34)
6373       ==>  #0.0057 <= gg_mcell V f u0 u1 i) 
6374 `,
6375   (* {{{ proof *)
6376   [
6377   REPEAT WEAKER_STRIP_TAC;
6378   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6379   ASM_REWRITE_TAC[];
6380   REPEAT WEAKER_STRIP_TAC;
6381   MATCH_MP_TAC (arith `y >  #0.0057 ==>  #0.0057 <= y`);
6382   INTRO_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "FHBVYXZv2 a") [];
6383   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
6384   REWRITE_TAC[GSYM Sphere.rad2_y];
6385   ONCE_REWRITE_TAC[TAUT `(r ==> a \/ b \/ c) <=> ((r /\ ~b /\ ~c) ==> a)`];
6386   GMATCH_SIMP_TAC GG_MCELL_QUARTER;
6387   CONJ_TAC;
6388     BY(ASM_MESON_TAC[]);
6389   DISCH_THEN MATCH_MP_TAC;
6390   ASM_REWRITE_TAC[];
6391   (ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
6392   CONJ_TAC;
6393     MATCH_MP_TAC (arith `r < &2 ==> ~( r > &2)`);
6394     BY(ASM_REWRITE_TAC[]);
6395   REWRITE_TAC[arith `~(x < y ) <=> y <= x`];
6396   MATCH_MP_TAC ETA_Y_LEMMA;
6397   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6398   ANTS_TAC;
6399     BY(ASM_REWRITE_TAC[]);
6400   REPEAT WEAKER_STRIP_TAC;
6401   ASM_REWRITE_TAC[];
6402   FIRST_X_ASSUM_ST `#1.34` MP_TAC;
6403   BY(REAL_ARITH_TAC)
6404   ]);;
6405   (* }}} *)
6406
6407 let real_model_fhbv2_sym  = prove_by_refinement(
6408   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
6409          1 < n /\
6410          packing V /\
6411          saturated V /\
6412          s_leaf V [u0; u1] HAS_SIZE n /\
6413          u0 IN V /\
6414          u1 IN V /\
6415         periodic f n /\
6416          ~collinear {u0, u1, w0} /\
6417          critical_edge_y (dist (u0,u1)) /\
6418          leaf_rank V [u0; u1] w0 n f
6419      ==> 
6420 (!i. (cc_4 V u0 u1 f i /\
6421        (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
6422        dist (u0,f (SUC i)) < &2 * hminus /\
6423        dist (u1,f (SUC i)) < &2 * hminus /\
6424        dist (f i,f (SUC i)) < &2 * hminus) /\
6425       ~(hl [u0; u1; f i] <  #1.34)
6426       ==>  #0.0057 <= gg_mcell V f u0 u1 i)`,
6427   (* {{{ proof *)
6428   [
6429   REPEAT WEAKER_STRIP_TAC;
6430   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6431   ASM_REWRITE_TAC[];
6432   REPEAT WEAKER_STRIP_TAC;
6433   MATCH_MP_TAC (arith `y >  #0.0057 ==>  #0.0057 <= y`);
6434   INTRO_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "FHBVYXZv2 a") [];
6435   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
6436   REWRITE_TAC[GSYM Sphere.rad2_y];
6437   ONCE_REWRITE_TAC[TAUT `(r ==> a \/ b \/ c) <=> ((r /\ ~b /\ ~c) ==> a)`];
6438   GMATCH_SIMP_TAC GG_MCELL_QUARTER;
6439   CONJ_TAC;
6440     BY(ASM_MESON_TAC[]);
6441   DISCH_TAC;
6442   ONCE_REWRITE_TAC[Merge_ineq.gamma4fgcy_sym23];
6443   FIRST_X_ASSUM MATCH_MP_TAC;
6444   ASM_REWRITE_TAC[];
6445   (ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
6446   CONJ_TAC;
6447     MATCH_MP_TAC (arith `r < &2 ==> ~( r > &2)`);
6448     FIRST_X_ASSUM_ST `rad2_y` MP_TAC;
6449     BY(MESON_TAC[Merge_ineq.rad2_y_sym]);
6450   REWRITE_TAC[arith `~(x < y ) <=> y <= x`];
6451   MATCH_MP_TAC ETA_Y_LEMMA;
6452   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6453   ANTS_TAC;
6454     BY(ASM_REWRITE_TAC[]);
6455   REPEAT WEAKER_STRIP_TAC;
6456   ASM_REWRITE_TAC[];
6457   FIRST_X_ASSUM_ST `#1.34` MP_TAC;
6458   BY(REAL_ARITH_TAC)
6459   ]);;
6460   (* }}} *)
6461
6462 let CC_3_PROPS = prove_by_refinement(
6463   `!V u0 u1 w0 n f i.
6464     pack_nonlinear_non_ox3q1h /\
6465     packing V /\
6466     saturated V /\
6467     leaf_rank V [u0;u1]  w0 n f /\
6468     ~collinear {u0,u1,w0} /\
6469     critical_edge_y (dist(u0,u1)) /\
6470     s_leaf V [u0;u1] HAS_SIZE n /\
6471     1 < n /\
6472     ~cc_4 V u0 u1 f i ==>
6473     cc_ke V [u0; u1; f i] = 3 /\
6474 barV V 3 (cc_uh V ([u0;u1;f i])) /\
6475 barV V 3 (cc_uh V ([u1;u0;f (SUC i)])) /\
6476 beta_bump_v1 V {u0,u1} (cc_cell V [u0;u1;f i]) = &0 /\
6477 beta_bump_v1 V {u0,u1} (cc_cell V [u1;u0;f (SUC i)]) = &0 /\
6478         cc_ke V [u1;u0;f (SUC i)] = 3 /\
6479         cc_cell V [u0;u1;f i] SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\
6480         cc_cell V [u1;u0;f(SUC i)] SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\
6481         ~(cc_cell V [u0;u1;f i] = cc_cell V [u1;u0;f (SUC i)]) /\
6482     cc_cell V [u0; u1; f i] SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\
6483     ~collinear {u0,u1,f i} /\
6484     ~collinear {u0,u1,f (SUC i)} /\
6485     hl [u0;u1;f i] < sqrt(&2) /\
6486     hl [u0;u1; f(SUC i)] < sqrt(&2) /\
6487     hl [u1;u0; f(SUC i)] < sqrt(&2) /\
6488     leaf V [u0; u1; f i] /\
6489     leaf V [u0; u1; f (SUC i)] /\
6490     leaf V [u1; u0; f (SUC i)] /\
6491         &2 <= dist(u0,u1) /\
6492         &2 <= dist(u0,f i) /\
6493         &2 <= dist(u0,f(SUC i)) /\
6494         &2 <= dist(u1,f i) /\
6495         &2 <= dist(u1,f(SUC i)) /\
6496         dist(u0,u1) <= &2 * sqrt(&2) /\
6497         dist(u0,f i) <= &2 * sqrt(&2) /\
6498         dist(u0,f (SUC i)) <= &2 * sqrt(&2) /\
6499         dist(u1,f i) <= &2 * sqrt(&2) /\
6500         dist(u1,f (SUC i)) <= &2 * sqrt(&2) /\
6501         eta_y (dist (u0,u1)) (dist(u0,f i)) (dist (u1,f i)) < sqrt(&2) /\
6502         eta_y (dist (u0,u1)) (dist(u0,f (SUC i))) (dist (u1,f (SUC i))) < sqrt(&2) /\
6503     ~NULLSET (cc_cell V [u0; u1; f i]) /\
6504     ~NULLSET (cc_cell V [u1; u0; f (SUC i)]) /\
6505     azim_mcell V f u0 u1 i = azim u0 u1 (f i) (f (SUC i)) /\
6506   (?y4.  &2 <= y4 /\
6507                    y4 <= &2 * sqrt (&2) /\
6508                    &0 < delta_y (dist(u0,u1)) (dist(u0,f i)) (dist(u0, f(SUC i))) y4 (dist(u1,f(SUC i))) (dist(u1,f i)) /\
6509                    dih_y (dist(u0,u1)) (dist(u0,f i)) (dist(u0, f(SUC i))) y4 (dist(u1,f(SUC i))) (dist(u1,f i)) <= azim u0 u1 (f i) (f (SUC i)) /\
6510                    &2 <= rad2_y (dist(u0,u1)) (dist(u0,f i)) (dist(u0, f(SUC i))) y4 (dist(u1,f(SUC i))) (dist(u1,f i)) /\
6511                    (azim u0 u1 (f i) (f (SUC i)) < pi /\
6512                     dist (f i,f (SUC i)) <= &2 * sqrt (&2)
6513                     ==> y4 = dist (f i,f (SUC i))))
6514 `,
6515   (* {{{ proof *)
6516   [
6517   REWRITE_TAC[cc_4];
6518   REPEAT WEAKER_STRIP_TAC;
6519   INTRO_TAC NO_4CELL_IMP_K3 [`V`;`wedge_ge u0 u1 (f i) (f (SUC i))`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
6520   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
6521   REPEAT WEAKER_STRIP_TAC;
6522   ASM_REWRITE_TAC[];
6523   REWRITE_TAC[TAUT `a /\ b /\ c <=> (a /\ b) /\ c`];
6524   CONJ2_TAC;
6525     REWRITE_TAC[TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
6526     MATCH_MP_TAC WEDGE3_Y4;
6527     GEXISTL_TAC [`V`;`w0`;`n`];
6528     BY(ASM_REWRITE_TAC[]);
6529   CONJ2_TAC;
6530     INTRO_TAC LEAF_RANK_REUHADY [`V`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
6531     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
6532   TYPIFY `leaf V [u0;u1;f i] /\ leaf V [u0;u1;f (SUC i)]` (C SUBGOAL_THEN ASSUME_TAC);
6533     BY(ASM_MESON_TAC[ LEAF_RANK_LEAF]);
6534   TYPIFY ` s_leaf V [u0;u1] (f (SUC i) )` (C SUBGOAL_THEN ASSUME_TAC);
6535     MATCH_MP_TAC LEAF_RANK_S_LEAF;
6536     BY(ASM_MESON_TAC[]);
6537   TYPIFY `leaf V [u1;u0;f (SUC i)]` (C SUBGOAL_THEN ASSUME_TAC);
6538     INTRO_TAC s_leaf_leaf [`V`;`[u1;u0]`;`f(SUC i)`];
6539     REWRITE_TAC[IN;Bump.EL_EXPLICIT];
6540     DISCH_THEN MATCH_MP_TAC;
6541     BY(ASM_MESON_TAC[S_LEAF_SYM]);
6542   SUBCONJ2_TAC;
6543     BY(ASM_MESON_TAC[Leaf_cell.CC_CELL_NOT_NULLSET]);
6544   DISCH_TAC;
6545   SUBCONJ2_TAC;
6546     BY(ASM_MESON_TAC[Leaf_cell.CC_CELL_NOT_NULLSET]);
6547   ASM_REWRITE_TAC[];
6548   INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[u0;u1;f i]`];
6549   ASM_REWRITE_TAC[];
6550   INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[u0;u1;f (SUC i)]`];
6551   ASM_REWRITE_TAC[set_of_list];
6552   REPEAT WEAKER_STRIP_TAC THEN ASM_REWRITE_TAC[];
6553   INTRO_TAC LEAF_DOMAIN [`V`;`[u0;u1;f i]`];
6554   INTRO_TAC LEAF_DOMAIN [`V`;`[u1;u0;f (SUC i)]`];
6555   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
6556   REPEAT WEAKER_STRIP_TAC;
6557   ASM_REWRITE_TAC[];
6558   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
6559   CONJ2_TAC;
6560     REPEAT (FIRST_X_ASSUM_ST `eta_y` MP_TAC);
6561     BY(MESON_TAC[DIST_SYM;Collect_geom.ETA_Y_SYYM]);
6562   REWRITE_TAC[TAUT `(a /\ b) /\ c <=> a /\ b /\ c`];
6563   SUBCONJ_TAC;
6564     BY(ASM_MESON_TAC[ Leaf_cell.cc_uh;IN]);
6565   DISCH_TAC;
6566   SUBCONJ_TAC;
6567     BY(ASM_MESON_TAC[Leaf_cell.cc_uh;IN]);
6568   DISCH_TAC;
6569   REPEAT (FIRST_X_ASSUM_ST `NULLSET` MP_TAC);
6570   ASM_REWRITE_TAC[Leaf_cell.cc_cell];
6571   REPEAT WEAKER_STRIP_TAC;
6572   REPEAT (GMATCH_SIMP_TAC Bump.MCELL_BUMP_0);
6573   ASM_REWRITE_TAC[arith `3 < 4`];
6574   REPEAT (FIRST_X_ASSUM_ST `leaf` MP_TAC);
6575   REWRITE_TAC[Leaf_cell.leaf];
6576   BY(MESON_TAC[Sphere.sqrt2])
6577   ]);;
6578   (* }}} *)
6579
6580 let real_model_gckb  = prove_by_refinement(
6581   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
6582          1 < n /\
6583          packing V /\
6584          saturated V /\
6585          s_leaf V [u0; u1] HAS_SIZE n /\
6586          u0 IN V /\
6587          u1 IN V /\
6588         periodic f n /\
6589          ~collinear {u0, u1, w0} /\
6590          critical_edge_y (dist (u0,u1)) /\
6591          leaf_rank V [u0; u1] w0 n f
6592      ==> (!i.  #0.606 <= azim_mcell V f u0 u1 i)`,
6593   (* {{{ proof *)
6594   [
6595   REPEAT WEAKER_STRIP_TAC;
6596   MATCH_MP_TAC (arith `y >  x ==>  x <= y`);
6597   INTRO_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "GCKBQEA") [];
6598   REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
6599   DISCH_TAC;
6600   TYPIFY `cc_4 V u0 u1 f i` ASM_CASES_TAC;
6601     INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6602     ASM_REWRITE_TAC[];
6603     REPEAT WEAKER_STRIP_TAC;
6604     INTRO_TAC c_4_azim_mcell_dih_y [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6605     ASM_REWRITE_TAC[];
6606     DISCH_THEN SUBST1_TAC;
6607     FIRST_X_ASSUM MATCH_MP_TAC;
6608     ASM_REWRITE_TAC[Nonlinear_lemma.sqrt8_sqrt2;Sphere.sqrt2];
6609     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
6610   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6611   ANTS_TAC;
6612     BY(ASM_REWRITE_TAC[]);
6613   REPEAT WEAKER_STRIP_TAC;
6614   FIRST_X_ASSUM_ST `dih_y` MP_TAC;
6615   ASM_REWRITE_TAC[];
6616   MATCH_MP_TAC (arith `d > c ==> (d <= a ==> a > c)`);
6617   FIRST_X_ASSUM MATCH_MP_TAC;
6618   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
6619   FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
6620   BY(MESON_TAC[Sphere.critical_edge_y])
6621   ]);;
6622   (* }}} *)
6623
6624 let real_model_sum_azim = prove_by_refinement(
6625   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
6626          1 < n /\
6627          packing V /\
6628          saturated V /\
6629          s_leaf V [u0; u1] HAS_SIZE n /\
6630          u0 IN V /\
6631          u1 IN V /\
6632         periodic f n /\
6633          ~collinear {u0, u1, w0} /\
6634          critical_edge_y (dist (u0,u1)) /\
6635          leaf_rank V [u0; u1] w0 n f
6636      ==> sum {i | i < n} (azim_mcell V f u0 u1) = &2 * pi`,
6637   (* {{{ proof *)
6638   [
6639   REPEAT WEAKER_STRIP_TAC;
6640   INTRO_TAC LEAF_RANK_GRUTOTI [`V`;`[u0;u1]`;`w0`;`n`;`f`];
6641   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
6642   DISCH_THEN MATCH_MP_TAC;
6643   REWRITE_TAC[Marchal_cells_3.HL_2];
6644   REWRITE_TAC[arith `inv(&2) * x < y <=> x < &2 * y`];
6645   FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
6646   REWRITE_TAC[Sphere.critical_edge_y];
6647   TYPIFY `&0 < sqrt(&2) - hplus` ENOUGH_TO_SHOW_TAC;
6648     BY(REAL_ARITH_TAC);
6649   BY(REWRITE_TAC[Flyspeck_constants.bounds])
6650   ]);;
6651   (* }}} *)
6652
6653 let real_model_ox3q1h_merge = prove_by_refinement(
6654   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ ox3q1h /\ 
6655          1 < n /\
6656          packing V /\
6657          saturated V /\
6658          s_leaf V [u0; u1] HAS_SIZE n /\
6659          u0 IN V /\
6660          u1 IN V /\
6661         periodic f n /\
6662          ~collinear {u0, u1, w0} /\
6663          critical_edge_y (dist (u0,u1)) /\
6664          leaf_rank V [u0; u1] w0 n f
6665 ==>
6666  (CARD (s_leaf V [u0; u1]) = 4 /\
6667   (?i. cc_4 V u0 u1 f i /\
6668        (&2 * hminus <= dist (f i,f (SUC i)) /\
6669         dist (f i,f (SUC i)) <= &2 * hplus) /\
6670        (cc_4 V u0 u1 f (SUC i) /\
6671         (dist (u0,f (SUC i)) < &2 * hminus /\
6672          dist (u1,f (SUC i)) < &2 * hminus) /\
6673         dist (u0,f (SUC (SUC i))) < &2 * hminus /\
6674         dist (u1,f (SUC (SUC i))) < &2 * hminus /\
6675         dist (f (SUC i),f (SUC (SUC i))) < &2 * hminus) /\
6676        (cc_4 V u0 u1 f (i + 2) /\
6677         (dist (u0,f (i + 2)) < &2 * hminus /\
6678          dist (u1,f (i + 2)) < &2 * hminus) /\
6679         dist (u0,f (SUC (i + 2))) < &2 * hminus /\
6680         dist (u1,f (SUC (i + 2))) < &2 * hminus /\
6681         dist (f (i + 2),f (SUC (i + 2))) < &2 * hminus) /\
6682        cc_4 V u0 u1 f (i + 3) /\
6683        (dist (u0,f (i + 3)) < &2 * hminus /\
6684         dist (u1,f (i + 3)) < &2 * hminus) /\
6685        dist (u0,f (SUC (i + 3))) < &2 * hminus /\
6686        dist (u1,f (SUC (i + 3))) < &2 * hminus /\
6687        dist (f (i + 3),f (SUC (i + 3))) < &2 * hminus)
6688   ==> &0 <= sum {i | i < n} (gg_mcell V f u0 u1))
6689 `,
6690   (* {{{ proof *)
6691   [
6692   REWRITE_TAC[arith `i + 2 = SUC (i + 1) /\ i + 3 = SUC (i + 2) /\ i + 1 = SUC i`];
6693   REPEAT WEAKER_STRIP_TAC;
6694   INTRO_TAC real_model_sum_azim [`V`;`u0`;`u1`;`w0`;`n`;`f`];
6695   ANTS_TAC;
6696     BY(ASM_REWRITE_TAC[]);
6697   TYPIFY `{i | i < n} = ( 0..n - 1)` (C SUBGOAL_THEN SUBST1_TAC);
6698     BY(ASM_MESON_TAC[NUMSEG_LT;arith `1 < n==> ~(n = 0)`;HAS_SIZE]);
6699   COMMENT "periodicity";
6700   INTRO_TAC Oxl_def.periodic_sum [`gg_mcell V f u0 u1`;`n`];
6701   ANTS_TAC;
6702     CONJ2_TAC;
6703       BY(ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`]);
6704     BY(ASM_MESON_TAC[real_periodic_data;LEAF_RANK_PERIODIC]);
6705   DISCH_THEN (C INTRO_TAC [`i`]);
6706   DISCH_THEN (SUBST1_TAC o GSYM);
6707   INTRO_TAC Oxl_def.periodic_sum [`azim_mcell V f u0 u1`;`n`];
6708   ANTS_TAC;
6709     CONJ2_TAC;
6710       BY(ASM_SIMP_TAC[arith `1 < n ==> ~(n = 0)`]);
6711     BY(ASM_MESON_TAC[real_periodic_data;LEAF_RANK_PERIODIC]);
6712   DISCH_THEN (C INTRO_TAC [`i`]);
6713   DISCH_THEN (SUBST1_TAC o GSYM);
6714   COMMENT "do sum";
6715   TYPIFY `n = 4` (C SUBGOAL_THEN ASSUME_TAC);
6716     BY(ASM_MESON_TAC[HAS_SIZE]);
6717   ASM_REWRITE_TAC[arith `4 - 1 + i = SUC  (SUC (SUC i))`];
6718   REWRITE_TAC[SUM_SING_NUMSEG;SUM_CLAUSES_NUMSEG;arith `i <= SUC(SUC(SUC i)) /\ i <= SUC (SUC i) /\ i <= SUC i`];
6719   REPEAT (FIRST_X_ASSUM_ST `SUC(SUC(SUC(SUC i)))` MP_TAC);
6720   ASM_REWRITE_TAC[arith `SUC(SUC(SUC (SUC i))) = i + 4`];
6721   TYPIFY `f(i) = f (i+4)` (C SUBGOAL_THEN ASSUME_TAC);
6722     BY(ASM_MESON_TAC[Oxl_def.periodic]);
6723   REPEAT WEAKER_STRIP_TAC;
6724   COMMENT "1st piece";
6725   INTRO_TAC GG_MCELL_BETA [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6726   ANTS_TAC;
6727     ASM_REWRITE_TAC[];
6728     BY(ASM_MESON_TAC[Sphere.critical_edge_y]);
6729   DISCH_THEN SUBST1_TAC;
6730   COMMENT "second piece";
6731   INTRO_TAC GG_MCELL_QUARTER [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
6732   ANTS_TAC;
6733     BY(ASM_REWRITE_TAC[]);
6734   DISCH_THEN SUBST1_TAC;
6735   COMMENT "third piece";
6736   INTRO_TAC GG_MCELL_QUARTER [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC(SUC i)`];
6737   ANTS_TAC;
6738     BY(ASM_REWRITE_TAC[]);
6739   DISCH_THEN SUBST1_TAC;
6740   COMMENT "fourth piece";
6741   INTRO_TAC GG_MCELL_QUARTER [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC(SUC(SUC i))`];
6742   ANTS_TAC;
6743     BY(ASM_REWRITE_TAC[arith `SUC(SUC(SUC(SUC i))) = i+4`]);
6744   DISCH_THEN SUBST1_TAC;
6745   MATCH_MP_TAC (arith `g > &0 ==> &0 <= g`);
6746   ASM_REWRITE_TAC[arith `SUC(SUC(SUC(SUC i))) = i+4`];
6747   ONCE_REWRITE_TAC[arith `((a + b) +c) + d = a + d + c + b`];
6748   COMMENT "intro ineq";
6749   INTRO_TAC Merge_ineq.ox3q1h_merge [];
6750   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
6751   TYPIFY `bump (dist (u0,u1) / &2) - bump (dist (f (i + 4),f (SUC i)) / &2) = beta_bump_force_y (dist (u0,u1)) (dist (u0,f (i + 4))) (dist (u0,f (SUC i)))       (dist (f (i + 4),f (SUC i)))      (dist (u1,f (SUC i)))      (dist (u1,f (i + 4)))` (C SUBGOAL_THEN SUBST1_TAC);
6752     BY(REWRITE_TAC[Sphere.beta_bump_force_y]);
6753   REWRITE_TAC[arith `(a+b)+c = a+b+c`];
6754   DISCH_THEN MATCH_MP_TAC;
6755   ASM_SIMP_TAC[];
6756   COMMENT "intro domain";
6757   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6758   ANTS_TAC;
6759     BY(ASM_REWRITE_TAC[]);
6760   REPEAT WEAKER_STRIP_TAC;
6761   ASM_REWRITE_TAC[];
6762   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
6763   ANTS_TAC;
6764     BY(ASM_REWRITE_TAC[]);
6765   REPEAT WEAKER_STRIP_TAC;
6766   ASM_REWRITE_TAC[];
6767   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC(SUC i)`];
6768   ANTS_TAC;
6769     BY(ASM_REWRITE_TAC[]);
6770   REPEAT WEAKER_STRIP_TAC;
6771   ASM_REWRITE_TAC[];
6772   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC(SUC(SUC i))`];
6773   ANTS_TAC;
6774     BY(ASM_REWRITE_TAC[]);
6775   REPEAT WEAKER_STRIP_TAC;
6776   ASM_REWRITE_TAC[];
6777   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
6778   RULE_ASSUM_TAC (REWRITE_RULE[arith `SUC(SUC(SUC(SUC i))) = i+4`]);
6779   FIRST_X_ASSUM_ST `f i = f (i + 4)` (fun t -> (REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[GSYM t]) THEN ASSUME_TAC t);
6780   REPEAT WEAKER_STRIP_TAC;
6781   ASM_REWRITE_TAC[arith `x< y ==> x<= y`];
6782   COMMENT "deal with angle sum";
6783   FIRST_X_ASSUM_ST `azim_mcell` MP_TAC;
6784   REPEAT (GMATCH_SIMP_TAC c_4_azim_mcell_dih_y);
6785   ASM_REWRITE_TAC[];
6786   SUBCONJ_TAC;
6787     BY(ASM_MESON_TAC[]);
6788   DISCH_TAC;
6789   ASM_REWRITE_TAC[arith `SUC(SUC(SUC(SUC i))) = i + 4`];
6790   FIRST_X_ASSUM_ST `f i = f (i + 4)` ((unlist REWRITE_TAC) o GSYM);
6791   BY(REAL_ARITH_TAC)
6792   ]);;
6793   (* }}} *)
6794
6795
6796 let mcell3_gammaX_gamma3f = prove_by_refinement(
6797   `!V u0 u1 w0 n f i.   
6798  pack_nonlinear_non_ox3q1h /\
6799       packing V /\
6800       saturated V /\
6801       leaf_rank V [u0; u1] w0 n f /\
6802       ~collinear {u0, u1, w0} /\
6803       critical_edge_y (dist (u0,u1)) /\
6804       s_leaf V [u0; u1] HAS_SIZE n /\
6805       1 < n /\
6806       ~cc_4 V u0 u1 f i      
6807   ==>    
6808   gammaX V (cc_cell V [u0;u1;f i]) lmfun = 
6809   gamma3f (dist(u0,u1)) (dist(u0,f i)) (dist(u1,f i)) sqrt2 lmfun
6810     `,
6811   (* {{{ proof *)
6812   [
6813   REPEAT WEAKER_STRIP_TAC;
6814   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6815   ANTS_TAC;
6816     BY(ASM_REWRITE_TAC[]);
6817   REPEAT WEAKER_STRIP_TAC;
6818   INTRO_TAC Tskajxy_lemmas.gammaX_gamma3f [`V`;`cc_cell V [u0;u1;f i]`;`cc_uh V [u0;u1;f i]`;`u0`;`u1`;`f i`;`EL 3 (cc_uh V [u0;u1;f i])`;`dist(u1,f i)`;`dist(u0,f i)`;`dist(u0,u1)`];
6819   ANTS_TAC;
6820     ASM_REWRITE_TAC[];
6821     TYPIFY ` [u0; u1; f i; EL 3 (cc_uh V [u0; u1; f i])] = cc_uh V [u0; u1; f i]` (C SUBGOAL_THEN ASSUME_TAC);
6822       GMATCH_SIMP_TAC Leaf_cell.LIST_OF_CC_UH;
6823       BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
6824     BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell]);
6825   DISCH_THEN (unlist REWRITE_TAC);
6826   BY(MESON_TAC[Merge_ineq.gamma3f_sym])
6827   ]);;
6828   (* }}} *)
6829
6830 let mcell3_dihX_dih_y = prove_by_refinement(
6831   `!V u0 u1 w0 n f i.   
6832     pack_nonlinear_non_ox3q1h /\
6833       packing V /\
6834       saturated V /\
6835       leaf_rank V [u0; u1] w0 n f /\
6836       ~collinear {u0, u1, w0} /\
6837       critical_edge_y (dist (u0,u1)) /\
6838       s_leaf V [u0; u1] HAS_SIZE n /\
6839       1 < n /\
6840       ~cc_4 V u0 u1 f i      
6841   ==>    
6842   dihX V (cc_cell V [u0;u1;f i]) (u0,u1) = 
6843   dih_y (dist(u0,u1)) (dist(u0,f i)) sqrt2 sqrt2 sqrt2 (dist(u1,f i)) 
6844     `,
6845   (* {{{ proof *)
6846   [
6847   REPEAT WEAKER_STRIP_TAC;
6848   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6849   ANTS_TAC;
6850     BY(ASM_REWRITE_TAC[]);
6851   REPEAT WEAKER_STRIP_TAC;
6852   INTRO_TAC Tskajxy_lemmas.gammaX_gamma3f [`V`;`cc_cell V [u0;u1;f i]`;`cc_uh V [u0;u1;f i]`;`u0`;`u1`;`f i`;`EL 3 (cc_uh V [u0;u1;f i])`;`dist(u1,f i)`;`dist(u0,f i)`;`dist(u0,u1)`];
6853   ANTS_TAC;
6854     ASM_REWRITE_TAC[];
6855     TYPIFY ` [u0; u1; f i; EL 3 (cc_uh V [u0; u1; f i])] = cc_uh V [u0; u1; f i]` (C SUBGOAL_THEN ASSUME_TAC);
6856       GMATCH_SIMP_TAC Leaf_cell.LIST_OF_CC_UH;
6857       BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
6858     BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell]);
6859   DISCH_THEN (unlist REWRITE_TAC);
6860   BY(MESON_TAC[Nonlinear_lemma.dih_y_sym;Nonlinear_lemma.dih_y_sym2])
6861   ]);;
6862   (* }}} *)
6863
6864 let mcell3_gammaXb_gamma3f = prove_by_refinement(
6865   `!V u0 u1 w0 n f i.   
6866  pack_nonlinear_non_ox3q1h /\
6867       packing V /\
6868       saturated V /\
6869       leaf_rank V [u0; u1] w0 n f /\
6870       ~collinear {u0, u1, w0} /\
6871       critical_edge_y (dist (u0,u1)) /\
6872       s_leaf V [u0; u1] HAS_SIZE n /\
6873       1 < n /\
6874       ~cc_4 V u0 u1 f i      
6875   ==>    
6876   gammaX V (cc_cell V [u1;u0;f (SUC i)]) lmfun = 
6877   gamma3f (dist(u0,u1)) (dist(u0,f (SUC i))) (dist(u1,f (SUC i))) sqrt2 lmfun
6878     `,
6879   (* {{{ proof *)
6880   [
6881   REPEAT WEAKER_STRIP_TAC;
6882   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6883   ANTS_TAC;
6884     BY(ASM_REWRITE_TAC[]);
6885   REPEAT WEAKER_STRIP_TAC;
6886   INTRO_TAC Tskajxy_lemmas.gammaX_gamma3f [`V`;`cc_cell V [u1;u0;f (SUC i)]`;`cc_uh V [u1;u0;f (SUC i)]`;`u1`;`u0`;`f (SUC i)`;`EL 3 (cc_uh V [u1;u0;f (SUC i)])`;`dist(u0,f (SUC i))`;`dist(u1,f (SUC i))`;`dist(u0,u1)`];
6887   ANTS_TAC;
6888     ASM_REWRITE_TAC[];
6889     TYPIFY ` [u1; u0; f (SUC i); EL 3 (cc_uh V [u1; u0; f (SUC i)])] = cc_uh V [u1; u0; f (SUC i)]` (C SUBGOAL_THEN ASSUME_TAC);
6890       GMATCH_SIMP_TAC Leaf_cell.LIST_OF_CC_UH;
6891       BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
6892     CONJ_TAC;
6893       BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell]);
6894     ASM_REWRITE_TAC[];
6895     BY(MESON_TAC[DIST_SYM]);
6896   DISCH_THEN (unlist REWRITE_TAC);
6897   BY(MESON_TAC[Merge_ineq.gamma3f_sym])
6898   ]);;
6899   (* }}} *)
6900
6901 let mcell3_dihXb_dih_y = prove_by_refinement(
6902   `!V u0 u1 w0 n f i.   
6903  pack_nonlinear_non_ox3q1h /\
6904       packing V /\
6905       saturated V /\
6906       leaf_rank V [u0; u1] w0 n f /\
6907       ~collinear {u0, u1, w0} /\
6908       critical_edge_y (dist (u0,u1)) /\
6909       s_leaf V [u0; u1] HAS_SIZE n /\
6910       1 < n /\
6911       ~cc_4 V u0 u1 f i      
6912   ==>    
6913   dihX V (cc_cell V [u1;u0;f (SUC i)]) (u0,u1) = 
6914   dih_y (dist(u0,u1)) (dist(u0,f (SUC i))) sqrt2 sqrt2 sqrt2 (dist(u1,f (SUC i)))
6915     `,
6916   (* {{{ proof *)
6917   [
6918   REPEAT WEAKER_STRIP_TAC;
6919   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
6920   ANTS_TAC;
6921     BY(ASM_REWRITE_TAC[]);
6922   REPEAT WEAKER_STRIP_TAC;
6923   INTRO_TAC Tskajxy_lemmas.gammaX_gamma3f [`V`;`cc_cell V [u1;u0;f (SUC i)]`;`cc_uh V [u1;u0;f (SUC i)]`;`u1`;`u0`;`f (SUC i)`;`EL 3 (cc_uh V [u1;u0;f (SUC i)])`;`dist(u0,f (SUC i))`;`dist(u1,f (SUC i))`;`dist(u0,u1)`];
6924   ANTS_TAC;
6925     ASM_REWRITE_TAC[];
6926     TYPIFY ` [u1; u0; f (SUC i); EL 3 (cc_uh V [u1; u0; f (SUC i)])] = cc_uh V [u1; u0; f (SUC i)]` (C SUBGOAL_THEN ASSUME_TAC);
6927       GMATCH_SIMP_TAC Leaf_cell.LIST_OF_CC_UH;
6928       BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
6929     CONJ_TAC;
6930       BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell]);
6931     ASM_REWRITE_TAC[];
6932     BY(MESON_TAC[DIST_SYM]);
6933   REPEAT WEAKER_STRIP_TAC;
6934   GMATCH_SIMP_TAC Marchal_cells_3.DIHX_SYM;
6935   ASM_REWRITE_TAC[];
6936   CONJ_TAC;
6937     ONCE_REWRITE_TAC[GSYM IN];
6938     MATCH_MP_TAC Leaf_cell.CC_CELL_IN_MCELL_SET;
6939     BY(ASM_REWRITE_TAC[]);
6940   INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;`[u1;u0;f (SUC i)]`];
6941   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
6942   TYPIFY `{u0,u1} = {u1,u0}` (C SUBGOAL_THEN SUBST1_TAC);
6943     BY(SET_TAC[]);
6944   BY(REWRITE_TAC[])
6945   ]);;
6946   (* }}} *)
6947
6948 (* Moved to Merge_ineq 
6949 let cell3_from_ineq_thm_ALT = prove_by_refinement(
6950   `pack_nonlinear_non_ox3q1h ==>     (!y4 y5 y6.
6951       &2 <= y4 /\
6952       &2 <= y5 /\
6953       &2 <= y6 /\
6954       y4 <= &2 * sqrt (&2) /\
6955       y5 <= &2 * sqrt (&2) /\
6956       y6 <= &2 * sqrt (&2) /\
6957       eta_y y4 y5 y6 < sqrt (&2)
6958       ==> &0 <= gamma3f y4 y5 y6 sqrt2 lmfun)
6959    `,
6960   (* {{{ proof *)
6961   [
6962   DISCH_TAC;
6963   INTRO_TAC Merge_ineq.cell3_from_ineq_thm [];
6964   ANTS_TAC;
6965     BY((REWRITE_TAC (map Merge_ineq.get_pack_nonlinear_non_ox3q1h ["QZECFIC wt0";"QZECFIC wt0 corner";"QZECFIC wt0 sqrt8";"QZECFIC wt1";"QZECFIC wt2 A";"CIHTIUM";"CJFZZDW";])));
6966   BY(REWRITE_TAC[])
6967   ]);;
6968   (* }}} *)
6969 *)
6970
6971
6972 let MCELL3_EDGE_EXPLICIT = prove_by_refinement(
6973   `!V u0 u1 u2 u3.
6974             packing V /\
6975             saturated V /\
6976             ~NULLSET (mcell3 V [u0; u1; u2; u3]) /\
6977             barV V 3 [u0; u1; u2; u3]
6978             ==> edgeX V (mcell3 V [u0; u1; u2; u3]) =
6979                 {{u0, u1}, {u0, u2}, {u1, u2}}`,
6980   (* {{{ proof *)
6981   [
6982   REPEAT WEAKER_STRIP_TAC;
6983   REWRITE_TAC[EXTENSION];
6984   GEN_TAC;
6985   TYPIFY `~(?u v. x = {u,v})` ASM_CASES_TAC;
6986     REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
6987     BY(ASM_MESON_TAC[EDGEX_PAIR]);
6988   FIRST_X_ASSUM MP_TAC;
6989   REWRITE_TAC[];
6990   REPEAT WEAKER_STRIP_TAC;
6991   ASM_REWRITE_TAC[];
6992   INTRO_TAC Bump.MCELL3_EDGE [`V`;`[u0;u1;u2;u3]`;`u`;`v`];
6993   ANTS_TAC;
6994     BY(ASM_REWRITE_TAC[]);
6995   DISCH_THEN SUBST1_TAC;
6996   REWRITE_TAC[set_of_list];
6997   INTRO_TAC MCELL3_EXTREME_CARD [`V`;`[u0;u1;u2;u3]`];
6998   ANTS_TAC;
6999     BY(ASM_MESON_TAC[IN]);
7000   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
7001   DISCH_THEN (MP_TAC o (MATCH_MP Leaf_cell.CARD4_ALL_DISTINCT));
7002   REWRITE_TAC[Basics.TRUNCATE_SIMPLEX_EXPLICIT;set_of_list];
7003   REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
7004   REPEAT WEAKER_STRIP_TAC;
7005   REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
7006   REWRITE_TAC[IN_INSERT;SUBSET;NOT_IN_EMPTY];
7007   TYPIFY `(u = u0)` ASM_CASES_TAC;
7008     ASM_REWRITE_TAC[];
7009     BY(ASM_MESON_TAC[]);
7010   TYPIFY `(u = u1)` ASM_CASES_TAC;
7011     ASM_REWRITE_TAC[];
7012     BY(ASM_MESON_TAC[]);
7013   TYPIFY `(u = u2)` ASM_CASES_TAC;
7014     ASM_REWRITE_TAC[];
7015     BY(ASM_MESON_TAC[]);
7016   ASM_REWRITE_TAC[];
7017   BY(ASM_MESON_TAC[])
7018   ]);;
7019   (* }}} *)
7020
7021 let critical_weight1 = prove_by_refinement(
7022   `!V u0 u1 u2. critical_edge_y (dist(u0,u1)) /\ dist(u0,u2) < &2 * hminus /\ dist(u1,u2) < &2 * hminus /\
7023     cc_ke V [u0;u1;u2] = 3 /\
7024     packing V /\
7025     saturated V /\
7026     barV V 3 (cc_uh V [u0;u1;u2]) /\
7027     leaf V [u0;u1;u2] /\
7028     ~(NULLSET (cc_cell V [u0;u1;u2])) 
7029       ==>
7030         critical_weight V (cc_cell V [u0;u1;u2]) = &1`,
7031   (* {{{ proof *)
7032   [
7033   REWRITE_TAC[Pack_defs.critical_weight];
7034   REPEAT WEAKER_STRIP_TAC;
7035   TYPIFY `CARD (critical_edgeX V (cc_cell V [u0; u1; u2])) = 1` ENOUGH_TO_SHOW_TAC;
7036     DISCH_THEN SUBST1_TAC;
7037     BY(REAL_ARITH_TAC);
7038   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
7039   REWRITE_TAC[SING];
7040   TYPIFY `{u0,u1}` EXISTS_TAC;
7041   ONCE_REWRITE_TAC[EXTENSION];
7042   REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
7043   GEN_TAC;
7044   PROOF_BY_CONTR_TAC;
7045   TYPIFY `~(?u v. x = {u,v})` ENOUGH_TO_SHOW_TAC;
7046     DISCH_TAC;
7047     FIRST_X_ASSUM_ST `IN` MP_TAC;
7048     ASM_REWRITE_TAC[Pack_defs.critical_edgeX;IN_ELIM_THM];
7049     BY(ASM_MESON_TAC[]);
7050   DISCH_THEN MP_TAC THEN STRIP_TAC;
7051   FIRST_X_ASSUM_ST `IN` MP_TAC;
7052   ASM_REWRITE_TAC[critical_edgeX_critical_edge_y];
7053   TYPIFY `cc_cell V [u0;u1;u2] = mcell3 V (cc_uh V [u0;u1;u2])` (C SUBGOAL_THEN ASSUME_TAC);
7054     BY(ASM_MESON_TAC[Leaf_cell.cc_cell;GSYM Bump.MCELL3]);
7055   ASM_REWRITE_TAC[];
7056   INTRO_TAC Leaf_cell.LIST_OF_CC_UH [`V`;`[u0;u1;u2]`];
7057   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
7058   DISCH_TAC;
7059   ONCE_ASM_REWRITE_TAC[];
7060   GMATCH_SIMP_TAC MCELL3_EDGE_EXPLICIT;
7061   CONJ_TAC;
7062     BY(ASM_MESON_TAC[]);
7063   REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
7064   TYPIFY `{u,v} = {u0,u1}` ASM_CASES_TAC;
7065     ASM_REWRITE_TAC[];
7066     BY(ASM_MESON_TAC[Geomdetail.DIST_PAIR_LEMMA]);
7067   REWRITE_TAC[Sphere.critical_edge_y];
7068   REWRITE_TAC[arith `x <= d <=> ~(d < x)`];
7069   TYPIFY `{u,v} = {u0,u2}` ASM_CASES_TAC;
7070     ASM_REWRITE_TAC[];
7071     BY(ASM_MESON_TAC[Geomdetail.DIST_PAIR_LEMMA]);
7072   TYPIFY `{u,v} = {u1,u2}` ASM_CASES_TAC;
7073     ASM_REWRITE_TAC[];
7074     BY(ASM_MESON_TAC[Geomdetail.DIST_PAIR_LEMMA]);
7075   BY(ASM_REWRITE_TAC[])
7076   ]);;
7077   (* }}} *)
7078
7079 let critical_weight1a = prove_by_refinement(
7080   `!V u0 u1 w0 n f i .  pack_nonlinear_non_ox3q1h /\ 
7081          1 < n /\
7082          packing V /\
7083          saturated V /\
7084          s_leaf V [u0; u1] HAS_SIZE n /\
7085          u0 IN V /\
7086          u1 IN V /\
7087         periodic f n /\
7088          ~collinear {u0, u1, w0} /\
7089          critical_edge_y (dist (u0,u1)) /\
7090          leaf_rank V [u0; u1] w0 n f /\
7091   ~cc_4 V u0 u1 f (i) /\
7092     dist(u0,f i) < &2 * hminus /\ dist(u1,f i) < &2 * hminus
7093       ==>  
7094             critical_weight V (cc_cell V [u0; u1; f (i)]) = &1`,
7095   (* {{{ proof *)
7096   [
7097   REPEAT WEAKER_STRIP_TAC;
7098   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7099   ANTS_TAC;
7100     BY(ASM_REWRITE_TAC[]);
7101   REPEAT WEAKER_STRIP_TAC;
7102   INTRO_TAC critical_weight1 [`V`;`u0`;`u1`;`f i`];
7103   ANTS_TAC;
7104     BY(ASM_REWRITE_TAC[]);
7105   BY(DISCH_THEN (unlist REWRITE_TAC))
7106   ]);;
7107   (* }}} *)
7108
7109 let critical_weight1b = prove_by_refinement(
7110   `!V u0 u1 w0 n f i .  pack_nonlinear_non_ox3q1h /\ 
7111          1 < n /\
7112          packing V /\
7113          saturated V /\
7114          s_leaf V [u0; u1] HAS_SIZE n /\
7115          u0 IN V /\
7116          u1 IN V /\
7117         periodic f n /\
7118          ~collinear {u0, u1, w0} /\
7119          critical_edge_y (dist (u0,u1)) /\
7120          leaf_rank V [u0; u1] w0 n f /\
7121   ~cc_4 V u0 u1 f (i) /\
7122     dist(u0,f (SUC i)) < &2 * hminus /\ dist(u1,f (SUC i)) < &2 * hminus
7123       ==>  
7124             critical_weight V (cc_cell V [u1; u0; f (SUC i)]) = &1`,
7125   (* {{{ proof *)
7126   [
7127   REPEAT WEAKER_STRIP_TAC;
7128   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7129   ANTS_TAC;
7130     BY(ASM_REWRITE_TAC[]);
7131   REPEAT WEAKER_STRIP_TAC;
7132   INTRO_TAC critical_weight1 [`V`;`u1`;`u0`;`f (SUC i)`];
7133   ANTS_TAC;
7134     (ASM_REWRITE_TAC[]);
7135     ONCE_REWRITE_TAC[DIST_SYM];
7136     BY(ASM_REWRITE_TAC[]);
7137   BY(DISCH_THEN (unlist REWRITE_TAC))
7138   ]);;
7139   (* }}} *)
7140
7141
7142 let real_model_quqy = prove_by_refinement(
7143   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7144          1 < n /\
7145          packing V /\
7146          saturated V /\
7147          s_leaf V [u0; u1] HAS_SIZE n /\
7148          u0 IN V /\
7149          u1 IN V /\
7150         periodic f n /\
7151          ~collinear {u0, u1, w0} /\
7152          critical_edge_y (dist (u0,u1)) /\
7153          leaf_rank V [u0; u1] w0 n f
7154  ==>
7155 (!i. (cc_4 V u0 u1 f i /\
7156        (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
7157        dist (u0,f (SUC i)) < &2 * hminus /\
7158        dist (u1,f (SUC i)) < &2 * hminus /\
7159        dist (f i,f (SUC i)) < &2 * hminus) /\
7160       ~cc_4 V u0 u1 f (SUC i)
7161       ==>  &0 <=
7162           gg_mcell V f u0 u1 i +
7163           gammaX V (cc_cell V [u0; u1; f (SUC i)]) lmfun *  
7164             critical_weight V (cc_cell V [u0; u1; f (SUC i)]) )`,
7165   (* {{{ proof *)
7166   [
7167   REPEAT WEAKER_STRIP_TAC;
7168   GMATCH_SIMP_TAC critical_weight1a;
7169   CONJ_TAC;
7170     BY(ASM_MESON_TAC[]);
7171   REWRITE_TAC[arith `x * &1 = x`];
7172   INTRO_TAC mcell3_gammaX_gamma3f [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
7173   ASM_REWRITE_TAC[];
7174   DISCH_THEN SUBST1_TAC;
7175   INTRO_TAC GG_MCELL_QUARTER [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7176   ASM_REWRITE_TAC[];
7177   DISCH_THEN SUBST1_TAC;
7178   MP_TAC (Merge_ineq.g_quqya_g_quqyb_ALT);
7179   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7180   DISCH_TAC;
7181   ONCE_REWRITE_TAC[Merge_ineq.gamma4fgcy_sym23];
7182   FIRST_X_ASSUM MATCH_MP_TAC;
7183   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7184   ANTS_TAC;
7185     BY(ASM_REWRITE_TAC[]);
7186   REPEAT WEAKER_STRIP_TAC;
7187   ASM_REWRITE_TAC[];
7188   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
7189   FIRST_X_ASSUM_ST `rad2_y` MP_TAC;
7190   BY(MESON_TAC[Merge_ineq.rad2_y_sym])
7191   ]);;
7192   (* }}} *)
7193
7194 (*
7195 let real_model_quqy = prove_by_refinement(
7196   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7197          1 < n /\
7198          packing V /\
7199          saturated V /\
7200          s_leaf V [u0; u1] HAS_SIZE n /\
7201          u0 IN V /\
7202          u1 IN V /\
7203         periodic f n /\
7204          ~collinear {u0, u1, w0} /\
7205          critical_edge_y (dist (u0,u1)) /\
7206          leaf_rank V [u0; u1] w0 n f
7207  ==>
7208 (!i. (cc_4 V u0 u1 f i /\
7209        (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
7210        dist (u0,f (SUC i)) < &2 * hminus /\
7211        dist (u1,f (SUC i)) < &2 * hminus /\
7212        dist (f i,f (SUC i)) < &2 * hminus) /\
7213       ~cc_4 V u0 u1 f (SUC i)
7214       ==>  &0 <=
7215           gg_mcell V f u0 u1 i +
7216           gammaX V (cc_cell V [u0; u1; f (SUC i)]) lmfun)`,
7217   (* {{{ proof *)
7218   [
7219   REPEAT WEAKER_STRIP_TAC;
7220   INTRO_TAC mcell3_gammaX_gamma3f [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
7221   ASM_REWRITE_TAC[];
7222   DISCH_THEN SUBST1_TAC;
7223   INTRO_TAC GG_MCELL_QUARTER [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7224   ASM_REWRITE_TAC[];
7225   DISCH_THEN SUBST1_TAC;
7226   MP_TAC (Merge_ineq.g_quqya_g_quqyb_ALT);
7227   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7228   DISCH_TAC;
7229   ONCE_REWRITE_TAC[Merge_ineq.gamma4fgcy_sym23];
7230   FIRST_X_ASSUM MATCH_MP_TAC;
7231   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7232   ANTS_TAC;
7233     BY(ASM_REWRITE_TAC[]);
7234   REPEAT WEAKER_STRIP_TAC;
7235   ASM_REWRITE_TAC[];
7236   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
7237   FIRST_X_ASSUM_ST `rad2_y` MP_TAC;
7238   BY(MESON_TAC[Merge_ineq.rad2_y_sym])
7239   ]);;
7240   (* }}} *)
7241 *)
7242
7243
7244 let real_model_quqy_sym = prove_by_refinement(
7245   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7246          1 < n /\
7247          packing V /\
7248          saturated V /\
7249          s_leaf V [u0; u1] HAS_SIZE n /\
7250          u0 IN V /\
7251          u1 IN V /\
7252         periodic f n /\
7253          ~collinear {u0, u1, w0} /\
7254          critical_edge_y (dist (u0,u1)) /\
7255          leaf_rank V [u0; u1] w0 n f
7256  ==>
7257 (!i. (cc_4 V u0 u1 f (SUC i) /\
7258        (dist (u0,f (SUC i)) < &2 * hminus /\
7259         dist (u1,f (SUC i)) < &2 * hminus) /\
7260        dist (u0,f (SUC (SUC i))) < &2 * hminus /\
7261        dist (u1,f (SUC (SUC i))) < &2 * hminus /\
7262        dist (f (SUC i),f (SUC (SUC i))) < &2 * hminus) /\
7263       ~cc_4 V u0 u1 f i
7264       ==> &0 <=
7265           gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun *
7266           critical_weight V (cc_cell V [u1; u0; f (SUC i)]) +
7267           gg_mcell V f u0 u1 (SUC i))`,
7268   (* {{{ proof *)
7269   [
7270   REPEAT WEAKER_STRIP_TAC;
7271   GMATCH_SIMP_TAC critical_weight1b;
7272   CONJ_TAC;
7273     BY(ASM_MESON_TAC[]);
7274   REWRITE_TAC[arith `x * &1 = x`];
7275   INTRO_TAC mcell3_gammaXb_gamma3f [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7276   ASM_REWRITE_TAC[];
7277   DISCH_THEN SUBST1_TAC;
7278   INTRO_TAC GG_MCELL_QUARTER [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
7279   ASM_REWRITE_TAC[];
7280   DISCH_THEN SUBST1_TAC;
7281   ONCE_REWRITE_TAC[arith `a + b = b + a`];
7282   MP_TAC (Merge_ineq.g_quqya_g_quqyb_ALT);
7283   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7284   DISCH_THEN MATCH_MP_TAC;
7285   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
7286   ANTS_TAC;
7287     BY(ASM_REWRITE_TAC[]);
7288   REPEAT WEAKER_STRIP_TAC;
7289   ASM_REWRITE_TAC[];
7290   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
7291   ]);;
7292   (* }}} *)
7293
7294 (*
7295 let real_model_quqy_sym = prove_by_refinement(
7296   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7297          1 < n /\
7298          packing V /\
7299          saturated V /\
7300          s_leaf V [u0; u1] HAS_SIZE n /\
7301          u0 IN V /\
7302          u1 IN V /\
7303         periodic f n /\
7304          ~collinear {u0, u1, w0} /\
7305          critical_edge_y (dist (u0,u1)) /\
7306          leaf_rank V [u0; u1] w0 n f
7307  ==>
7308 (!i. (cc_4 V u0 u1 f (SUC i) /\
7309        (dist (u0,f (SUC i)) < &2 * hminus /\
7310         dist (u1,f (SUC i)) < &2 * hminus) /\
7311        dist (u0,f (SUC (SUC i))) < &2 * hminus /\
7312        dist (u1,f (SUC (SUC i))) < &2 * hminus /\
7313        dist (f (SUC i),f (SUC (SUC i))) < &2 * hminus) /\
7314       ~cc_4 V u0 u1 f i
7315       ==> &0 <=
7316           gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun +
7317           gg_mcell V f u0 u1 (SUC i))`,
7318   (* {{{ proof *)
7319   [
7320   REPEAT WEAKER_STRIP_TAC;
7321   INTRO_TAC mcell3_gammaXb_gamma3f [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7322   ASM_REWRITE_TAC[];
7323   DISCH_THEN SUBST1_TAC;
7324   INTRO_TAC GG_MCELL_QUARTER [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
7325   ASM_REWRITE_TAC[];
7326   DISCH_THEN SUBST1_TAC;
7327   ONCE_REWRITE_TAC[arith `a + b = b + a`];
7328   MP_TAC (Merge_ineq.g_quqya_g_quqyb_ALT);
7329   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7330   DISCH_THEN MATCH_MP_TAC;
7331   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
7332   ANTS_TAC;
7333     BY(ASM_REWRITE_TAC[]);
7334   REPEAT WEAKER_STRIP_TAC;
7335   ASM_REWRITE_TAC[];
7336   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
7337   ]);;
7338   (* }}} *)
7339 *)
7340
7341 let real_model_ztg4 = prove_by_refinement(
7342   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7343          1 < n /\
7344          packing V /\
7345          saturated V /\
7346          s_leaf V [u0; u1] HAS_SIZE n /\
7347          u0 IN V /\
7348          u1 IN V /\
7349         periodic f n /\
7350          ~collinear {u0, u1, w0} /\
7351          critical_edge_y (dist (u0,u1)) /\
7352          leaf_rank V [u0; u1] w0 n f
7353  ==>
7354 (!i. cc_4 V u0 u1 f i
7355       ==> a_spine5 + b_spine5 * azim_mcell V f u0 u1 i <=
7356           gg_mcell V f u0 u1 i)`,
7357   (* {{{ proof *)
7358   [
7359   REPEAT WEAKER_STRIP_TAC;
7360   GMATCH_SIMP_TAC GG_MCELL_GENERAL;
7361   CONJ_TAC;
7362     BY(ASM_MESON_TAC[]);
7363   GMATCH_SIMP_TAC c_4_azim_mcell_dih_y;
7364   CONJ_TAC;
7365     BY(ASM_MESON_TAC[]);
7366   MATCH_MP_TAC (arith `g > a ==> a <= g`);
7367   INTRO_TAC Merge_ineq.ztg4_ALT [];
7368   ASM_REWRITE_TAC[];
7369   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7370   DISCH_THEN MATCH_MP_TAC;
7371   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7372   ANTS_TAC;
7373     BY(ASM_REWRITE_TAC[]);
7374   REPEAT WEAKER_STRIP_TAC;
7375   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7376   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
7377   ]);;
7378   (* }}} *)
7379
7380 let real_model_azim1 = prove_by_refinement(
7381   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7382          1 < n /\
7383          packing V /\
7384          saturated V /\
7385          s_leaf V [u0; u1] HAS_SIZE n /\
7386          u0 IN V /\
7387          u1 IN V /\
7388         periodic f n /\
7389          ~collinear {u0, u1, w0} /\
7390          critical_edge_y (dist (u0,u1)) /\
7391          leaf_rank V [u0; u1] w0 n f
7392  ==>
7393   (!i. cc_4 V u0 u1 f i /\
7394       (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
7395       dist (u0,f (SUC i)) < &2 * hminus /\
7396       dist (u1,f (SUC i)) < &2 * hminus /\
7397       dist (f i,f (SUC i)) < &2 * hminus
7398       ==> -- #0.0659 +  #0.042 * azim_mcell V f u0 u1 i <=
7399           gg_mcell V f u0 u1 i)
7400 `,
7401   (* {{{ proof *)
7402   [
7403   REPEAT WEAKER_STRIP_TAC;
7404   GMATCH_SIMP_TAC GG_MCELL_QUARTER;
7405   CONJ_TAC;
7406     BY(ASM_MESON_TAC[]);
7407   GMATCH_SIMP_TAC c_4_azim_mcell_dih_y;
7408   CONJ_TAC;
7409     BY(ASM_MESON_TAC[]);
7410   MATCH_MP_TAC (arith `g +c - d > &0 ==> --c +d <= g`);
7411   MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "QITNPEA 5653753305");
7412   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`;arith `#0.0 = &0`];
7413   DISCH_THEN MATCH_MP_TAC;
7414   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7415   ANTS_TAC;
7416     BY(ASM_REWRITE_TAC[]);
7417   REPEAT WEAKER_STRIP_TAC;
7418   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7419   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
7420   ]);;
7421   (* }}} *)
7422
7423 let real_model_gaz4 = prove_by_refinement(
7424   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7425          1 < n /\
7426          packing V /\
7427          saturated V /\
7428          s_leaf V [u0; u1] HAS_SIZE n /\
7429          u0 IN V /\
7430          u1 IN V /\
7431         periodic f n /\
7432          ~collinear {u0, u1, w0} /\
7433          critical_edge_y (dist (u0,u1)) /\
7434          leaf_rank V [u0; u1] w0 n f
7435  ==>
7436   (!i. cc_4 V u0 u1 f i /\
7437       (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
7438       dist (u0,f (SUC i)) < &2 * hminus /\
7439       dist (u1,f (SUC i)) < &2 * hminus /\
7440       dist (f i,f (SUC i)) < &2 * hminus
7441       ==> -- #0.0142852 +  #0.00609451 * azim_mcell V f u0 u1 i <=
7442           gg_mcell V f u0 u1 i)`,
7443   (* {{{ proof *)
7444   [
7445   REPEAT WEAKER_STRIP_TAC;
7446   GMATCH_SIMP_TAC GG_MCELL_QUARTER;
7447   CONJ_TAC;
7448     BY(ASM_MESON_TAC[]);
7449   GMATCH_SIMP_TAC c_4_azim_mcell_dih_y;
7450   CONJ_TAC;
7451     BY(ASM_MESON_TAC[]);
7452   MATCH_MP_TAC (arith `g +c - d > #0.0 ==> --c +d <= g`);
7453   MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "QITNPEA 6206775865");
7454   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7455   DISCH_THEN MATCH_MP_TAC;
7456   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7457   ANTS_TAC;
7458     BY(ASM_REWRITE_TAC[]);
7459   REPEAT WEAKER_STRIP_TAC;
7460   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2;arith `#2 = &2`];
7461   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
7462   ]);;
7463   (* }}} *)
7464
7465 let real_model_gaz6 = prove_by_refinement(
7466   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7467          1 < n /\
7468          packing V /\
7469          saturated V /\
7470          s_leaf V [u0; u1] HAS_SIZE n /\
7471          u0 IN V /\
7472          u1 IN V /\
7473         periodic f n /\
7474          ~collinear {u0, u1, w0} /\
7475          critical_edge_y (dist (u0,u1)) /\
7476          leaf_rank V [u0; u1] w0 n f
7477  ==>
7478  (!i. cc_4 V u0 u1 f i /\
7479       (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
7480       dist (u0,f (SUC i)) < &2 * hminus /\
7481       dist (u1,f (SUC i)) < &2 * hminus /\
7482       dist (f i,f (SUC i)) < &2 * hminus
7483       ==>  #0.161517 -  #0.119482 * azim_mcell V f u0 u1 i <=
7484           gg_mcell V f u0 u1 i) `,
7485   (* {{{ proof *)
7486   [
7487   REPEAT WEAKER_STRIP_TAC;
7488   GMATCH_SIMP_TAC GG_MCELL_QUARTER;
7489   CONJ_TAC;
7490     BY(ASM_MESON_TAC[]);
7491   GMATCH_SIMP_TAC c_4_azim_mcell_dih_y;
7492   CONJ_TAC;
7493     BY(ASM_MESON_TAC[]);
7494   MATCH_MP_TAC (arith `g - c + d > #0.0 ==> c - d <= g`);
7495   MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "QITNPEA 3848804089");
7496   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7497   DISCH_THEN MATCH_MP_TAC;
7498   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7499   ANTS_TAC;
7500     BY(ASM_REWRITE_TAC[]);
7501   REPEAT WEAKER_STRIP_TAC;
7502   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2;arith `#2 = &2`];
7503   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
7504   ]);;
7505   (* }}} *)
7506
7507 let real_model_gamma_qx = prove_by_refinement(
7508   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7509          1 < n /\
7510          packing V /\
7511          saturated V /\
7512          s_leaf V [u0; u1] HAS_SIZE n /\
7513          u0 IN V /\
7514          u1 IN V /\
7515         periodic f n /\
7516          ~collinear {u0, u1, w0} /\
7517          critical_edge_y (dist (u0,u1)) /\
7518          leaf_rank V [u0; u1] w0 n f
7519  ==>
7520 (!i. cc_4 V u0 u1 f i /\
7521       ~(dist (u0,f i) < &2 * hminus /\
7522         dist (u1,f i) < &2 * hminus /\
7523         dist (u0,f (SUC i)) < &2 * hminus /\
7524         dist (u1,f (SUC i)) < &2 * hminus /\
7525         dist (f i,f (SUC i)) < &2 * hminus)
7526       ==>  #0.0 <= gg_mcell V f u0 u1 i)`,
7527   (* {{{ proof *)
7528   [
7529   REPEAT WEAKER_STRIP_TAC;
7530   GMATCH_SIMP_TAC GG_MCELL_GENERAL;
7531   CONJ_TAC;
7532     BY(ASM_MESON_TAC[]);
7533   MATCH_MP_TAC (arith `&0 < x ==> #0.0 <= x`);
7534   MP_TAC Merge_ineq.gamma_qx_ALT;
7535   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7536   DISCH_THEN MATCH_MP_TAC;
7537   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7538   ANTS_TAC;
7539     BY(ASM_REWRITE_TAC[]);
7540   REPEAT WEAKER_STRIP_TAC;
7541   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2;arith `#2 = &2`];
7542   (ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
7543   BY(ASM_MESON_TAC[])
7544   ]);;
7545   (* }}} *)
7546
7547 let real_model_g_qxd = prove_by_refinement(
7548   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7549          1 < n /\
7550          packing V /\
7551          saturated V /\
7552          s_leaf V [u0; u1] HAS_SIZE n /\
7553          u0 IN V /\
7554          u1 IN V /\
7555         periodic f n /\
7556          ~collinear {u0, u1, w0} /\
7557          critical_edge_y (dist (u0,u1)) /\
7558          leaf_rank V [u0; u1] w0 n f
7559  ==>
7560 (!i. (cc_4 V u0 u1 f i /\
7561        ~(dist (u0,f i) < &2 * hminus /\
7562          dist (u1,f i) < &2 * hminus /\
7563          dist (u0,f (SUC i)) < &2 * hminus /\
7564          dist (u1,f (SUC i)) < &2 * hminus /\
7565          dist (f i,f (SUC i)) < &2 * hminus)) /\
7566        #2.3 < azim_mcell V f u0 u1 i
7567       ==>  #0.0057 <= gg_mcell V f u0 u1 i) 
7568 `,
7569   (* {{{ proof *)
7570   [
7571   REPEAT WEAKER_STRIP_TAC;
7572   GMATCH_SIMP_TAC GG_MCELL_GENERAL;
7573   CONJ_TAC;
7574     BY(ASM_MESON_TAC[]);
7575   MATCH_MP_TAC (arith `y < x ==> y <= x`);
7576   MP_TAC Merge_ineq.g_qxd_ALT;
7577   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7578   DISCH_THEN MATCH_MP_TAC;
7579   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7580   ANTS_TAC;
7581     BY(ASM_REWRITE_TAC[]);
7582   REPEAT WEAKER_STRIP_TAC;
7583   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2;arith `#2 = &2`];
7584   (ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
7585   FIRST_X_ASSUM_ST `azim_mcell` MP_TAC;
7586   MATCH_MP_TAC (arith `a = d ==> (x < a ==> x < d)`);
7587   GMATCH_SIMP_TAC c_4_azim_mcell_dih_y;
7588   BY(ASM_MESON_TAC[])
7589   ]);;
7590   (* }}} *)
7591
7592 let wtcount6_y_sym23 = prove_by_refinement(
7593   `!y1 y2 y3 y4 y5 y6. 
7594    wtcount6_y y1 y2 y3 y4 y5 y6 = wtcount6_y y1 y3 y2 y4 y6 y5 `,
7595   (* {{{ proof *)
7596   [
7597   REWRITE_TAC[Sphere.wtcount6_y;Sphere.wtcount3_y];
7598   BY(ARITH_TAC)
7599   ]);;
7600   (* }}} *)
7601
7602 let wtcount6_y_sym26 = prove_by_refinement(
7603   `!y1 y2 y3 y4 y5 y6. 
7604    wtcount6_y y1 y2 y3 y4 y5 y6 = wtcount6_y y1 y6 y5 y4 y3 y2 `,
7605   (* {{{ proof *)
7606   [
7607   REWRITE_TAC[Sphere.wtcount6_y;Sphere.wtcount3_y];
7608   BY(ARITH_TAC)
7609   ]);;
7610   (* }}} *)
7611
7612 let beta_bumpA_y_sym23 = prove_by_refinement(
7613   `!y1 y2 y3 y4 y5 y6. 
7614    beta_bumpA_y y1 y2 y3 y4 y5 y6 = beta_bumpA_y y1 y3 y2 y4 y6 y5 `,
7615   (* {{{ proof *)
7616   [
7617   REWRITE_TAC[Sphere.beta_bumpA_y;Sphere.beta_bumpA_y];
7618   BY(REAL_ARITH_TAC)
7619   ]);;
7620   (* }}} *)
7621
7622 let real_model_gamma10 = prove_by_refinement(
7623   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7624          1 < n /\
7625          packing V /\
7626          saturated V /\
7627          s_leaf V [u0; u1] HAS_SIZE n /\
7628          u0 IN V /\
7629          u1 IN V /\
7630         periodic f n /\
7631          ~collinear {u0, u1, w0} /\
7632          critical_edge_y (dist (u0,u1)) /\
7633          leaf_rank V [u0; u1] w0 n f
7634  ==>
7635  (!i. (cc_4 V u0 u1 f i /\
7636        ~(dist (u0,f i) < &2 * hminus /\
7637          dist (u1,f i) < &2 * hminus /\
7638          dist (u0,f (SUC i)) < &2 * hminus /\
7639          dist (u1,f (SUC i)) < &2 * hminus /\
7640          dist (f i,f (SUC i)) < &2 * hminus)) /\
7641       ((dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
7642        dist (u0,f (SUC i)) < &2 * hminus /\
7643        dist (u1,f (SUC i)) < &2 * hminus) /\
7644       ~cc_4 V u0 u1 f (SUC i)
7645       ==>  #0.0057 <=
7646           gg_mcell V f u0 u1 i +
7647           gammaX V (cc_cell V [u0; u1; f (SUC i)]) lmfun  *
7648           critical_weight V (cc_cell V [u0; u1; f (SUC i)]))
7649 `,
7650   (* {{{ proof *)
7651   [
7652   REPEAT WEAKER_STRIP_TAC;
7653   GMATCH_SIMP_TAC critical_weight1a;
7654   CONJ_TAC;
7655     BY(ASM_MESON_TAC[]);
7656   REWRITE_TAC[arith `x * &1 = x`];
7657   GMATCH_SIMP_TAC GG_MCELL_GENERAL;
7658   CONJ_TAC;
7659     BY(ASM_MESON_TAC[]);
7660   GMATCH_SIMP_TAC mcell3_gammaX_gamma3f;
7661   CONJ_TAC;
7662     BY(ASM_MESON_TAC[]);
7663   ONCE_REWRITE_TAC[Merge_ineq.gamma4fgcy_sym23];
7664   ONCE_REWRITE_TAC[wtcount6_y_sym23];
7665   ONCE_REWRITE_TAC[beta_bumpA_y_sym23];
7666   MP_TAC Merge_ineq.gamma10_gamma11_ALT;
7667   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`;arith `(a + b) + c = a + b + c`];
7668   DISCH_THEN MATCH_MP_TAC;
7669   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7670   ANTS_TAC;
7671     BY(ASM_REWRITE_TAC[]);
7672   REPEAT WEAKER_STRIP_TAC;
7673   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2;arith `#2 = &2`];
7674   (ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
7675   CONJ2_TAC;
7676     BY(ASM_MESON_TAC[Merge_ineq.rad2_y_sym]);
7677   REPEAT (FIRST_X_ASSUM_ST `~` MP_TAC);
7678   ASM_REWRITE_TAC[];
7679   BY(REAL_ARITH_TAC)
7680   ]);;
7681   (* }}} *)
7682
7683 let real_model_gamma11 = prove_by_refinement(
7684   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7685          1 < n /\
7686          packing V /\
7687          saturated V /\
7688          s_leaf V [u0; u1] HAS_SIZE n /\
7689          u0 IN V /\
7690          u1 IN V /\
7691         periodic f n /\
7692          ~collinear {u0, u1, w0} /\
7693          critical_edge_y (dist (u0,u1)) /\
7694          leaf_rank V [u0; u1] w0 n f
7695  ==>
7696   (!i. (cc_4 V u0 u1 f (SUC i) /\
7697        ~(dist (u0,f (SUC i)) < &2 * hminus /\
7698          dist (u1,f (SUC i)) < &2 * hminus /\
7699          dist (u0,f (SUC (SUC i))) < &2 * hminus /\
7700          dist (u1,f (SUC (SUC i))) < &2 * hminus /\
7701          dist (f (SUC i),f (SUC (SUC i))) < &2 * hminus)) /\
7702       ((dist (u0,f (SUC i)) < &2 * hminus /\
7703         dist (u1,f (SUC i)) < &2 * hminus) /\
7704        dist (u0,f (SUC (SUC i))) < &2 * hminus /\
7705        dist (u1,f (SUC (SUC i))) < &2 * hminus) /\
7706       ~cc_4 V u0 u1 f i
7707       ==>  #0.0057 <=
7708           gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun *
7709           critical_weight V (cc_cell V [u1; u0; f (SUC i)])  +
7710           gg_mcell V f u0 u1 (SUC i))
7711 `,
7712   (* {{{ proof *)
7713   [
7714   REPEAT WEAKER_STRIP_TAC;
7715   GMATCH_SIMP_TAC critical_weight1b;
7716   CONJ_TAC;
7717     BY(ASM_MESON_TAC[]);
7718   REWRITE_TAC[arith `x * &1 = x`];
7719   GMATCH_SIMP_TAC GG_MCELL_GENERAL;
7720   CONJ_TAC;
7721     BY(ASM_MESON_TAC[]);
7722   GMATCH_SIMP_TAC mcell3_gammaXb_gamma3f;
7723   CONJ_TAC;
7724     BY(ASM_MESON_TAC[]);
7725   ONCE_REWRITE_TAC[arith `g3 + g4 + b = g4 + b + g3`];
7726   MP_TAC Merge_ineq.gamma10_gamma11_ALT;
7727   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`;arith `(a + b) + c = a + b + c`];
7728   DISCH_THEN MATCH_MP_TAC;
7729   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`SUC i`];
7730   ANTS_TAC;
7731     BY(ASM_REWRITE_TAC[]);
7732   REPEAT WEAKER_STRIP_TAC;
7733   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2;arith `#2 = &2`];
7734   BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC)
7735   ]);;
7736   (* }}} *)
7737
7738 let leaf_CIHTIUM = prove_by_refinement(
7739   `!V u0 u1 u2. pack_nonlinear_non_ox3q1h /\ packing V /\ saturated V /\
7740     leaf V [u0;u1;u2] /\ critical_edge_y (dist(u0,u1)) /\ 
7741      (&2 * hminus <= dist(u0,u2)) /\ (&2 * hminus <= dist(u1,u2)) ==> F`,
7742   (* {{{ proof *)
7743   [
7744   REPEAT WEAKER_STRIP_TAC;
7745   INTRO_TAC Leaf_cell.GBEWYFX [`V`;`[u0;u1;u2]`];
7746   ASM_REWRITE_TAC[set_of_list];
7747   INTRO_TAC LEAF_DOMAIN [`V`;`[u0;u1;u2]`];
7748   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
7749   REPEAT (FIRST_X_ASSUM MP_TAC);
7750   REWRITE_TAC[Leaf_cell.leaf;Pack_defs.HL;set_of_list];
7751   REPEAT WEAKER_STRIP_TAC;
7752   PROOF_BY_CONTR_TAC;
7753   MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "CIHTIUM");
7754   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7755   DISCH_TAC;
7756   FIRST_X_ASSUM_ST `sqrt2` MP_TAC;
7757   MATCH_MP_TAC (arith `s < r ==> (r < s ==> F)`);
7758   GMATCH_SIMP_TAC RADV_ETAY;
7759   ASM_REWRITE_TAC[];
7760   GMATCH_SIMP_TAC (GSYM Tactics_jordan.REAL_POW_2_LT);
7761   REWRITE_TAC[Nonlinear_lemma.sqrt2_nn;ETA_Y_POS_LE_ALT;Nonlin_def.sqrt2_sqrt2;arith `sqrt2 pow 2 = sqrt2 * sqrt2`];
7762   REWRITE_TAC[arith `x < y <=> y > x`];
7763   FIRST_X_ASSUM MATCH_MP_TAC;
7764   GEXISTL_TAC [`&1`;`&1`;`&1`];
7765   ASM_REWRITE_TAC[REAL_LE_REFL];
7766   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7767   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
7768   BY(ASM_MESON_TAC[Sphere.critical_edge_y])
7769   ]);;
7770   (* }}} *)
7771
7772 let gamma4fgcy_sym26 = prove_by_refinement(
7773   `!y1 y2 y3 y4 y5 y6 f. gamma4fgcy y1 y2 y3 y4 y5 y6 f = gamma4fgcy y1 y6 y5 y4 y3 y2 f`,
7774   (* {{{ proof *)
7775   [
7776   BY(MESON_TAC[Merge_ineq.gamma4fgcy_sym03;Merge_ineq.gamma4fgcy_sym23;Merge_ineq.gamma4fgcy_sym12])
7777   ]);;
7778   (* }}} *)
7779
7780 let gamma4fgcy_POS = prove_by_refinement(
7781   `!y1 y2 y3 y4 y5 y6. pack_nonlinear_non_ox3q1h /\ rad2_y y1 y2 y3 y4 y5 y6 < &2 /\ critical_edge_y y1 /\
7782    ~(y2 < &2 * hminus /\
7783                  y3 < &2 * hminus /\
7784                  y4 < &2 * hminus /\
7785                  y5 < &2 * hminus /\
7786                  y6 < &2 * hminus ) /\
7787    &2 <= y2 /\ y2 <= sqrt8 /\ &2 <= y3 /\ y3 <= sqrt8 /\
7788 &2 <= y4 /\ y4 <= sqrt8 /\
7789 &2 <= y5 /\ y5 <= sqrt8 /\
7790 &2 <= y6 /\ y6 <= sqrt8 ==>
7791 &0 < gamma4fgcy y1 y2 y3 y4 y5 y6 lmfun
7792 `,
7793   (* {{{ proof *)
7794   [
7795   REPEAT WEAKER_STRIP_TAC;
7796   MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "GLFVCVK4 2477216213");
7797   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7798   REWRITE_TAC[TAUT `a ==> b \/ c \/ d <=> a /\ ~c /\  ~d ==> b`];
7799   REWRITE_TAC[arith `g > &0 <=> &0 < g`];
7800   DISCH_THEN MATCH_MP_TAC;
7801   ASM_REWRITE_TAC[];
7802   REWRITE_TAC[GSYM Sphere.rad2_y];
7803   SUBCONJ_TAC;
7804     BY(ASM_MESON_TAC[Sphere.critical_edge_y]);
7805   DISCH_TAC;
7806   CONJ2_TAC;
7807     BY(FIRST_X_ASSUM_ST `rad2_y` MP_TAC THEN REAL_ARITH_TAC);
7808   DISCH_THEN (MP_TAC o (MATCH_MP Merge_ineq.quarter_norm2hh));
7809   BY(ASM_REWRITE_TAC[])
7810   ]);;
7811   (* }}} *)
7812
7813 let real_model_gamma8 = prove_by_refinement(
7814   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7815          1 < n /\
7816          packing V /\
7817          saturated V /\
7818          s_leaf V [u0; u1] HAS_SIZE n /\
7819          u0 IN V /\
7820          u1 IN V /\
7821         periodic f n /\
7822          ~collinear {u0, u1, w0} /\
7823          critical_edge_y (dist (u0,u1)) /\
7824          leaf_rank V [u0; u1] w0 n f
7825  ==>
7826  (!i. (cc_4 V u0 u1 f i /\
7827        ~(dist (u0,f i) < &2 * hminus /\
7828          dist (u1,f i) < &2 * hminus /\
7829          dist (u0,f (SUC i)) < &2 * hminus /\
7830          dist (u1,f (SUC i)) < &2 * hminus /\
7831          dist (f i,f (SUC i)) < &2 * hminus)) /\
7832       (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
7833       ~(dist (u0,f (SUC i)) < &2 * hminus /\
7834         dist (u1,f (SUC i)) < &2 * hminus)
7835       ==>  #0.0057 <= gg_mcell V f u0 u1 i)
7836 `,
7837   (* {{{ proof *)
7838   [
7839   REPEAT WEAKER_STRIP_TAC;
7840   GMATCH_SIMP_TAC GG_MCELL_NONBETA;
7841   CONJ_TAC;
7842     BY(ASM_MESON_TAC[]);
7843   MP_TAC Merge_ineq.QITNPEA4_9063653052_weak_ALT;
7844   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7845   DISCH_TAC;
7846   MATCH_MP_TAC (arith `gw > c ==> c <= gw`);
7847   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7848   ANTS_TAC;
7849     BY(ASM_REWRITE_TAC[]);
7850   REPEAT WEAKER_STRIP_TAC;
7851   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7852   ANTS_TAC;
7853     BY(ASM_MESON_TAC[]);
7854   REPEAT WEAKER_STRIP_TAC;
7855   INTRO_TAC leaf_CIHTIUM [`V`;`u0`;`u1`;`f (SUC i)`];
7856   ASM_REWRITE_TAC[];
7857   REWRITE_TAC[DE_MORGAN_THM ;arith `~(x <= y) <=> y < x`];
7858   COMMENT "case split";
7859   DISCH_THEN DISJ_CASES_TAC;
7860     FIRST_X_ASSUM_ST `~(a /\ b)` MP_TAC;
7861     ASM_REWRITE_TAC[arith `~(a < b) <=> b <= a`];
7862     DISCH_TAC;
7863     ONCE_REWRITE_TAC[wtcount6_y_sym26];
7864     ONCE_REWRITE_TAC[gamma4fgcy_sym26];
7865     FIRST_X_ASSUM MATCH_MP_TAC;
7866     ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7867     ASM_SIMP_TAC[arith `x < y ==> x <= y`];
7868     SUBCONJ_TAC;
7869       FIRST_X_ASSUM_ST `rad2_y` MP_TAC;
7870       BY(MESON_TAC[Merge_ineq.rad2_y_sym]);
7871     DISCH_TAC;
7872     MATCH_MP_TAC (arith `x < y ==> x <= y`);
7873     MATCH_MP_TAC gamma4fgcy_POS;
7874     ASM_REWRITE_TAC[];
7875     ASM_SIMP_TAC[arith `x <= y ==> ~(y < x)`];
7876     ASM_SIMP_TAC[Merge_ineq.y_bounds];
7877     ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7878     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
7879   COMMENT "second case";
7880   FIRST_X_ASSUM_ST `~(a /\ b)` MP_TAC;
7881   ASM_REWRITE_TAC[arith `~(a < b) <=> b <= a`];
7882   DISCH_TAC;
7883   FIRST_X_ASSUM MATCH_MP_TAC;
7884   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7885   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
7886   MATCH_MP_TAC (arith `x < y ==> x <= y`);
7887   MATCH_MP_TAC gamma4fgcy_POS;
7888   ASM_REWRITE_TAC[];
7889   ASM_SIMP_TAC[arith `x <= y ==> ~(y < x)`];
7890   ASM_SIMP_TAC[Merge_ineq.y_bounds];
7891   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7892   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
7893   ]);;
7894   (* }}} *)
7895
7896 let real_model_gamma8b = prove_by_refinement(
7897   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7898          1 < n /\
7899          packing V /\
7900          saturated V /\
7901          s_leaf V [u0; u1] HAS_SIZE n /\
7902          u0 IN V /\
7903          u1 IN V /\
7904         periodic f n /\
7905          ~collinear {u0, u1, w0} /\
7906          critical_edge_y (dist (u0,u1)) /\
7907          leaf_rank V [u0; u1] w0 n f
7908  ==>
7909 (!i. (cc_4 V u0 u1 f i /\
7910        ~(dist (u0,f i) < &2 * hminus /\
7911          dist (u1,f i) < &2 * hminus /\
7912          dist (u0,f (SUC i)) < &2 * hminus /\
7913          dist (u1,f (SUC i)) < &2 * hminus /\
7914          dist (f i,f (SUC i)) < &2 * hminus)) /\
7915       (dist (u0,f (SUC i)) < &2 * hminus /\
7916        dist (u1,f (SUC i)) < &2 * hminus) /\
7917       ~(dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus)
7918       ==>  #0.0057 <= gg_mcell V f u0 u1 i)
7919 `,
7920   (* {{{ proof *)
7921   [
7922   REPEAT WEAKER_STRIP_TAC;
7923   GMATCH_SIMP_TAC GG_MCELL_NONBETA;
7924   CONJ_TAC;
7925     BY(ASM_MESON_TAC[]);
7926   ONCE_REWRITE_TAC[Merge_ineq.gamma4fgcy_sym23];
7927   ONCE_REWRITE_TAC[wtcount6_y_sym23];
7928   MP_TAC Merge_ineq.QITNPEA4_9063653052_weak_ALT;
7929   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
7930   DISCH_TAC;
7931   MATCH_MP_TAC (arith `gw > c ==> c <= gw`);
7932   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7933   ANTS_TAC;
7934     BY(ASM_REWRITE_TAC[]);
7935   REPEAT WEAKER_STRIP_TAC;
7936   INTRO_TAC CC_4_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
7937   ANTS_TAC;
7938     BY(ASM_MESON_TAC[]);
7939   REPEAT WEAKER_STRIP_TAC;
7940   INTRO_TAC leaf_CIHTIUM [`V`;`u0`;`u1`;`f i`];
7941   ASM_REWRITE_TAC[];
7942   REWRITE_TAC[DE_MORGAN_THM ;arith `~(x <= y) <=> y < x`];
7943   COMMENT "case split";
7944   DISCH_THEN DISJ_CASES_TAC;
7945     FIRST_X_ASSUM_ST `~(a /\ b)` MP_TAC;
7946     ASM_REWRITE_TAC[arith `~(a < b) <=> b <= a`];
7947     DISCH_TAC;
7948     ONCE_REWRITE_TAC[wtcount6_y_sym26];
7949     ONCE_REWRITE_TAC[gamma4fgcy_sym26];
7950     FIRST_X_ASSUM MATCH_MP_TAC;
7951     ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7952     ASM_SIMP_TAC[arith `x < y ==> x <= y`];
7953     SUBCONJ_TAC;
7954       FIRST_X_ASSUM_ST `rad2_y` MP_TAC;
7955       BY(MESON_TAC[Merge_ineq.rad2_y_sym]);
7956     DISCH_TAC;
7957     MATCH_MP_TAC (arith `x < y ==> x <= y`);
7958     MATCH_MP_TAC gamma4fgcy_POS;
7959     ASM_REWRITE_TAC[];
7960     ASM_SIMP_TAC[arith `x <= y ==> ~(y < x)`];
7961     ASM_SIMP_TAC[Merge_ineq.y_bounds];
7962     ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7963     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
7964   COMMENT "second case";
7965   FIRST_X_ASSUM_ST `~(a /\ b)` MP_TAC;
7966   ASM_REWRITE_TAC[arith `~(a < b) <=> b <= a`];
7967   DISCH_TAC;
7968   FIRST_X_ASSUM MATCH_MP_TAC;
7969   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7970   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
7971   SUBCONJ_TAC;
7972     FIRST_X_ASSUM_ST `rad2_y` MP_TAC;
7973     BY(MESON_TAC[Merge_ineq.rad2_y_sym]);
7974   DISCH_TAC;
7975   MATCH_MP_TAC (arith `x < y ==> x <= y`);
7976   MATCH_MP_TAC gamma4fgcy_POS;
7977   ASM_REWRITE_TAC[];
7978   ASM_SIMP_TAC[arith `x <= y ==> ~(y < x)`];
7979   ASM_SIMP_TAC[Merge_ineq.y_bounds];
7980   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
7981   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
7982   ]);;
7983   (* }}} *)
7984
7985 let real_model_gaz9 = prove_by_refinement(
7986   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
7987          1 < n /\
7988          packing V /\
7989          saturated V /\
7990          s_leaf V [u0; u1] HAS_SIZE n /\
7991          u0 IN V /\
7992          u1 IN V /\
7993         periodic f n /\
7994          ~collinear {u0, u1, w0} /\
7995          critical_edge_y (dist (u0,u1)) /\
7996          leaf_rank V [u0; u1] w0 n f
7997  ==>
7998  (!i. (cc_4 V u0 u1 f i /\
7999        ~(dist (u0,f i) < &2 * hminus /\
8000          dist (u1,f i) < &2 * hminus /\
8001          dist (u0,f (SUC i)) < &2 * hminus /\
8002          dist (u1,f (SUC i)) < &2 * hminus /\
8003          dist (f i,f (SUC i)) < &2 * hminus)) /\
8004       (dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
8005       dist (u0,f (SUC i)) < &2 * hminus /\
8006       dist (u1,f (SUC i)) < &2 * hminus
8007       ==>  #0.213849 -  #0.119482 * azim_mcell V f u0 u1 i <=
8008           gg_mcell V f u0 u1 i) 
8009 `,
8010   (* {{{ proof *)
8011   [
8012   REPEAT WEAKER_STRIP_TAC;
8013   GMATCH_SIMP_TAC c_4_azim_mcell_dih_y;
8014   CONJ_TAC;
8015     BY(ASM_MESON_TAC[]);
8016   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8017   ANTS_TAC;
8018     BY(ASM_REWRITE_TAC[]);
8019   REPEAT WEAKER_STRIP_TAC;
8020   FIRST_X_ASSUM_ST `~` MP_TAC;
8021   ASM_REWRITE_TAC[];
8022   DISCH_TAC;
8023   GMATCH_SIMP_TAC GG_MCELL_GENERAL;
8024   CONJ_TAC;
8025     BY(ASM_MESON_TAC[]);
8026   MATCH_MP_TAC (arith `(?t. x <= g + t /\ &1 * t <= b) ==> x <= g + b`);
8027   TYPIFY`beta_bump_lb` EXISTS_TAC;
8028   REWRITE_TAC[ Merge_ineq.beta_bumpA_lb1 ];
8029   MATCH_MP_TAC (arith `(?w. x <= g / w + t /\ g / w <= g / w') ==> (x <= g / w' +  t)`);
8030   TYPIFY `&2` EXISTS_TAC;
8031   CONJ2_TAC;
8032     MATCH_MP_TAC Merge_ineq.gamma_wt;
8033     ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`];
8034     CONJ_TAC;
8035       REWRITE_TAC[arith `x > &0 <=> &0 < x`];
8036       MATCH_MP_TAC gamma4fgcy_POS;
8037       ASM_REWRITE_TAC[];
8038       ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
8039       BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
8040     ASM_REWRITE_TAC[Sphere.wtcount6_y;Sphere.wtcount3_y];
8041     ASM_REWRITE_TAC[Sphere.critical_edge_y];
8042     ASM_SIMP_TAC[arith `x < y ==> ~(y<= x)`];
8043     BY(ARITH_TAC);
8044   MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "QITNPEA 2134082733");
8045   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
8046   ASM_REWRITE_TAC[GSYM Sphere.rad2_y];
8047   REWRITE_TAC[TAUT ` (a ==> b \/ c) <=> (a /\ ~c ==> b)`];
8048   REWRITE_TAC[arith `g + b - c + d > #0.0 <=> c - d < g + b`];
8049   DISCH_TAC;
8050   MATCH_MP_TAC (arith `x <  y ==> x <= y`);
8051   FIRST_X_ASSUM MATCH_MP_TAC;
8052   ASM_REWRITE_TAC[];
8053   CONJ2_TAC;
8054     BY(FIRST_X_ASSUM_ST `rad2_y` MP_TAC THEN REAL_ARITH_TAC);
8055   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
8056   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
8057   BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC)
8058   ]);;
8059   (* }}} *)
8060
8061 let real_model_azim2 = prove_by_refinement(
8062   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
8063          1 < n /\
8064          packing V /\
8065          saturated V /\
8066          s_leaf V [u0; u1] HAS_SIZE n /\
8067          u0 IN V /\
8068          u1 IN V /\
8069         periodic f n /\
8070          ~collinear {u0, u1, w0} /\
8071          critical_edge_y (dist (u0,u1)) /\
8072          leaf_rank V [u0; u1] w0 n f
8073  ==>
8074  (!i. (cc_4 V u0 u1 f i /\
8075        ~(dist (u0,f i) < &2 * hminus /\
8076          dist (u1,f i) < &2 * hminus /\
8077          dist (u0,f (SUC i)) < &2 * hminus /\
8078          dist (u1,f (SUC i)) < &2 * hminus /\
8079          dist (f i,f (SUC i)) < &2 * hminus)) /\
8080       ((dist (u0,f i) < &2 * hminus /\ dist (u1,f i) < &2 * hminus) /\
8081        dist (u0,f (SUC i)) < &2 * hminus /\
8082        dist (u1,f (SUC i)) < &2 * hminus) /\
8083       &2 * hplus < dist (f i,f (SUC i))
8084       ==>  #0.00457511 +  #0.00609451 * azim_mcell V f u0 u1 i <=
8085           gg_mcell V f u0 u1 i) 
8086 `,
8087   (* {{{ proof *)
8088   [
8089   REPEAT WEAKER_STRIP_TAC;
8090   GMATCH_SIMP_TAC c_4_azim_mcell_dih_y;
8091   CONJ_TAC;
8092     BY(ASM_MESON_TAC[]);
8093   INTRO_TAC MCELL4_DOMAIN [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8094   ANTS_TAC;
8095     BY(ASM_REWRITE_TAC[]);
8096   REPEAT WEAKER_STRIP_TAC;
8097   TYPIFY `~critical_edge_y (dist(f i,f (SUC i)))` (C SUBGOAL_THEN ASSUME_TAC);
8098     BY(ASM_SIMP_TAC[Sphere.critical_edge_y;arith `h < x ==> ~(x<= h)`]);
8099   GMATCH_SIMP_TAC GG_MCELL_NONBETA;
8100   CONJ_TAC;
8101     BY(ASM_MESON_TAC[]);
8102   TYPIFY `wtcount6_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i)))   (dist (f i,f (SUC i)))   (dist (u1,f (SUC i)))  (dist (u1,f i)) = 1` (C SUBGOAL_THEN SUBST1_TAC);
8103     ASM_REWRITE_TAC[Sphere.wtcount6_y;Sphere.wtcount3_y];
8104     ASM_REWRITE_TAC[Sphere.critical_edge_y];
8105     ASM_SIMP_TAC[arith `x < y ==> ~(y<= x)`];
8106     BY(ARITH_TAC);
8107   MATCH_MP_TAC (arith `g - c - d > #0.0 ==> c + d <= g / &1`);
8108   MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "QITNPEA 9939613598");
8109   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
8110   ASM_REWRITE_TAC[GSYM Sphere.rad2_y];
8111   REWRITE_TAC[TAUT ` (a ==> b \/ c) <=> (a /\ ~c ==> b)`];
8112   DISCH_THEN MATCH_MP_TAC;
8113   ASM_REWRITE_TAC[];
8114   CONJ2_TAC;
8115     BY(FIRST_X_ASSUM_ST `rad2_y` MP_TAC THEN REAL_ARITH_TAC);
8116   ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2];
8117   BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`])
8118   ]);;
8119   (* }}} *)
8120
8121 let CC_3_SUM_SET = prove_by_refinement(
8122   `!V u0 u1 w0 n f i.   pack_nonlinear_non_ox3q1h /\ 1 < n /\
8123          packing V /\
8124          saturated V /\
8125          s_leaf V [u0; u1] HAS_SIZE n /\
8126          u0 IN V /\
8127          u1 IN V /\
8128         periodic f n /\
8129    ~cc_4 V u0 u1 f i /\
8130          ~collinear {u0, u1, w0} /\
8131          critical_edge_y (dist (u0,u1)) /\
8132          leaf_rank V [u0; u1] w0 n f ==> {X | mcell_set V X /\
8133                  {u0, u1} IN edgeX V X /\
8134                  X SUBSET wedge_ge u0 u1 (f i) (f (SUC i))} = 
8135     {cc_cell V [u0;u1;f i],cc_cell V [u1;u0;f (SUC i)]} UNION 
8136       {X | mcell_set V X /\ {u0,u1} IN edgeX V X /\ 
8137            X SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\
8138            ~(X = cc_cell V [u0;u1;f i]) /\ ~(X = cc_cell V [u1;u0;f (SUC i)])}`,
8139   (* {{{ proof *)
8140   [
8141   REPEAT WEAKER_STRIP_TAC;
8142   ONCE_REWRITE_TAC[EXTENSION];
8143   REWRITE_TAC[IN_UNION;IN_INSERT;NOT_IN_EMPTY];
8144   REWRITE_TAC[IN_ELIM_THM];
8145   GEN_TAC;
8146   MATCH_MP_TAC (TAUT `((a==> b) /\ (b ==> a)) ==> (a = b)`);
8147   CONJ_TAC;
8148     BY(MESON_TAC[]);
8149   REPEAT WEAKER_STRIP_TAC;
8150   INTRO_TAC NO_4CELL_IMP_K3 [`V`;`wedge_ge u0 u1 (f i) (f (SUC i))`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
8151   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
8152   ANTS_TAC;
8153     BY(ASM_MESON_TAC[cc_4]);
8154   REPEAT WEAKER_STRIP_TAC;
8155   INTRO_TAC Leaf_cell.STEM_EDGEX [`V`];
8156   ASM_REWRITE_TAC[];
8157   DISCH_TAC;
8158   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8159   ANTS_TAC;
8160     BY(ASM_REWRITE_TAC[]);
8161   REPEAT WEAKER_STRIP_TAC;
8162   FIRST_ASSUM (C INTRO_TAC [`[u0;u1;f i]`]);
8163   FIRST_X_ASSUM (C INTRO_TAC [`[u1;u0;f(SUC i)]`]);
8164   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
8165   TYPIFY `{u1,u0} = {u0,u1}` (C SUBGOAL_THEN ASSUME_TAC);
8166     BY(SET_TAC[]);
8167   REPEAT WEAKER_STRIP_TAC;
8168   FIRST_X_ASSUM_ST `\/` DISJ_CASES_TAC;
8169     BY(ASM_MESON_TAC[Leaf_cell.CC_CELL_IN_MCELL_SET;IN]);
8170   BY(ASM_REWRITE_TAC[])
8171   ]);;
8172   (* }}} *)
8173
8174 let CC_3_SUM_fn = prove_by_refinement(
8175   `!V u0 u1 w0 n f i fn.   pack_nonlinear_non_ox3q1h /\ 1 < n /\
8176          packing V /\
8177          saturated V /\
8178          s_leaf V [u0; u1] HAS_SIZE n /\
8179          u0 IN V /\
8180          u1 IN V /\
8181         periodic f n /\
8182    ~cc_4 V u0 u1 f i /\
8183          ~collinear {u0, u1, w0} /\
8184          critical_edge_y (dist (u0,u1)) /\
8185          leaf_rank V [u0; u1] w0 n f ==> 
8186     sum {X | mcell_set V X /\
8187                  {u0, u1} IN edgeX V X /\
8188                  X SUBSET wedge_ge u0 u1 (f i) (f (SUC i))} fn = 
8189              fn (cc_cell V [u0;u1;f i]) + fn (cc_cell V [u1;u0;f (SUC i)]) +
8190                sum 
8191       {X | mcell_set V X /\ {u0,u1} IN edgeX V X /\ 
8192            X SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\
8193            ~(X = cc_cell V [u0;u1;f i]) /\ ~(X = cc_cell V [u1;u0;f (SUC i)])} fn`,
8194   (* {{{ proof *)
8195   [
8196   REPEAT WEAKER_STRIP_TAC;
8197   GMATCH_SIMP_TAC CC_3_SUM_SET;
8198   CONJ_TAC;
8199     BY(ASM_MESON_TAC[]);
8200   INTRO_TAC Marchal_cells_3.FINITE_EDGE_X2 [`V`;`{u0,u1}`;`u0`;`u1`];
8201   ASM_REWRITE_TAC[];
8202   DISCH_TAC;
8203   GMATCH_SIMP_TAC SUM_UNION;
8204   REWRITE_TAC[FINITE_INSERT;FINITE_EMPTY];
8205   CONJ_TAC;
8206     CONJ_TAC;
8207       MATCH_MP_TAC FINITE_SUBSET;
8208       TYPIFY `{X | mcell_set V X /\ edgeX V X {u0, u1}}` EXISTS_TAC;
8209       ASM_REWRITE_TAC[];
8210       REWRITE_TAC[SUBSET;IN_ELIM_THM];
8211       BY(MESON_TAC[IN]);
8212     REWRITE_TAC[DISJOINT];
8213     BY(SET_TAC[]);
8214   MATCH_MP_TAC (arith `s = s'+s'' ==> (s + a = s'+s'' + a)`);
8215   MATCH_MP_TAC Geomdetail.SUM_DIS2;
8216   INTRO_TAC NO_4CELL_IMP_K3 [`V`;`wedge_ge u0 u1 (f i) (f (SUC i))`;`[u0;u1]`;`w0`;`n`;`f`;`i`];
8217   ASM_REWRITE_TAC[Bump.EL_EXPLICIT];
8218   ANTS_TAC;
8219     BY(ASM_MESON_TAC[cc_4]);
8220   BY(DISCH_THEN (unlist REWRITE_TAC))
8221   ]);;
8222   (* }}} *)
8223
8224 let EDGE_IMP_K23 = prove_by_refinement(
8225     `!V X u0 u1 w0 n f i.   pack_nonlinear_non_ox3q1h /\ 1 < n /\
8226          packing V /\
8227          saturated V /\
8228          s_leaf V [u0; u1] HAS_SIZE n /\
8229          u0 IN V /\
8230          u1 IN V /\
8231         periodic f n /\
8232    ~cc_4 V u0 u1 f i /\
8233          ~collinear {u0, u1, w0} /\
8234          critical_edge_y (dist (u0,u1)) /\
8235          leaf_rank V [u0; u1] w0 n f /\
8236     mcell_set V X /\
8237                  {u0, u1} IN edgeX V X  /\
8238     X SUBSET wedge_ge u0 u1 (f i) (f (SUC i))
8239  ==> (?k v1 v2. barV V 3 [u0;u1;v1;v2] /\ ((k = 2)\/ (k = 3)) /\ X = mcell k V [u0;u1;v1;v2])
8240  `,
8241   (* {{{ proof *)
8242   [
8243   REWRITE_TAC[Qzyzmjc.mcell_set_2;IN_ELIM_THM];
8244   REPEAT WEAKER_STRIP_TAC;
8245   TYPIFY `i'` EXISTS_TAC;
8246   FIRST_X_ASSUM (ASSUME_TAC o (MATCH_MP (arith `i' <= 4 ==> (i' <= 1 \/ i' = 4 \/ i' = 2 \/ i' = 3)`)));
8247   FIRST_X_ASSUM DISJ_CASES_TAC;
8248     INTRO_TAC Bump.EDGE_IMP_K2 [`V`;`ul`;`i'`];
8249     ANTS_TAC;
8250       BY(ASM_MESON_TAC[IN]);
8251     BY(ASM_MESON_TAC[NOT_IN_EMPTY;IN]);
8252   FIRST_X_ASSUM DISJ_CASES_TAC;
8253     BY(ASM_MESON_TAC[cc_4;IN;Bump.MCELL4]);
8254   ASM_REWRITE_TAC[];
8255   INTRO_TAC Leaf_cell.MCELL_EDGE_FIRST [`V`;`ul`;`i'`;`u0`;`u1`];
8256   ANTS_TAC;
8257     BY(ASM_MESON_TAC[IN]);
8258   REPEAT WEAKER_STRIP_TAC;
8259   GEXISTL_TAC [ `EL 2 vl`;`EL 3 vl`];
8260   TYPIFY `[u0; u1; EL 2 vl; EL 3 vl]  = vl` (C SUBGOAL_THEN SUBST1_TAC);
8261     MATCH_MP_TAC EQ_SYM;
8262     ASM_REWRITE_TAC[];
8263     MATCH_MP_TAC Bump.LENGTH4;
8264     REWRITE_TAC[arith `4 = 3 + 1`] THEN MATCH_MP_TAC Marchal_cells_3.BARV_LENGTH_LEMMA;
8265     BY(ASM_MESON_TAC[IN]);
8266   BY(ASM_MESON_TAC[IN])
8267   ]);;
8268   (* }}} *)
8269
8270 let CC_2_PROPS = prove_by_refinement(
8271   `!V X u0 u1 vl.
8272     pack_nonlinear_non_ox3q1h /\
8273     packing V /\
8274     saturated V /\
8275     critical_edge_y (dist(u0,u1)) /\
8276     X = mcell2 V vl /\
8277     {u0,u1} IN edgeX V X /\
8278     barV V 3 vl 
8279    ==>
8280     ~(NULLSET X) /\
8281     gammaX V X lmfun = gamma2_x_div_azim_v2 (h0cut (dist(u0,u1))) (dist(u0,u1) * dist(u0,u1)) * dihX V X (u0,u1) /\
8282     &0 < dihX V X (u0,u1) /\
8283     #0.008 * dihX V X (u0,u1) < gammaX V X lmfun`,
8284   (* {{{ proof *)
8285   [
8286   REPEAT WEAKER_STRIP_TAC;
8287   ASM_REWRITE_TAC[];
8288   SUBCONJ_TAC;
8289     REWRITE_TAC[Bump.MCELL2];
8290     DISCH_THEN (MP_TAC o (MATCH_MP Bump.RIJRIED));
8291     BY(ASM_MESON_TAC[NOT_IN_EMPTY;IN;Bump.MCELL2]);
8292   DISCH_TAC;
8293   INTRO_TAC Leaf_cell.MCELL2_EDGE_FIRST [`V`;`vl`;`u0`;`u1`];
8294   ANTS_TAC;
8295     BY(ASM_MESON_TAC[IN]);
8296   REPEAT WEAKER_STRIP_TAC;
8297   INTRO_TAC MCELL2_DIHX_POS [`V`;`X`;`vl'`];
8298   ASM_REWRITE_TAC[];
8299   ANTS_TAC;
8300     BY(ASM_MESON_TAC[IN]);
8301   DISCH_TAC;
8302   ASM_REWRITE_TAC[];
8303   MATCH_MP_TAC (TAUT `((a ==> b) /\ a) ==> (a /\  b)`);
8304   CONJ_TAC;
8305     DISCH_THEN SUBST1_TAC;
8306     MATCH_MP_TAC REAL_LT_RMUL;
8307     ASM_REWRITE_TAC[];
8308     MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "GRKIBMP A V2");
8309     ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
8310     REWRITE_TAC[Sphere.y_of_x;Functional_equation.nonf_gamma2_x1_div_a_v2];
8311     REWRITE_TAC[arith `x > y <=> y < x`];
8312     DISCH_THEN MATCH_MP_TAC;
8313     GEXISTL_TAC [`&1`;`&1`;`&1`;`&1`;`&1`];
8314     REWRITE_TAC[REAL_LE_REFL];
8315     FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
8316     ASM_REWRITE_TAC[Sphere.critical_edge_y];
8317     MP_TAC Nonlinear_lemma.hminus_prop;
8318     BY(REAL_ARITH_TAC);
8319   COMMENT "gammaX formula";
8320   INTRO_TAC Tskajxy.GAMMAX_GAMMA2_X [`V`;`X`;`vl'`;`dist(u0,u1)`;`dist(u0,mxi V vl')`;`dist(u0,omega_list_n V vl' 3)`;`dist(mxi V vl',omega_list_n V vl' 3)`;`dist(u1,omega_list_n V vl' 3)`;`dist(u1,mxi V vl')`];
8321   ANTS_TAC;
8322     ASM_REWRITE_TAC[];
8323     CONJ_TAC;
8324       BY(ASM_MESON_TAC[IN]);
8325     BY(ASM_MESON_TAC[]);
8326   ASM_REWRITE_TAC[];
8327   REPEAT WEAKER_STRIP_TAC;
8328   ASM_REWRITE_TAC[];
8329   MATCH_MP_TAC (arith `x = y ==> a * x = a * y`);
8330   GMATCH_SIMP_TAC Tskajxy.MCELL2_DIHX;
8331   CONJ_TAC;
8332     BY(ASM_MESON_TAC[IN]);
8333   GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] Merge_ineq.DIHV_EQ_DIH_Y);
8334   INTRO_TAC Tskajxy.NOT_COPLANAR_EXTREME_MCELL2 [`V`;`vl'`];
8335   ANTS_TAC;
8336     BY(ASM_MESON_TAC[IN]);
8337   DISCH_TAC;
8338   FIRST_ASSUM (ASSUME_TAC o (MATCH_MP NOT_COPLANAR_NOT_COLLINEAR));
8339   ASM_REWRITE_TAC[];
8340   FIRST_X_ASSUM_ST `coplanar` MP_TAC;
8341   TYPIFY `{EL 0 vl', EL 1 vl', mxi V vl', omega_list_n V vl' 3} = {EL 0 vl', EL 1 vl', omega_list_n V vl' 3,  mxi V vl'}` (C SUBGOAL_THEN SUBST1_TAC);
8342     BY(SET_TAC[]);
8343   BY(MESON_TAC[NOT_COPLANAR_NOT_COLLINEAR])
8344   ]);;
8345   (* }}} *)
8346
8347 let MCELL2_CRITICAL_WEIGHT1 = prove_by_refinement(
8348   `!V X u0 u1 vl.
8349     pack_nonlinear_non_ox3q1h /\
8350     packing V /\
8351     saturated V /\
8352     critical_edge_y (dist(u0,u1)) /\
8353     X = mcell2 V vl /\
8354     {u0,u1} IN edgeX V X /\
8355     barV V 3 vl ==>
8356     critical_weight V X = &1`,
8357   (* {{{ proof *)
8358   [
8359   REPEAT WEAKER_STRIP_TAC;
8360   REWRITE_TAC[Pack_defs.critical_edge_y;Pack_defs.critical_weight];
8361   MATCH_MP_TAC (arith `x = &1 ==> &1 / x = &1`);
8362   REWRITE_TAC[REAL_OF_NUM_EQ];
8363   MATCH_MP_TAC Misc_defs_and_lemmas.CARD_SING;
8364   REWRITE_TAC[SING];
8365   TYPIFY `{u0,u1}` EXISTS_TAC;
8366   ONCE_REWRITE_TAC[EXTENSION];
8367   GEN_TAC;
8368   INTRO_TAC Bump.MCELL2_EDGE [`V`;`vl`;`{u0,u1}`];
8369   ANTS_TAC;
8370     BY(ASM_MESON_TAC[IN]);
8371   DISCH_TAC;
8372   INTRO_TAC Tskajxy.MCELL2_VX_PROPS [`V`;`X`;`vl`];
8373   ANTS_TAC;
8374     ASM_REWRITE_TAC[];
8375     REWRITE_TAC[ Bump.MCELL2];
8376     DISCH_THEN (MP_TAC o (MATCH_MP Bump.RIJRIED));
8377     BY(ASM_MESON_TAC[NOT_IN_EMPTY;Bump.MCELL2]);
8378   REPEAT WEAKER_STRIP_TAC;
8379   PROOF_BY_CONTR_TAC;
8380   TYPIFY `~(?u v. x = {u,v})` ENOUGH_TO_SHOW_TAC;
8381     DISCH_TAC;
8382     FIRST_X_ASSUM_ST `IN` MP_TAC;
8383     ASM_REWRITE_TAC[Pack_defs.critical_edgeX;IN_ELIM_THM];
8384     REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
8385     BY(ASM_MESON_TAC[]);
8386   REPEAT WEAKER_STRIP_TAC;
8387   FIRST_X_ASSUM_ST `IN` MP_TAC;
8388   ASM_REWRITE_TAC[critical_edgeX_critical_edge_y;IN_ELIM_THM;IN_INSERT;NOT_IN_EMPTY];
8389   FIRST_X_ASSUM_ST `mcell2` (SUBST1_TAC o GSYM);
8390   ASM_REWRITE_TAC[IN_INSERT;NOT_IN_EMPTY];
8391   BY(ASM_MESON_TAC[Geomdetail.DIST_PAIR_LEMMA])
8392   ]);;
8393   (* }}} *)
8394
8395 let MCELL3_CRITICAL_WEIGHT = prove_by_refinement(
8396   `!V X u0 u1 v1 v2.
8397     pack_nonlinear_non_ox3q1h /\
8398     packing V /\
8399     saturated V /\
8400     critical_edge_y (dist(u0,u1)) /\
8401     X = mcell3 V [u0;u1;v1;v2] /\
8402     {u0,u1} IN edgeX V X /\
8403     barV V 3 [u0;u1;v1;v2] ==>
8404     critical_weight V X = &1 / &(wtcount3_y (dist(u0,u1)) (dist(u0,v1)) (dist(u1,v1)))`,
8405   (* {{{ proof *)
8406   [
8407   REWRITE_TAC[Pack_defs.critical_weight];
8408   REPEAT WEAKER_STRIP_TAC;
8409   REWRITE_TAC[Pack_defs.critical_edge_y;Pack_defs.critical_weight;arith `&1 /x = inv x`];
8410   REWRITE_TAC[REAL_EQ_INV2;REAL_OF_NUM_EQ];
8411   TYPIFY `~NULLSET X` (C SUBGOAL_THEN ASSUME_TAC);
8412     ASM_REWRITE_TAC[Bump.MCELL3];
8413     DISCH_THEN (MP_TAC o (MATCH_MP Bump.RIJRIED));
8414     BY(ASM_MESON_TAC[NOT_IN_EMPTY;Bump.MCELL3]);
8415   INTRO_TAC MCELL3_EDGE_EXPLICIT [`V`;`u0`;`u1`;`v1`;`v2`];
8416   ANTS_TAC;
8417     ASM_REWRITE_TAC[];
8418     BY(ASM_MESON_TAC[]);
8419   DISCH_TAC;
8420   TYPIFY `critical_edgeX V X SUBSET edgeX V X` (C SUBGOAL_THEN MP_TAC);
8421     REWRITE_TAC[SUBSET;Bump.CRITICAL_EDGEX_ALT];
8422     BY(MESON_TAC[]);
8423   ASM_REWRITE_TAC[];
8424   DISCH_TAC;
8425   TYPIFY `critical_edgeX V (mcell3 V [u0; u1; v1; v2]) =  {{u0, u1}, {u0, v1}, {u1, v1}} INTER critical_edgeX V (mcell3 V [u0; u1; v1; v2])` (C SUBGOAL_THEN SUBST1_TAC);
8426     FIRST_X_ASSUM MP_TAC;
8427     BY(SET_TAC[]);
8428   INTRO_TAC Upfzbzm_support_lemmas.FINITE_critical_edgeX [`V`;`X`];
8429   ASM_REWRITE_TAC[];
8430   DISCH_TAC;
8431   ASM_SIMP_TAC[CARD_INSERT_INTER_ALT];
8432   ASM_REWRITE_TAC[INTER_EMPTY;CARD_CLAUSES;NOT_IN_EMPTY;IN_INSERT;critical_edgeX_critical_edge_y];
8433   INTRO_TAC MCELL3_EXTREME_CARD [`V`;`[u0; u1; v1; v2]`];
8434   ANTS_TAC;
8435     BY(ASM_MESON_TAC[IN]);
8436   REWRITE_TAC[Bump.EL_EXPLICIT];
8437   DISCH_THEN (ASSUME_TAC o (MATCH_MP Leaf_cell.CARD4_ALL_DISTINCT));
8438   ASM_REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
8439   REWRITE_TAC[Sphere.wtcount3_y];
8440   ASM_REWRITE_TAC[];
8441   BY(ARITH_TAC)
8442   ]);;
8443   (* }}} *)
8444
8445 let MCELL3_008 = prove_by_refinement(
8446   `!V X u0 u1 ul. 
8447    pack_nonlinear_non_ox3q1h /\
8448     packing V /\
8449     saturated V /\
8450     X = mcell3 V ul /\
8451     critical_edge_y (dist(u0,u1)) /\
8452     {u0,u1} IN edgeX V (X) /\
8453     barV V 3 ul ==>
8454     #0.008 * dihX V (X) (u0,u1) <=
8455     gammaX V (X) lmfun *
8456       critical_weight V (X) +
8457       beta_bump_v1 V {u0, u1} (X)
8458 `,
8459   (* {{{ proof *)
8460   [
8461   REPEAT WEAKER_STRIP_TAC;
8462   COMMENT "now 3 cell";
8463   INTRO_TAC Leaf_cell.MCELL3_EDGE_FIRST [`V`;`ul`;`u0`;`u1`];
8464   ANTS_TAC;
8465     BY(ASM_MESON_TAC[IN]);
8466   REWRITE_TAC[IN];
8467   REPEAT WEAKER_STRIP_TAC;
8468   FIRST_X_ASSUM (fun t -> REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[t]);
8469   REPEAT WEAKER_STRIP_TAC;
8470   TYPIFY `~NULLSET X` (C SUBGOAL_THEN ASSUME_TAC);
8471     ASM_REWRITE_TAC[Bump.MCELL3];
8472     DISCH_THEN (MP_TAC o (MATCH_MP Bump.RIJRIED));
8473     BY(ASM_MESON_TAC[NOT_IN_EMPTY;Bump.MCELL3]);
8474   TYPIFY `vl = [EL 0 vl; EL 1 vl; EL 2 vl; EL 3 vl]` (C SUBGOAL_THEN ASSUME_TAC);
8475     MATCH_MP_TAC Bump.LENGTH4;
8476     BY(REWRITE_TAC[arith `4 = 3+1`] THEN ASM_MESON_TAC[Sphere.BARV;IN]);
8477   INTRO_TAC Tskajxy_lemmas.gammaX_gamma3f [`V`;`mcell3 V vl`;`vl`;`EL 0 vl`;`EL 1 vl`;`EL 2 vl`;`EL 3 vl`;`dist(EL 1 vl,EL 2 vl)`;`dist(EL 0 vl,EL 2 vl)`;`dist(EL 0 vl,EL 1 vl)`];
8478   ANTS_TAC;
8479     ASM_REWRITE_TAC[Bump.MCELL3];
8480     BY(ASM_MESON_TAC[Bump.MCELL3]);
8481   ASM_REWRITE_TAC[Bump.MCELL3];
8482   FIRST_ASSUM SUBST1_TAC;
8483   REWRITE_TAC[Bump.EL_EXPLICIT];
8484   DISCH_THEN (unlist REWRITE_TAC);
8485   INTRO_TAC Merge_ineq.cell3_008_from_ineq_ALT [];
8486   ASM_REWRITE_TAC[];
8487   DISCH_TAC;
8488   REWRITE_TAC[GSYM Bump.MCELL3];
8489   GMATCH_SIMP_TAC MCELL3_CRITICAL_WEIGHT;
8490   GEXISTL_TAC [`EL 0 vl`;`EL 1 vl`;`EL 2 vl`];
8491   CONJ_TAC;
8492     TYPIFY `EL 3 vl` EXISTS_TAC;
8493     ASM_REWRITE_TAC[];
8494     BY(ASM_MESON_TAC[Bump.MCELL3]);
8495   TYPIFY `gamma3f (dist (EL 1 vl,EL 2 vl)) (dist (EL 0 vl,EL 2 vl)) (dist (EL 0 vl,EL 1 vl)) sqrt2 lmfun = gamma3f (dist (EL 0 vl,EL 1 vl)) (dist (EL 1 vl,EL 2 vl)) (dist (EL 0 vl,EL 2 vl))    sqrt2 lmfun` (C SUBGOAL_THEN SUBST1_TAC);
8496     BY(MESON_TAC[Merge_ineq.gamma3f_sym]);
8497   TYPIFY `wtcount3_y (dist (EL 0 vl,EL 1 vl)) (dist (EL 0 vl,EL 2 vl)) (dist (EL 1 vl,EL 2 vl)) = wtcount3_y (dist (EL 0 vl,EL 1 vl))  (dist (EL 1 vl,EL 2 vl)) (dist (EL 0 vl,EL 2 vl))` (C SUBGOAL_THEN SUBST1_TAC);
8498     REWRITE_TAC[Sphere.wtcount3_y];
8499     BY(ARITH_TAC);
8500   REWRITE_TAC[arith `x * &1 / y = x / y`];
8501   REWRITE_TAC[arith `#0.008 * d = d * #0.008`];
8502   REWRITE_TAC[Bump.MCELL3];
8503   REPEAT (GMATCH_SIMP_TAC Bump.MCELL_BUMP_0);
8504   CONJ_TAC;
8505     BY(ASM_MESON_TAC[arith `3 < 4`;Bump.MCELL3]);
8506   REWRITE_TAC[arith `x + &0 = x`];
8507   FIRST_X_ASSUM MATCH_MP_TAC;
8508   INTRO_TAC MCELL3_DOMAIN [`V`;`[EL 0 vl;EL 1 vl;EL 2 vl;EL 3 vl]`];
8509   REWRITE_TAC[Bump.EL_EXPLICIT];
8510   ANTS_TAC;
8511     BY(ASM_MESON_TAC[Bump.MCELL3]);
8512   REPEAT WEAKER_STRIP_TAC;
8513   ASM_REWRITE_TAC[];
8514   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
8515   FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
8516   ASM_REWRITE_TAC[Sphere.critical_edge_y];
8517   DISCH_THEN (unlist REWRITE_TAC);
8518   FIRST_X_ASSUM MP_TAC;
8519   MATCH_MP_TAC (arith `e = e' ==> (e < s ==> e'< s)`);
8520   BY(MESON_TAC[Collect_geom.ETA_Y_SYYM])
8521   ]);;
8522   (* }}} *)
8523
8524 let real_model_008 = prove_by_refinement(
8525   `!V u0 u1 w0 n f i.  pack_nonlinear_non_ox3q1h /\ 
8526          1 < n /\
8527          packing V /\
8528          saturated V /\
8529          s_leaf V [u0; u1] HAS_SIZE n /\
8530          u0 IN V /\
8531          u1 IN V /\
8532         periodic f n /\
8533          ~collinear {u0, u1, w0} /\
8534          critical_edge_y (dist (u0,u1)) /\
8535          leaf_rank V [u0; u1] w0 n f /\
8536     ~cc_4 V u0 u1 f i
8537   ==>
8538   sum {X | mcell_set V X /\
8539       {u0, u1} IN edgeX V X /\
8540       X SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\
8541       ~(X = cc_cell V [u0; u1; f i]) /\
8542       ~(X = cc_cell V [u1; u0; f (SUC i)])} (\X. #0.008 * dihX V X (u0,u1)) <=
8543   sum {X | mcell_set V X /\
8544       {u0, u1} IN edgeX V X /\
8545       X SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\
8546       ~(X = cc_cell V [u0; u1; f i]) /\
8547       ~(X = cc_cell V [u1; u0; f (SUC i)])} 
8548     (\X. gammaX V X lmfun * critical_weight V X + beta_bump_v1 V {u0, u1} X)
8549 `,
8550   (* {{{ proof *)
8551   [
8552   REPEAT WEAKER_STRIP_TAC;
8553   MATCH_MP_TAC SUM_LE;
8554   SUBCONJ_TAC;
8555     INTRO_TAC Marchal_cells_3.FINITE_EDGE_X2 [`V`;`{u0,u1}`;`u0`;`u1`];
8556     ASM_REWRITE_TAC[];
8557     DISCH_TAC;
8558     MATCH_MP_TAC FINITE_SUBSET;
8559     TYPIFY `{X | mcell_set V X /\ edgeX V X {u0, u1}}` EXISTS_TAC;
8560     ASM_REWRITE_TAC[];
8561     REWRITE_TAC[SUBSET;IN_ELIM_THM];
8562     BY(MESON_TAC[IN]);
8563   DISCH_TAC;
8564   REWRITE_TAC[IN_ELIM_THM];
8565   REPEAT WEAKER_STRIP_TAC;
8566   INTRO_TAC EDGE_IMP_K23 [`V`;`x`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8567   ANTS_TAC;
8568     BY(ASM_REWRITE_TAC[]);
8569   REPEAT WEAKER_STRIP_TAC;
8570   ASM_REWRITE_TAC[];
8571   FIRST_X_ASSUM DISJ_CASES_TAC;
8572     REPEAT (GMATCH_SIMP_TAC Bump.MCELL_BUMP_0);
8573     CONJ_TAC;
8574       ASM_REWRITE_TAC[];
8575       CONJ_TAC;
8576         BY(ASM_SIMP_TAC[arith `(k = 2) ==> (k < 4)`]);
8577       FIRST_X_ASSUM_ST `edgeX` MP_TAC;
8578       ASM_REWRITE_TAC[];
8579       BY(MESON_TAC[Bump.RIJRIED;NOT_IN_EMPTY]);
8580     REWRITE_TAC[arith `x + &0 = x`];
8581     GMATCH_SIMP_TAC MCELL2_CRITICAL_WEIGHT1;
8582     CONJ_TAC;
8583       GEXISTL_TAC [`u0`;`u1`;`[u0;u1;v1;v2]`];
8584       ASM_REWRITE_TAC[];
8585       BY(ASM_MESON_TAC[Bump.MCELL2]);
8586     REWRITE_TAC[arith `x * &1 = x`];
8587     INTRO_TAC CC_2_PROPS [`V`;`x`;`u0`;`u1`;`[u0;u1;v1;v2]`];
8588     ANTS_TAC;
8589       BY(ASM_REWRITE_TAC[Bump.MCELL2]);
8590     BY(ASM_MESON_TAC[arith `x < y ==> x <= y`]);
8591   COMMENT "now 3 cell";
8592   INTRO_TAC MCELL3_008 [`V`;`x`;`u0`;`u1`;`[u0;u1;v1;v2]`];
8593   ANTS_TAC;
8594     BY(ASM_REWRITE_TAC[Bump.MCELL3]);
8595   BY(ASM_REWRITE_TAC[])
8596   ]);;
8597   (* }}} *)
8598
8599 let real_model_cell23 = prove_by_refinement(
8600   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
8601          1 < n /\
8602          packing V /\
8603          saturated V /\
8604          s_leaf V [u0; u1] HAS_SIZE n /\
8605          u0 IN V /\
8606          u1 IN V /\
8607         periodic f n /\
8608          ~collinear {u0, u1, w0} /\
8609          critical_edge_y (dist (u0,u1)) /\
8610          leaf_rank V [u0; u1] w0 n f
8611  ==>
8612 (!i. ~cc_4 V u0 u1 f i
8613       ==> gammaX V (cc_cell V [u0; u1; f i]) lmfun *
8614           critical_weight V (cc_cell V [u0; u1; f i]) +
8615           gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun *
8616           critical_weight V (cc_cell V [u1; u0; f (SUC i)]) <=
8617           gg_mcell V f u0 u1 i)
8618 `,
8619   (* {{{ proof *)
8620   [
8621   REPEAT WEAKER_STRIP_TAC;
8622   REWRITE_TAC[gg_mcell];
8623   GMATCH_SIMP_TAC CC_3_SUM_fn;
8624   CONJ_TAC;
8625     BY(ASM_MESON_TAC[]);
8626   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8627   ANTS_TAC;
8628     BY(ASM_REWRITE_TAC[]);
8629   REPEAT WEAKER_STRIP_TAC;
8630   ASM_REWRITE_TAC[arith `x + &0 = x`];
8631   REWRITE_TAC[arith `g1 + g2 <= g1 + g2 + s <=> &0 <= s`];
8632   INTRO_TAC real_model_008 [`V`; `u0`; `u1`; `w0`; `n`; `f`; `i`];
8633   ANTS_TAC;
8634     BY(ASM_REWRITE_TAC[]);
8635   DISCH_TAC;
8636   TYPIFY `&0 <= sum {X | mcell_set V X /\ {u0, u1} IN edgeX V X /\ X SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\           ~(X = cc_cell V [u0; u1; f i]) /\           ~(X = cc_cell V [u1; u0; f (SUC i)])}      (\X.  #0.008 * dihX V X (u0,u1))` ENOUGH_TO_SHOW_TAC;
8637     FIRST_X_ASSUM MP_TAC;
8638     TYPED_ABBREV_TAC  `s = {X | mcell_set V X /\      {u0, u1} IN edgeX V X /\      X SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\      ~(X = cc_cell V [u0; u1; f i]) /\      ~(X = cc_cell V [u1; u0; f (SUC i)])}` ;
8639     BY(REAL_ARITH_TAC);
8640   MATCH_MP_TAC SUM_POS_LE;
8641   CONJ_TAC;
8642     MATCH_MP_TAC FINITE_SUBSET;
8643     TYPIFY `{X | mcell_set V X /\ edgeX V X {u0,u1} }` EXISTS_TAC;
8644     CONJ_TAC;
8645       MATCH_MP_TAC Marchal_cells_3.FINITE_EDGE_X2;
8646       BY(ASM_MESON_TAC[]);
8647     BY(SET_TAC[]);
8648   REWRITE_TAC[IN_ELIM_THM];
8649   REPEAT WEAKER_STRIP_TAC;
8650   GMATCH_SIMP_TAC REAL_LE_MUL;
8651   CONJ_TAC;
8652     BY(REAL_ARITH_TAC);
8653   BY(REWRITE_TAC[Upfzbzm_support_lemmas.DIHX_POS])
8654   ]);;
8655   (* }}} *)
8656
8657 let real_model_cell23_008 = prove_by_refinement(
8658   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
8659          1 < n /\
8660          packing V /\
8661          saturated V /\
8662          s_leaf V [u0; u1] HAS_SIZE n /\
8663          u0 IN V /\
8664          u1 IN V /\
8665         periodic f n /\
8666          ~collinear {u0, u1, w0} /\
8667          critical_edge_y (dist (u0,u1)) /\
8668          leaf_rank V [u0; u1] w0 n f
8669  ==>
8670 (!i. ~cc_4 V u0 u1 f i
8671       ==> (gammaX V (cc_cell V [u0; u1; f i]) lmfun *
8672           critical_weight V (cc_cell V [u0; u1; f i]) - #0.008 * dihX V (cc_cell V [u0;u1;f i]) (u0,u1)) +
8673           (gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun *
8674           critical_weight V (cc_cell V [u1; u0; f (SUC i)]) - #0.008 * dihX V (cc_cell V [u1;u0;f (SUC i)]) (u0,u1)) +
8675           #0.008 * azim_mcell V f u0 u1 i <=
8676           gg_mcell V f u0 u1 i)
8677 `,
8678   (* {{{ proof *)
8679   [
8680   REPEAT WEAKER_STRIP_TAC;
8681   REWRITE_TAC[gg_mcell;azim_mcell];
8682   GMATCH_SIMP_TAC CC_3_SUM_fn;
8683   CONJ_TAC;
8684     BY(ASM_MESON_TAC[]);
8685   GMATCH_SIMP_TAC CC_3_SUM_fn;
8686   CONJ_TAC;
8687     BY(ASM_MESON_TAC[]);
8688   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8689   ANTS_TAC;
8690     BY(ASM_MESON_TAC[]);
8691   REPEAT WEAKER_STRIP_TAC;
8692   ASM_REWRITE_TAC[arith `x + &0 = x`];
8693   TYPED_ABBREV_TAC  `s = {X | mcell_set V X /\       {u0, u1} IN edgeX V X /\       X SUBSET wedge_ge u0 u1 (f i) (f (SUC i)) /\       ~(X = cc_cell V [u0; u1; f i]) /\       ~(X = cc_cell V [u1; u0; f (SUC i)])}` ;
8694   TYPIFY `!X. X IN s ==> (?k v1 v2.                   barV V 3 [u0; u1; v1; v2] /\                  (k = 2 \/ k = 3) /\                  X = mcell k V [u0; u1; v1; v2])` (C SUBGOAL_THEN ASSUME_TAC);
8695     EXPAND_TAC "s";
8696     REWRITE_TAC[IN_ELIM_THM];
8697     REPEAT WEAKER_STRIP_TAC;
8698     MATCH_MP_TAC EDGE_IMP_K23;
8699     BY(ASM_MESON_TAC[]);
8700   TYPIFY `sum s  (\X. gammaX V X lmfun * critical_weight V X + beta_bump_v1 V {u0, u1} X) = sum s (\X. gammaX V X lmfun * critical_weight V X )` (C SUBGOAL_THEN ASSUME_TAC);
8701     MATCH_MP_TAC SUM_EQ;
8702     REWRITE_TAC[arith `g + b = g <=> b = &0`];
8703     REPEAT WEAKER_STRIP_TAC;
8704     FIRST_X_ASSUM (C INTRO_TAC [`x`]);
8705     ASM_REWRITE_TAC[];
8706     REPEAT WEAKER_STRIP_TAC;
8707     ASM_REWRITE_TAC[];
8708     MATCH_MP_TAC Bump.MCELL_BUMP_0;
8709     ASM_REWRITE_TAC[];
8710     CONJ_TAC;
8711       FIRST_X_ASSUM_ST `\/` MP_TAC;
8712       BY(ARITH_TAC);
8713     DISCH_THEN (ASSUME_TAC o (MATCH_MP Bump.RIJRIED));
8714     FIRST_X_ASSUM_ST `IN` MP_TAC;
8715     EXPAND_TAC "s";
8716     BY(ASM_REWRITE_TAC[IN_ELIM_THM;NOT_IN_EMPTY]);
8717   ASM_REWRITE_TAC[];
8718   COMMENT "reduce to 008 bound";
8719   TYPIFY `#0.008 * sum  s  (\X. dihX V X (u0,u1)) <= sum s (\X. gammaX V X lmfun * critical_weight V X)` ENOUGH_TO_SHOW_TAC;
8720     BY(REAL_ARITH_TAC);
8721   REWRITE_TAC[GSYM SUM_LMUL];
8722   FIRST_X_ASSUM (SUBST1_TAC o GSYM);
8723   EXPAND_TAC "s";
8724   MATCH_MP_TAC real_model_008;
8725   BY(ASM_MESON_TAC[])
8726   ]);;
8727   (* }}} *)
8728
8729 let GAMMAX_008a = prove_by_refinement(
8730   `!V u0 u1 w0 n f i.
8731          pack_nonlinear_non_ox3q1h /\
8732          1 < n /\
8733          packing V /\
8734          saturated V /\
8735          s_leaf V [u0; u1] HAS_SIZE n /\
8736          u0 IN V /\
8737          u1 IN V /\
8738          periodic f n /\
8739          ~collinear {u0, u1, w0} /\
8740          critical_edge_y (dist (u0,u1)) /\
8741          leaf_rank V [u0; u1] w0 n f /\
8742          ~cc_4 V u0 u1 f i 
8743                   ==> #0.008 * dihX V (cc_cell V [u0; u1; f i]) (u0,u1) <= 
8744             gammaX V (cc_cell V [u0; u1; f i]) lmfun *
8745                       critical_weight V (cc_cell V [u0; u1; f i]) `,
8746   (* {{{ proof *)
8747   [
8748   REPEAT WEAKER_STRIP_TAC;
8749   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8750   ANTS_TAC;
8751     BY(ASM_MESON_TAC[]);
8752   REPEAT WEAKER_STRIP_TAC;
8753   INTRO_TAC MCELL3_008 [`V`;`cc_cell V [u0;u1; f i]`;`u0`;`u1`;`cc_uh V [u0;u1;f i]`];
8754   ANTS_TAC;
8755     ASM_REWRITE_TAC[];
8756     CONJ_TAC;
8757       BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL3]);
8758     INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;` [u0;u1;f i]`];
8759     BY(ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
8760   BY(ASM_REWRITE_TAC[arith `x + &0 = x`])
8761   ]);;
8762   (* }}} *)
8763
8764 let GAMMAX_008b = prove_by_refinement(
8765   `!V u0 u1 w0 n f i.
8766          pack_nonlinear_non_ox3q1h /\
8767          1 < n /\
8768          packing V /\
8769          saturated V /\
8770          s_leaf V [u0; u1] HAS_SIZE n /\
8771          u0 IN V /\
8772          u1 IN V /\
8773          periodic f n /\
8774          ~collinear {u0, u1, w0} /\
8775          critical_edge_y (dist (u0,u1)) /\
8776          leaf_rank V [u0; u1] w0 n f /\
8777          ~cc_4 V u0 u1 f i 
8778                   ==> #0.008 * dihX V (cc_cell V [u1; u0; f (SUC i)]) (u0,u1) <= 
8779             gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun *
8780                       critical_weight V (cc_cell V [u1; u0; f (SUC i)])`,
8781   (* {{{ proof *)
8782   [
8783   REPEAT WEAKER_STRIP_TAC;
8784   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8785   ANTS_TAC;
8786     BY(ASM_MESON_TAC[]);
8787   REPEAT WEAKER_STRIP_TAC;
8788   INTRO_TAC Leaf_cell.STEM_EDGEX [`V`;` [u1;u0;f (SUC i)]`];
8789   (ASM_REWRITE_TAC[Bump.EL_EXPLICIT]);
8790   DISCH_TAC;
8791   GMATCH_SIMP_TAC (GSYM Marchal_cells_3.DIHX_SYM);
8792   CONJ_TAC;
8793     ASM_REWRITE_TAC[];
8794     ONCE_REWRITE_TAC[GSYM IN] THEN MATCH_MP_TAC Leaf_cell.CC_CELL_IN_MCELL_SET;
8795     BY(ASM_REWRITE_TAC[]);
8796   INTRO_TAC MCELL3_008 [`V`;`cc_cell V [u1;u0; f (SUC i)]`;`u1`;`u0`;`cc_uh V [u1;u0;f (SUC i)]`];
8797   ANTS_TAC;
8798     ASM_REWRITE_TAC[];
8799     CONJ_TAC;
8800       BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL3]);
8801     ONCE_REWRITE_TAC[DIST_SYM];
8802     BY(ASM_REWRITE_TAC[]);
8803   TYPIFY `{u1,u0} = {u0,u1}` (C SUBGOAL_THEN SUBST1_TAC);
8804     BY(SET_TAC[]);
8805   BY((ASM_REWRITE_TAC[arith `x + &0 = x`]))
8806   ]);;
8807   (* }}} *)
8808
8809 let real_model_3a = prove_by_refinement(
8810   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
8811          1 < n /\
8812          packing V /\
8813          saturated V /\
8814          s_leaf V [u0; u1] HAS_SIZE n /\
8815          u0 IN V /\
8816          u1 IN V /\
8817         periodic f n /\
8818          ~collinear {u0, u1, w0} /\
8819          critical_edge_y (dist (u0,u1)) /\
8820          leaf_rank V [u0; u1] w0 n f
8821  ==>
8822  (!i. ~cc_4 V u0 u1 f i
8823       ==> &0 <=
8824           gammaX V (cc_cell V [u0; u1; f i]) lmfun *
8825           critical_weight V (cc_cell V [u0; u1; f i]))
8826 `,
8827   (* {{{ proof *)
8828   [
8829   REPEAT WEAKER_STRIP_TAC;
8830   GMATCH_SIMP_TAC REAL_LE_MUL;
8831   REWRITE_TAC[CRITICAL_WEIGHT_POS_LE];
8832   INTRO_TAC TSKAJXY_3 [`V`;`cc_cell V [u0;u1;f i]`;`cc_uh V [u0;u1;f i]`];
8833   REWRITE_TAC[arith `g >= &0 <=> &0 <= g`];
8834   DISCH_THEN MATCH_MP_TAC;
8835   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8836   ANTS_TAC;
8837     BY(ASM_MESON_TAC[]);
8838   REPEAT WEAKER_STRIP_TAC;
8839   ASM_REWRITE_TAC[];
8840   BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL3])
8841   ]);;
8842   (* }}} *)
8843
8844 let real_model_3b = prove_by_refinement(
8845   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
8846          1 < n /\
8847          packing V /\
8848          saturated V /\
8849          s_leaf V [u0; u1] HAS_SIZE n /\
8850          u0 IN V /\
8851          u1 IN V /\
8852         periodic f n /\
8853          ~collinear {u0, u1, w0} /\
8854          critical_edge_y (dist (u0,u1)) /\
8855          leaf_rank V [u0; u1] w0 n f
8856  ==>
8857  (!i. ~cc_4 V u0 u1 f i
8858       ==> &0 <=
8859           gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun *
8860           critical_weight V (cc_cell V [u1; u0; f (SUC i)])) 
8861 `,
8862   (* {{{ proof *)
8863   [
8864   REPEAT WEAKER_STRIP_TAC;
8865   GMATCH_SIMP_TAC REAL_LE_MUL;
8866   REWRITE_TAC[CRITICAL_WEIGHT_POS_LE];
8867   INTRO_TAC TSKAJXY_3 [`V`;`cc_cell V [u1;u0;f (SUC i)]`;`cc_uh V [u1;u0;f (SUC i)]`];
8868   REWRITE_TAC[arith `g >= &0 <=> &0 <= g`];
8869   DISCH_THEN MATCH_MP_TAC;
8870   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8871   ANTS_TAC;
8872     BY(ASM_MESON_TAC[]);
8873   REPEAT WEAKER_STRIP_TAC;
8874   ASM_REWRITE_TAC[];
8875   BY(ASM_REWRITE_TAC[Leaf_cell.cc_cell;Bump.MCELL3])
8876   ]);;
8877   (* }}} *)
8878
8879 let real_model_gr = prove_by_refinement(
8880   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
8881          1 < n /\
8882          packing V /\
8883          saturated V /\
8884          s_leaf V [u0; u1] HAS_SIZE n /\
8885          u0 IN V /\
8886          u1 IN V /\
8887         periodic f n /\
8888          ~collinear {u0, u1, w0} /\
8889          critical_edge_y (dist (u0,u1)) /\
8890          leaf_rank V [u0; u1] w0 n f
8891  ==>
8892 (!i. ~cc_4 V u0 u1 f i
8893       ==>  #0.008 * azim_mcell V f u0 u1 i <= gg_mcell V f u0 u1 i) `,
8894   (* {{{ proof *)
8895   [
8896   REPEAT WEAKER_STRIP_TAC;
8897   INTRO_TAC real_model_cell23_008 [`V`;`u0`;`u1`;`w0`;`n`;`f`];
8898   ANTS_TAC;
8899     BY(ASM_REWRITE_TAC[]);
8900   DISCH_THEN (C INTRO_TAC [`i`]);
8901   ASM_REWRITE_TAC[];
8902   MATCH_MP_TAC (arith `&0 <= t1 /\ &0 <= t2 ==> (t1 + t2 + a <= g ==> a <= g)`);
8903   REWRITE_TAC[arith `&0 <= g - d <=> d <= g`];
8904   CONJ_TAC;
8905     MATCH_MP_TAC GAMMAX_008a;
8906     BY(ASM_MESON_TAC[]);
8907   MATCH_MP_TAC GAMMAX_008b;
8908   BY(ASM_MESON_TAC[])
8909   ]);;
8910   (* }}} *)
8911
8912 let JSP_BOUNDS = prove_by_refinement(
8913   `!(u0:real^3) u1 u2. pack_nonlinear_non_ox3q1h /\
8914     ~collinear {u0, u1, u2} /\
8915   hl [u0; u1; u2] <=  #1.34 /\
8916   &2 * hminus <= dist (u0,u1) /\
8917   &2 <= dist (u0,u2) /\
8918   &2 <= dist (u1,u2)
8919  ==>
8920     dist(u0,u2) < &2 * hminus /\ dist(u1,u2) < &2 * hminus`,
8921   (* {{{ proof *)
8922   [
8923   REPEAT WEAKER_STRIP_TAC;
8924   INTRO_TAC JSPEVYT_EXPLICIT [`u0`;`u1`;`u2`];
8925   ASM_REWRITE_TAC[];
8926   DISCH_THEN (unlist REWRITE_TAC);
8927   INTRO_TAC JSPEVYT_EXPLICIT [`u1`;`u0`;`u2`];
8928   ANTS_TAC;
8929     TYPIFY `{u1,u0,u2 } = {u0,u1,u2}` (C SUBGOAL_THEN ASSUME_TAC);
8930       BY(SET_TAC[]);
8931     TYPIFY `hl [u1;u0;u2] = hl[u0;u1;u2]` (C SUBGOAL_THEN SUBST1_TAC);
8932       BY(ASM_REWRITE_TAC[Pack_defs.HL;set_of_list]);
8933     ASM_REWRITE_TAC[];
8934     ONCE_REWRITE_TAC[DIST_SYM];
8935     BY(ASM_REWRITE_TAC[]);
8936   BY(REWRITE_TAC[])
8937   ]);;
8938   (* }}} *)
8939
8940 let real_model_pema = prove_by_refinement(
8941   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
8942          1 < n /\
8943          packing V /\
8944          saturated V /\
8945          s_leaf V [u0; u1] HAS_SIZE n /\
8946          u0 IN V /\
8947          u1 IN V /\
8948         periodic f n /\
8949          ~collinear {u0, u1, w0} /\
8950          critical_edge_y (dist (u0,u1)) /\
8951          leaf_rank V [u0; u1] w0 n f
8952  ==>
8953  (!i. ~cc_4 V u0 u1 f i /\
8954       hl [u0; u1; f i] <  #1.34 /\
8955       ~(hl [u0; u1; f (SUC i)] <  #1.34) /\
8956       azim_mcell V f u0 u1 i <  #1.074
8957       ==> a_spine5 + b_spine5 * azim_mcell V f u0 u1 i <=
8958           gg_mcell V f u0 u1 i) 
8959 `,
8960   (* {{{ proof *)
8961   [
8962   REPEAT WEAKER_STRIP_TAC;
8963   INTRO_TAC real_model_cell23_008 [`V`;`u0`;`u1`;`w0`;`n`;`f`];
8964   ANTS_TAC;
8965     BY(ASM_REWRITE_TAC[]);
8966   TYPIFY `&2 * hminus <= dist (u0,u1) /\ dist(u0,u1) <= &2 * hplus` (C SUBGOAL_THEN ASSUME_TAC);
8967     FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
8968     BY((REWRITE_TAC[Sphere.critical_edge_y]) THEN REAL_ARITH_TAC);
8969   DISCH_THEN (C INTRO_TAC [`i`]);
8970   ASM_REWRITE_TAC[];
8971   MATCH_MP_TAC (arith `&0 <= t /\  a <= t'+ a' ==> (t' + t + a' <= g ==> a <= g)`);
8972   CONJ_TAC;
8973     REWRITE_TAC[arith `&0 <= g - d <=> d <= g`];
8974     MATCH_MP_TAC GAMMAX_008b;
8975     BY(ASM_MESON_TAC[]);
8976   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
8977   ANTS_TAC;
8978     BY(ASM_REWRITE_TAC[]);
8979   REPEAT WEAKER_STRIP_TAC;
8980   ASM_REWRITE_TAC[];
8981   COMMENT "bound edges 3,5";
8982   INTRO_TAC JSP_BOUNDS [`u0`;`u1`;`f i`];
8983   ANTS_TAC;
8984     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
8985   REPEAT WEAKER_STRIP_TAC;
8986   COMMENT "simplify goal";
8987   TYPIFY `a_spine5 + b_spine5 * dih_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i))) y4       (dist (u1,f (SUC i)))      (dist (u1,f i))  <= gammaX V (cc_cell V [u0; u1; f i]) lmfun * critical_weight V (cc_cell V [u0; u1; f i]) -  #0.008 * dihX V (cc_cell V [u0; u1; f i]) (u0,u1) +  #0.008 * dih_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i))) y4      (dist (u1,f (SUC i)))      (dist (u1,f i))` ENOUGH_TO_SHOW_TAC;
8988     REWRITE_TAC[Sphere.b_spine5];
8989     FIRST_X_ASSUM_ST `dih_y` MP_TAC;
8990     BY(REAL_ARITH_TAC);
8991   COMMENT "import inequality";
8992   MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "PEMKWKU");
8993   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
8994   REWRITE_TAC[GSYM Sphere.rad2_y];
8995   REWRITE_TAC[ (TAUT ` (p ==> a \/ b) <=> (p /\ ~b ==> a)`)];
8996   REWRITE_TAC[DE_MORGAN_THM];
8997   REWRITE_TAC[Functional_equation.nonf_gamma23_keep135_x;Sphere.y_of_x];
8998   REWRITE_TAC[GSYM (REWRITE_RULE[LET_DEF;LET_END_DEF] Sphere.dih_y)];
8999   DISCH_TAC;
9000   FIRST_X_ASSUM (C INTRO_TAC [`(dist (u0,u1))`;` (dist (u0,f (SUC i)))`;` (dist (u0,f i))`;` y4`; ` (dist (u1,f i))`;`(dist (u1,f (SUC i)))`]);
9001   ANTS_TAC;
9002     REWRITE_TAC[arith `~(x < y) <=> y<= x`;arith`~(x > y) <=> x <= y`];
9003     ASM_SIMP_TAC[arith `x < y ==> x <= y`];
9004     GMATCH_SIMP_TAC ETA_Y_LEMMA;
9005     ASM_REWRITE_TAC[];
9006     CONJ_TAC;
9007       BY(REPEAT (FIRST_X_ASSUM_ST `#1.34` MP_TAC) THEN REAL_ARITH_TAC);
9008     TYPIFY `!x. x <= &2 <=> x <= (sqrt(&2) pow 2)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
9009       BY(REWRITE_TAC[GSYM Sphere.sqrt2;arith `x pow 2 = x * x`;Nonlin_def.sqrt2_sqrt2]);
9010     REPEAT (GMATCH_SIMP_TAC ETA_Y_LEMMA_ALT);
9011     ASM_SIMP_TAC[arith `x < y ==> x <= y`];
9012     CONJ2_TAC;
9013       CONJ_TAC;
9014         FIRST_X_ASSUM_ST `rad2_y` MP_TAC;
9015         BY(MESON_TAC[Merge_ineq.rad2_y_sym]);
9016       PURE_ONCE_REWRITE_TAC[Nonlinear_lemma.dih_y_sym];
9017       FIRST_X_ASSUM_ST `dih_y` MP_TAC;
9018       FIRST_X_ASSUM_ST `#1.074` MP_TAC;
9019       ASM_REWRITE_TAC[];
9020       BY(REAL_ARITH_TAC);
9021     BY(ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2]);
9022   COMMENT "handle gamma3_f";
9023   GMATCH_SIMP_TAC (GSYM Merge_ineq.gamma3_x_gamma3f);
9024   CONJ_TAC;
9025     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
9026   GMATCH_SIMP_TAC critical_weight1;
9027   CONJ_TAC;
9028     BY(ASM_REWRITE_TAC[]);
9029   GMATCH_SIMP_TAC mcell3_gammaX_gamma3f;
9030   CONJ_TAC;
9031     GEXISTL_TAC [`w0`;`n`];
9032     BY(ASM_REWRITE_TAC[]);
9033   REWRITE_TAC[arith `g + dd * #0.008 > r <=> g > r - dd * #0.008`];
9034   MATCH_MP_TAC(arith `r = s + a - b   ==> (g > r ==> s <= g * &1 - a + b)`);
9035   REWRITE_TAC[arith `(a+b) - c = a + b - c`;arith `(a+b) + c = a + b + c`];
9036   AP_TERM_TAC;
9037   MATCH_MP_TAC (arith `(d = d' /\ e' = -- e) ==> (b * d - e = b * d' + e')`);
9038   CONJ_TAC;
9039     BY(MESON_TAC[Nonlinear_lemma.dih_y_sym]);
9040   MATCH_MP_TAC (arith `d3' = d3'' /\ d6 = d6' ==> (#0.008 * d3' - #0.008 * d6 = --( ( d6' - d3'')* #0.008))`);
9041   CONJ2_TAC;
9042     BY(MESON_TAC[Nonlinear_lemma.dih_y_sym]);
9043   GMATCH_SIMP_TAC mcell3_dihX_dih_y;
9044   CONJ_TAC;
9045     BY(ASM_MESON_TAC[]);
9046   REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF;Nonlin_def.sqrt2_sqrt2];
9047   BY(MESON_TAC[Nonlinear_lemma.dih_x_sym])
9048   ]);;
9049   (* }}} *)
9050
9051 let real_model_pemb = prove_by_refinement(
9052   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
9053          1 < n /\
9054          packing V /\
9055          saturated V /\
9056          s_leaf V [u0; u1] HAS_SIZE n /\
9057          u0 IN V /\
9058          u1 IN V /\
9059         periodic f n /\
9060          ~collinear {u0, u1, w0} /\
9061          critical_edge_y (dist (u0,u1)) /\
9062          leaf_rank V [u0; u1] w0 n f
9063  ==>
9064  (!i. ~cc_4 V u0 u1 f i /\
9065       ~(hl [u0; u1; f i] <  #1.34) /\
9066       hl [u0; u1; f (SUC i)] <  #1.34 /\
9067       azim_mcell V f u0 u1 i <  #1.074
9068       ==> a_spine5 + b_spine5 * azim_mcell V f u0 u1 i <=
9069           gg_mcell V f u0 u1 i) 
9070 `,
9071   (* {{{ proof *)
9072   [
9073   REPEAT WEAKER_STRIP_TAC;
9074   INTRO_TAC real_model_cell23_008 [`V`;`u0`;`u1`;`w0`;`n`;`f`];
9075   ANTS_TAC;
9076     BY(ASM_REWRITE_TAC[]);
9077   TYPIFY `&2 * hminus <= dist (u0,u1) /\ dist(u0,u1) <= &2 * hplus` (C SUBGOAL_THEN ASSUME_TAC);
9078     FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
9079     BY((REWRITE_TAC[Sphere.critical_edge_y]) THEN REAL_ARITH_TAC);
9080   DISCH_THEN (C INTRO_TAC [`i`]);
9081   ASM_REWRITE_TAC[];
9082   MATCH_MP_TAC (arith `&0 <= t' /\  a <= t+ a' ==> (t' + t + a' <= g ==> a <= g)`);
9083   CONJ_TAC;
9084     REWRITE_TAC[arith `&0 <= g - d <=> d <= g`];
9085     MATCH_MP_TAC GAMMAX_008a;
9086     BY(ASM_MESON_TAC[]);
9087   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
9088   ANTS_TAC;
9089     BY(ASM_REWRITE_TAC[]);
9090   REPEAT WEAKER_STRIP_TAC;
9091   ASM_REWRITE_TAC[];
9092   COMMENT "bound edges 2,6";
9093   INTRO_TAC JSP_BOUNDS [`u0`;`u1`;`f (SUC i)`];
9094   ANTS_TAC;
9095     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
9096   REPEAT WEAKER_STRIP_TAC;
9097   COMMENT "simplify goal+";
9098   TYPIFY `a_spine5 + b_spine5 * dih_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i))) y4       (dist (u1,f (SUC i)))      (dist (u1,f i))  <=  gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun * critical_weight V (cc_cell V [u1; u0; f (SUC i)]) -  #0.008 * dihX V (cc_cell V [u1; u0; f (SUC i)]) (u0,u1) +  #0.008 * dih_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i))) y4       (dist (u1,f (SUC i)))      (dist (u1,f i)) ` ENOUGH_TO_SHOW_TAC;
9099     REWRITE_TAC[Sphere.b_spine5];
9100     FIRST_X_ASSUM_ST `dih_y` MP_TAC;
9101     BY(REAL_ARITH_TAC);
9102   COMMENT "import inequality";
9103   MP_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "PEMKWKU");
9104   ASM_REWRITE_TAC[Sphere.ineq;TAUT `a ==> b ==> c <=> (a /\ b) ==> c`];
9105   REWRITE_TAC[GSYM Sphere.rad2_y];
9106   REWRITE_TAC[ (TAUT ` (p ==> a \/ b) <=> (p /\ ~b ==> a)`)];
9107   REWRITE_TAC[DE_MORGAN_THM];
9108   REWRITE_TAC[Functional_equation.nonf_gamma23_keep135_x;Sphere.y_of_x];
9109   REWRITE_TAC[GSYM (REWRITE_RULE[LET_DEF;LET_END_DEF] Sphere.dih_y)];
9110   DISCH_TAC;
9111   COMMENT "instantiate pem";
9112   FIRST_X_ASSUM (C INTRO_TAC [`(dist (u0,u1))`;` (dist (u0,f ( i)))`;` (dist (u0,f (SUC i)))`;` y4`; ` (dist (u1,f (SUC i)))`;`(dist (u1,f ( i)))`]);
9113   ANTS_TAC;
9114     REWRITE_TAC[arith `~(x < y) <=> y<= x`;arith`~(x > y) <=> x <= y`];
9115     ASM_SIMP_TAC[arith `x < y ==> x <= y`];
9116     GMATCH_SIMP_TAC ETA_Y_LEMMA;
9117     ASM_REWRITE_TAC[];
9118     CONJ_TAC;
9119       BY(REPEAT (FIRST_X_ASSUM_ST `#1.34` MP_TAC) THEN REAL_ARITH_TAC);
9120     TYPIFY `!x. x <= &2 <=> x <= (sqrt(&2) pow 2)` (C SUBGOAL_THEN (unlist REWRITE_TAC));
9121       BY(REWRITE_TAC[GSYM Sphere.sqrt2;arith `x pow 2 = x * x`;Nonlin_def.sqrt2_sqrt2]);
9122     REPEAT (GMATCH_SIMP_TAC ETA_Y_LEMMA_ALT);
9123     ASM_SIMP_TAC[arith `x < y ==> x <= y`];
9124     CONJ2_TAC;
9125       FIRST_X_ASSUM_ST `dih_y` MP_TAC;
9126       FIRST_X_ASSUM_ST `#1.074` MP_TAC;
9127       ASM_REWRITE_TAC[];
9128       BY(REAL_ARITH_TAC);
9129     BY(ASM_REWRITE_TAC[Sphere.sqrt2;Nonlinear_lemma.sqrt8_sqrt2]);
9130   COMMENT "handle gamma3_f";
9131   GMATCH_SIMP_TAC (GSYM Merge_ineq.gamma3_x_gamma3f);
9132   CONJ_TAC;
9133     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
9134   GMATCH_SIMP_TAC critical_weight1;
9135   CONJ_TAC;
9136     (ASM_REWRITE_TAC[]);
9137     ONCE_REWRITE_TAC[DIST_SYM];
9138     BY(ASM_REWRITE_TAC[]);
9139   GMATCH_SIMP_TAC mcell3_gammaXb_gamma3f;
9140   CONJ_TAC;
9141     GEXISTL_TAC [`w0`;`n`];
9142     BY(ASM_REWRITE_TAC[]);
9143   REWRITE_TAC[arith `g + dd * #0.008 > r <=> g > r - dd * #0.008`];
9144   MATCH_MP_TAC(arith `r = s + a - b   ==> (g > r ==> s <= g * &1 - a + b)`);
9145   REWRITE_TAC[arith `(a+b) - c = a + b - c`;arith `(a+b) + c = a + b + c`];
9146   AP_TERM_TAC;
9147   MATCH_MP_TAC (arith `(d = d' /\ e' = -- e) ==> (b * d - e = b * d' + e')`);
9148   CONJ_TAC;
9149     BY(REWRITE_TAC[]);
9150   MATCH_MP_TAC (arith `d3' = d3'' /\ d6 = d6' ==> (#0.008 * d3' - #0.008 * d6 = --( ( d6' - d3'')* #0.008))`);
9151   REWRITE_TAC[];
9152   GMATCH_SIMP_TAC mcell3_dihXb_dih_y;
9153   CONJ_TAC;
9154     BY(ASM_MESON_TAC[]);
9155   REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF;Nonlin_def.sqrt2_sqrt2];
9156   BY(MESON_TAC[Nonlinear_lemma.dih_x_sym])
9157   ]);;
9158   (* }}} *)
9159
9160 let c2089 = Flyspeck_constants.calc `atn (sqrt (#3.07)) < pi - #2.089`;;
9161 let c1946 = Flyspeck_constants.calc `pi - #1.946 < atn (sqrt (#6.45))`;;
9162
9163 let IXPOTPA_MERGED = prove_by_refinement(
9164   `!y1 y2 y3 y4 y5 y6. 
9165     pack_nonlinear_non_ox3q1h /\
9166     critical_edge_y y1 /\
9167     &2 <= y2 /\ y2 <= &2 * hminus /\
9168     &2 <= y3 /\ y3 <= &2 * hminus /\
9169     sqrt8 <= y4 /\ y4 <= y5 + y6 /\
9170     &2 <= y5 /\ y5 <= &2 * hminus /\
9171     &2 <= y6 /\ y6 <= &2 * hminus /\
9172     &0 < delta_y y1 y2 y3 y4 y5 y6 /\
9173     dih_y y1 y2 y3 y4 y5 y6 <= #2.089 /\
9174     #1.946 <= dih_y y1 y2 y3 y4 y5 y6 /\
9175     eta_y y1 y2 y6 pow 2 <= #1.34 pow 2/\
9176     eta_y y1 y3 y5 pow 2 <= #1.34 pow 2
9177    ==>
9178     &3 * #0.0057 <= gamma3f y1 y2 y6 sqrt2 lmfun +
9179      gamma3f y1 y3 y5 sqrt2 lmfun +
9180      (dih_y y1 y2 y3 y4 y5 y6 -
9181       (dih_y y1 y2 sqrt2 sqrt2 sqrt2 y6 + dih_y y1 sqrt2 y3 sqrt2 y5 sqrt2)) *
9182       #0.008`,
9183   (* {{{ proof *)
9184   [
9185   COMMENT "prelims";
9186   REPEAT WEAKER_STRIP_TAC;
9187   TYPIFY `y4 <= &4 * hminus ` (C SUBGOAL_THEN ASSUME_TAC);
9188     BY(REPEAT (FIRST_X_ASSUM MP_TAC) THEN REAL_ARITH_TAC);
9189   TYPIFY `&2 * hminus <= y1 /\ y1 <= &2 * hplus` (C SUBGOAL_THEN ASSUME_TAC);
9190     BY(ASM_MESON_TAC[Sphere.critical_edge_y]);
9191   TYPIFY `&0 < y1` (C SUBGOAL_THEN ASSUME_TAC);
9192     MP_TAC Nonlinear_lemma.hminus_gt;
9193     FIRST_X_ASSUM MP_TAC;
9194     BY(REAL_ARITH_TAC);
9195   TYPIFY `&0 < y1 * y1` (C SUBGOAL_THEN ASSUME_TAC);
9196     GMATCH_SIMP_TAC REAL_LT_MUL_EQ;
9197     BY(ASM_REWRITE_TAC[]);
9198   TYPIFY `delta4_y y1 y2 y3 y4 y5 y6 < &0` (C SUBGOAL_THEN ASSUME_TAC);
9199     REWRITE_TAC[Sphere.delta4_y;Sphere.y_of_x];
9200     MATCH_MP_TAC Merge_ineq.dih_gt_pi2;
9201     ASM_REWRITE_TAC[];
9202     REPEAT (FIRST_X_ASSUM MP_TAC);
9203     REWRITE_TAC[Sphere.dih_y;Sphere.delta_y;LET_DEF;LET_END_DEF];
9204     MP_TAC Flyspeck_constants.bounds;
9205     BY(REAL_ARITH_TAC);
9206   COMMENT "add nonlinear";
9207   MATCH_MP_TAC (arith `x > y ==> y <= x`);
9208   INTRO_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "IXPOTPA") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
9209   ASM_REWRITE_TAC[Sphere.ineq;LET_DEF;LET_END_DEF];
9210   REWRITE_TAC[TAUT `a \/ b \/ c <=> (a \/ b) \/ c`];
9211   ONCE_REWRITE_TAC[TAUT `a \/ b <=> (~a ==> b)`];
9212   REWRITE_TAC[DE_MORGAN_THM];
9213   REWRITE_TAC[TAUT `(a /\ b) /\c <=> a /\ b /\ c`];
9214   ASM_REWRITE_TAC[Functional_equation.nonf_gamma23_full8_x;Sphere.y_of_x];
9215   REPEAT (GMATCH_SIMP_TAC (GSYM Merge_ineq.gamma3_x_gamma3f));
9216   ASM_SIMP_TAC[Merge_ineq.y_bounds];
9217   REWRITE_TAC[REWRITE_RULE[LET_DEF;LET_END_DEF] (GSYM Sphere.dih_y);GSYM Nonlinear_lemma.sqrt2_sqrt2];
9218   DISCH_THEN MATCH_MP_TAC;
9219   COMMENT "remove hypotheses";
9220   ASM_SIMP_TAC [arith `&0 < x ==> ~(x < &0)`];
9221   ASM_SIMP_TAC [arith `x <= y ==> ~(x > y)`];
9222   ASM_SIMP_TAC [arith `x < &0 ==> ~(x > &0)`];
9223   CONJ_TAC;
9224     MATCH_MP_TAC (arith `b < a ==> ~(a < b)`);
9225     TYPIFY `#3.07 = sqrt (#3.07) pow 2 ` (C SUBGOAL_THEN SUBST1_TAC);
9226       GMATCH_SIMP_TAC SQRT_POW_2;
9227       BY(REAL_ARITH_TAC);
9228     GMATCH_SIMP_TAC (GSYM Merge_ineq.lindihpi_lt_y);
9229     ASM_REWRITE_TAC[];
9230     CONJ_TAC;
9231       GMATCH_SIMP_TAC REAL_LT_RSQRT;
9232       BY(REAL_ARITH_TAC);
9233     FIRST_X_ASSUM_ST `#2.089` MP_TAC;
9234     MP_TAC c2089;
9235     BY(REAL_ARITH_TAC);
9236   MATCH_MP_TAC (arith `a < b ==> ~(a > b)`);
9237   TYPIFY `#6.45 = sqrt (#6.45) pow 2 ` (C SUBGOAL_THEN SUBST1_TAC);
9238     GMATCH_SIMP_TAC SQRT_POW_2;
9239     BY(REAL_ARITH_TAC);
9240   GMATCH_SIMP_TAC (GSYM Merge_ineq.lindihpi_gt_y);
9241   ASM_REWRITE_TAC[];
9242   CONJ_TAC;
9243     GMATCH_SIMP_TAC REAL_LT_RSQRT;
9244     BY(REAL_ARITH_TAC);
9245   FIRST_X_ASSUM_ST `#1.946` MP_TAC;
9246   MP_TAC c1946;
9247   BY(REAL_ARITH_TAC)
9248   ]);;
9249   (* }}} *)
9250
9251 let TXQTPVC_MERGED = prove_by_refinement(
9252   `!y1 y2 y3 y4 y5 y6. 
9253     pack_nonlinear_non_ox3q1h /\
9254     critical_edge_y y1 /\
9255     &2 <= y2 /\ y2 <= &2 * hminus /\
9256     &2 <= y3 /\ y3 <= &2 * hminus /\
9257     &2 <= y4 /\ y4 <= y5 + y6 /\
9258     &2 <= rad2_y y1 y2 y3 y4 y5 y6 /\
9259     &2 <= y5 /\ y5 <= &2 * hminus /\
9260     &2 <= y6 /\ y6 <= &2 * hminus /\
9261     &0 < delta_y y1 y2 y3 y4 y5 y6 /\
9262     dih_y y1 y2 y3 y4 y5 y6 <= #2.089 /\
9263     #1.946 <= dih_y y1 y2 y3 y4 y5 y6 /\
9264     eta_y y1 y2 y6 pow 2 <= #1.34 pow 2/\
9265     eta_y y1 y3 y5 pow 2 <= #1.34 pow 2
9266    ==>
9267     &3 * #0.0057 <= gamma3f y1 y2 y6 sqrt2 lmfun +
9268      gamma3f y1 y3 y5 sqrt2 lmfun +
9269      (dih_y y1 y2 y3 y4 y5 y6 -
9270       (dih_y y1 y2 sqrt2 sqrt2 sqrt2 y6 + dih_y y1 sqrt2 y3 sqrt2 y5 sqrt2)) *
9271       #0.008`,
9272   (* {{{ proof *)
9273   [
9274   REPEAT WEAKER_STRIP_TAC;
9275   TYPIFY `&2 * hminus <= y1 /\ y1 <= &2 * hplus` (C SUBGOAL_THEN ASSUME_TAC);
9276     BY(ASM_MESON_TAC[Sphere.critical_edge_y]);
9277   TYPIFY `sqrt8 <= y4` ASM_CASES_TAC;
9278     MATCH_MP_TAC IXPOTPA_MERGED;
9279     BY(ASM_REWRITE_TAC[]);
9280   TYPIFY `y4 <= sqrt8` (C SUBGOAL_THEN ASSUME_TAC);
9281     BY(FIRST_X_ASSUM MP_TAC THEN REAL_ARITH_TAC);
9282   MATCH_MP_TAC (arith `y > x ==> x<= y`);
9283   INTRO_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "TXQTPVC") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
9284   ASM_REWRITE_TAC[Sphere.ineq;LET_DEF;LET_END_DEF];
9285   ONCE_REWRITE_TAC[TAUT `a \/ b <=> ~b ==> a`];
9286   REWRITE_TAC[DE_MORGAN_THM];
9287   ASM_REWRITE_TAC[Functional_equation.nonf_gamma23_full8_x;Sphere.y_of_x];
9288   REPEAT (GMATCH_SIMP_TAC (GSYM Merge_ineq.gamma3_x_gamma3f));
9289   ASM_SIMP_TAC[Merge_ineq.y_bounds];
9290   REWRITE_TAC[REWRITE_RULE[LET_DEF;LET_END_DEF] (GSYM Sphere.dih_y);GSYM Nonlinear_lemma.sqrt2_sqrt2];
9291   DISCH_THEN MATCH_MP_TAC;
9292   COMMENT "deal with assumptions";
9293   ASM_SIMP_TAC [arith `x <= y ==> ~(x > y)`];
9294   ASM_SIMP_TAC [arith `c <= d ==> ~(d < c)`];
9295   FIRST_X_ASSUM_ST `rad2_y` MP_TAC;
9296   REWRITE_TAC[Nonlin_def.sqrt2_sqrt2];
9297   REWRITE_TAC[Sphere.rad2_y;Sphere.y_of_x];
9298   BY(REAL_ARITH_TAC)
9299   ]);;
9300   (* }}} *)
9301
9302 let TEWNSCJ_MERGED = prove_by_refinement(
9303   `!y1 y2 y3 y4 y5 y6. 
9304     pack_nonlinear_non_ox3q1h /\
9305     critical_edge_y y1 /\
9306     &2 <= y2 /\ y2 <= &2 * hminus /\
9307     &2 <= y3 /\ y3 <= &2 * hminus /\
9308     &2 <= y4 /\ y4 <= sqrt8 /\
9309     &2 <= rad2_y y1 y2 y3 y4 y5 y6 /\
9310     &2 <= y5 /\ y5 <= &2 * hminus /\
9311     &2 <= y6 /\ y6 <= &2 * hminus /\
9312     eta_y y1 y2 y6 pow 2 <= #1.34 pow 2 /\
9313     eta_y y1 y3 y5 pow 2 <= #1.34 pow 2
9314    ==>
9315     a_spine5 + b_spine5 * dih_y y1 y2 y3 y4 y5 y6 <=
9316      gamma3f y1 y2 y6 sqrt2 lmfun +
9317      gamma3f y1 y3 y5 sqrt2 lmfun +
9318      (dih_y y1 y2 y3 y4 y5 y6 -
9319       (dih_y y1 y2 sqrt2 sqrt2 sqrt2 y6 + dih_y y1 sqrt2 y3 sqrt2 y5 sqrt2)) *
9320       #0.008`,
9321   (* {{{ proof *)
9322   [
9323   REPEAT WEAKER_STRIP_TAC;
9324   TYPIFY `&2 * hminus <= y1 /\ y1 <= &2 * hplus` (C SUBGOAL_THEN ASSUME_TAC);
9325     BY(ASM_MESON_TAC[Sphere.critical_edge_y]);
9326   MATCH_MP_TAC (arith `y > x ==> x<= y`);
9327   INTRO_TAC (Merge_ineq.get_pack_nonlinear_non_ox3q1h "TEWNSCJ") [`y1`;`y2`;`y3`;`y4`;`y5`;`y6`];
9328   ASM_REWRITE_TAC[Sphere.ineq;LET_DEF;LET_END_DEF];
9329   ONCE_REWRITE_TAC[TAUT `a \/ b <=> ~b ==> a`];
9330   REWRITE_TAC[DE_MORGAN_THM];
9331   ASM_REWRITE_TAC[Functional_equation.nonf_gamma23_full8_x;Sphere.y_of_x];
9332   REPEAT (GMATCH_SIMP_TAC (GSYM Merge_ineq.gamma3_x_gamma3f));
9333   ASM_SIMP_TAC[Merge_ineq.y_bounds];
9334   REWRITE_TAC[REWRITE_RULE[LET_DEF;LET_END_DEF] (GSYM Sphere.dih_y);GSYM Nonlinear_lemma.sqrt2_sqrt2];
9335   DISCH_THEN MATCH_MP_TAC;
9336   COMMENT "deal with assumptions";
9337   ASM_SIMP_TAC [arith `x <= y ==> ~(x > y)`];
9338   ASM_SIMP_TAC [arith `c <= d ==> ~(d < c)`];
9339   FIRST_X_ASSUM_ST `rad2_y` MP_TAC;
9340   REWRITE_TAC[Nonlin_def.sqrt2_sqrt2];
9341   REWRITE_TAC[Sphere.rad2_y;Sphere.y_of_x];
9342   BY(REAL_ARITH_TAC)
9343   ]);;
9344   (* }}} *)
9345
9346 let CC_3_AZIM_LT_PI_COPLANAR = prove_by_refinement(
9347   `!V u0 u1 w0 n f i .  pack_nonlinear_non_ox3q1h /\ 
9348          1 < n /\
9349          packing V /\
9350          saturated V /\
9351          s_leaf V [u0; u1] HAS_SIZE n /\
9352          u0 IN V /\
9353          u1 IN V /\
9354         periodic f n /\
9355          ~collinear {u0, u1, w0} /\
9356          critical_edge_y (dist (u0,u1)) /\
9357     ~cc_4 V u0 u1 f i /\
9358          leaf_rank V [u0; u1] w0 n f /\ azim u0 u1 (f i) (f (SUC i)) < pi ==>
9359     ~(coplanar {u0,u1,f i,f (SUC i)})`,
9360   (* {{{ proof *)
9361   [
9362   REPEAT WEAKER_STRIP_TAC;
9363   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
9364   ANTS_TAC;
9365     BY((ASM_REWRITE_TAC[]));
9366   REPEAT WEAKER_STRIP_TAC;
9367   FIRST_X_ASSUM_ST `coplanar` MP_TAC;
9368   REWRITE_TAC[GSYM Local_lemmas1.AZIM_COND_FOR_COPLANAR];
9369   ASM_SIMP_TAC[arith `x < y ==> ~(x = y)`];
9370   ASM_SIMP_TAC[Local_lemmas.AZIM_EQ_0_GE_ALT2];
9371   GMATCH_SIMP_TAC Local_lemmas1.DIJ_AFF_GE_PARTITION;
9372   REWRITE_TAC[IN_UNION];
9373   ASM_SIMP_TAC[Fan.th3a];
9374   REWRITE_TAC[DE_MORGAN_THM];
9375   CONJ_TAC;
9376     MATCH_MP_TAC Fan.th3c;
9377     BY(ASM_MESON_TAC[]);
9378   DISCH_TAC;
9379   TYPIFY `cc_A0 [u0;u1;f i] = cc_A0 [u0;u1;f (SUC i)]` (C SUBGOAL_THEN ASSUME_TAC);
9380     REWRITE_TAC[Leaf_cell.cc_A0;Bump.EL_EXPLICIT];
9381     MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
9382     BY(ASM_REWRITE_TAC[]);
9383   INTRO_TAC Leaf_cell.FCHKUGT [`V`;`u0`;`u1`;`f i`;`f (SUC i)`];
9384   ASM_REWRITE_TAC[];
9385   DISCH_TAC;
9386   INTRO_TAC DIST_I_SUCI [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
9387   ASM_REWRITE_TAC[DIST_REFL];
9388   BY(REAL_ARITH_TAC)
9389   ]);;
9390   (* }}} *)
9391
9392 let real_model_txq = prove_by_refinement(
9393   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
9394          1 < n /\
9395          packing V /\
9396          saturated V /\
9397          s_leaf V [u0; u1] HAS_SIZE n /\
9398          u0 IN V /\
9399          u1 IN V /\
9400         periodic f n /\
9401          ~collinear {u0, u1, w0} /\
9402          critical_edge_y (dist (u0,u1)) /\
9403          leaf_rank V [u0; u1] w0 n f
9404  ==>
9405  (!i. ~cc_4 V u0 u1 f i /\
9406       hl [u0; u1; f i] <  #1.34 /\
9407       hl [u0; u1; f (SUC i)] <  #1.34 /\
9408        #1.946 <= azim_mcell V f u0 u1 i /\
9409       azim_mcell V f u0 u1 i <=  #2.089
9410       ==>  #3.0 *  #0.0057 <= gg_mcell V f u0 u1 i)
9411 `,
9412   (* {{{ proof *)
9413   [
9414   REPEAT WEAKER_STRIP_TAC;
9415   INTRO_TAC real_model_cell23_008 [`V`;`u0`;`u1`;`w0`;`n`;`f`];
9416   ANTS_TAC;
9417     BY(ASM_REWRITE_TAC[]);
9418   TYPIFY `&2 * hminus <= dist (u0,u1) /\ dist(u0,u1) <= &2 * hplus` (C SUBGOAL_THEN ASSUME_TAC);
9419     FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
9420     BY((REWRITE_TAC[Sphere.critical_edge_y]) THEN REAL_ARITH_TAC);
9421   DISCH_THEN (C INTRO_TAC [`i`]);
9422   ASM_REWRITE_TAC[];
9423   MATCH_MP_TAC (arith `a <= l ==> (l <= g ==> a <= g)`);
9424   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
9425   ANTS_TAC;
9426     BY(ASM_REWRITE_TAC[]);
9427   REPEAT WEAKER_STRIP_TAC;
9428   ASM_REWRITE_TAC[];
9429   COMMENT "build asm list";
9430   INTRO_TAC JSP_BOUNDS [`u0`;`u1`;`f i`];
9431   INTRO_TAC JSP_BOUNDS [`u0`;`u1`;`f (SUC i)`];
9432   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
9433   REPEAT WEAKER_STRIP_TAC;
9434   TYPIFY `azim u0 u1 (f i) (f (SUC i)) < pi` (C SUBGOAL_THEN ASSUME_TAC);
9435     FIRST_X_ASSUM_ST `#2.089` MP_TAC;
9436     ASM_REWRITE_TAC[];
9437     MP_TAC Flyspeck_constants.bounds;
9438     BY(REAL_ARITH_TAC);
9439   INTRO_TAC CC_3_AZIM_LT_PI_COPLANAR [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
9440   ANTS_TAC;
9441     BY(ASM_REWRITE_TAC[]);
9442   DISCH_TAC;
9443   TYPIFY `&0 < delta_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i))) (dist(f i,f (SUC i)))       (dist (u1,f (SUC i)))      (dist (u1,f i))` (C SUBGOAL_THEN ASSUME_TAC);
9444     BY(ASM_REWRITE_TAC[GSYM coplanar_delta_y]);
9445   COMMENT "simplify goal+";
9446   REPEAT (GMATCH_SIMP_TAC critical_weight1);
9447   ASM_REWRITE_TAC[];
9448   ONCE_REWRITE_TAC[DIST_SYM];
9449   ASM_REWRITE_TAC[arith `x * &1 = x`];
9450   TYPIFY `azim u0 u1 (f i) (f (SUC i)) = dih_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i))) (dist(f i,f (SUC i)))       (dist (u1,f (SUC i)))      (dist (u1,f i))` (C SUBGOAL_THEN ASSUME_TAC);
9451     GMATCH_SIMP_TAC AZIM_DIHV_SAME;
9452     CONJ_TAC;
9453       BY(ASM_REWRITE_TAC[]);
9454     GMATCH_SIMP_TAC (REWRITE_RULE[LET_DEF;LET_END_DEF] Merge_ineq.DIHV_EQ_DIH_Y);
9455     BY(ASM_REWRITE_TAC[]);
9456   ASM_REWRITE_TAC[];
9457   REPEAT (FIRST_X_ASSUM_ST `DECIMAL` MP_TAC);
9458   ASM_REWRITE_TAC[];
9459   REPEAT WEAKER_STRIP_TAC;
9460   COMMENT "import inequality";
9461   INTRO_TAC TXQTPVC_MERGED [`(dist (u0,u1))`;` (dist (u0,f ( i)))`;` (dist (u0,f (SUC i)))`;`dist(f i,f (SUC i))`; ` (dist (u1,f (SUC i)))`;`(dist (u1,f ( i)))`];
9462   ANTS_TAC;
9463     ASM_SIMP_TAC[arith `x < y ==> x <= y`];
9464     CONJ_TAC;
9465       MATCH_MP_TAC DIST_I_SUCI;
9466       BY(ASM_MESON_TAC[]);
9467     CONJ_TAC;
9468       BY(MESON_TAC[DIST_TRIANGLE;DIST_SYM;arith `x + y = y + x`]);
9469     CONJ_TAC;
9470       INTRO_TAC RAD_PI_IMP_WEDGE4 [`V`;`f`;`w0`;`n`;`i`;`u0`;`u1`];
9471       ASM_REWRITE_TAC[];
9472       FIRST_X_ASSUM_ST `cc_4` MP_TAC;
9473       REWRITE_TAC[cc_4];
9474       DISCH_TAC;
9475       DISCH_THEN (MP_TAC o (MATCH_MP (TAUT `(b ==> a) ==> (~a ==> ~b)`)));
9476       ANTS_TAC;
9477         BY(FIRST_X_ASSUM MP_TAC THEN MESON_TAC[]);
9478       REWRITE_TAC[arith `~(r < s) <=> s <= r`];
9479       REWRITE_TAC[Sphere.rad2_y;Sphere.y_of_x;arith `x * x = x pow 2`];
9480       GMATCH_SIMP_TAC (GSYM (REWRITE_RULE[LET_DEF;LET_END_DEF] GDRQXLGv3));
9481       ASM_REWRITE_TAC[];
9482       DISCH_TAC;
9483       REWRITE_TAC[GSYM Nonlin_def.sqrt2_sqrt2;arith `x * x = x pow 2`];
9484       MATCH_MP_TAC Collect_geom2.POS_IMP_POW2;
9485       ASM_REWRITE_TAC[Sphere.sqrt2];
9486       GMATCH_SIMP_TAC SQRT_POS_LE;
9487       BY(REAL_ARITH_TAC);
9488     CONJ_TAC;
9489       MATCH_MP_TAC ETA_Y_LEMMA_ALT;
9490       BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
9491     MATCH_MP_TAC ETA_Y_LEMMA_ALT;
9492     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
9493   COMMENT "match ineq with goal";
9494   MATCH_MP_TAC (arith `(r = r') ==> (&3 * a <= r ==> #3.0 * a <= r')`);
9495   MATCH_MP_TAC (arith `(g1 = g1' /\ g2 = g2' /\ d1 = d1' /\ d2 = d2') ==> (g1 + g2 + (d - (d1 + d2))* #0.008 = g1' - #0.008 * d1' + g2' - #0.008 * d2' + #0.008 * d)`);
9496   GMATCH_SIMP_TAC mcell3_gammaXb_gamma3f;
9497   CONJ_TAC;
9498     GEXISTL_TAC [`w0`;`n`];
9499     BY(ASM_REWRITE_TAC[]);
9500   GMATCH_SIMP_TAC mcell3_gammaX_gamma3f;
9501   CONJ_TAC;
9502     GEXISTL_TAC [`w0`;`n`];
9503     BY(ASM_REWRITE_TAC[]);
9504   GMATCH_SIMP_TAC mcell3_dihXb_dih_y;
9505   CONJ_TAC;
9506     BY(ASM_MESON_TAC[]);
9507   REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF;Nonlin_def.sqrt2_sqrt2];
9508   GMATCH_SIMP_TAC mcell3_dihX_dih_y;
9509   CONJ_TAC;
9510     BY(ASM_MESON_TAC[]);
9511   REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF;Nonlin_def.sqrt2_sqrt2];
9512   BY(MESON_TAC[Nonlinear_lemma.dih_x_sym])
9513   ]);;
9514   (* }}} *)
9515
9516 let real_model_tew = prove_by_refinement(
9517   `!V u0 u1 w0 n f.  pack_nonlinear_non_ox3q1h /\ 
9518          1 < n /\
9519          packing V /\
9520          saturated V /\
9521          s_leaf V [u0; u1] HAS_SIZE n /\
9522          u0 IN V /\
9523          u1 IN V /\
9524         periodic f n /\
9525          ~collinear {u0, u1, w0} /\
9526          critical_edge_y (dist (u0,u1)) /\
9527          leaf_rank V [u0; u1] w0 n f
9528  ==>
9529  (!i. ~cc_4 V u0 u1 f i /\
9530       hl [u0; u1; f i] <  #1.34 /\
9531       hl [u0; u1; f (SUC i)] <  #1.34
9532       ==> a_spine5 + b_spine5 * azim_mcell V f u0 u1 i <=
9533           gg_mcell V f u0 u1 i)`,
9534   (* {{{ proof *)
9535   [
9536   REPEAT WEAKER_STRIP_TAC;
9537   INTRO_TAC real_model_cell23_008 [`V`;`u0`;`u1`;`w0`;`n`;`f`];
9538   ANTS_TAC;
9539     BY(ASM_REWRITE_TAC[]);
9540   TYPIFY `&2 * hminus <= dist (u0,u1) /\ dist(u0,u1) <= &2 * hplus` (C SUBGOAL_THEN ASSUME_TAC);
9541     FIRST_X_ASSUM_ST `critical_edge_y` MP_TAC;
9542     BY((REWRITE_TAC[Sphere.critical_edge_y]) THEN REAL_ARITH_TAC);
9543   DISCH_THEN (C INTRO_TAC [`i`]);
9544   ASM_REWRITE_TAC[];
9545   MATCH_MP_TAC (arith `a <= l ==> (l <= g ==> a <= g)`);
9546   INTRO_TAC CC_3_PROPS [`V`;`u0`;`u1`;`w0`;`n`;`f`;`i`];
9547   ANTS_TAC;
9548     BY(ASM_REWRITE_TAC[]);
9549   REPEAT WEAKER_STRIP_TAC;
9550   ASM_REWRITE_TAC[];
9551   COMMENT "build asm list";
9552   INTRO_TAC JSP_BOUNDS [`u0`;`u1`;`f i`];
9553   INTRO_TAC JSP_BOUNDS [`u0`;`u1`;`f (SUC i)`];
9554   ASM_SIMP_TAC[arith `x < y ==> x <= y`];
9555   REPEAT WEAKER_STRIP_TAC;
9556   COMMENT "simplify goal+";
9557   REPEAT (GMATCH_SIMP_TAC critical_weight1);
9558   ASM_REWRITE_TAC[];
9559   ONCE_REWRITE_TAC[DIST_SYM];
9560   ASM_REWRITE_TAC[arith `x * &1 = x`];
9561   TYPIFY `a_spine5 + b_spine5 * dih_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i))) y4      (dist (u1,f (SUC i)))      (dist (u1,f i))  <=  gammaX V (cc_cell V [u0; u1; f i]) lmfun -  #0.008 * dihX V (cc_cell V [u0; u1; f i]) (u0,u1) + gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun -  #0.008 * dihX V (cc_cell V [u1; u0; f (SUC i)]) (u0,u1) +  #0.008 * dih_y (dist (u0,u1)) (dist (u0,f i)) (dist (u0,f (SUC i))) y4      (dist (u1,f (SUC i)))      (dist (u1,f i))` ENOUGH_TO_SHOW_TAC;
9562     REWRITE_TAC[Sphere.b_spine5];
9563     REPEAT (FIRST_X_ASSUM_ST `dih_y` MP_TAC);
9564     BY(REAL_ARITH_TAC);
9565   COMMENT "import inequality";
9566   INTRO_TAC TEWNSCJ_MERGED [`(dist (u0,u1))`;` (dist (u0,f ( i)))`;` (dist (u0,f (SUC i)))`;`y4`; ` (dist (u1,f (SUC i)))`;`(dist (u1,f ( i)))`];
9567   ANTS_TAC;
9568     ASM_SIMP_TAC[arith `x < y ==> x <= y`];
9569     ASM_REWRITE_TAC[Nonlinear_lemma.sqrt8_sqrt2;Sphere.sqrt2];
9570     CONJ_TAC;
9571       MATCH_MP_TAC ETA_Y_LEMMA_ALT;
9572       BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
9573     MATCH_MP_TAC ETA_Y_LEMMA_ALT;
9574     BY(ASM_SIMP_TAC[arith `x < y ==> x <= y`]);
9575   COMMENT "match ineq with goal";
9576   MATCH_MP_TAC (arith `(r = r') ==> (a <= r ==> a <= r')`);
9577   MATCH_MP_TAC (arith `(g1 = g1' /\ g2 = g2' /\ d1 = d1' /\ d2 = d2') ==> (g1 + g2 + (d - (d1 + d2))* #0.008 = g1' - #0.008 * d1' + g2' - #0.008 * d2' + #0.008 * d)`);
9578   GMATCH_SIMP_TAC mcell3_gammaXb_gamma3f;
9579   CONJ_TAC;
9580     GEXISTL_TAC [`w0`;`n`];
9581     BY(ASM_REWRITE_TAC[]);
9582   GMATCH_SIMP_TAC mcell3_gammaX_gamma3f;
9583   CONJ_TAC;
9584     GEXISTL_TAC [`w0`;`n`];
9585     BY(ASM_REWRITE_TAC[]);
9586   GMATCH_SIMP_TAC mcell3_dihXb_dih_y;
9587   CONJ_TAC;
9588     BY(ASM_MESON_TAC[]);
9589   REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF;Nonlin_def.sqrt2_sqrt2];
9590   GMATCH_SIMP_TAC mcell3_dihX_dih_y;
9591   CONJ_TAC;
9592     BY(ASM_MESON_TAC[]);
9593   REWRITE_TAC[Sphere.dih_y;LET_DEF;LET_END_DEF;Nonlin_def.sqrt2_sqrt2];
9594   BY(MESON_TAC[Nonlinear_lemma.dih_x_sym])
9595   ]);;
9596   (* }}} *)
9597
9598 let intro_real_model th = 
9599   INTRO_TAC th [`V:real^3->bool`;`u0:real^3`;`u1:real^3`;`w0:real^3`;`n:num`;`f:num->real^3`] THEN
9600   ANTS_TAC THEN ASM_REWRITE_TAC[] THEN (DISCH_THEN (unlist REWRITE_TAC));;
9601
9602 let cc_real_model_data = prove_by_refinement(
9603   `!V f w0 n u0 u1.
9604          pack_nonlinear_non_ox3q1h /\ ox3q1h /\
9605          1 < n /\
9606          packing V /\
9607          saturated V /\
9608          s_leaf V [u0; u1] HAS_SIZE n /\
9609          u0 IN V /\
9610          u1 IN V /\
9611         periodic f n /\
9612          ~collinear {u0, u1, w0} /\
9613          critical_edge_y (dist (u0,u1)) /\
9614          leaf_rank V [u0; u1] w0 n f
9615          ==> cc_real_model_v11 (cc_data_v8 V f u0 u1)`,
9616   (* {{{ proof *)
9617   [
9618   REPEAT WEAKER_STRIP_TAC;
9619   REWRITE_TAC[Oxl_def.cc_real_model_v11;cc_real_data;cc_bool_data;cc_card_data;GSYM cc_4;cc_real_dat_def;Oxl_def.cc_eps];
9620   TYPIFY `periodic (azim_mcell V f u0 u1) (CARD (s_leaf V [u0; u1])) /\  periodic (gg_mcell V f u0 u1) (CARD (s_leaf V [u0; u1])) /\ periodic (\i. gammaX V (cc_cell V [u0; u1; f i]) lmfun * critical_weight V (cc_cell V [u0; u1; f i])) (CARD (s_leaf V [u0; u1])) /\ periodic (\i. gammaX V (cc_cell V [u1; u0; f (SUC i)]) lmfun * critical_weight V (cc_cell V [u1; u0; f (SUC i)])) (CARD (s_leaf V [u0; u1]))` (C SUBGOAL_THEN (unlist REWRITE_TAC));
9621     BY(ASM_MESON_TAC[real_periodic_data;HAS_SIZE]);
9622   TYPIFY `( 0..CARD (s_leaf V [u0;u1]) - 1) = {i | i < n}` (C SUBGOAL_THEN SUBST1_TAC);
9623     BY(ASM_MESON_TAC[NUMSEG_LT;arith `1 < n==> ~(n = 0)`;HAS_SIZE]);
9624   REWRITE_TAC[arith `!i. i + 1 = SUC i`];
9625   intro_real_model real_model_ox3q1h_merge;
9626   intro_real_model real_model_azim_c4;
9627   intro_real_model real_model_gamma_qu;
9628   intro_real_model real_model_fhbv2;
9629   intro_real_model real_model_fhbv2_sym;
9630   intro_real_model real_model_gckb;
9631   intro_real_model real_model_sum_azim;
9632   intro_real_model real_model_quqy;
9633   intro_real_model real_model_quqy_sym;
9634   intro_real_model real_model_ztg4;
9635   intro_real_model real_model_azim1;
9636   intro_real_model real_model_gaz4;
9637   intro_real_model real_model_gaz6;
9638   intro_real_model real_model_gamma_qx;
9639   intro_real_model real_model_g_qxd;
9640   intro_real_model real_model_gamma10;
9641   intro_real_model real_model_gamma11;
9642   intro_real_model real_model_gamma8;
9643   intro_real_model real_model_gamma8b;
9644   intro_real_model real_model_gaz9;
9645   intro_real_model real_model_azim2;
9646   intro_real_model real_model_cell23;
9647   intro_real_model real_model_3a;
9648   intro_real_model real_model_3b;
9649   intro_real_model real_model_gr;
9650   intro_real_model real_model_pema;
9651   intro_real_model real_model_pemb;
9652   intro_real_model real_model_tew;
9653   BY(intro_real_model real_model_txq)
9654   ]);;
9655   (* }}} *)
9656
9657 let CELL_CLUSTER_ESTIMATE_PROPS = prove_by_refinement(
9658 `!V. packing V /\ saturated V /\  ~cell_cluster_estimate_v1 V /\ pack_nonlinear_non_ox3q1h /\ ox3q1h
9659     ==> (?u0 u1 n f. 
9660     1 < n /\
9661     sum {i | i < n} (gg_mcell V f (u0) (u1)) < &0 /\ 
9662     n = cc_card_v11 (cc_data_v8 V f u0 u1) /\
9663    cc_bool_model_v11 (cc_data_v8 V f u0 u1) /\
9664    cc_bool_prep_v11 (cc_data_v8 V f u0 u1) /\
9665     cc_real_model_v11 (cc_data_v8 V f u0 u1))`,
9666   (* {{{ proof *)
9667   [
9668   REPEAT WEAKER_STRIP_TAC;
9669   INTRO_TAC (* Oxlzlez. *)LEAF_RANK_PROPS [`V`];
9670   ASM_REWRITE_TAC[HAS_SIZE;(* Oxlzlez. *)cc_card_data];
9671   REPEAT WEAKER_STRIP_TAC;
9672   GEXISTL_TAC [`u0`;`u1`;`n`;`f`];
9673   ASM_REWRITE_TAC[];
9674   MATCH_MP_TAC (* Oxlzlez. *)cc_real_model_data;
9675   GEXISTL_TAC [`w0`;`n`];
9676   BY((ASM_REWRITE_TAC[HAS_SIZE]))
9677   ]);;
9678   (* }}} *)
9679
9680 let OXLZLEZ = prove_by_refinement(
9681   `!V. pack_nonlinear_non_ox3q1h /\ ox3q1h /\ packing V /\ saturated V   ==>
9682     cell_cluster_estimate_v1 V`,
9683   (* {{{ proof *)
9684   [
9685   REPEAT WEAKER_STRIP_TAC;
9686   PROOF_BY_CONTR_TAC;
9687   INTRO_TAC CELL_CLUSTER_ESTIMATE_PROPS [`V`];
9688   ASM_REWRITE_TAC[];
9689   REPEAT WEAKER_STRIP_TAC;
9690   INTRO_TAC Oxl_2012.GRHIDFA [`cc_data_v8 V f u0 u1`];
9691   ASM_REWRITE_TAC[(* Oxlzlez. *)cc_real_data];
9692   TYPIFY_GOAL_THEN `(0..(n-1)) =  {i | i < n}` (unlist ASM_MESON_TAC);
9693   REWRITE_TAC[EXTENSION;IN_ELIM_THM;IN_NUMSEG];
9694   BY(ASM_TAC THEN ARITH_TAC)
9695   ]);;
9696   (* }}} *)
9697
9698 let PACKING_CHAPTER_MAIN_CONCLUSION = prove_by_refinement(
9699   `~kepler_conjecture /\ pack_nonlinear_non_ox3q1h /\ ox3q1h ==>
9700     (?V. packing V /\ V SUBSET ball_annulus /\ ~lmfun_ineq_center V)`,
9701   (* {{{ proof *)
9702   [
9703   REPEAT WEAKER_STRIP_TAC;
9704   MATCH_MP_TAC Rdwkarc.RDWKARC;
9705   ASM_REWRITE_TAC[];
9706   CONJ_TAC;
9707     REPEAT WEAKER_STRIP_TAC;
9708     MATCH_MP_TAC OXLZLEZ;
9709     BY(ASM_REWRITE_TAC[]);
9710   REWRITE_TAC[Pack_concl.TSKAJXY_statement];
9711   REPEAT WEAKER_STRIP_TAC;
9712   MATCH_MP_TAC Tskajxy.TSKAJXY;
9713   BY(ASM_REWRITE_TAC[])
9714   ]);;
9715   (* }}} *)
9716
9717  end;;