Update from HH
[Flyspeck/.git] / text_formalization / packing / marchal_cells_3.hl
1
2 (* ========================================================================= *)
3 (*                FLYSPECK - BOOK FORMALIZATION                              *)
4 (*                                                                           *)
5 (*      Authour   : VU KHAC KY                                               *)
6 (*      Book lemma:                                                          *)
7 (*      Chaper    : Packing (Marchal Cells 3)                                *)
8 (*      Date : May 14 2012                                                   *)
9 (* ========================================================================= *)
10
11 module Marchal_cells_3 = struct
12
13 open Sphere;;
14 open Euler_main_theorem;;
15 open Pack_defs;;
16 open Pack_concl;; 
17 open Pack1;;
18 open Pack2;;
19 open Packing3;;
20 open Rogers;; 
21 open Vukhacky_tactics;;
22 open Marchal_cells;;
23 open Emnwuus;;
24 (* open Marchal_cells_2;; *)
25 open Marchal_cells_2_new;;
26 open Urrphbz1;;
27 open Lepjbdj;;
28 open Hdtfnfz;;
29 open Rvfxzbu;;
30 open Sltstlo;;
31 open Urrphbz2;;
32 open Urrphbz3;;
33 open Ynhyjit;;
34 open Njiutiu;;
35 open Tezffsk;;
36 open Qzksykg;;
37 open Ddzuphj;;
38 open Ajripqn;;
39 open Qzyzmjc;;
40 open Upfzbzm_support_lemmas;;
41
42
43 let TAKE_TAC = UP_ASM_TAC THEN REPEAT STRIP_TAC;;
44 (* ==================================================================== *)
45 (* Lemma 1 *)
46
47 let HD_IN_ROGERS = prove (
48  `!V ul. saturated V /\ packing V /\ barV V 3 ul ==> HD ul IN rogers V ul`,
49 REPEAT STRIP_TAC THEN 
50 ASM_SIMP_TAC[ROGERS_EXPLICIT] THEN 
51 MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET THEN SET_TAC[]);; 
52
53 (* ==================================================================== *)
54 (* Lemma 2 *)
55
56 let ROGERS_SUBSET_VORONOI_CLOSED = prove_by_refinement (
57  `!V ul. saturated V /\ packing V /\ barV V 3 ul ==> 
58           rogers V ul SUBSET voronoi_closed V (HD ul)`,
59 [(REPEAT STRIP_TAC);
60  (ASM_SIMP_TAC[ROGERS_EXPLICIT]);
61  (NEW_GOAL `voronoi_closed V (HD ul) = 
62    convex hull (voronoi_closed V ((HD ul):real^3))`);
63  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
64  (REWRITE_TAC[CONVEX_HULL_EQ]);
65  (REWRITE_TAC[Packing3.CONVEX_VORONOI_CLOSED]);
66  (ONCE_ASM_REWRITE_TAC[]);
67  (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
68
69  (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
70  (MATCH_MP_TAC BARV_3_EXPLICIT);
71  (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
72  (UP_ASM_TAC THEN STRIP_TAC);
73
74  (REWRITE_TAC[GSYM OMEGA_LIST_N]);
75  (REWRITE_WITH `voronoi_closed V (omega_list_n V ul 0) = 
76                  voronoi_list V (truncate_simplex 0 ul)`);
77  (ASM_REWRITE_TAC[OMEGA_LIST_N; TRUNCATE_SIMPLEX_EXPLICIT_0; VORONOI_LIST; 
78    VORONOI_SET; set_of_list; HD] THEN SET_TAC[]);
79
80  (NEW_GOAL `omega_list_n V ul 0 IN 
81    voronoi_list V (truncate_simplex 0 ul)`);
82  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
83  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
84  (NEW_GOAL `omega_list_n V ul 1 IN 
85    voronoi_list V (truncate_simplex 0 ul)`);
86  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
87  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
88  (NEW_GOAL `omega_list_n V ul 2 IN 
89    voronoi_list V (truncate_simplex 0 ul)`);
90  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
91  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
92  (NEW_GOAL `omega_list_n V ul 3 IN 
93    voronoi_list V (truncate_simplex 0 ul)`);
94  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
95  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
96  (ASM_SET_TAC[])]);;
97
98 (* ==================================================================== *)
99 (* Lemma 3 *)
100
101 let HD_IN_MCELL = prove_by_refinement (
102  `!V ul i r X . 
103       packing V /\ 
104       saturated V /\ 
105       barV V 3 ul /\ 
106       X = mcell i V ul /\ 
107      ~(X = {}) /\ ~(i = 0)
108      ==> (HD ul IN X)`,
109 [(REPEAT STRIP_TAC);
110  (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
111  (MATCH_MP_TAC BARV_3_EXPLICIT);
112  (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
113  (UP_ASM_TAC THEN STRIP_TAC);
114
115  (ASM_REWRITE_TAC[HD]);
116  (ASM_CASES_TAC `i = 1`);
117  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell1]);
118  (COND_CASES_TAC);
119  (ASM_SIMP_TAC[IN_DIFF;IN_INTER; HD; TL; IN_CBALL; DIST_REFL;  
120    TRUNCATE_SIMPLEX_EXPLICIT_1; rcone_gt; rconesgn]);
121  (REPEAT STRIP_TAC);
122  (REWRITE_WITH `u0 = HD ul /\ [u0; u1; u2; u3:real^3] = ul`);
123  (ASM_REWRITE_TAC[HD]);
124  (MATCH_MP_TAC HD_IN_ROGERS);
125  (ASM_REWRITE_TAC[]);
126  (MATCH_MP_TAC SQRT_POS_LE);
127  (REAL_ARITH_TAC);
128  (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM; VECTOR_ARITH 
129   `(u0 - u0) dot (u1 - u0) = &0`; DIST_REFL]);
130  (REAL_ARITH_TAC);
131  (NEW_GOAL `F`);
132  (NEW_GOAL `X:real^3->bool = {}`);
133  (REWRITE_TAC[ASSUME `X = mcell i V ul`; ASSUME `i = 1`; MCELL_EXPLICIT; mcell1]);
134  (COND_CASES_TAC);
135  (NEW_GOAL `F`);
136  (ASM_MESON_TAC[]);
137  (ASM_MESON_TAC[]);
138  (REFL_TAC);
139  (ASM_MESON_TAC[]);
140  (ASM_MESON_TAC[]);
141
142  (ASM_CASES_TAC `i = 2`);
143  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
144  (COND_CASES_TAC);
145  (LET_TAC);
146  (ASM_SIMP_TAC[IN_INTER; HD; TL; DIST_REFL;  
147    TRUNCATE_SIMPLEX_EXPLICIT_1; rcone_ge; rconesgn; IN; IN_ELIM_THM]);
148  (REPEAT STRIP_TAC);
149  (REWRITE_TAC[VECTOR_ARITH `(u0 - u0) dot (u1 - u0) = &0`]);
150  (REAL_ARITH_TAC);
151  (REWRITE_TAC[GSYM NORM_POW_2; GSYM dist; REAL_POW_2]);
152  (REWRITE_TAC[REAL_ARITH `a * a >= a * a * b <=> &0 <= a * a * (&1 - b)`]);
153  (MATCH_MP_TAC REAL_LE_MUL);
154  (REWRITE_TAC[DIST_POS_LE]);
155  (MATCH_MP_TAC REAL_LE_MUL);
156  (REWRITE_TAC[DIST_POS_LE]);
157  (ABBREV_TAC `s = hl (truncate_simplex 1 [u0; u1; u2; u3:real^3])`);
158  (EXPAND_TAC "a");
159  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
160  (REWRITE_WITH `s / sqrt (&2) <= &1 <=> s <= &1 * sqrt (&2)`);
161  (MATCH_MP_TAC REAL_LE_LDIV_EQ);
162  (MATCH_MP_TAC SQRT_POS_LT THEN REAL_ARITH_TAC);
163  (ASM_REAL_ARITH_TAC);
164
165  (REWRITE_WITH `[u0; u1; u2; u3:real^3] = ul`);
166  (ASM_REWRITE_TAC[]);
167  (ABBREV_TAC `m = mxi V ul`);
168  (ABBREV_TAC `s3 = omega_list_n V ul 3`);
169  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} u0 <=>
170                  u0 IN aff_ge {u0, u1} {m, s3}`);
171  (REWRITE_TAC[IN]);
172  (NEW_GOAL `u0 IN convex hull {u0,u1,m,s3:real^3}`);
173  (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
174  (SET_TAC[]);
175  (NEW_GOAL `convex hull {u0,u1,m,s3:real^3} SUBSET aff_ge {u0, u1} {m, s3}`);
176  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
177  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
178  (NEW_GOAL `F`);
179  (NEW_GOAL `X:real^3->bool = {}`);
180  (REWRITE_TAC[ASSUME `X = mcell i V ul`; ASSUME `i = 2`; MCELL_EXPLICIT; mcell2]);
181  (COND_CASES_TAC);
182  (NEW_GOAL `F`);
183  (ASM_MESON_TAC[]);
184  (ASM_MESON_TAC[]);
185  (REFL_TAC);
186  (ASM_MESON_TAC[]);
187  (ASM_MESON_TAC[]);
188
189  (ASM_CASES_TAC `i = 3`);
190  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
191  (COND_CASES_TAC);
192  (REWRITE_TAC[set_of_list;TRUNCATE_SIMPLEX_EXPLICIT_2]);
193  (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
194  (SET_TAC[]);
195  (NEW_GOAL `F`);
196  (NEW_GOAL `X:real^3->bool = {}`);
197  (REWRITE_TAC[ASSUME `X = mcell i V ul`; ASSUME `i = 3`; MCELL_EXPLICIT; mcell3]);
198  (COND_CASES_TAC);
199  (NEW_GOAL `F`);
200  (ASM_MESON_TAC[]);
201  (ASM_MESON_TAC[]);
202  (REFL_TAC);
203  (ASM_MESON_TAC[]);
204  (ASM_MESON_TAC[]);
205
206  (ASM_CASES_TAC `i >= 4`);
207  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4]);
208  (COND_CASES_TAC);
209  (REWRITE_TAC[set_of_list]);
210  (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
211  (SET_TAC[]);
212  (NEW_GOAL `F`);
213  (NEW_GOAL `X:real^3->bool = {}`);
214  (SIMP_TAC[ASSUME `X = mcell i V ul`; ASSUME `i >= 4`; MCELL_EXPLICIT; mcell4]);
215  (COND_CASES_TAC);
216  (NEW_GOAL `F`);
217  (ASM_MESON_TAC[]);
218  (ASM_MESON_TAC[]);
219  (REFL_TAC);
220  (ASM_MESON_TAC[]);
221  (ASM_MESON_TAC[]);
222
223  (NEW_GOAL `F`);
224  (ASM_ARITH_TAC);
225  (ASM_MESON_TAC[])]);;
226
227
228 (* ==================================================================== *)
229 (* Lemma 4 *)
230
231 let FINITE_MCELL_SET_lemma1 = prove_by_refinement (
232  `!V ul i r X . 
233       packing V /\ 
234       saturated V /\ 
235       barV V 3 ul /\ 
236       X = mcell i V ul /\ 
237       X SUBSET ball (vec 0, r) /\ 
238      ~(X = {}) 
239      ==> (!u. u IN set_of_list ul ==> u IN ball (vec 0, r + &6))`,
240 [(REPEAT STRIP_TAC);
241
242 (* Case i = 0 *)
243  (ASM_CASES_TAC `i = 0`);
244  (UNDISCH_TAC `X = mcell i V ul`THEN ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
245  (STRIP_TAC);
246  (NEW_GOAL `!s. s IN rogers V ul ==> dist (HD ul, s) < &2`);
247  (REPEAT STRIP_TAC);
248  (NEW_GOAL `rogers V ul SUBSET voronoi_closed V (HD ul)`);
249  (ASM_SIMP_TAC[ROGERS_SUBSET_VORONOI_CLOSED]);
250  (NEW_GOAL `s:real^3 IN voronoi_closed V (HD ul)`);
251  (ASM_SET_TAC[]);
252  (UNDISCH_TAC `saturated (V:real^3->bool)`);
253  (REWRITE_TAC[saturated]);
254  (REPEAT STRIP_TAC);
255  (NEW_GOAL `?y. y IN V /\ dist (s, y:real^3) < &2`);
256  (ASM_MESON_TAC[]);
257  (UP_ASM_TAC THEN STRIP_TAC);
258  (UNDISCH_TAC `s:real^3 IN voronoi_closed V (HD ul)` THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
259  (REPEAT STRIP_TAC);
260  (NEW_GOAL `dist (s,HD ul) <= dist (s,y:real^3)`);
261  (FIRST_ASSUM MATCH_MP_TAC);
262  (ASM_SET_TAC[]);
263  (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC);
264  (NEW_GOAL `?s. s:real^3 IN X`);
265  (ASM_SET_TAC[]);
266  (UP_ASM_TAC THEN STRIP_TAC);
267  (NEW_GOAL `dist (HD ul, s:real^3) < &2`);
268  (FIRST_ASSUM MATCH_MP_TAC);
269  (ASM_SET_TAC[]);
270
271  (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET ball (HD ul,&4)`);
272  (MATCH_MP_TAC BARV_3_IMP_FINITE_lemma2);
273  (EXISTS_TAC `V:real^3->bool`);
274  (ASM_REWRITE_TAC[]);
275  (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
276  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
277                  CARD (set_of_list ul) = 3 + 1`);
278  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
279  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
280  (ARITH_TAC);
281  (NEW_GOAL `u:real^3 IN ball (HD ul, &4)`);
282  (ASM_SET_TAC[]);
283  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
284  (STRIP_TAC);
285  (NEW_GOAL `dist (vec 0,u) <= dist (vec 0, s) + dist (s, u:real^3)`);
286  (REWRITE_TAC[DIST_TRIANGLE]);
287  (NEW_GOAL `dist (s, u) <= dist (s, HD ul) + dist (HD ul, u:real^3)`);
288  (REWRITE_TAC[DIST_TRIANGLE]);
289  (NEW_GOAL `dist (vec 0,u) <=  
290    dist (vec 0,s) + dist (s,HD ul) + dist (HD ul,u:real^3)`);
291  (ASM_REAL_ARITH_TAC);
292  (NEW_GOAL `dist (s:real^3, HD ul) < &2`);
293  (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
294  (NEW_GOAL `dist (vec 0,s:real^3) < r`);
295  (REWRITE_TAC[GSYM IN_BALL]);
296  (ASM_SET_TAC[]);
297  (ASM_REAL_ARITH_TAC);
298
299 (* Case i != 0 *)
300
301  (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
302  (MATCH_MP_TAC BARV_3_EXPLICIT);
303  (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
304  (UP_ASM_TAC THEN STRIP_TAC);
305  (NEW_GOAL `(HD ul):real^3 IN X`);
306  (MATCH_MP_TAC HD_IN_MCELL);
307  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i:num`);
308  (ASM_REWRITE_TAC[]);
309  (NEW_GOAL `(HD ul):real^3 IN ball (vec 0, r)`);
310  (ASM_SET_TAC[]);
311  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
312  (NEW_GOAL `dist (vec 0,u) <= dist (vec 0,HD ul) + dist (HD ul, u:real^3)`);
313  (REWRITE_TAC[DIST_TRIANGLE]);
314  (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET ball (HD ul,&4)`);
315  (MATCH_MP_TAC BARV_3_IMP_FINITE_lemma2);
316  (EXISTS_TAC `V:real^3->bool`);
317  (ASM_REWRITE_TAC[HD; set_of_list]);
318  (SET_TAC[]);
319  (NEW_GOAL `u:real^3 IN ball (HD ul, &4)`);
320  (ASM_SET_TAC[]);
321  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
322  (STRIP_TAC);
323  (ASM_REAL_ARITH_TAC)]);;
324
325
326 (* ==================================================================== *)
327 (* Lemma 5 *)
328
329 let FINITE_MCELL_SET_LEMMA_concl = 
330    `!V r. packing V /\ saturated V ==> 
331           FINITE {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}`;;
332 let FINITE_MCELL_SET_LEMMA = prove_by_refinement (
333  FINITE_MCELL_SET_LEMMA_concl,
334
335 [(REPEAT STRIP_TAC);
336  (REWRITE_WITH `FINITE {X | X SUBSET ball (vec 0,r) /\ mcell_set V X} <=>
337    FINITE {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
338  (ASM_CASES_TAC `{} IN {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}`);
339  (REWRITE_WITH `{X | X SUBSET ball (vec 0,r) /\ mcell_set V X} = 
340    {} INSERT {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
341  (ONCE_REWRITE_TAC[SET_RULE `A = B <=> B SUBSET A /\ A SUBSET B`]);
342  (REPEAT STRIP_TAC);
343  (REWRITE_TAC[INSERT_SUBSET]);
344  (ASM_REWRITE_TAC[]);
345  (SET_TAC[]);
346  (REWRITE_TAC[SUBSET_INSERT_DELETE]);
347  (ONCE_REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN_DELETE] THEN REWRITE_TAC[IN_ELIM_THM]);
348  (SET_TAC[]);
349  (REWRITE_TAC[FINITE_INSERT]);
350  (REWRITE_WITH `{X | X SUBSET ball (vec 0,r) /\ mcell_set V X} = 
351   {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
352  (ONCE_REWRITE_TAC[SET_RULE `A = B <=> B SUBSET A /\ A SUBSET B`]);
353  (REPEAT STRIP_TAC);
354  (SET_TAC[]);
355  (ONCE_REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] 
356    THEN REWRITE_TAC[IN_ELIM_THM]);
357  (REPEAT STRIP_TAC);
358  (ASM_REWRITE_TAC[]);
359  (ASM_REWRITE_TAC[]);
360  (NEW_GOAL `{} IN {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}`);
361  (ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
362  (ASM_MESON_TAC[]);
363  (ASM_MESON_TAC[]);
364
365  (ABBREV_TAC 
366   `S = {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
367  (ABBREV_TAC `s1:(real^3->bool) = V INTER ball (vec 0, r + &6)`);
368  (ABBREV_TAC `s2 = {ul:(real^3)list |  ?u0 u1 u2 u3.
369                u0 IN s1 /\
370                u1 IN s1 /\
371                u2 IN s1 /\
372                u3 IN s1 /\
373                ul = [u0; u1; u2; u3]}`);
374  (ABBREV_TAC `s3 = {(i:num, ul:(real^3)list) | i IN 0..4 /\ ul IN s2}`);
375  (NEW_GOAL`S SUBSET {X| ?t. t IN s3 /\ X = (\t. mcell (FST t) V (SND t)) t}`);
376  (EXPAND_TAC "S" THEN EXPAND_TAC "s3");
377  (ONCE_REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN  
378    REWRITE_TAC[IN_ELIM_THM; FST; SND; mcell_set]);
379  (REPEAT STRIP_TAC);
380  (EXISTS_TAC `((if i <= 4 then i else 4), ul:(real^3)list)`);
381  (ASM_REWRITE_TAC[FST;SND]);
382  (REPEAT STRIP_TAC);
383  (EXISTS_TAC `(if i <= 4 then i else 4)` THEN EXISTS_TAC `ul:(real^3)list`);
384  (REWRITE_TAC[]);
385  (REPEAT STRIP_TAC);
386  (COND_CASES_TAC);
387  (ASM_REWRITE_TAC[IN_NUMSEG_0]);
388  (ASM_REWRITE_TAC[IN_NUMSEG_0] THEN ARITH_TAC);
389  (EXPAND_TAC "s2");
390  (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
391  (MATCH_MP_TAC BARV_3_EXPLICIT);
392  (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
393  (UP_ASM_TAC THEN STRIP_TAC THEN ONCE_REWRITE_TAC[IN]);
394  (REWRITE_TAC[IN_ELIM_THM]);
395  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
396  (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
397  (ASM_REWRITE_TAC[]);
398
399  (NEW_GOAL `!u:real^3. u IN set_of_list ul ==> u IN s1`);
400  (EXPAND_TAC "s1" THEN REPEAT STRIP_TAC);
401  (REWRITE_TAC[IN_INTER]);
402  (STRIP_TAC);
403  (NEW_GOAL `set_of_list ul SUBSET (V:real^3->bool)`);
404  (MATCH_MP_TAC Packing3.BARV_SUBSET);
405  (EXISTS_TAC `3` THEN ASM_MESON_TAC[IN]);
406  (ASM_SET_TAC[]);
407  (NEW_GOAL `!u:real^3. u IN set_of_list ul ==> u IN ball (vec 0,r + &6)`);
408  (MATCH_MP_TAC FINITE_MCELL_SET_lemma1);
409  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i:num` THEN 
410    EXISTS_TAC `x:real^3->bool`);
411  (ASM_MESON_TAC[IN]);
412  (ASM_SIMP_TAC[]);
413  (REPEAT STRIP_TAC);
414  (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
415  (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
416  (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
417  (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
418
419  (COND_CASES_TAC);
420  (REFL_TAC);
421  (NEW_GOAL `i >= 4`);
422  (ASM_ARITH_TAC);
423  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
424  (MATCH_MP_TAC FINITE_SUBSET);
425
426  (EXISTS_TAC `{X | ?t. t IN s3 /\ X = (\t. mcell (FST t) V (SND t)) t}`);
427  (ASM_REWRITE_TAC[]);
428  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
429  (EXPAND_TAC "s3");
430  (MATCH_MP_TAC FINITE_PRODUCT);
431  (REWRITE_TAC[FINITE_NUMSEG]);
432  (EXPAND_TAC "s2");
433  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
434  (EXPAND_TAC "s1");
435  (MATCH_MP_TAC Packing3.KIUMVTC);
436  (ASM_REWRITE_TAC[])]);;
437
438
439
440 (* ==================================================================== *)
441 (* Lemma 6 *)
442
443 let CARD_BOUNDARY_INT_BALL_BOUND_1 = prove_by_refinement (
444  `!x k1 k2. &0 < k1 /\ &0 < k2 ==>
445   (?C. !r. &1 <= r ==>
446       &(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= C * r pow 2)`,
447 [(REPEAT STRIP_TAC);
448  (NEW_GOAL `?C. !r. k2 + sqrt (&3) <= r
449                       ==> &(CARD
450                            (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
451                           C * r pow 2`);
452  (MATCH_MP_TAC Vol1.bdt5_finiteness);
453  (ASM_REWRITE_TAC[]);
454  (TAKE_TAC);
455  (ABBREV_TAC `D = &(CARD (int_ball x ((k2 + sqrt (&3)) + k1)))`);
456  (EXISTS_TAC `max C D`);
457  (REPEAT STRIP_TAC);
458  (ASM_CASES_TAC `k2 + sqrt (&3) <= r`);
459  (NEW_GOAL 
460   `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= C * r pow 2`);
461  (ASM_SIMP_TAC[]);
462  (NEW_GOAL `C * r pow 2 <= max C D * r pow 2`);
463  (REWRITE_TAC[REAL_ARITH `a * b <= c * b <=> &0 <= (c - a) * b`]);
464  (MATCH_MP_TAC REAL_LE_MUL);
465  (REWRITE_TAC[REAL_LE_POW_2]);
466  (REAL_ARITH_TAC);
467  (ASM_REAL_ARITH_TAC);
468
469  (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= 
470    &(CARD (int_ball x (r + k1)))`);
471  (REWRITE_TAC[REAL_OF_NUM_LE]);
472  (MATCH_MP_TAC CARD_SUBSET);
473  (STRIP_TAC);
474  (SET_TAC[]);
475  (REWRITE_TAC[Vol1.finite_int_ball]);
476
477  (NEW_GOAL `&(CARD (int_ball x (r + k1))) <= D * r pow 2`);
478  (NEW_GOAL `&(CARD (int_ball x (r + k1))) <= D`);
479  (EXPAND_TAC "D");
480  (REWRITE_TAC[REAL_OF_NUM_LE]);
481  (MATCH_MP_TAC CARD_SUBSET);
482  (REWRITE_TAC[Vol1.finite_int_ball; int_ball; Pack1.hinhcau_ball; SUBSET;    
483    IN_INTER; IN_BALL]);
484  (REWRITE_TAC[IN; IN_ELIM_THM]);
485  (REPEAT STRIP_TAC);
486  (ASM_SIMP_TAC[]);
487  (NEW_GOAL `r + k1 <= (k2 + sqrt (&3)) + k1`);
488  (ASM_REAL_ARITH_TAC);
489  (ASM_REAL_ARITH_TAC);
490  (NEW_GOAL `D <= D * r pow 2`);
491  (REWRITE_TAC[REAL_ARITH `a <= a * b <=> &0 <= a * (b - &1)`]);
492  (MATCH_MP_TAC REAL_LE_MUL);
493  (STRIP_TAC);
494  (EXPAND_TAC "D" THEN REWRITE_TAC[REAL_OF_NUM_LE; LE_0]);
495  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
496  (ONCE_REWRITE_TAC[REAL_ARITH `&1 = (&1) pow 2`]);
497  (REWRITE_WITH `(&1) pow 2 <= r pow 2 <=> &1 <= r`);
498  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Collect_geom.POW2_COND_LT);
499  (ASM_REAL_ARITH_TAC);
500  (ASM_REAL_ARITH_TAC);
501  (ASM_REAL_ARITH_TAC);
502  (NEW_GOAL `D * r pow 2 <= max C D * r pow 2`);
503  (REWRITE_TAC[REAL_ARITH `a * b <= c * b <=> &0 <= (c - a) * b`]);
504  (MATCH_MP_TAC REAL_LE_MUL);
505  (REWRITE_TAC[REAL_LE_POW_2]);
506  (REAL_ARITH_TAC);
507  (ASM_REAL_ARITH_TAC)]);;
508
509 (* ==================================================================== *)
510 (* Lemma 7 *)
511 (* The following is a simplified version of Vol1.bdt5_finiteness, Vol1.bdt7_finiteness *)
512
513 let CARD_BOUNDARY_INT_BALL_BOUND = prove_by_refinement (
514  `!x k1 k2. 
515   (?C. !r. &1 <= r ==>
516       &(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= C * r pow 2)`,
517 [(REPEAT STRIP_TAC);
518  (ASM_CASES_TAC `&0 < k1 /\ &0 < k2`);
519  (ASM_MESON_TAC[CARD_BOUNDARY_INT_BALL_BOUND_1]);
520  (ASM_CASES_TAC `&0 < k2`);
521  (NEW_GOAL 
522   `(?C. !r. &1 <= r ==>
523       &(CARD (int_ball x (r + &1) DIFF int_ball x (r - k2))) <= C * r pow 2)`);
524  (MATCH_MP_TAC CARD_BOUNDARY_INT_BALL_BOUND_1);
525  (ASM_REAL_ARITH_TAC);
526  (TAKE_TAC);
527  (EXISTS_TAC `C:real`);
528  (REPEAT STRIP_TAC);
529  (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= 
530   &(CARD (int_ball x (r + &1) DIFF int_ball x (r - k2)))`);
531  (REWRITE_TAC[REAL_OF_NUM_LE]);
532  (MATCH_MP_TAC CARD_SUBSET);
533  (SIMP_TAC[FINITE_DIFF; Vol1.finite_int_ball]);
534  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A DIFF C SUBSET B DIFF C`));
535  (REWRITE_TAC[int_ball; Pack1.hinhcau_ball; SUBSET; IN_INTER; IN_BALL]);
536  (REWRITE_TAC[IN; IN_ELIM_THM]);
537  (REPEAT STRIP_TAC);
538  (ASM_SIMP_TAC[]);
539  (NEW_GOAL `r + k1 <= r + &1`);
540  (ASM_REAL_ARITH_TAC);
541  (ASM_REAL_ARITH_TAC);
542  (NEW_GOAL `&(CARD (int_ball x (r + &1) DIFF int_ball x (r - k2))) <=
543               C * r pow 2`);
544  (ASM_SIMP_TAC[]);
545  (ASM_REAL_ARITH_TAC);
546
547  (ASM_CASES_TAC `&0 < k1`);
548  (NEW_GOAL 
549   `(?C. !r. &1 <= r ==>
550       &(CARD (int_ball x (r + k1) DIFF int_ball x (r - &1))) <= C * r pow 2)`);
551  (MATCH_MP_TAC CARD_BOUNDARY_INT_BALL_BOUND_1);
552  (ASM_REAL_ARITH_TAC);
553  (TAKE_TAC);
554  (EXISTS_TAC `C:real`);
555  (REPEAT STRIP_TAC);
556  (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= 
557   &(CARD (int_ball x (r + k1) DIFF int_ball x (r - &1)))`);
558  (REWRITE_TAC[REAL_OF_NUM_LE]);
559  (MATCH_MP_TAC CARD_SUBSET);
560  (SIMP_TAC[FINITE_DIFF; Vol1.finite_int_ball]);
561  (MATCH_MP_TAC (SET_RULE `B SUBSET A ==> C DIFF A SUBSET C DIFF B`));
562  (REWRITE_TAC[int_ball; Pack1.hinhcau_ball; SUBSET; IN_INTER; IN_BALL]);
563  (REWRITE_TAC[IN; IN_ELIM_THM]);
564  (REPEAT STRIP_TAC);
565  (ASM_SIMP_TAC[]);
566  (NEW_GOAL `r - &1 <= r - k2`);
567  (ASM_REAL_ARITH_TAC);
568  (ASM_REAL_ARITH_TAC);
569  (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - &1))) <=
570               C * r pow 2`);
571  (ASM_SIMP_TAC[]);
572  (ASM_REAL_ARITH_TAC);
573
574  (NEW_GOAL 
575   `(?C. !r. &1 <= r ==>
576       &(CARD (int_ball x (r + &1) DIFF int_ball x (r - &1))) <= C * r pow 2)`);
577  (MATCH_MP_TAC CARD_BOUNDARY_INT_BALL_BOUND_1);
578  (ASM_REAL_ARITH_TAC);
579  (TAKE_TAC);
580  (EXISTS_TAC `C:real`);
581  (REPEAT STRIP_TAC);
582  (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= 
583   &(CARD (int_ball x (r + &1) DIFF int_ball x (r - &1)))`);
584  (REWRITE_TAC[REAL_OF_NUM_LE]);
585  (MATCH_MP_TAC CARD_SUBSET);
586  (SIMP_TAC[FINITE_DIFF; Vol1.finite_int_ball]);
587  (REWRITE_TAC[IN_DIFF; int_ball; Pack1.hinhcau_ball; SUBSET; IN_INTER; IN_BALL]);
588  (REWRITE_TAC[IN; IN_ELIM_THM]);
589  (REPEAT STRIP_TAC);
590  (ASM_SIMP_TAC[]);
591  (ASM_REAL_ARITH_TAC);
592  (NEW_GOAL `(!i. 1 <= i /\i <= 3 ==>integer (x'$i)) /\ 
593                  dist (x:real^3,x') < r - k2`);
594  (REPEAT STRIP_TAC);
595  (ASM_SIMP_TAC[]);
596  (ASM_REAL_ARITH_TAC);
597  (ASM_MESON_TAC[]);
598  (NEW_GOAL `&(CARD (int_ball x (r + &1) DIFF int_ball x (r - &1))) <=
599               C * r pow 2`);
600  (ASM_SIMP_TAC[]);
601  (ASM_REAL_ARITH_TAC)]);;
602
603 (* ==================================================================== *)
604 (* Lemma 8 *)
605
606 let CARD_INJ_LE = prove_by_refinement (
607  `!s t f. FINITE s /\ FINITE t /\ INJ (f:A->B) s t ==>
608             CARD s <= CARD t`,
609 [(REWRITE_TAC[INJ] THEN REPEAT STRIP_TAC);
610  (REWRITE_WITH `CARD s = CARD (IMAGE (f:A->B) s)`);
611  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC CARD_IMAGE_INJ);
612  (ASM_REWRITE_TAC[]);
613  (MATCH_MP_TAC CARD_SUBSET);
614  (ASM_REWRITE_TAC[IMAGE; SUBSET]);
615  (UNDISCH_TAC `!x. x IN s ==> (f:A->B) x IN t`);
616  (REWRITE_TAC[IN; IN_ELIM_THM]);
617  (SET_TAC[])]);;
618
619 (* ==================================================================== *)
620 (* Lemma 9 *)
621
622 let BOUNDARY_VOLUME = prove_by_refinement (
623  `!p:real^3 k1 k2. 
624        ?C. (!r. &1 <= r ==> 
625         vol (ball (p:real^3,r + k1) DIFF ball (p,r - k2)) <= C * r pow 2)`,
626 [(REPEAT STRIP_TAC);
627
628  (ABBREV_TAC 
629   `C = &4 / &3 * pi * (&3 * abs (k1 + k2) + &3 * k1 pow 2 + abs (k1 pow 3 + k2 pow 3))`);
630  (ABBREV_TAC `D = vol (ball (p:real^3, abs (k1 + k2)))`);
631  (ABBREV_TAC `E = max C (D:real)`);
632  (EXISTS_TAC `max (E:real) (&0)`);
633  (REPEAT STRIP_TAC);
634  (ASM_CASES_TAC `r + k1 <= r - k2`);
635  (REWRITE_WITH `ball (p,r + k1) DIFF ball (p:real^3,r - k2) = {}`);
636  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A DIFF B = {}`));
637  (REWRITE_TAC[SUBSET; IN_BALL] THEN REPEAT STRIP_TAC);
638  (ASM_REAL_ARITH_TAC);
639  (REWRITE_TAC[MEASURE_EMPTY]);
640  (NEW_GOAL `&0 * r pow 2 <= max E (&0) * r pow 2`);
641  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
642  (MATCH_MP_TAC REAL_LE_MUL);
643  (ASM_REWRITE_TAC[REAL_LE_POW_2] THEN REAL_ARITH_TAC);
644  (ASM_REAL_ARITH_TAC);
645
646  (REWRITE_WITH `vol (ball (p,r + k1) DIFF ball (p,r - k2)) = 
647                  vol (ball (p,r + k1)) - vol (ball (p,r - k2))`);
648  (MATCH_MP_TAC MEASURE_DIFF_SUBSET);
649  (REWRITE_TAC[MEASURABLE_BALL; SUBSET; IN_BALL] THEN ASM_REAL_ARITH_TAC);
650  (REWRITE_TAC[VOLUME_BALL]);
651  (ASM_CASES_TAC `&0 <= r - k2`);
652  (NEW_GOAL `&0 <= r + k1`);
653  (ASM_REAL_ARITH_TAC);
654
655  (NEW_GOAL `vol (ball (p,r + k1)) - vol (ball (p,r - k2)) <= C * r pow 2`);
656  (ASM_SIMP_TAC [VOLUME_BALL]);
657  (EXPAND_TAC "C");
658  (REWRITE_TAC[REAL_ARITH 
659    `x * pi * a - x * pi * b <=  (x *  pi *  c) * d <=> 
660     &0 <= (x * pi) * (c * d - (a - b))`]);
661  (MATCH_MP_TAC REAL_LE_MUL);
662  (ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_DIV; PI_POS_LE; REAL_ARITH `&0 <= &3 /\ &0 <= &4`]);
663  (REWRITE_TAC[REAL_ARITH `(r + k1) pow 3 - (r - k2) pow 3 = &3 * (k1 + k2) * 
664    r pow 2 + &3 * (k1 pow 2  - k2 pow 2) * r + (k1 pow 3 + k2 pow 3)`]);
665  (REWRITE_TAC[REAL_ADD_RDISTRIB]);
666  (NEW_GOAL `(&3 * abs (k1 + k2)) * r pow 2 >= 
667              &3 * (k1 * r pow 2 + k2 * r pow 2)`);
668  (REWRITE_TAC[REAL_ARITH
669   `(&3 * abs (k1 + k2)) * r pow 2 >= &3 * (k1 * r pow 2 + k2 * r pow 2) <=> 
670    &0 <= &3 * r pow 2 * (abs (k1 + k2) - (k1 + k2))`]);
671  (MATCH_MP_TAC REAL_LE_MUL);
672  (REWRITE_TAC[REAL_ARITH `&0 <= &3`]);
673  (MATCH_MP_TAC REAL_LE_MUL);
674  (REWRITE_TAC[REAL_LE_POW_2]);
675  (REAL_ARITH_TAC);
676
677  (NEW_GOAL `(&3 * k1 pow 2) * r pow 2 >= &3 * (k1 pow 2 - k2 pow 2) * r`);
678  (NEW_GOAL `(&3 * k1 pow 2) * r pow 2 >= (&3 * k1 pow 2) * r`);
679  (REWRITE_TAC[REAL_ARITH `x * y pow 2 >= x * y <=> &0 <= x * y * (y - &1)`]);
680  (ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_POW_2; REAL_ARITH `&1 <= a ==> &0 <= a`;
681    REAL_ARITH `&1 <= a ==> &0 <= (a - &1)`; REAL_ARITH `&0 <= &3`]);
682  (NEW_GOAL `(&3 * k1 pow 2) * r >= &3 * (k1 pow 2 - k2 pow 2) * r`);
683  (REWRITE_TAC[REAL_ARITH `(&3 * x) * r >= &3 * (x - y) * r <=> &0 <= y * r`]);
684  (ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_POW_2; REAL_ARITH `&1 <= a ==> &0 <= a`]);
685  (ASM_REAL_ARITH_TAC);
686
687
688  (NEW_GOAL `abs (k1 pow 3 + k2 pow 3) * r pow 2 >= k1 pow 3 + k2 pow 3`);
689  (NEW_GOAL `abs (k1 pow 3 + k2 pow 3) * r pow 2 >= 
690              abs (k1 pow 3 + k2 pow 3)`);
691  (REWRITE_TAC[REAL_ARITH `x * y pow 2 >= x <=> &0 <= x * (y pow 2 - &1)`]);
692  (MATCH_MP_TAC REAL_LE_MUL);
693  (REWRITE_TAC[REAL_ABS_POS]);
694  (REWRITE_TAC[REAL_ARITH `&0 <= a - &1 <=> &1 pow 2 <= a`]);
695  (REWRITE_WITH `&1 pow 2 <= r pow 2 <=> &1 <= r`);
696  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
697  (MATCH_MP_TAC Collect_geom.POW2_COND_LT);
698  (ASM_REAL_ARITH_TAC);
699  (ASM_REAL_ARITH_TAC);
700  (ASM_REAL_ARITH_TAC);
701  (ASM_REAL_ARITH_TAC);
702
703
704  (NEW_GOAL `C * r pow 2 <= max E (&0) * r pow 2`);
705  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
706  (MATCH_MP_TAC REAL_LE_MUL);
707  (ASM_REWRITE_TAC[REAL_LE_POW_2] THEN ASM_REAL_ARITH_TAC);
708  (ASM_REAL_ARITH_TAC);
709
710  (NEW_GOAL `r < k2`);
711  (ASM_REAL_ARITH_TAC);
712  (NEW_GOAL `vol (ball (p,r + k1)) - vol (ball (p,r - k2)) <= D * r pow 2`);
713  (REWRITE_WITH `ball (p:real^3,r - k2) = {}`);
714  (REWRITE_TAC[SET_RULE `s = {} <=> (!x. x IN s ==> F)`]);
715  (REWRITE_TAC[IN_BALL] THEN GEN_TAC);
716  (MP_TAC (MESON[DIST_POS_LE] `&0 <= dist (p, x:real^3)`));
717  (ASM_REAL_ARITH_TAC);
718
719  (REWRITE_TAC[MEASURE_EMPTY; REAL_ARITH `a - &0 = a`]);
720  (NEW_GOAL `vol (ball (p,r + k1)) <= D`);
721  (EXPAND_TAC "D" THEN MATCH_MP_TAC MEASURE_SUBSET);
722  (REWRITE_TAC[MEASURABLE_BALL; SUBSET; IN_BALL]);
723  (REPEAT STRIP_TAC);
724  (ASM_REAL_ARITH_TAC);
725  (NEW_GOAL `D <= D * r pow 2`);
726  (REWRITE_TAC[REAL_ARITH `x <= x * y pow 2 <=> &0 <= x * (y pow 2 - &1)`]);
727  (MATCH_MP_TAC REAL_LE_MUL);
728  (EXPAND_TAC "D");
729  (STRIP_TAC);
730  (MATCH_MP_TAC MEASURE_POS_LE);
731  (REWRITE_TAC[MEASURABLE_BALL]);
732  (REWRITE_TAC[REAL_ARITH `&0 <= a - &1 <=> &1 pow 2 <= a`]);
733  (REWRITE_WITH `&1 pow 2 <= r pow 2 <=> &1 <= r`);
734  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
735  (MATCH_MP_TAC Collect_geom.POW2_COND_LT);
736  (ASM_REAL_ARITH_TAC);
737  (ASM_REAL_ARITH_TAC);
738  (ASM_REAL_ARITH_TAC);
739
740  (NEW_GOAL `D * r pow 2 <= max E (&0) * r pow 2`);
741  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
742  (MATCH_MP_TAC REAL_LE_MUL);
743  (ASM_REWRITE_TAC[REAL_LE_POW_2] THEN ASM_REAL_ARITH_TAC);
744  (ASM_REAL_ARITH_TAC)]);;
745
746 (* ==================================================================== *)
747 (* Lemma 10 *)
748
749 let PACKING_BALL_BOUNDARY = prove_by_refinement (
750  `!V p:real^3 k1 k2. packing V ==>
751       ?C. !r. &1 <= r
752        ==> &(CARD (V INTER ball (p,r + k1) DIFF V INTER ball (p,r - k2))) 
753            <= C * r pow 2`,
754 [(REPEAT STRIP_TAC);
755  (NEW_GOAL `?C. (!r. &1 <= r  ==> 
756              vol (ball (p:real^3,r + k1 + &1) DIFF ball (p,r - (k2 + &1))) <= 
757              C * r pow 2)`);
758  (REWRITE_TAC[BOUNDARY_VOLUME]);
759  (UP_ASM_TAC THEN STRIP_TAC);
760  (EXISTS_TAC `C:real`);
761  (REPEAT STRIP_TAC);
762  (ABBREV_TAC
763   `B = V INTER ball (p,r + k1) DIFF V INTER ball (p:real^3,r - k2)`);
764  (ABBREV_TAC `f = (\u:real^3. ball (u, &1))`);
765  (NEW_GOAL `FINITE (B:real^3->bool)`);
766  (EXPAND_TAC "B");
767  (MATCH_MP_TAC FINITE_SUBSET);
768  (EXISTS_TAC `V INTER ball (p:real^3,r + k1)`);
769  (ASM_SIMP_TAC[FINITE_PACK_LEMMA] THEN ASM_SET_TAC[]);
770
771  (NEW_GOAL `sum B (\u:real^3. vol (f u)) = &(CARD B) * &4 / &3 * pi`);
772  (EXPAND_TAC "f");
773  (SIMP_TAC[VOLUME_BALL; REAL_ARITH `&0 <= &1`]);
774  (ASM_SIMP_TAC [SUM_CONST]);
775  (REAL_ARITH_TAC);
776
777  (NEW_GOAL `sum B (\u:real^3. vol (f u)) = vol (UNIONS (IMAGE f B))`);
778  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
779  (MATCH_MP_TAC MEASURE_DISJOINT_UNIONS_IMAGE);
780  (EXPAND_TAC "f" THEN REWRITE_TAC[MEASURABLE_BALL] THEN ASM_REWRITE_TAC[]);
781  (REWRITE_TAC[SET_RULE `DISJOINT s t <=> !x. ~(x IN s /\ x IN t)`]);
782  (REWRITE_TAC[IN_BALL]);
783  (REPEAT STRIP_TAC);
784  (UP_ASM_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN STRIP_TAC);
785  (NEW_GOAL `dist (u, y) <= dist (u, x) + dist (x, y:real^3)`);
786  (REWRITE_TAC[DIST_TRIANGLE]);
787  (NEW_GOAL `&2 <= dist (u, y:real^3)`);
788  (UNDISCH_TAC `packing V` THEN REWRITE_TAC[packing] THEN STRIP_TAC);
789  (FIRST_ASSUM MATCH_MP_TAC);
790  (ASM_SET_TAC[]);
791  (ASM_REAL_ARITH_TAC);
792
793  (NEW_GOAL `vol (UNIONS (IMAGE f (B:real^3->bool))) <= 
794              vol (ball (p,r + k1 + &1) DIFF ball (p,r - (k2 + &1)))`);
795  (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
796  (MATCH_MP_TAC MEASURE_SUBSET);
797  (REPEAT STRIP_TAC);
798  (MATCH_MP_TAC MEASURABLE_UNIONS);
799  (STRIP_TAC);
800
801  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
802  (ASM_REWRITE_TAC[]);
803  (REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
804  (ASM_REWRITE_TAC[MEASURABLE_BALL]);
805
806  (ASM_SIMP_TAC[MEASURABLE_DIFF; MEASURABLE_BALL]);
807  (EXPAND_TAC "B");
808  (REWRITE_TAC[SUBSET; IN_UNIONS; IN_BALL; IN_DIFF; IN_INTER]);
809  (REWRITE_TAC[IN_ELIM_THM; IN]);
810  (REPEAT STRIP_TAC);
811  (NEW_GOAL `dist (p, x) <= dist (p, x') + dist (x', x:real^3)`);
812  (REWRITE_TAC[DIST_TRIANGLE]);
813  (NEW_GOAL `dist (x',x:real^3) < &1`);
814  (UNDISCH_TAC `(t:real^3->bool) x`);
815  (ASM_REWRITE_TAC[ball; IN_ELIM_THM]);
816  (ASM_REAL_ARITH_TAC);
817
818  (NEW_GOAL `dist (p, x':real^3) < r - k2`);
819  (NEW_GOAL `dist (p, x') <= dist (p, x) + dist (x, x':real^3)`);
820  (REWRITE_TAC[DIST_TRIANGLE]);
821  (NEW_GOAL `dist (x,x':real^3) < &1`);
822  (ONCE_REWRITE_TAC[DIST_SYM]);
823  (UNDISCH_TAC `(t:real^3->bool) x`);
824  (ASM_REWRITE_TAC[ball; IN_ELIM_THM]);
825  (ASM_REAL_ARITH_TAC);
826  (ASM_MESON_TAC[]);
827
828  (NEW_GOAL `&(CARD (B:real^3->bool)) <= &(CARD B) * &4 / &3 * pi`);
829  (REWRITE_TAC [REAL_ARITH `a <= a * b <=> &0 <= a * (b - &1)`]);
830  (MATCH_MP_TAC REAL_LE_MUL);
831  (REWRITE_TAC[REAL_OF_NUM_LE; LE_0]);
832  (NEW_GOAL `#3.14159 < pi`);
833  (REWRITE_TAC[Flyspeck_constants.bounds]);
834  (ASM_REAL_ARITH_TAC);
835  (NEW_GOAL `vol (ball (p:real^3,r + k1 + &1) DIFF ball (p,r - (k2 + &1))) <= 
836    C * r pow 2`);
837  (ASM_SIMP_TAC[]);
838  (ASM_REAL_ARITH_TAC)]);;
839
840 (* ==================================================================== *)
841 (* Lemma 11 *)
842
843 let MCELL_SUBSET_BALL_4 = prove_by_refinement (
844  `!V X . 
845       packing V /\ 
846       saturated V /\ mcell_set V X
847      ==> (?p. X SUBSET ball (p, &4))`,
848 [(REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
849  (REPEAT STRIP_TAC);
850  (ASM_CASES_TAC `X:real^3->bool = {}`);
851  (EXISTS_TAC `(vec 0):real^3`);
852  (ASM_MESON_TAC[EMPTY_SUBSET]);
853
854 (* Case i = 0 *)
855  (ASM_CASES_TAC `i = 0`);
856  (UNDISCH_TAC `X = mcell i V ul`THEN ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
857  (STRIP_TAC);
858  (NEW_GOAL `!s. s IN rogers V ul ==> dist (HD ul, s) < &2`);
859  (REPEAT STRIP_TAC);
860  (NEW_GOAL `rogers V ul SUBSET voronoi_closed V (HD ul)`);
861  (ASM_SIMP_TAC[ROGERS_SUBSET_VORONOI_CLOSED]);
862  (NEW_GOAL `s:real^3 IN voronoi_closed V (HD ul)`);
863  (ASM_SET_TAC[]);
864  (UNDISCH_TAC `saturated (V:real^3->bool)`);
865  (REWRITE_TAC[saturated]);
866  (REPEAT STRIP_TAC);
867  (NEW_GOAL `?y. y IN V /\ dist (s, y:real^3) < &2`);
868  (ASM_MESON_TAC[]);
869  (UP_ASM_TAC THEN STRIP_TAC);
870  (UNDISCH_TAC `s:real^3 IN voronoi_closed V (HD ul)` THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
871  (REPEAT STRIP_TAC);
872  (NEW_GOAL `dist (s,HD ul) <= dist (s,y:real^3)`);
873  (FIRST_ASSUM MATCH_MP_TAC);
874  (ASM_SET_TAC[]);
875  (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC);
876  (EXISTS_TAC `HD (ul:(real^3)list)`);
877  (REWRITE_TAC[SUBSET; IN_BALL]);
878  (REPEAT STRIP_TAC);
879  (NEW_GOAL `dist (HD ul, x:real^3) < &2`);
880  (FIRST_ASSUM MATCH_MP_TAC);
881  (ASM_SET_TAC[]);
882  (ASM_REAL_ARITH_TAC);
883
884 (* Case i = 4 *)
885  (ASM_CASES_TAC `i = 4`);
886  (UNDISCH_TAC `X = mcell i V ul` THEN 
887    ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
888  (COND_CASES_TAC);
889  (STRIP_TAC);
890  (EXISTS_TAC `omega_list V ul`);
891  (NEW_GOAL `ball (omega_list V ul,&4) = convex hull (ball (omega_list V ul,&4))`);
892  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN REWRITE_TAC[CONVEX_HULL_EQ; CONVEX_BALL]);
893  (ONCE_ASM_REWRITE_TAC[]);
894  (MATCH_MP_TAC CONVEX_HULL_SUBSET);
895  (REWRITE_TAC[SUBSET; IN_BALL] THEN REPEAT STRIP_TAC);
896  (REWRITE_WITH `omega_list V ul = circumcenter (set_of_list ul)`);
897  (MATCH_MP_TAC Rogers.XNHPWAB1);
898  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
899  (REWRITE_WITH `dist (circumcenter (set_of_list ul),x:real^3) = hl ul`);
900  (NEW_GOAL `(!x:real^3. x IN set_of_list ul
901                   ==> dist (circumcenter (set_of_list ul),x) = hl ul)`);
902  (MATCH_MP_TAC Rogers.HL_PROPERTIES);
903  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
904  (FIRST_ASSUM MATCH_MP_TAC);
905  (ASM_REWRITE_TAC[]);
906  (NEW_GOAL `sqrt (&2) <= &2`);
907  (REWRITE_WITH `sqrt (&2) <= &2 <=> sqrt (&2) pow 2 <= &2 pow 2`);
908  (MATCH_MP_TAC Collect_geom.POW2_COND_LT);
909  (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
910  (REWRITE_WITH `sqrt (&2) pow 2 = (&2)`);
911  (MATCH_MP_TAC SQRT_POW_2);
912  (REAL_ARITH_TAC);
913  (REAL_ARITH_TAC);
914  (ASM_REAL_ARITH_TAC);
915  (STRIP_TAC);
916  (NEW_GOAL `F`);
917  (ASM_MESON_TAC[]);
918  (ASM_MESON_TAC[]);
919
920 (* Case i = 1 and i = 2 and i = 3 *)
921
922  (ABBREV_TAC `s = omega_list_n V ul (i - 1)`);
923  (EXISTS_TAC `s:real^3`);
924  (MATCH_MP_TAC (SET_RULE `(?x. A SUBSET x /\ x SUBSET B) ==> A SUBSET B`));
925  (EXISTS_TAC `UNIONS
926                {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
927  (STRIP_TAC);
928  (ASM_REWRITE_TAC[]);
929  (MATCH_MP_TAC Qzksykg.QZKSYKG2);
930  (ASM_REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4} <=> i=0\/i=1\/i=2\/i=3\/i=4`]);
931  (ASM_ARITH_TAC);
932  (REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM; IN_BALL]);
933  (REPEAT STRIP_TAC);
934  (ABBREV_TAC `vl:(real^3)list = left_action_list p ul`);
935  (NEW_GOAL `rogers V vl SUBSET voronoi_closed V (HD vl)`);
936  (MATCH_MP_TAC ROGERS_SUBSET_VORONOI_CLOSED);
937  (ASM_REWRITE_TAC[]);
938  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
939  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN EXISTS_TAC `p:num->num`);
940  (ASM_REWRITE_TAC[]);
941  (STRIP_TAC);
942  (ASM_REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4} <=> i=0\/i=1\/i=2\/i=3\/i=4`]);
943  (ASM_ARITH_TAC);
944  (ASM_SET_TAC[]);
945
946 (* -------------------------------------------------------------------------- *)
947
948  (NEW_GOAL `barV V 3 vl /\
949              (!j. i - 1 <= j /\ j <= 3
950                   ==> omega_list_n V vl j = omega_list_n V ul j)`);
951  (ASM_CASES_TAC `i <= 1`);
952  (UNDISCH_TAC `p permutes 0..i - 1`);
953  (REWRITE_WITH `i - 1 = 0`);
954  (ASM_ARITH_TAC);
955  (REWRITE_TAC[Packing3.PERMUTES_TRIVIAL]);
956  (STRIP_TAC THEN EXPAND_TAC "vl" THEN REWRITE_TAC[ASSUME `p = I:num->num`; 
957    Packing3.LEFT_ACTION_LIST_I]);
958  (ASM_REWRITE_TAC[]);
959
960  (MATCH_MP_TAC Ynhyjit.YNHYJIT);
961  (EXISTS_TAC `p:num->num`);
962  (ASM_REWRITE_TAC[]);
963  (STRIP_TAC);
964
965  (REWRITE_TAC[SET_RULE `i IN {2,3,4} <=> i = 2 \/ i = 3 \/ i = 4`]);
966  (ASM_ARITH_TAC);
967  (UNDISCH_TAC `~(X = {}:real^3->bool)` THEN ASM_REWRITE_TAC[]);
968
969  (ASM_CASES_TAC `i = 2`);
970  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; ARITH_RULE `2 - 1 = 1`]);
971  (COND_CASES_TAC);
972  (MESON_TAC[]);
973  (MESON_TAC[]);
974  (ASM_CASES_TAC `i = 3`);
975  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; ARITH_RULE `3 - 1 = 2`]);
976  (COND_CASES_TAC);
977  (MESON_TAC[]);
978  (MESON_TAC[]);
979  (NEW_GOAL `F`);
980  (ASM_ARITH_TAC);
981  (ASM_MESON_TAC[]);
982  (UP_ASM_TAC THEN STRIP_TAC);
983
984  (NEW_GOAL `s IN voronoi_list V (truncate_simplex (i - 1) vl)`);
985  (REWRITE_WITH `s = omega_list_n V vl (i - 1)`);
986  (EXPAND_TAC "s");
987  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
988  (FIRST_ASSUM MATCH_MP_TAC);
989  (ASM_ARITH_TAC);
990  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
991  (EXISTS_TAC `3`);
992  (ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC);
993
994  (NEW_GOAL `s:real^3 IN voronoi_closed V (HD vl)`);
995  (NEW_GOAL `voronoi_list V (truncate_simplex (i - 1) vl) SUBSET 
996              voronoi_closed V (HD vl)`);
997  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET]);
998  (NEW_GOAL `HD (vl:(real^3)list) IN 
999    set_of_list (truncate_simplex (i - 1) vl)`);
1000  (NEW_GOAL `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1001  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1002  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1003  (REWRITE_WITH `HD (vl:(real^3)list) = HD (truncate_simplex (i - 1) vl)`);
1004  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1005  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1006  (ASM_ARITH_TAC);
1007  (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
1008  (NEW_GOAL `?u0 u1 u2 u3. vl = [u0;u1;u2;u3:real^3]`);
1009  (MATCH_MP_TAC BARV_3_EXPLICIT);
1010  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1011  (UP_ASM_TAC THEN STRIP_TAC);
1012
1013  (ASM_CASES_TAC `i = 1`);
1014  (ASM_REWRITE_TAC[ARITH_RULE `1 - 1 = 0`; 
1015   TRUNCATE_SIMPLEX_EXPLICIT_0; LENGTH] THEN ARITH_TAC);
1016  (ASM_CASES_TAC `i = 2`);
1017  (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`; 
1018   TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
1019  (ASM_CASES_TAC `i = 3`);
1020  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; 
1021   TRUNCATE_SIMPLEX_EXPLICIT_2; LENGTH] THEN ARITH_TAC);
1022  (NEW_GOAL `F`);
1023  (ASM_ARITH_TAC);
1024  (ASM_MESON_TAC[]);
1025  (UP_ASM_TAC THEN SET_TAC[]);
1026  (ASM_SET_TAC[]);
1027
1028  (NEW_GOAL `dist (s, x:real^3) <= dist (s, HD vl) + dist (HD vl, x)`);
1029  (REWRITE_TAC[DIST_TRIANGLE]);
1030  (NEW_GOAL `dist (s:real^3, HD vl) < &2`);
1031  (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
1032  (NEW_GOAL `voronoi_closed V ((HD vl):real^3) SUBSET ball (HD vl,&2)`);
1033  (ASM_SIMP_TAC[Packing3.VORONOI_BALL2]);
1034  (ASM_SET_TAC[]);
1035
1036  (NEW_GOAL `dist (HD vl, x:real^3) < &2`);
1037  (REWRITE_TAC[GSYM IN_BALL]);
1038  (NEW_GOAL `voronoi_closed V ((HD vl):real^3) SUBSET ball (HD vl,&2)`);
1039  (ASM_SIMP_TAC[Packing3.VORONOI_BALL2]);
1040  (ASM_SET_TAC[]);
1041  (ASM_REAL_ARITH_TAC)]);;
1042
1043 (* ==================================================================== *)
1044 (* Lemma 12 *)
1045
1046 let HL_2 = prove_by_refinement (
1047  `!u v:real^3. hl [u; v] = inv (&2) * dist (u, v)`,
1048 [(REWRITE_TAC[HL; set_of_list; radV] THEN REPEAT GEN_TAC THEN 
1049    MATCH_MP_TAC SELECT_UNIQUE THEN REPEAT STRIP_TAC THEN 
1050    REWRITE_TAC[BETA_THM; CIRCUMCENTER_2; midpoint] THEN EQ_TAC);
1051  (REPEAT STRIP_TAC);
1052  (REWRITE_WITH `y = dist (inv (&2) % (u + v),v:real^3)`);
1053  (FIRST_ASSUM MATCH_MP_TAC THEN 
1054    REWRITE_TAC[MESON [IN] `{a, b} s <=> s IN {a, b}`] THEN SET_TAC[]);
1055  (NORM_ARITH_TAC);
1056  (REPEAT STRIP_TAC);
1057  (NEW_GOAL `w = u \/ w = v:real^3`);
1058  (UP_ASM_TAC THEN REWRITE_TAC[MESON [IN] `{a, b} s <=> s IN {a, b}`] THEN SET_TAC[]);
1059  (UP_ASM_TAC THEN STRIP_TAC);
1060  (ASM_REWRITE_TAC[] THEN NORM_ARITH_TAC);
1061  (ASM_REWRITE_TAC[] THEN NORM_ARITH_TAC)]);;
1062
1063 (* ==================================================================== *)
1064 (* Lemma 13 *)
1065
1066 let HL_LE_SQRT2_IMP_BARV_1 = prove_by_refinement (
1067  `!V u0 u1.
1068      saturated V /\
1069      packing V /\
1070      u0 IN V /\
1071      u1 IN V /\
1072      ~(u0 = u1) /\
1073      hl [u0;u1] < sqrt (&2) ==> barV V 1 [u0;u1:real^3]`,
1074 [(REPEAT STRIP_TAC);
1075  (REWRITE_TAC[BARV; LENGTH; ARITH_RULE `SUC (SUC 0) = 1 + 1`]);
1076  (REPEAT STRIP_TAC);
1077  (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 1`);
1078  (NEW_GOAL `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 0 + 1`);
1079  (ASM_REWRITE_TAC[] THEN ARITH_TAC);
1080  (UP_ASM_TAC THEN REWRITE_WITH 
1081    `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 0 + 1 <=>
1082     truncate_simplex 0 [u0;u1] = vl /\ 0 + 1 <= LENGTH [u0;u1:real^3]`);
1083  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1084  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
1085  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1086  (REPEAT STRIP_TAC);
1087  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0]);
1088  (REWRITE_TAC[VORONOI_NONDG; VORONOI_LIST; VORONOI_SET; set_of_list; LENGTH;
1089    SET_RULE `INTERS {voronoi_closed V v | v IN {u0}} = voronoi_closed V u0`]);
1090  (ASM_SIMP_TAC[Packing3.AFF_DIM_VORONOI_CLOSED]);
1091  (REPEAT STRIP_TAC);
1092  (ARITH_TAC);
1093  (ASM_SET_TAC[]);
1094  (ARITH_TAC);
1095
1096  (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 2`);
1097  (NEW_GOAL `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 1 + 1`);
1098  (ASM_REWRITE_TAC[] THEN ARITH_TAC);
1099  (UP_ASM_TAC THEN REWRITE_WITH 
1100    `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 1 + 1 <=>
1101     truncate_simplex 1 [u0;u1] = vl /\ 1 + 1 <= LENGTH [u0;u1:real^3]`);
1102  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1103  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
1104  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1105  (REPEAT STRIP_TAC);
1106  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
1107  (REWRITE_TAC[VORONOI_NONDG]);
1108  (REWRITE_TAC[set_of_list; LENGTH]);
1109  (REPEAT STRIP_TAC);
1110  (ARITH_TAC);
1111  (ASM_SET_TAC[]);
1112
1113  (REWRITE_WITH 
1114   `aff_dim (voronoi_list V [u0; u1:real^3]) =
1115    aff_dim (INTERS {bis (HD [u0; u1]) v | v | v IN set_of_list [u0; u1]})`);
1116  (MATCH_MP_TAC Rogers.YIFVQDV_lemma_aff_dim);
1117  (ASM_REWRITE_TAC[set_of_list; AFFINE_INDEPENDENT_2] THEN ASM_SET_TAC[]);
1118  (REWRITE_TAC[set_of_list; SET_RULE `a IN {b,c} <=> a =b \/ a = c`; HD]);
1119  (REWRITE_TAC[SET_RULE `INTERS {bis u0 v | v | v = u0 \/ v = u1} = 
1120    bis u0 u0 INTER bis u0 u1`]);
1121  (REWRITE_WITH `!a:real^3. bis a a = (:real^3)`);
1122  (REWRITE_TAC[bis] THEN SET_TAC[]);
1123  (REWRITE_TAC[SET_RULE `(:real^3) INTER s = s`]);
1124  (MATCH_MP_TAC (ARITH_RULE `a = &2 ==> a + &(SUC(SUC 0)) = (&4):int`));
1125  (REWRITE_WITH `&2 = &(dimindex (:3)) - &1:int`);
1126  (REWRITE_TAC[DIMINDEX_3]);
1127  (ARITH_TAC);
1128  (REWRITE_TAC[Packing3.BIS_EQ_HYPERPLANE]);
1129  (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
1130  (ASM_NORM_ARITH_TAC);
1131
1132  (NEW_GOAL `F`);
1133  (NEW_GOAL `initial_sublist vl [u0; u1:real^3] /\ 
1134              LENGTH vl = (LENGTH vl - 1) + 1`);
1135  (ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC);
1136  (UP_ASM_TAC THEN REWRITE_WITH 
1137    `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = (LENGTH vl - 1) + 1 <=>
1138     truncate_simplex (LENGTH vl - 1) [u0;u1] = vl /\ 
1139     (LENGTH vl - 1) + 1 <= LENGTH [u0;u1:real^3]`);
1140  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1141  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
1142  (REWRITE_TAC[LENGTH]);
1143  (REPEAT STRIP_TAC);
1144  (ASM_ARITH_TAC);
1145  (ASM_MESON_TAC[])]);;
1146
1147 (* ==================================================================== *)
1148 (* Lemma 14 *)
1149
1150 let RCONE_GE_SUBSET = prove_by_refinement (
1151   `!a b u0:real^N u1. a <= b ==> rcone_ge u0 u1 b SUBSET rcone_ge u0 u1 a`,
1152 [(REPEAT STRIP_TAC);
1153  (REWRITE_TAC[rcone_ge; rconesgn; SUBSET; IN; IN_ELIM_THM]);
1154  (REPEAT STRIP_TAC);
1155  (NEW_GOAL 
1156 `&0 <= dist (x,u0:real^N) * dist (u1,u0) * b - dist (x,u0) * dist (u1,u0) * a`);
1157  (REWRITE_TAC[REAL_ARITH `x * y * b - x * y * a = x * y * (b - a)`]);
1158  (MATCH_MP_TAC REAL_LE_MUL);
1159  (REWRITE_TAC[DIST_POS_LE]);
1160  (MATCH_MP_TAC REAL_LE_MUL);
1161  (REWRITE_TAC[DIST_POS_LE]);
1162  (ASM_REAL_ARITH_TAC);
1163  (ASM_REAL_ARITH_TAC)]);;
1164
1165 (* ==================================================================== *)
1166 (* Lemma 15 *)
1167
1168 let RCONE_GT_SUBSET = prove_by_refinement (
1169   `!a b u0:real^N u1. a <= b ==> rcone_gt u0 u1 b SUBSET rcone_gt u0 u1 a`,
1170 [(REPEAT STRIP_TAC);
1171  (REWRITE_TAC[rcone_gt; rconesgn; SUBSET; IN; IN_ELIM_THM]);
1172  (REPEAT STRIP_TAC);
1173  (NEW_GOAL 
1174 `&0 <= dist (x,u0:real^N) * dist (u1,u0) * b - dist (x,u0) * dist (u1,u0) * a`);
1175  (REWRITE_TAC[REAL_ARITH `x * y * b - x * y * a = x * y * (b - a)`]);
1176  (MATCH_MP_TAC REAL_LE_MUL);
1177  (REWRITE_TAC[DIST_POS_LE]);
1178  (MATCH_MP_TAC REAL_LE_MUL);
1179  (REWRITE_TAC[DIST_POS_LE]);
1180  (ASM_REAL_ARITH_TAC);
1181  (ASM_REAL_ARITH_TAC)]);;
1182
1183 (* ===================================================================== *)
1184 (*     The following lemmas are in the svn 126 of HOL                    *)
1185 (*     To be done by John Harrison                                       *)
1186 (* ===================================================================== *)
1187 (* ==================================================================== *)
1188 (* Lemma 16 *)
1189
1190 let BOUNDED_SING = prove 
1191  (`!a. bounded {a}`, 
1192     REWRITE_TAC[BOUNDED_INSERT; BOUNDED_EMPTY]);;
1193
1194 let SUBSPACE_BOUNDED_EQ_TRIVIAL = prove
1195   (`!s:real^N->bool. subspace s ==> (bounded s <=> s = {vec 0})`,
1196    REPEAT STRIP_TAC THEN EQ_TAC THEN SIMP_TAC[BOUNDED_SING] THEN
1197    ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
1198    DISCH_THEN(MP_TAC o MATCH_MP (SET_RULE
1199     `~(s = {a}) ==> a IN s ==> ?b. b IN s /\ ~(b = a)`)) THEN
1200    ASM_SIMP_TAC[SUBSPACE_0] THEN
1201    DISCH_THEN(X_CHOOSE_THEN `v:real^N` STRIP_ASSUME_TAC) THEN
1202    REWRITE_TAC[bounded; NOT_EXISTS_THM] THEN X_GEN_TAC `B:real` THEN
1203    DISCH_THEN(MP_TAC o SPEC `(B + &1) / norm v % v:real^N`) THEN
1204    ASM_SIMP_TAC[SUBSPACE_MUL; NORM_MUL; REAL_ABS_DIV; REAL_ABS_NORM] THEN
1205    ASM_SIMP_TAC[REAL_DIV_RMUL; NORM_EQ_0] THEN REAL_ARITH_TAC);;
1206
1207  let AFFINE_BOUNDED_EQ_TRIVIAL = prove
1208   (`!s:real^N->bool.
1209          affine s ==> (bounded s <=> s = {} \/ ?a. s = {a})`,
1210    GEN_TAC THEN ASM_CASES_TAC `s:real^N->bool = {}` THEN
1211    ASM_REWRITE_TAC[BOUNDED_EMPTY] THEN
1212    FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
1213    DISCH_THEN(X_CHOOSE_THEN `b:real^N` MP_TAC) THEN
1214    GEOM_ORIGIN_TAC `b:real^N` THEN SIMP_TAC[AFFINE_EQ_SUBSPACE] THEN
1215    REPEAT STRIP_TAC THEN ASM_SIMP_TAC[SUBSPACE_BOUNDED_EQ_TRIVIAL] THEN
1216    FIRST_ASSUM(MP_TAC o MATCH_MP SUBSPACE_0) THEN SET_TAC[]);;
1217
1218  let AFFINE_BOUNDED_EQ_LOWDIM = prove
1219   (`!s:real^N->bool.
1220          affine s ==> (bounded s <=> aff_dim s <= &0)`,
1221    SIMP_TAC[AFF_DIM_GE; INT_ARITH
1222     `--(&1):int <= x ==> (x <= &0 <=> x = --(&1) \/ x = &0)`] THEN
1223    SIMP_TAC[AFF_DIM_EQ_0; AFF_DIM_EQ_MINUS1; AFFINE_BOUNDED_EQ_TRIVIAL]);;
1224
1225  let BOUNDED_HYPERPLANE_EQ_TRIVIAL = prove
1226   (`!a b. bounded {x:real^N | a dot x = b} <=>
1227           if a = vec 0 then ~(b = &0) else dimindex(:N) = 1`,
1228    REPEAT GEN_TAC THEN ASM_CASES_TAC `a:real^N = vec 0` THEN
1229    ASM_REWRITE_TAC[DOT_LZERO] THENL
1230     [ASM_CASES_TAC `b = &0` THEN
1231      ASM_REWRITE_TAC[EMPTY_GSPEC; BOUNDED_EMPTY] THEN
1232      REWRITE_TAC[NOT_BOUNDED_UNIV; SET_RULE `{x | T} = UNIV`];
1233      ASM_SIMP_TAC[AFFINE_BOUNDED_EQ_LOWDIM; AFF_DIM_HYPERPLANE;
1234                   AFFINE_HYPERPLANE] THEN
1235      REWRITE_TAC[INT_ARITH `a - &1:int <= &0 <=> a <= &1`; INT_OF_NUM_LE] THEN
1236      MATCH_MP_TAC(ARITH_RULE `1 <= n ==> (n <= 1 <=> n = 1)`) THEN
1237      REWRITE_TAC[DIMINDEX_GE_1]]);;
1238
1239  let UNBOUNDED_HYPERPLANE = prove
1240   (`!a b. ~(a = vec 0) ==> ~(bounded {x:real^3 | a dot x = b})`,
1241    SIMP_TAC[BOUNDED_HYPERPLANE_EQ_TRIVIAL; DIMINDEX_3; ARITH]);;
1242
1243 (* ==================================================================== *)
1244 (* Lemma 17 *)
1245
1246 let DIHV_SYM_2 = prove 
1247  (`!x y z t:real^3. dihV x y z t = dihV x y t z`, 
1248    REWRITE_TAC[dihV] THEN 
1249    REPEAT STRIP_TAC THEN REPEAT LET_TAC THEN 
1250    ASM_REWRITE_TAC[arcV; DOT_SYM; REAL_ARITH `a * b = b * a`]);;
1251
1252 (* ==================================================================== *)
1253 (* Lemma 18 *)
1254
1255 let REAL_DIV_LE_1_TACTICS = prove_by_refinement (
1256   `!m n. &0 < n /\ m <= n ==> m / n <= &1`,
1257 [(REPEAT STRIP_TAC);
1258  (REWRITE_WITH `m / n <= &1 <=> m <= &1 * n`);
1259  (MATCH_MP_TAC REAL_LE_LDIV_EQ);
1260  (ASM_REWRITE_TAC[]);
1261  (ASM_REAL_ARITH_TAC)]);;
1262
1263 (* ==================================================================== *)
1264 (* Lemma 19 *)
1265
1266 let REAL_DIV_GE_1_TACTICS = prove_by_refinement (
1267   `!m n. &0 < n /\ n <= m ==> &1 <= m / n`,
1268 [(REPEAT STRIP_TAC);
1269  (REWRITE_WITH `&1 <= m / n <=> &1 * n <= m`);
1270  (MATCH_MP_TAC REAL_LE_RDIV_EQ);
1271  (ASM_REWRITE_TAC[]);
1272  (ASM_REAL_ARITH_TAC)]);;
1273
1274 (* ==================================================================== *)
1275 (* Lemma 20 *)
1276
1277 let REAL_DIV_LT_1_TACTICS = prove_by_refinement (
1278   `!m n. &0 < n /\ m < n ==> m / n < &1`,
1279 [(REPEAT STRIP_TAC);
1280  (REWRITE_WITH `m / n < &1 <=> m < &1 * n`);
1281  (MATCH_MP_TAC REAL_LT_LDIV_EQ);
1282  (ASM_REWRITE_TAC[]);
1283  (ASM_REAL_ARITH_TAC)]);;
1284
1285 (* ==================================================================== *)
1286 (* Lemma 21 *)
1287
1288 let REAL_DIV_GT_1_TACTICS = prove_by_refinement (
1289   `!m n. &0 < n /\ n < m ==> &1 < m / n`,
1290 [(REPEAT STRIP_TAC);
1291  (REWRITE_WITH `&1 < m / n <=> &1 * n < m`);
1292  (MATCH_MP_TAC REAL_LT_RDIV_EQ);
1293  (ASM_REWRITE_TAC[]);
1294  (ASM_REAL_ARITH_TAC)]);;
1295
1296
1297 (* ==================================================================== *)
1298 (* The following lemmas help to prove that the                          *)
1299 (*         definition of dihX is well-defined                           *)
1300 (* ==================================================================== *)
1301 (* ==================================================================== *)
1302 (* Lemma 22 *)
1303
1304 let MCELL_ID_OMEGA_LIST_N = prove_by_refinement (
1305  `!V i j ul vl. packing V /\ saturated V /\ barV V 3 ul /\ barV V 3 vl /\
1306                (mcell i V ul = mcell j V vl) /\ 
1307                ~(negligible (mcell i V ul)) /\ 
1308                 i IN {2, 3, 4} /\
1309                 j IN {2, 3, 4} ==>
1310                (i = j) /\ (!k. i - 1 <= k /\ k <= 3
1311                   ==> omega_list_n V ul k = omega_list_n V vl k)`,
1312 [(REPEAT GEN_TAC THEN STRIP_TAC);
1313  (NEW_GOAL `i = j /\ mcell i V ul = mcell j V vl`);
1314  (MATCH_MP_TAC Ajripqn.AJRIPQN);
1315  (ASM_REWRITE_TAC[SET_RULE `a INTER a = a` ]);
1316  (STRIP_TAC);
1317  (ASM_SET_TAC[]);
1318  (STRIP_TAC);
1319  (ASM_SET_TAC[]);
1320  (ASM_MESON_TAC[]);
1321  (UP_ASM_TAC THEN STRIP_TAC);
1322  (STRIP_TAC);
1323  (ASM_REWRITE_TAC[]);
1324
1325  (ASM_CASES_TAC `i = 4`);
1326  (REPEAT STRIP_TAC);
1327  (NEW_GOAL `k = 3`);
1328  (ASM_ARITH_TAC);
1329  (ASM_REWRITE_TAC[]);
1330
1331  (REWRITE_WITH `omega_list_n V ul 3 = omega_list V ul`);
1332  (REWRITE_TAC[OMEGA_LIST]);
1333  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
1334                  CARD (set_of_list ul) = 3 + 1`);
1335  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1336  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1337  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
1338
1339  (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
1340  (REWRITE_TAC[OMEGA_LIST]);
1341  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
1342                  CARD (set_of_list vl) = 3 + 1`);
1343  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1344  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1345  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
1346
1347  (REWRITE_WITH `omega_list V ul = circumcenter (set_of_list ul)`);
1348  (MATCH_MP_TAC Rogers.XNHPWAB1);
1349  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
1350  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
1351  (STRIP_TAC);
1352  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1353  (SIMP_TAC[ASSUME `i = 4`; MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1354  (COND_CASES_TAC);
1355  (NEW_GOAL `F`);
1356  (ASM_MESON_TAC[]);
1357  (ASM_MESON_TAC[]);
1358  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1359
1360  (REWRITE_WITH `omega_list V vl = circumcenter (set_of_list vl)`);
1361  (MATCH_MP_TAC Rogers.XNHPWAB1);
1362  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
1363  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
1364  (STRIP_TAC);
1365  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1366  (ASM_REWRITE_TAC[]);
1367  (REWRITE_WITH `j = 4`);
1368  (ASM_ARITH_TAC);
1369  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1370  (COND_CASES_TAC);
1371  (NEW_GOAL `F`);
1372  (ASM_MESON_TAC[]);
1373  (ASM_MESON_TAC[]);
1374  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1375  (AP_TERM_TAC);
1376
1377  (REWRITE_WITH `set_of_list ul = set_of_list (vl:(real^3)list) <=> 
1378                  convex hull (set_of_list ul) = convex hull (set_of_list vl)`);
1379  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1380  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
1381  (STRIP_TAC);
1382
1383  (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
1384  (MATCH_MP_TAC BARV_3_EXPLICIT);
1385  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1386  (UP_ASM_TAC THEN STRIP_TAC);
1387  (ASM_REWRITE_TAC[set_of_list] THEN STRIP_TAC);
1388  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1389  (REWRITE_TAC[ASSUME `i = 4`]);
1390  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1391  (COND_CASES_TAC);
1392  (ASM_REWRITE_TAC[set_of_list]);
1393  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1394  (MATCH_MP_TAC COPLANAR_SUBSET);
1395  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
1396  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1397  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
1398  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
1399  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
1400  (ASM_REWRITE_TAC[]);
1401  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1402
1403  (NEW_GOAL `?u0 u1 u2 u3. vl = [u0;u1;u2;u3:real^3]`);
1404  (MATCH_MP_TAC BARV_3_EXPLICIT);
1405  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1406  (UP_ASM_TAC THEN STRIP_TAC);
1407  (ASM_REWRITE_TAC[set_of_list] THEN STRIP_TAC);
1408  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1409  (REWRITE_TAC[ASSUME `mcell i V ul = mcell j V vl`]);
1410  (REWRITE_WITH `j = 4`);
1411  (ASM_ARITH_TAC);
1412  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1413  (COND_CASES_TAC);
1414  (ASM_REWRITE_TAC[set_of_list]);
1415  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1416  (MATCH_MP_TAC COPLANAR_SUBSET);
1417  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
1418  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1419  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
1420  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
1421  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
1422  (ASM_REWRITE_TAC[]);
1423  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1424
1425  (MP_TAC (ASSUME `mcell i V ul = mcell j V vl`));
1426  (REWRITE_WITH `j = 4 /\ i = 4`);
1427  (ASM_ARITH_TAC);
1428  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1429  (COND_CASES_TAC);
1430  (COND_CASES_TAC);
1431  (REWRITE_TAC[]);
1432
1433  (NEW_GOAL `F`);
1434  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1435  (ASM_REWRITE_TAC[]);
1436  (REWRITE_WITH `j = 4 /\ i = 4`);
1437  (ASM_ARITH_TAC);
1438  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1439  (COND_CASES_TAC);
1440  (NEW_GOAL `F`);
1441  (ASM_MESON_TAC[]);
1442  (ASM_MESON_TAC[]);
1443  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1444  (ASM_MESON_TAC[]);
1445
1446  (NEW_GOAL `F`);
1447  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1448  (REWRITE_WITH `j = 4 /\ i = 4`);
1449  (ASM_ARITH_TAC);
1450  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1451  (COND_CASES_TAC);
1452  (NEW_GOAL `F`);
1453  (ASM_MESON_TAC[]);
1454  (ASM_MESON_TAC[]);
1455  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1456  (ASM_MESON_TAC[]);
1457
1458 (* Finish the case i = 4 *)
1459 (* ========================================================================= *)
1460  (NEW_GOAL `mcell i V ul SUBSET 
1461              UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
1462  (MATCH_MP_TAC Qzksykg.QZKSYKG2);
1463  (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1464
1465  (ABBREV_TAC `X = mcell i V ul`);
1466  (NEW_GOAL `X INTER 
1467    UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1} = X`);
1468  (ASM_SET_TAC[]);
1469  (NEW_GOAL `~negligible (X INTER 
1470    UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1})`);
1471  (ASM_REWRITE_TAC[]);
1472  (ASM_MESON_TAC[]);
1473  (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1474  (NEW_GOAL `!s:(real^3->bool)->bool. 
1475   ~negligible (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~negligible t)`);
1476  (MESON_TAC[NEGLIGIBLE_UNIONS]);
1477  (REWRITE_TAC[SET_RULE 
1478   `{X INTER x | x IN {rogers V (left_action_list p ul) | p permutes 0..i - 1}} =
1479    {X INTER rogers V (left_action_list p ul) | p permutes 0..i - 1}`]);
1480  (ABBREV_TAC 
1481   `S = {X INTER rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
1482  (STRIP_TAC);
1483
1484  (NEW_GOAL `(?t. t IN (S:(real^3->bool)->bool) /\ ~negligible t)`);
1485  (FIRST_ASSUM MATCH_MP_TAC);
1486  (ASM_REWRITE_TAC[]);
1487  (EXPAND_TAC "S");
1488  (ABBREV_TAC `f = (\p. X INTER rogers V (left_action_list p ul))`);
1489  (REWRITE_WITH 
1490   `{X INTER rogers V (left_action_list p ul) | p permutes 0..i - 1} = 
1491    {f p | p permutes 0..i-1}`);
1492  (EXPAND_TAC "f" THEN REFL_TAC);
1493  (ONCE_REWRITE_TAC[SET_RULE `{f x | P x} = {f x | x IN {x | P x}}`]);
1494
1495  (REWRITE_TAC[SET_RULE `{f p | p IN {x | x permutes 0..i - 1} } = 
1496                         {y | ?p. p IN {x | x permutes 0..i - 1} /\ y = f p}`]);
1497  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1498  (MATCH_MP_TAC FINITE_PERMUTATIONS);
1499  (REWRITE_TAC[FINITE_NUMSEG]);
1500  (UP_ASM_TAC THEN EXPAND_TAC "S" THEN REWRITE_TAC[IN; IN_ELIM_THM] 
1501    THEN STRIP_TAC);
1502
1503
1504
1505  (NEW_GOAL `mcell j V vl SUBSET 
1506              UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
1507  (MATCH_MP_TAC Qzksykg.QZKSYKG2);
1508  (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1509  (NEW_GOAL `t SUBSET 
1510              UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
1511  (ASM_SET_TAC[]);
1512  (NEW_GOAL `t INTER 
1513    UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1} = t`);
1514  (ASM_SET_TAC[]);
1515  (NEW_GOAL `~negligible (t INTER 
1516    UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1})`);
1517  (ASM_REWRITE_TAC[]);
1518  (ASM_MESON_TAC[]);
1519  (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1520  (REWRITE_TAC[SET_RULE 
1521   `{t INTER x | x IN {rogers V (left_action_list q vl) | q permutes 0..j - 1}} =
1522    {t INTER rogers V (left_action_list q vl) | q permutes 0..j - 1}`]);
1523
1524  (NEW_GOAL `!s:(real^3->bool)->bool. 
1525   ~negligible (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~negligible t)`);
1526  (MESON_TAC[NEGLIGIBLE_UNIONS]);
1527  (ABBREV_TAC 
1528   `R = {t INTER rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
1529  (STRIP_TAC);
1530
1531  (NEW_GOAL `(?r. r IN (R:(real^3->bool)->bool) /\ ~negligible r)`);
1532  (FIRST_ASSUM MATCH_MP_TAC);
1533  (ASM_REWRITE_TAC[]);
1534  (EXPAND_TAC "R");
1535  (ABBREV_TAC `f = (\q. t INTER rogers V (left_action_list q vl))`);
1536  (REWRITE_WITH 
1537   `{t INTER rogers V (left_action_list q vl) | q permutes 0..j - 1} = 
1538    {f q | q permutes 0..j - 1}`);
1539  (EXPAND_TAC "f" THEN REFL_TAC);
1540  (ONCE_REWRITE_TAC[SET_RULE `{f x | P x} = {f x | x IN {x | P x}}`]);
1541
1542  (REWRITE_TAC[SET_RULE `{f q | q IN {x | x permutes 0..j - 1} } = 
1543                         {y | ?q. q IN {x | x permutes 0..j - 1} /\ y = f q}`]);
1544  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1545  (MATCH_MP_TAC FINITE_PERMUTATIONS);
1546  (REWRITE_TAC[FINITE_NUMSEG]);
1547  (UP_ASM_TAC THEN EXPAND_TAC "R" THEN REWRITE_TAC[IN; IN_ELIM_THM] 
1548    THEN STRIP_TAC);
1549  (NEW_GOAL 
1550   `rogers V (left_action_list p ul) = rogers V (left_action_list q vl)`);
1551  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
1552  (STRIP_TAC);
1553  (NEW_GOAL `coplanar (rogers V (left_action_list p ul) INTER 
1554                        rogers V (left_action_list q vl))`);
1555  (MATCH_MP_TAC Rogers.DUUNHOR);
1556  (ASM_REWRITE_TAC[IN]);
1557  (STRIP_TAC);
1558
1559  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
1560  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
1561  (EXISTS_TAC `p:num->num`);
1562  (ASM_REWRITE_TAC[]);
1563  (STRIP_TAC);
1564  (ASM_SET_TAC[]);
1565  (REWRITE_TAC[GSYM (ASSUME `X = mcell j V vl`)]);
1566  (STRIP_TAC);
1567  (UNDISCH_TAC `~NULLSET X`);
1568  (REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
1569
1570  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
1571  (EXISTS_TAC `vl:(real^3)list` THEN EXISTS_TAC `j:num`);
1572  (EXISTS_TAC `q:num->num`);
1573  (ASM_REWRITE_TAC[]);
1574  (STRIP_TAC);
1575  (ASM_SET_TAC[]);
1576  (REWRITE_TAC[GSYM (ASSUME `X = mcell j V vl`)]);
1577  (STRIP_TAC);
1578  (UNDISCH_TAC `~NULLSET X`);
1579  (REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
1580  (UNDISCH_TAC `~NULLSET r`);
1581  (REWRITE_TAC[]);
1582  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1583  (EXISTS_TAC `rogers V (left_action_list p ul) INTER
1584        rogers V (left_action_list q vl)`);
1585  (STRIP_TAC);
1586  (ASM_SIMP_TAC[COPLANAR_IMP_NEGLIGIBLE]);
1587  (ASM_SET_TAC[]);
1588  (ABBREV_TAC `xl:(real^3)list = (left_action_list p ul)`);
1589  (ABBREV_TAC `yl:(real^3)list = (left_action_list q vl)`);
1590
1591
1592  (NEW_GOAL `barV V 3 xl /\
1593              (!k. i - 1 <= k /\ k <= 3
1594                   ==> omega_list_n V xl k = omega_list_n V ul k)`);
1595  (MATCH_MP_TAC Ynhyjit.YNHYJIT);
1596  (EXISTS_TAC `p:num->num`);
1597  (ASM_REWRITE_TAC[]);
1598
1599  (ASM_CASES_TAC `j = 2`);
1600  (UNDISCH_TAC `~NULLSET X`);
1601  (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = X`); ASSUME `i = j:num`; 
1602    MCELL_EXPLICIT; mcell2; ASSUME `j = 2`]);
1603  (COND_CASES_TAC);
1604  (STRIP_TAC);
1605  (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`]);
1606  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1607
1608  (NEW_GOAL `j = 3`);
1609  (ASM_SET_TAC[]);
1610  (UNDISCH_TAC `~NULLSET X`);
1611  (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = X`); ASSUME `i = j:num`; 
1612    MCELL_EXPLICIT; mcell3; ASSUME `j = 3`]);
1613  (COND_CASES_TAC);
1614  (STRIP_TAC);
1615  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1616  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1617
1618
1619  (NEW_GOAL `barV V 3 yl /\
1620              (!k. j - 1 <= k /\ k <= 3
1621                   ==> omega_list_n V yl k = omega_list_n V vl k)`);
1622  (MATCH_MP_TAC Ynhyjit.YNHYJIT);
1623  (EXISTS_TAC `q:num->num`);
1624  (ASM_REWRITE_TAC[]);
1625
1626  (ASM_CASES_TAC `j = 2`);
1627  (UNDISCH_TAC `~NULLSET X`);
1628  (REWRITE_TAC[ASSUME `X = mcell j V vl`; MCELL_EXPLICIT; mcell2; ASSUME `j = 2`]);
1629  (COND_CASES_TAC);
1630  (STRIP_TAC);
1631  (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`]);
1632  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1633
1634  (NEW_GOAL `j = 3`);
1635  (ASM_SET_TAC[]);
1636  (UNDISCH_TAC `~NULLSET X`);
1637  (REWRITE_TAC[ASSUME `X = mcell j V vl`; MCELL_EXPLICIT; mcell3; ASSUME `j = 3`]);
1638  (COND_CASES_TAC);
1639  (STRIP_TAC);
1640  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1641  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1642
1643
1644  (NEW_GOAL `!k. 0 <= k /\ k <= 3
1645                   ==> omega_list_n V xl k = omega_list_n V yl k`);
1646  (MATCH_MP_TAC Njiutiu.NJIUTIU);
1647  (ASM_REWRITE_TAC[]);
1648  (NEW_GOAL `aff_dim (rogers V yl) <= &(dimindex (:3))`);
1649  (REWRITE_TAC[AFF_DIM_LE_UNIV]);
1650  (UP_ASM_TAC THEN REWRITE_TAC[DIMINDEX_3]);
1651  (STRIP_TAC);
1652  (NEW_GOAL `~(aff_dim (rogers V yl) <= &2)`);
1653  (STRIP_TAC);
1654  (UNDISCH_TAC `~NULLSET r` THEN REWRITE_TAC[]);
1655  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1656  (EXISTS_TAC `rogers V yl`);
1657  (STRIP_TAC);
1658  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1659  (ASM_SIMP_TAC[Rogers.AFF_DIM_LE_2_IMP_COPLANAR]);
1660  (ASM_SET_TAC[]);
1661  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
1662  (NEW_GOAL 
1663   `(!k. j - 1 <= k /\ k <= 3 ==> omega_list_n V xl k = omega_list_n V yl k)`);
1664  (REPEAT STRIP_TAC);
1665  (FIRST_ASSUM MATCH_MP_TAC);
1666  (ASM_REWRITE_TAC[]);
1667  (NEW_GOAL `j = 2 \/ j = 3 \/ j = 4`);
1668  (ASM_SET_TAC[]);
1669
1670  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
1671  (ASM_MESON_TAC[])]);;
1672
1673 (* ==================================================================== *)
1674 (* Lemma 23 *)
1675
1676 let MCELL_ID_MXI = prove_by_refinement (
1677  `!V i j ul vl.
1678          packing V /\
1679          saturated V /\
1680          barV V 3 ul /\
1681          barV V 3 vl /\
1682          HD ul = HD vl /\
1683          mcell i V ul = mcell j V vl /\
1684          ~NULLSET (mcell i V ul) /\
1685          i IN {2, 3} /\
1686          j IN {2, 3}
1687          ==> mxi V ul = mxi V vl`,
1688 [(REPEAT STRIP_TAC);
1689  (NEW_GOAL `i = j /\
1690              (!k. i - 1 <= k /\ k <= 3
1691                   ==> omega_list_n V ul k = omega_list_n V vl k)`);
1692  (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
1693  (ASM_REWRITE_TAC[]);
1694  (ASM_SET_TAC[]);
1695  (UP_ASM_TAC THEN STRIP_TAC);
1696
1697  (ASM_CASES_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) >= sqrt (&2)`);
1698  (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
1699
1700  (REWRITE_WITH `mxi V ul = omega_list_n V ul 2`);
1701  (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
1702  (ASM_REWRITE_TAC[]);
1703  (NEW_GOAL `F`);
1704  (ASM_MESON_TAC[]);
1705  (ASM_MESON_TAC[]);
1706
1707  (REWRITE_WITH `mxi V vl = omega_list_n V vl 2`);
1708  (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
1709  (ASM_REWRITE_TAC[]);
1710  (NEW_GOAL `F`);
1711  (ASM_MESON_TAC[]);
1712  (ASM_MESON_TAC[]);
1713
1714  (FIRST_ASSUM MATCH_MP_TAC);
1715  (NEW_GOAL `i = 2 \/ i = 3`);
1716  (ASM_SET_TAC[]);
1717  (ASM_ARITH_TAC);
1718
1719  (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
1720  (STRIP_TAC);
1721
1722  (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
1723  (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
1724
1725  (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) = 
1726              set_of_list (truncate_simplex (i - 1) vl)`);
1727  (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
1728  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1729  (NEW_GOAL `i = 2 \/ i = 3`);
1730  (ASM_SET_TAC[]);
1731  (ASM_REWRITE_TAC[]);
1732  (REPEAT STRIP_TAC);
1733  (ASM_ARITH_TAC);
1734  (ASM_ARITH_TAC);
1735  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1736  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1737  (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
1738  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1739  (NEW_GOAL `i = 2 \/ i = 3`);
1740  (ASM_SET_TAC[]);
1741  (ASM_REWRITE_TAC[]);
1742  (REPEAT STRIP_TAC);
1743  (ASM_ARITH_TAC);
1744  (ASM_ARITH_TAC);
1745  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1746  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1747  (ASM_MESON_TAC[]);
1748
1749  (NEW_GOAL `F`);
1750  (NEW_GOAL `hl (xl:(real^3)list) <= dist (omega_list V xl, HD xl)`);
1751  (MATCH_MP_TAC Rogers.WAUFCHE1);
1752  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "xl");
1753  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1754  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1755
1756  (NEW_GOAL `hl yl = dist (omega_list V yl, HD yl)`);
1757  (MATCH_MP_TAC Rogers.WAUFCHE2);
1758  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
1759  (EXPAND_TAC "yl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1760  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1761
1762  (NEW_GOAL `omega_list V xl = omega_list V yl`);
1763  (REWRITE_TAC[OMEGA_LIST]);
1764  (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
1765  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1766  (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
1767  (STRIP_TAC);
1768  (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1769  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
1770                  CARD (set_of_list ul) = 3 + 1`);
1771  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1772  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1773  (ARITH_TAC);
1774  (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1775  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
1776                  CARD (set_of_list vl) = 3 + 1`);
1777  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1778  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1779  (ARITH_TAC);
1780  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1781  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1782  (REWRITE_WITH 
1783   `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
1784    truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
1785  (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
1786  (REWRITE_WITH 
1787   `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
1788  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1789  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1790  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
1791                  CARD (set_of_list ul) = 3 + 1`);
1792  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1793  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1794  (ARITH_TAC);
1795
1796  (REWRITE_WITH 
1797   `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
1798  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1799  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1800  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
1801                  CARD (set_of_list vl) = 3 + 1`);
1802  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1803  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1804  (ARITH_TAC);
1805
1806  (FIRST_ASSUM MATCH_MP_TAC);
1807  (NEW_GOAL `i = 2 \/ i = 3`);
1808  (ASM_SET_TAC[]);
1809  (ASM_ARITH_TAC);
1810  (NEW_GOAL `HD (xl:(real^3)list) = HD yl`);
1811  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1812  (REWRITE_WITH `HD (truncate_simplex 2 ul) = (HD ul):real^3`);
1813  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1814  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
1815                  CARD (set_of_list ul) = 3 + 1`);
1816  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1817  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1818  (ARITH_TAC);
1819
1820  (REWRITE_WITH `HD (truncate_simplex 2 vl) = (HD vl):real^3`);
1821  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1822  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
1823                  CARD (set_of_list vl) = 3 + 1`);
1824  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1825  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1826  (ARITH_TAC);
1827  (ASM_REWRITE_TAC[]);
1828  (NEW_GOAL `hl (yl:(real^3)list) = dist (omega_list V xl, HD xl)`);
1829  (ASM_REWRITE_TAC[]);
1830  (ASM_REAL_ARITH_TAC);
1831  (ASM_MESON_TAC[]);
1832
1833 (* ======================================================================= *)
1834
1835  (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
1836  (STRIP_TAC);
1837  (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
1838
1839  (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
1840  (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
1841
1842  (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) = 
1843              set_of_list (truncate_simplex (i - 1) vl)`);
1844  (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
1845  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1846  (NEW_GOAL `i = 2 \/ i = 3`);
1847  (ASM_SET_TAC[]);
1848  (ASM_REWRITE_TAC[]);
1849  (REPEAT STRIP_TAC);
1850  (ASM_ARITH_TAC);
1851  (ASM_ARITH_TAC);
1852  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1853  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1854  (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
1855  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1856  (NEW_GOAL `i = 2 \/ i = 3`);
1857  (ASM_SET_TAC[]);
1858  (ASM_REWRITE_TAC[]);
1859  (REPEAT STRIP_TAC);
1860  (ASM_ARITH_TAC);
1861  (ASM_ARITH_TAC);
1862  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1863  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1864  (ASM_MESON_TAC[]);
1865
1866  (NEW_GOAL `F`);
1867  (NEW_GOAL `hl (yl:(real^3)list) <= dist (omega_list V yl, HD yl)`);
1868  (MATCH_MP_TAC Rogers.WAUFCHE1);
1869  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "yl");
1870  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1871  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1872
1873  (NEW_GOAL `hl xl = dist (omega_list V xl, HD xl)`);
1874  (MATCH_MP_TAC Rogers.WAUFCHE2);
1875  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
1876  (EXPAND_TAC "xl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1877  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1878
1879  (NEW_GOAL `omega_list V xl = omega_list V yl`);
1880  (REWRITE_TAC[OMEGA_LIST]);
1881  (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
1882  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1883  (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
1884  (STRIP_TAC);
1885  (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1886  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
1887                  CARD (set_of_list ul) = 3 + 1`);
1888  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1889  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1890  (ARITH_TAC);
1891  (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1892  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
1893                  CARD (set_of_list vl) = 3 + 1`);
1894  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1895  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1896  (ARITH_TAC);
1897  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1898  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1899  (REWRITE_WITH 
1900   `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
1901    truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
1902  (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
1903  (REWRITE_WITH 
1904   `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
1905  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1906  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1907  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
1908                  CARD (set_of_list ul) = 3 + 1`);
1909  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1910  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1911  (ARITH_TAC);
1912
1913  (REWRITE_WITH 
1914   `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
1915  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1916  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1917  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
1918                  CARD (set_of_list vl) = 3 + 1`);
1919  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1920  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1921  (ARITH_TAC);
1922
1923  (FIRST_ASSUM MATCH_MP_TAC);
1924  (NEW_GOAL `i = 2 \/ i = 3`);
1925  (ASM_SET_TAC[]);
1926  (ASM_ARITH_TAC);
1927
1928  (NEW_GOAL `HD (xl:(real^3)list) = HD yl`);
1929  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1930  (REWRITE_WITH `HD (truncate_simplex 2 ul) = (HD ul):real^3`);
1931  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1932  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
1933                  CARD (set_of_list ul) = 3 + 1`);
1934  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1935  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1936  (ARITH_TAC);
1937
1938  (REWRITE_WITH `HD (truncate_simplex 2 vl) = (HD vl):real^3`);
1939  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1940  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
1941                  CARD (set_of_list vl) = 3 + 1`);
1942  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1943  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1944  (ARITH_TAC);
1945  (ASM_REWRITE_TAC[]);
1946
1947  (NEW_GOAL `hl (xl:(real^3)list) = dist (omega_list V yl, HD yl)`);
1948  (ASM_REWRITE_TAC[]);
1949  (ASM_REAL_ARITH_TAC);
1950  (ASM_MESON_TAC[]);
1951  (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
1952  (STRIP_TAC);
1953
1954 (* ======================================================================= *)
1955
1956  (NEW_GOAL `sqrt (&2) <= hl (ul:(real^3)list)`);
1957  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1958  (ASM_CASES_TAC `i = 2`);
1959  (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 2`; mcell2]);
1960  (COND_CASES_TAC);
1961  (STRIP_TAC);
1962  (ASM_REWRITE_TAC[]);
1963  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1964  (NEW_GOAL `i = 3`);
1965  (ASM_SET_TAC[]);
1966  (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 3`; mcell3]);
1967  (COND_CASES_TAC);
1968  (STRIP_TAC);
1969  (ASM_REWRITE_TAC[]);
1970  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1971
1972  (NEW_GOAL `sqrt (&2) <= hl (vl:(real^3)list)`);
1973  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1974  (ASM_REWRITE_TAC[]);
1975  (ASM_CASES_TAC `j = 2`);
1976  (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 2`; mcell2]);
1977  (COND_CASES_TAC);
1978  (STRIP_TAC);
1979  (ASM_REWRITE_TAC[]);
1980  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1981  (NEW_GOAL `j = 3`);
1982  (ASM_SET_TAC[]);
1983  (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 3`; mcell3]);
1984  (COND_CASES_TAC);
1985  (STRIP_TAC);
1986  (ASM_REWRITE_TAC[]);
1987  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1988
1989  (ABBREV_TAC `s2 = omega_list_n V ul 2`);
1990  (ABBREV_TAC `s3 = omega_list_n V ul 3`);
1991  (NEW_GOAL `s2 = omega_list_n V vl 2`);
1992  (EXPAND_TAC "s2" THEN FIRST_ASSUM MATCH_MP_TAC);
1993  (NEW_GOAL `i = 2 \/ i = 3`);
1994  (ASM_SET_TAC[]);
1995  (ASM_ARITH_TAC);
1996  (NEW_GOAL `s3 = omega_list_n V vl 3`);
1997  (EXPAND_TAC "s3" THEN FIRST_ASSUM MATCH_MP_TAC);
1998  (NEW_GOAL `i = 2 \/ i = 3`);
1999  (ASM_SET_TAC[]);
2000  (ASM_ARITH_TAC);
2001  (ABBREV_TAC `u0:real^3 = HD ul`);
2002
2003  (NEW_GOAL `?s. between s (s2,s3) /\
2004                   dist (u0,s) = sqrt (&2) /\
2005                   mxi V ul = s`);
2006  (EXPAND_TAC "s2" THEN EXPAND_TAC "s3");
2007  (MATCH_MP_TAC MXI_EXPLICIT);
2008  (NEW_GOAL `?v0 u1 u2 u3. ul = [v0;u1;u2;u3:real^3]`);
2009  (MATCH_MP_TAC BARV_3_EXPLICIT);
2010  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2011  (UP_ASM_TAC THEN STRIP_TAC);
2012  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
2013    EXISTS_TAC `u3:real^3`);
2014  (ASM_REWRITE_TAC[]);
2015  (REWRITE_WITH `v0:real^3 = HD ul`);
2016  (REWRITE_TAC[ASSUME `ul = [v0;u1;u2;u3:real^3]`; HD]);
2017  (ASM_REWRITE_TAC[]);
2018  (UP_ASM_TAC THEN STRIP_TAC);
2019
2020  (NEW_GOAL `?t. between t (s2,s3) /\
2021                   dist (u0,t) = sqrt (&2) /\
2022                   mxi V vl = t`);
2023  (ASM_REWRITE_TAC[]);
2024  (MATCH_MP_TAC MXI_EXPLICIT);
2025  (NEW_GOAL `?v0 u1 u2 u3. vl = [v0;u1;u2;u3:real^3]`);
2026  (MATCH_MP_TAC BARV_3_EXPLICIT);
2027  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2028  (UP_ASM_TAC THEN STRIP_TAC);
2029  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
2030    EXISTS_TAC `u3:real^3`);
2031  (ASM_REWRITE_TAC[HD]);
2032  (UP_ASM_TAC THEN STRIP_TAC);
2033  (ASM_REWRITE_TAC[]);
2034
2035  (NEW_GOAL `!n. between n (s2, s3:real^3) ==> 
2036              dist (u0, n) pow 2 = dist (s2, n) pow 2 + dist (u0, s2) pow 2`);
2037  (REPEAT STRIP_TAC);
2038  (REWRITE_TAC[dist]);
2039  (MATCH_MP_TAC PYTHAGORAS);
2040  (REWRITE_TAC[orthogonal]);
2041  (ABBREV_TAC `zl = truncate_simplex 2 (ul:(real^3)list)`);
2042  (REWRITE_WITH `s2:real^3 = circumcenter (set_of_list zl)`);
2043  (REWRITE_WITH `s2 = omega_list V zl`);
2044  (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
2045  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2046  (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
2047  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2048                  CARD (set_of_list ul) = 3 + 1`);
2049  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2050  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2051  (ARITH_TAC);
2052  (MATCH_MP_TAC Rogers.XNHPWAB1);
2053  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
2054  (EXPAND_TAC "zl");
2055  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2056  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2057  (MATCH_MP_TAC Rogers.MHFTTZN4);
2058  (EXISTS_TAC `V:real^3->bool`);
2059  (EXISTS_TAC `2`);
2060  (REPEAT STRIP_TAC);
2061  (ASM_REWRITE_TAC[]);
2062  (EXPAND_TAC "zl");
2063  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2064  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2065
2066  (NEW_GOAL `s2 IN voronoi_list V zl`);
2067  (REWRITE_WITH `s2 = omega_list V zl`);
2068  (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
2069  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2070  (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
2071  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2072                  CARD (set_of_list ul) = 3 + 1`);
2073  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2074  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2075  (ARITH_TAC);
2076  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
2077  (EXISTS_TAC `2`);
2078  (EXPAND_TAC "zl");
2079  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2080  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2081
2082  (NEW_GOAL `s3 IN voronoi_list V zl`);
2083  (EXPAND_TAC "s3" THEN EXPAND_TAC "zl");
2084  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
2085  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3 /\ 3 <= 3`]);
2086  (NEW_GOAL `affine hull {s2, s3} SUBSET affine hull voronoi_list V zl`);
2087  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
2088  (ASM_SET_TAC[]);
2089  (NEW_GOAL `n IN affine hull {s2, s3:real^3}`);
2090  (NEW_GOAL `convex hull {s2,s3} SUBSET affine hull {s2,s3:real^3}`);
2091  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2092  (NEW_GOAL `n IN convex hull {s2, s3:real^3}`);
2093  (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
2094  (ASM_REWRITE_TAC[]);
2095  (ASM_SET_TAC[]);
2096  (ASM_SET_TAC[]);
2097
2098  (MATCH_MP_TAC Marchal_cells_2_new.IN_AFFINE_KY_LEMMA1);
2099  (REWRITE_WITH `u0:real^3 = HD zl`);
2100  (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
2101  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2102  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2103  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2104                  CARD (set_of_list ul) = 3 + 1`);
2105  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2106  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2107  (ARITH_TAC);
2108  (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
2109
2110  (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\ 
2111                  CARD (set_of_list zl) = 2 + 1`);
2112  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2113  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2114  (EXPAND_TAC "zl");
2115  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2116  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2117  (ARITH_TAC);
2118
2119  (NEW_GOAL `dist (u0,s) pow 2 = dist (s2,s:real^3) pow 2 + dist (u0,s2) pow 2`);
2120  (ASM_SIMP_TAC[]);
2121  (NEW_GOAL `dist (u0,t) pow 2 = dist (s2,t:real^3) pow 2 + dist (u0,s2) pow 2`);
2122  (ASM_SIMP_TAC[]);
2123  (NEW_GOAL `dist (s2, s:real^3) = dist (s2, t)`);
2124  (REWRITE_TAC[DIST_EQ]);
2125  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
2126
2127  (UNDISCH_TAC `between s (s2, s3:real^3)` THEN 
2128    UNDISCH_TAC `between t (s2, s3:real^3)`);
2129  (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
2130  (REPEAT STRIP_TAC);
2131  (UNDISCH_TAC `dist (s2,s) = dist (s2,t:real^3)`);
2132  (REWRITE_TAC[dist;ASSUME `s = u' % s2 + v' % s3:real^3`; 
2133    ASSUME `t = u % s2 + v % s3:real^3` ]);
2134  (REWRITE_WITH `s2 - (u' % s2 + v' % s3) =
2135   (u' + v') % s2 - (u' % s2 + v' % s3:real^3)`);
2136  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
2137  (REWRITE_WITH `s2 - (u % s2 + v % s3) =
2138   (u + v) % s2 - (u % s2 + v % s3:real^3)`);
2139  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
2140  (REWRITE_TAC[VECTOR_ARITH `(u + v) % s - (u % s + v % t) = v % (s - t)`]);
2141  (REWRITE_TAC[NORM_MUL]);
2142  (REWRITE_WITH `abs v = v /\ abs v' = v'`);
2143  (ASM_SIMP_TAC[REAL_ABS_REFL]);
2144  (REWRITE_TAC[REAL_ARITH `a * b = c * b <=> (a - c) * b = &0`;REAL_ENTIRE]);
2145  (STRIP_TAC);
2146  (REWRITE_WITH `v = v':real /\ u = u':real`);
2147  (ASM_REAL_ARITH_TAC);
2148  (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0]);
2149  (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`] THEN STRIP_TAC);
2150  (NEW_GOAL `F`);
2151  (NEW_GOAL `hl (ul:(real^3)list) <= dist (s3,u0:real^3)`);
2152  (REWRITE_WITH `s3 = omega_list V ul /\ u0 = HD ul`);
2153  (STRIP_TAC);
2154  (REWRITE_TAC[GSYM (ASSUME `omega_list_n V ul 3 = s3`); OMEGA_LIST]);
2155  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2156                  CARD (set_of_list ul) = 3 + 1`);
2157  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2158  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2159  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
2160  (ASM_REWRITE_TAC[]);
2161  (MATCH_MP_TAC Rogers.WAUFCHE1);
2162  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
2163  (ABBREV_TAC `zl:(real^3)list = truncate_simplex 2 ul`);
2164  (NEW_GOAL `hl (zl:(real^3)list) = dist (s3, u0:real^3)`);
2165
2166
2167  (REWRITE_WITH `s3 = omega_list V zl /\ u0 = HD zl`);
2168  (STRIP_TAC);
2169  (REWRITE_TAC[GSYM (ASSUME `s2:real^3 = s3`); OMEGA_LIST]);
2170  (EXPAND_TAC "s2");
2171
2172  (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\ 
2173                  CARD (set_of_list zl) = 2 + 1`);
2174  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2175  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2176  (EXPAND_TAC "zl");
2177  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2178  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2179  (REWRITE_TAC[ARITH_RULE `(2 + 1) - 1 = 2`]);
2180  (EXPAND_TAC "zl");
2181
2182  (REWRITE_WITH `truncate_simplex 2 (ul:(real^3)list) = 
2183                  truncate_simplex (2 + 0) (ul:(real^3)list)`);
2184  (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
2185  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
2186  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2187                  CARD (set_of_list ul) = 3 + 1`);
2188  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2189  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2190  (ARITH_TAC);
2191
2192  (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
2193  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2194  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2195  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2196                  CARD (set_of_list ul) = 3 + 1`);
2197  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2198  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2199  (ARITH_TAC);
2200  (MATCH_MP_TAC Rogers.WAUFCHE2);
2201  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
2202  (EXPAND_TAC "zl");
2203  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2204  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2205  (ASM_REAL_ARITH_TAC);
2206  (ASM_MESON_TAC[])]);;
2207
2208
2209 (* ==================================================================== *)
2210 (* Lemma 24 *)
2211
2212 let AFFINE_HULL_3_INSERT = prove_by_refinement (
2213 `!a:real^3 S.
2214     a IN affine hull S ==> affine hull (a INSERT S) = affine hull S`,
2215 [(REPEAT STRIP_TAC);
2216  (MATCH_MP_TAC AFFINE_HULLS_EQ);
2217  (ASM_REWRITE_TAC[SET_SUBSET_AFFINE_HULL; INSERT_SUBSET]);
2218  (MATCH_MP_TAC (SET_RULE `a:real^3 INSERT s SUBSET t ==> s SUBSET t`));
2219  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL])]);;
2220
2221 (* ==================================================================== *)
2222 (* Lemma 25 *)
2223
2224 let FINITE_EDGE_X2 = prove_by_refinement (
2225  `!(V:real^3->bool) e:real^3->bool u0 u1. 
2226     packing V /\ saturated V /\ e = {u0, u1} ==> 
2227     FINITE {X | mcell_set V X /\ edgeX V X e}`,
2228 [(REPEAT STRIP_TAC);
2229  (MATCH_MP_TAC FINITE_SUBSET);
2230  (EXISTS_TAC `{X | mcell_set V X /\ edgeX V X e /\ ~(X = {})} UNION {{}}`);
2231
2232  (ONCE_REWRITE_TAC[SET_RULE `A /\ B <=> B /\ A`]);
2233  (STRIP_TAC);
2234  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; IN_UNION]);
2235  (REPEAT STRIP_TAC);
2236  (ASM_REWRITE_TAC[MESON[IN] `{{}} x <=> x IN {{}}`; 
2237    SET_RULE `x IN {a} <=> x = a`]);
2238  (MESON_TAC[]);
2239  (REWRITE_TAC [FINITE_UNION; FINITE_SING]);
2240
2241  (MATCH_MP_TAC FINITE_SUBSET);
2242  (ABBREV_TAC `f = (\(i, ul). mcell i V ul)`);
2243  (ABBREV_TAC `s = V INTER ball (u0:real^3, &4)`);
2244  (ABBREV_TAC `S = {y | ?v0 v1 v2 v3:real^3.
2245                       v0 IN s /\
2246                       v1 IN s /\
2247                       v2 IN s /\
2248                       v3 IN s /\
2249                       y = [v0; v1; v2; v3]}`);
2250  (ABBREV_TAC `S1 = {i, (ul:(real^3)list) | i IN 0..4 /\ ul IN S}`);
2251  (EXISTS_TAC `{(f:num#(real^3)list->real^3->bool) x | x IN S1}`);
2252  (STRIP_TAC);
2253  (REWRITE_TAC[SET_RULE `{f x |x IN s } = {y | ?x. x IN s /\ y = f x}`]);
2254  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
2255  (EXPAND_TAC "S1");
2256  (MATCH_MP_TAC FINITE_PRODUCT);
2257  (REWRITE_TAC[FINITE_NUMSEG]);
2258  (EXPAND_TAC "S");
2259  (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA);
2260  (EXPAND_TAC "s");
2261  (MATCH_MP_TAC Pack2.KIUMVTC THEN ASM_SIMP_TAC[]);
2262
2263  (EXPAND_TAC "f" THEN REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; mcell_set_2]);
2264  (REPEAT STRIP_TAC);
2265  (EXISTS_TAC `(i:num, ul:(real^3)list)`);
2266  (ASM_REWRITE_TAC[]);
2267  (EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM]);
2268  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list`);
2269  (ASM_REWRITE_TAC[IN_NUMSEG_0]);
2270  (EXPAND_TAC "S" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
2271  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2272  (MATCH_MP_TAC BARV_3_EXPLICIT);
2273  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2274  (UP_ASM_TAC THEN REPEAT STRIP_TAC);
2275  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN 
2276    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2277  (ASM_REWRITE_TAC[]);
2278  (NEW_GOAL `set_of_list ul SUBSET (s:real^3->bool)`);
2279  (EXPAND_TAC "s");
2280  (REWRITE_TAC[SUBSET_INTER]);
2281  (STRIP_TAC);
2282  (MATCH_MP_TAC Packing3.BARV_SUBSET);
2283  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2284  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2285  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2286
2287  (NEW_GOAL `~NULLSET x`);
2288  (UNDISCH_TAC `edgeX V x e`);
2289  (REWRITE_TAC[edgeX; IN_ELIM_THM; VX]);
2290  (COND_CASES_TAC);
2291  (REPEAT STRIP_TAC);
2292  (UNDISCH_TAC `{ } (u:real^3)`);
2293  (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
2294  (ASM_MESON_TAC[]);
2295
2296  (NEW_GOAL `VX V x = V INTER x`);
2297  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
2298  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
2299  (ASM_REWRITE_TAC[]);
2300
2301  (NEW_GOAL `V INTER (x:real^3->bool) = 
2302    set_of_list (truncate_simplex (i - 1) ul)`);
2303  (ASM_REWRITE_TAC[]);
2304  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
2305  (REWRITE_TAC[GSYM (ASSUME `ul = [v0;v1;v2;v3:real^3]`);
2306    GSYM (ASSUME `x = mcell i V ul`)]);
2307  (ASM_REWRITE_TAC[]);
2308  (ASM_CASES_TAC `i = 0`);
2309  (NEW_GOAL `F`);
2310  (UNDISCH_TAC `edgeX V x e`);
2311  (REWRITE_TAC[edgeX; IN_ELIM_THM]);
2312  (REWRITE_WITH `VX V x = {}`);
2313  (ASM_REWRITE_TAC[]);
2314  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
2315  (ASM_REWRITE_TAC[]);
2316  (ASM_MESON_TAC[]);
2317  (REPEAT STRIP_TAC);
2318  (UNDISCH_TAC `{ } (u:real^3)`);
2319  (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
2320  (ASM_MESON_TAC[]);
2321  (UP_ASM_TAC THEN ARITH_TAC);
2322
2323  (NEW_GOAL `u0 IN VX V x`);
2324  (UNDISCH_TAC `edgeX V x e`);
2325  (REWRITE_TAC[edgeX; IN_ELIM_THM; ASSUME `e = {u0, u1:real^3}`; IN]);
2326  (REPEAT STRIP_TAC);
2327  (ASM_SET_TAC[]);
2328  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2329
2330  (REWRITE_TAC[GSYM (ASSUME `ul = [v0; v1; v2; v3:real^3]`)]);
2331  (STRIP_TAC);
2332  (NEW_GOAL `set_of_list (truncate_simplex (i - 1) ul) SUBSET 
2333              set_of_list (ul:(real^3)list)`);
2334  (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
2335  (ASM_REWRITE_TAC[LENGTH] THEN ASM_ARITH_TAC);
2336  (ASM_SET_TAC[]);
2337  (REWRITE_TAC[MESON[IN] `(s:real^3->bool) v <=> v IN s`]);
2338  (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[])]);;
2339
2340
2341 (* ==================================================================== *)
2342 (* Lemma 26 *)
2343
2344 let CONTINUOUS_ON_LIFT_DOT2 = prove
2345  (`!f:real^M->real^N g s.
2346        f continuous_on s /\ g continuous_on s
2347        ==> (\x. lift(f x dot g x)) continuous_on s`,
2348  REPEAT GEN_TAC THEN
2349  SUBGOAL_THEN `bilinear (\x y:real^N. lift(x dot y))` MP_TAC THENL
2350   [REWRITE_TAC[bilinear; linear; DOT_LADD; DOT_RADD; DOT_LMUL; DOT_RMUL] THEN
2351    REWRITE_TAC[LIFT_ADD; LIFT_CMUL];
2352    REWRITE_TAC[GSYM IMP_CONJ_ALT; GSYM CONJ_ASSOC] THEN
2353    DISCH_THEN(MP_TAC o MATCH_MP BILINEAR_CONTINUOUS_ON_COMPOSE) THEN
2354    REWRITE_TAC[]]);;
2355
2356 let LIFT_MUL_CONTINUOUS_ON = prove
2357  (`!f:real^N->real g s.
2358    lift o f continuous_on s /\ lift o g continuous_on s ==>
2359    lift o (\x. f x * g x) continuous_on s`,
2360  REWRITE_TAC[o_DEF; LIFT_CMUL] THEN
2361  REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
2362  ASM_REWRITE_TAC[o_DEF]);;
2363
2364 let LIFT_DIV_CONTINUOUS_ON = prove
2365  (`!f:real^N->real g s.
2366    lift o f continuous_on s /\ lift o g continuous_on s /\
2367    (!x. x IN s ==> ~(g x = &0))==>
2368    lift o (\x. f x / g x) continuous_on s`,
2369  REWRITE_TAC[o_DEF; LIFT_CMUL; real_div] THEN
2370  REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
2371  ASM_REWRITE_TAC[o_DEF] THEN
2372  MATCH_MP_TAC(REWRITE_RULE[o_DEF] CONTINUOUS_ON_INV) THEN
2373  ASM_REWRITE_TAC[]);;
2374
2375 let LIFT_DOT_CONTINUOUS_ON = prove
2376 (`!a:real^N b s.
2377    (lift o ((\x. (x - a) dot b))) continuous_on s`,
2378  REPEAT GEN_TAC THEN REWRITE_TAC[o_DEF] THEN
2379  MATCH_MP_TAC CONTINUOUS_ON_LIFT_DOT2 THEN
2380  ASM_SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID]);;
2381
2382 let LIFT_NORM_CONTINUOUS_ON = prove
2383  (`!a:real^N s.
2384    (lift o ((\x. norm (x - a)))) continuous_on s`,
2385  REPEAT GEN_TAC THEN REWRITE_TAC[o_DEF] THEN
2386  MATCH_MP_TAC CONTINUOUS_ON_LIFT_NORM_COMPOSE THEN
2387  ASM_SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID]);;
2388
2389 (* ==================================================================== *)
2390 (* Lemma 27 *)
2391
2392 let aff_ge_alt = new_definition
2393  `aff_ge_alt s t (v:real^3) <=>
2394          (?f q. FINITE q /\ q SUBSET t /\ v = lin_combo (s UNION q) f /\
2395               (!w. q w ==> &0 <= f w) /\
2396               sum (s UNION q) f = &1)`;;
2397
2398 let smallest_angle_set = new_definition 
2399  `!u0:real^3 u1 s. 
2400   smallest_angle_set s u0 u1 =
2401   (@x. x IN s /\ (!y. y IN s ==> 
2402                          ((y - u0) dot (u1 - u0)) / 
2403                          (norm (y - u0) * norm (u1 - u0)) <=
2404                          ((x - u0) dot (u1 - u0)) / 
2405                          (norm (x - u0) * norm (u1 - u0))))`;;
2406
2407 let smallest_angle_line = new_definition 
2408  `!a b c d:real^3. 
2409   smallest_angle_line a b c d = smallest_angle_set (convex hull {a, b}) c d`;;
2410
2411 let SMALLEST_ANGLE_LINE_EXISTS = prove_by_refinement (
2412  `!a b u0 u1. ~(u0 = u1) /\ ~(u0 IN convex hull {a, b}) ==> 
2413               (?x.  (x IN convex hull {a, b:real^3} /\ 
2414                    (!y. y IN convex hull {a, b} ==> 
2415                          ((y - u0) dot (u1 - u0)) / 
2416                          (norm (y - u0) * norm (u1 - u0)) <=
2417                          ((x - u0) dot (u1 - u0)) / 
2418                          (norm (x - u0) * norm (u1 - u0)))))`,
2419 [(REPEAT STRIP_TAC);
2420  (ABBREV_TAC `f = (\x:real^3. ((x - u0) dot (u1 - u0)) / 
2421                          (norm (x - u0) * norm (u1 - u0)))`);
2422
2423  (REWRITE_WITH `!y:real^3. 
2424   ((y - u0) dot (u1 - u0)) / (norm (y - u0) * norm (u1 - u0)) =  f y`);
2425  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
2426  (MATCH_MP_TAC CONTINUOUS_ATTAINS_SUP);
2427  (STRIP_TAC);
2428  (MATCH_MP_TAC FINITE_IMP_COMPACT_CONVEX_HULL);
2429  (REWRITE_TAC[Geomdetail.FINITE6]);
2430  (STRIP_TAC);
2431  (REWRITE_TAC[CONVEX_HULL_EQ_EMPTY] THEN SET_TAC[]);
2432  (ABBREV_TAC `f1 = (\x. (x - u0) dot (u1 - u0:real^3))`);
2433  (ABBREV_TAC `f2 = (\x. norm (x - u0) * norm (u1 - u0:real^3))`);
2434  (REWRITE_WITH `f = (\x:real^3. f1 x / f2 x)`);
2435  (EXPAND_TAC "f" THEN EXPAND_TAC "f1" THEN EXPAND_TAC "f2");
2436  (REWRITE_TAC[]);
2437  (MATCH_MP_TAC LIFT_DIV_CONTINUOUS_ON);
2438
2439  (REPEAT STRIP_TAC);
2440  (EXPAND_TAC "f1");
2441  (REWRITE_TAC[LIFT_DOT_CONTINUOUS_ON]);
2442  (ABBREV_TAC `f3 = (\x:real^3. norm (u1 - u0:real^3))`);
2443  (ABBREV_TAC `f4 = (\x:real^3. norm (x - u0:real^3))`);
2444  (REWRITE_WITH `f2 = (\x:real^3. f4 x * f3 x)`);
2445  (EXPAND_TAC "f2" THEN EXPAND_TAC "f3" THEN EXPAND_TAC "f4");
2446  (REWRITE_TAC[]);
2447  (MATCH_MP_TAC LIFT_MUL_CONTINUOUS_ON);
2448  (EXPAND_TAC "f3" THEN EXPAND_TAC "f4");
2449  (REWRITE_TAC[LIFT_NORM_CONTINUOUS_ON]);
2450  (REWRITE_TAC[o_DEF; CONTINUOUS_ON_CONST]);
2451  (UP_ASM_TAC THEN EXPAND_TAC "f2" THEN REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0]);
2452  (ASM_REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2453  (STRIP_TAC);
2454  (ASM_MESON_TAC[])]);;
2455
2456 (* ==================================================================== *)
2457 (* Lemma 28 *)
2458
2459 let SMALLEST_ANGLE_IN_CONVEX_HULL = prove_by_refinement (
2460   `!m n p q x. 
2461     ~(p = q) /\ ~(p IN convex hull {m,n}) /\ x = smallest_angle_line m n p q 
2462        ==> x IN convex hull {m, n}`, 
2463 [(REPEAT STRIP_TAC);
2464  (UP_ASM_TAC THEN REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2465  (STRIP_TAC);
2466  (ABBREV_TAC `X = (\x:real^3. x IN convex hull {m, n} /\
2467            (!y. y IN convex hull {m, n}
2468                 ==> ((y - p) dot (q - p)) / (norm (y - p) * norm (q - p)) <=
2469                     ((x - p) dot (q - p)) / (norm (x - p) * norm (q - p))))`);
2470  (NEW_GOAL `(X:real^3->bool) x`);
2471  (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SELECT_AX);
2472  (EXPAND_TAC "X" THEN ASM_SIMP_TAC[SMALLEST_ANGLE_LINE_EXISTS]);
2473  (UP_ASM_TAC THEN EXPAND_TAC "X" THEN MESON_TAC[])]);;
2474
2475 (* ==================================================================== *)
2476 (* Lemma 29 *)
2477
2478 let SMALLEST_ANGLE_LINE_PROPERTY = prove_by_refinement (
2479  `!m n u0 u1 x y. 
2480     ~(u0 = u1) /\ 
2481     ~(u0 IN convex hull {m,n}) /\ 
2482     x = smallest_angle_line m n u0 u1 /\ 
2483     y IN convex hull {m, n} 
2484        ==> ((y - u0) dot (u1 - u0)) /
2485            (norm (y - u0) * norm (u1 - u0)) <=
2486            ((x - u0) dot (u1 - u0)) /
2487            (norm (x - u0) * norm (u1 - u0))`,
2488 [(REPEAT STRIP_TAC);
2489  (UNDISCH_TAC `x = smallest_angle_line m n u0 u1`);
2490  (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2491  (STRIP_TAC);
2492  (ABBREV_TAC `X =
2493      (\x:real^3. x IN convex hull {m, n} /\
2494          (!y. y IN convex hull {m, n}
2495             ==> ((y - u0) dot (u1 - u0)) / (norm (y - u0) * norm (u1 - u0)) <=
2496                ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0))))`);
2497  (NEW_GOAL `(X:real^3->bool) x`);
2498  (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SELECT_AX);
2499  (EXPAND_TAC "X" THEN ASM_SIMP_TAC[SMALLEST_ANGLE_LINE_EXISTS]);
2500  (UP_ASM_TAC THEN EXPAND_TAC "X" THEN ASM_MESON_TAC[])]);;
2501
2502 (* ==================================================================== *)
2503 (* Lemma 30 *)
2504
2505 let MCELL_SUBSET_BALL8_1 = prove_by_refinement (
2506  `!v:real^3 ul i V. 
2507        i<= 4 /\ packing V /\ saturated V /\ barV V 3 ul /\ v IN mcell i V ul ==>
2508        mcell i V ul SUBSET ball (v, &8)`,
2509 [(REPEAT STRIP_TAC);
2510  (NEW_GOAL `mcell i V ul SUBSET
2511              UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
2512  (MATCH_MP_TAC Qzksykg.QZKSYKG2);
2513  (ASM_REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4}<=> i =0\/i=1\/i=2\/i=3\/i=4`]);
2514  (ASM_ARITH_TAC);
2515  (NEW_GOAL `UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}
2516       SUBSET UNIONS {voronoi_closed V s | s IN set_of_list ul}`);
2517  (REWRITE_TAC[SUBSET; IN_UNIONS; IN;IN_ELIM_THM] THEN REPEAT STRIP_TAC);
2518  (EXISTS_TAC `voronoi_closed V ((HD (left_action_list p ul)):real^3)`);
2519  (STRIP_TAC);
2520  (EXISTS_TAC `(HD (left_action_list p ul)):real^3`);
2521  (REWRITE_TAC[MESON[IN] `(a:real^3->bool) s <=> s IN a`]);
2522  (REWRITE_WITH 
2523   `set_of_list (ul:(real^3)list) = set_of_list (left_action_list p ul)`);
2524  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2525  (ASM_CASES_TAC `i = 4`);
2526  (MATCH_MP_TAC Packing3.SET_OF_LIST_LEFT_ACTION_LIST);
2527  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2528                  CARD (set_of_list ul) = 3 + 1`);
2529  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2530  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2531  (ASM_MESON_TAC[ARITH_RULE `3 + 1 = 4`]);
2532
2533  (ASM_CASES_TAC `i = 3`);
2534  (MATCH_MP_TAC Marchal_cells_2_new.SET_OF_LIST_LEFT_ACTION_LIST_2);
2535  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2536                  CARD (set_of_list ul) = 3 + 1`);
2537  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2538  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2539  (ASM_MESON_TAC[ARITH_RULE `(3 + 1) - 2 = 3 - 1 /\ 2 <= 3 + 1`]);
2540
2541  (ASM_CASES_TAC `i = 2`);
2542  (MATCH_MP_TAC Marchal_cells_2_new.SET_OF_LIST_LEFT_ACTION_LIST_3);
2543  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2544                  CARD (set_of_list ul) = 3 + 1`);
2545  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2546  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2547  (ASM_MESON_TAC[ARITH_RULE `(3 + 1) - 3 = 2 - 1 /\ 3 <= 3 + 1`]);
2548
2549  (NEW_GOAL `i <= 1`);
2550  (ASM_ARITH_TAC);
2551  (NEW_GOAL `p permutes 0..0`);
2552  (ASM_MESON_TAC[ARITH_RULE `i <= 1 ==> i - 1 = 0`]);
2553  (UP_ASM_TAC THEN REWRITE_TAC[Packing3.PERMUTES_TRIVIAL] THEN STRIP_TAC);
2554  (ASM_REWRITE_TAC[Packing3.LEFT_ACTION_LIST_I]);
2555  (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
2556  (REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
2557  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
2558                  CARD (set_of_list ul) = 3 + 1`);
2559  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2560  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2561  (ARITH_TAC);
2562
2563  (UP_ASM_TAC THEN REWRITE_TAC[MESON[IN] `(a:real^3->bool) s <=> s IN a`]);
2564  (ASM_REWRITE_TAC[]);
2565  (NEW_GOAL `rogers V (left_action_list p ul) SUBSET
2566              voronoi_closed V (HD (left_action_list p ul))`);
2567  (MATCH_MP_TAC ROGERS_SUBSET_VORONOI_CLOSED);
2568  (ASM_REWRITE_TAC[]);
2569  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
2570  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN 
2571    EXISTS_TAC `p:num->num`);
2572  (ASM_REWRITE_TAC[]);
2573  (STRIP_TAC);
2574  (REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4} <=> i=0\/i=1\/i=2\/i=3\/i=4`]);
2575  (ASM_ARITH_TAC);
2576  (UNDISCH_TAC `v IN mcell i V ul` THEN SET_TAC[]);
2577  (UP_ASM_TAC THEN SET_TAC[]);
2578
2579  (NEW_GOAL `UNIONS {voronoi_closed V s | s IN set_of_list ul} SUBSET 
2580              UNIONS {ball (s:real^3, &2) | s IN set_of_list ul}`);
2581  (NEW_GOAL `!s:real^3. voronoi_closed V s  SUBSET ball (s, &2)`);
2582  (ASM_SIMP_TAC[Packing3.VORONOI_BALL2]);
2583  (UP_ASM_TAC THEN SET_TAC[]);
2584
2585  (NEW_GOAL `mcell i V ul SUBSET UNIONS {ball (s,&2) | s IN set_of_list ul}`);
2586  (ABBREV_TAC `s1 = 
2587    UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
2588  (ABBREV_TAC `s2 = 
2589    UNIONS {voronoi_closed V (s:real^3) | s IN set_of_list ul}`);
2590  (ABBREV_TAC `s3 = UNIONS {ball (s:real^3,&2) | s IN set_of_list ul}`);
2591  (DEL_TAC THEN DEL_TAC THEN DEL_TAC);
2592  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
2593  (UP_ASM_TAC THEN REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM; IN_BALL]);
2594  (REPEAT STRIP_TAC);
2595  (NEW_GOAL `?t. (?s. set_of_list ul s /\ t = ball (s:real^3,&2)) /\ t x`);
2596  (ASM_SIMP_TAC[]);
2597  (UP_ASM_TAC THEN STRIP_TAC);
2598  (NEW_GOAL `dist (s, x:real^3) < &2`);
2599  (REWRITE_TAC[GSYM IN_BALL]);
2600  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
2601
2602  (NEW_GOAL `?t. (?s. set_of_list ul s /\ t = ball (s:real^3,&2)) /\ t v`);
2603  (FIRST_ASSUM MATCH_MP_TAC);
2604  (ASM_SET_TAC[]);
2605  (UP_ASM_TAC THEN STRIP_TAC);
2606  (NEW_GOAL `dist (s', v:real^3) < &2`);
2607  (REWRITE_TAC[GSYM IN_BALL]);
2608  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
2609
2610  (NEW_GOAL `dist (v, x:real^3) <= dist (s', v) + dist (s', s) + dist (s, x)`);
2611  (NORM_ARITH_TAC);
2612  (NEW_GOAL `dist (s', s:real^3) < &4`);
2613  (REWRITE_TAC[GSYM IN_BALL]);
2614
2615  (NEW_GOAL `set_of_list ul SUBSET ball (s':real^3,&4)`);
2616  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2617  (EXISTS_TAC `V:real^3->bool`);
2618  (ASM_REWRITE_TAC[IN]);
2619  (ASM_SET_TAC[]);
2620  (ASM_REAL_ARITH_TAC)]);;
2621
2622 (* ==================================================================== *)
2623 (* Lemma 31 *)
2624
2625 let MCELL_SUBSET_BALL8 = prove_by_refinement (
2626  `!v:real^3 ul i V. 
2627        packing V /\ saturated V /\ barV V 3 ul /\ v IN mcell i V ul ==>
2628        mcell i V ul SUBSET ball (v, &8)`,
2629 [(REPEAT STRIP_TAC);
2630  (ASM_CASES_TAC `i <= 4`);
2631  (ASM_SIMP_TAC[MCELL_SUBSET_BALL8_1]);
2632  (UNDISCH_TAC `v IN mcell i V ul`);
2633  (REWRITE_WITH `mcell i V ul = mcell 4 V ul`);
2634  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; 
2635    ARITH_RULE `~(i <= 4)==>i >= 4`]);
2636  (STRIP_TAC);
2637  (ASM_SIMP_TAC[MCELL_SUBSET_BALL8_1; ARITH_RULE `4 <= 4`])]);;
2638
2639 (* ==================================================================== *)
2640 (* Lemma 32 *)
2641
2642 let FINITE_MCELL_SET_LEMMA_2 = prove_by_refinement (
2643  `!V r s:real^3.
2644            packing V /\ saturated V
2645            ==> FINITE {X | X SUBSET ball (s,r) /\ mcell_set V X}`,
2646 [(REPEAT STRIP_TAC);
2647  (MATCH_MP_TAC FINITE_SUBSET);
2648  (EXISTS_TAC `{X | X SUBSET ball (vec 0,norm (s:real^3) + r) /\ 
2649                     mcell_set V X}`);
2650  (STRIP_TAC);
2651  (ASM_SIMP_TAC[FINITE_MCELL_SET_LEMMA]);
2652  (REWRITE_TAC[IN; SUBSET; IN_BALL; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
2653  (NEW_GOAL `dist (vec 0, x') <= norm s + dist (s, x':real^3)`);
2654  (NORM_ARITH_TAC);
2655  (NEW_GOAL `dist (s, x':real^3) < r`);
2656  (ASM_SIMP_TAC[]);
2657  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2658  (ASM_REWRITE_TAC[])]);;
2659
2660 (* ==================================================================== *)
2661 (* Lemma 33 *)
2662
2663 let CONIC_CAP_WEDGE_EQ_0 =prove_by_refinement (
2664  `!v0 v1 a r w1 w2. a < &1 /\ &0 < r /\
2665        vol (conic_cap v0 v1 r a INTER wedge v0 v1 w1 w2) = &0 ==>
2666        coplanar {v0,v1,w1, w2:real^3}`,
2667 [(REPEAT STRIP_TAC);
2668  (MATCH_MP_TAC (MESON[] `(~A==> F) ==> A`) THEN STRIP_TAC);
2669  (NEW_GOAL `~collinear {v0, v1, w1:real^3}`);
2670  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2671  (EXISTS_TAC `w2:real^3` THEN ASM_REWRITE_TAC[]);
2672  (NEW_GOAL `~collinear {v0, v1, w2:real^3}`);
2673  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2674  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`] THEN 
2675    EXISTS_TAC `w1:real^3` THEN ASM_REWRITE_TAC[]);
2676
2677  (NEW_GOAL `vol (conic_cap v0 v1 r a INTER wedge v0 v1 w1 (w2:real^3)) =
2678              (if &1 < a \/ r < &0
2679               then &0
2680               else azim v0 v1 w1 w2 / &3 * (&1 - max a (-- &1)) * r pow 3)`);
2681  (ASM_MESON_TAC[VOLUME_CONIC_CAP_WEDGE]);
2682  (UP_ASM_TAC THEN COND_CASES_TAC);
2683  (STRIP_TAC THEN ASM_REAL_ARITH_TAC);
2684  (ASM_REWRITE_TAC[REAL_ARITH `&0 = a <=> a = &0`; 
2685    REAL_ENTIRE; REAL_ARITH `a / &3 = &0 <=> a = &0`]);
2686  (REWRITE_TAC[REAL_ARITH `&1 - max a (-- &1) = &0 <=> a = &1`]);
2687  (REPEAT STRIP_TAC);
2688  (UNDISCH_TAC `~coplanar {v0, v1, w1, w2:real^3}`);
2689  (ASM_SIMP_TAC[AZIM_EQ_0_PI_IMP_COPLANAR]);
2690  (ASM_REAL_ARITH_TAC);
2691  (UP_ASM_TAC THEN REWRITE_TAC[] THEN MATCH_MP_TAC REAL_POW_NZ);
2692  (ASM_REAL_ARITH_TAC)]);;
2693
2694 (* ==================================================================== *)
2695 (* Lemma 34 *)
2696
2697 let CONIC_CAP_AFF_GT_EQ_0 =prove_by_refinement (
2698  `!v0 v1 a r w1 w2. a < &1 /\ &0 < r /\
2699        vol (conic_cap v0 v1 r a INTER aff_gt {v0, v1} {w1, w2}) = &0 ==>
2700        coplanar {v0,v1,w1, w2:real^3}`,
2701 [(REPEAT STRIP_TAC);
2702  (MATCH_MP_TAC (MESON[] `(~A==> F) ==> A`) THEN STRIP_TAC);
2703  (NEW_GOAL `~collinear {v0, v1, w1:real^3}`);
2704  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2705  (EXISTS_TAC `w2:real^3` THEN ASM_REWRITE_TAC[]);
2706  (NEW_GOAL `~collinear {v0, v1, w2:real^3}`);
2707  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2708  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`] THEN 
2709    EXISTS_TAC `w1:real^3` THEN ASM_REWRITE_TAC[]);
2710  (ASM_CASES_TAC `azim v0 v1 w1 (w2:real^3) < pi`);
2711  (NEW_GOAL `wedge v0 v1 w1 w2 = aff_gt {v0, v1} {w1, w2:real^3}`);
2712  (ASM_MESON_TAC[WEDGE_LUNE]);
2713  (ASM_MESON_TAC[ CONIC_CAP_WEDGE_EQ_0]);
2714
2715  (ASM_CASES_TAC `azim v0 v1 w1 (w2:real^3) > pi`);
2716  (NEW_GOAL `azim v0 v1 w2 (w1:real^3) =
2717         (if azim v0 v1 w1 w2 = &0 then &0 else &2 * pi - azim v0 v1 w1 w2)`);
2718  (MATCH_MP_TAC AZIM_COMPL);
2719  (ASM_REWRITE_TAC[]);
2720  (UP_ASM_TAC THEN COND_CASES_TAC);
2721  (UNDISCH_TAC `azim v0 v1 w1 (w2:real^3) > pi` THEN ASM_REWRITE_TAC[]);
2722  (MESON_TAC[PI_POS_LE; REAL_ARITH `&0 > a <=> ~(&0 <= a)`]);
2723  (STRIP_TAC);
2724  (NEW_GOAL `azim v0 v1 w2 (w1:real^3) < pi`);
2725  (ASM_REAL_ARITH_TAC);
2726
2727  (NEW_GOAL `wedge v0 v1 w2 w1 = aff_gt {v0, v1} {w1, w2:real^3}`);
2728  (REWRITE_WITH `{w1, w2:real^3} = {w2, w1}`);
2729  (SET_TAC[]);
2730
2731  (UNDISCH_TAC `~coplanar {v0, v1, w1, w2:real^3}`);
2732  (REWRITE_TAC[]);
2733  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
2734  (ASM_MESON_TAC[WEDGE_LUNE]);
2735
2736  (UNDISCH_TAC `~coplanar {v0, v1, w1, w2:real^3}`);
2737  (REWRITE_TAC[]);
2738  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
2739  (ASM_MESON_TAC[ CONIC_CAP_WEDGE_EQ_0]);
2740
2741  (NEW_GOAL `azim v0 v1 w1 (w2:real^3) = pi`);
2742  (ASM_REAL_ARITH_TAC);
2743  (ASM_MESON_TAC[AZIM_EQ_0_PI_IMP_COPLANAR])]);;
2744
2745 (* ==================================================================== *)
2746 (* Lemma 35 *)
2747
2748 let CONIC_CAP_INTER_CONVEX_HULL_4_GT_0 = prove_by_refinement (
2749  `!u0:real^3 u1 w1 w2 r a.
2750     &0 < r /\ a < &1 /\ &0 <= a /\ ~coplanar {u0, u1, w1, w2} ==>
2751     vol (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2}) > &0`,
2752 [(REPEAT STRIP_TAC);
2753  (NEW_GOAL `measurable 
2754             (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2:real^3})`);
2755  (MATCH_MP_TAC MEASURABLE_INTER);
2756  (REWRITE_TAC[MEASURABLE_CONIC_CAP; MEASURABLE_CONVEX_HULL]);
2757  (SIMP_TAC[MEASURABLE_CONVEX_HULL;FINITE_IMP_BOUNDED;Geomdetail.FINITE6]);
2758  (REWRITE_TAC[REAL_ARITH `a > &0 <=> &0 <= a /\ ~(a = &0)`]);
2759  (ASM_SIMP_TAC[MEASURE_POS_LE]);
2760  (REWRITE_WITH 
2761      `vol (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2}) = &0 <=>
2762       NULLSET (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2})`);
2763  (ASM_SIMP_TAC[MEASURABLE_MEASURE_EQ_0]);
2764  (REPEAT STRIP_TAC);
2765
2766  (NEW_GOAL `~(u0 = u1:real^3)`);
2767  (STRIP_TAC);
2768  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}` THEN REWRITE_TAC[]);
2769  (REWRITE_WITH `{u0, u1, w1, w2} = {u1:real^3, w1, w2}`);
2770  (ASM_SET_TAC[]);
2771  (ASM_REWRITE_TAC[COPLANAR_3]);
2772
2773  (NEW_GOAL `?r1 a1. &0 < r1 /\ a1 < &1 /\ 
2774                 conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1} {w1, w2:real^3} =
2775                 conic_cap u0 u1 r1 a1 INTER convex hull {u0, u1,w1, w2} /\
2776                 conic_cap u0 u1 r1 a1 SUBSET conic_cap u0 u1 r a`);
2777  (ABBREV_TAC `s = closest_point (affine hull {u1, w1, w2:real^3}) u0`);
2778  (ABBREV_TAC `r2 = dist (u0:real^3, s)`);
2779  (ABBREV_TAC `r1 = min r2 r`);
2780  (ABBREV_TAC `s2 = smallest_angle_line w1 (w2:real^3) u0 u1`);
2781  (ABBREV_TAC 
2782    `a2 = ((s2 - u0:real^3) dot (u1 - u0)) /(norm (s2 - u0) * norm (u1 - u0))`);
2783  (ABBREV_TAC `a1 = max a2 a`);
2784  (EXISTS_TAC `r1:real` THEN EXISTS_TAC `a1:real`);
2785  (NEW_GOAL `&0 < r1 /\ a1 < &1`);
2786  (EXPAND_TAC "r1" THEN EXPAND_TAC "a1");
2787  (REWRITE_TAC[REAL_ARITH `&0 < min a b <=> &0 < a /\ &0 < b`;
2788                REAL_ARITH `max a b < &1 <=> a < &1 /\ b < &1`;]);
2789  (ASM_REWRITE_TAC[]);
2790  (STRIP_TAC);
2791  (EXPAND_TAC "r2");
2792  (MATCH_MP_TAC DIST_POS_LT);
2793  (STRIP_TAC);
2794
2795  (NEW_GOAL `u0 IN affine hull {u1, w1, w2:real^3}`);
2796  (ASM_REWRITE_TAC[]);
2797  (DEL_TAC THEN EXPAND_TAC "s");
2798  (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
2799  (REWRITE_TAC[CLOSED_AFFINE_HULL; AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
2800  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2801  (REWRITE_TAC[]);
2802  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2803  (REWRITE_WITH `affine hull {u0, u1, w1, w2} = 
2804                  affine hull {u1:real^3, w1, w2}`);
2805  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2806  (ASM_REWRITE_TAC[]);
2807  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR; COPLANAR_3]);
2808
2809  (EXPAND_TAC "a2");
2810  (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
2811
2812  (NEW_GOAL `s2 IN convex hull {w1, w2:real^3}`);
2813  (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2814  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2815  (ASM_REWRITE_TAC[]);
2816  (STRIP_TAC);
2817  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2818  (REWRITE_TAC[]);
2819  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2820  (REWRITE_WITH `affine hull {u0, u1, w1, w2} = 
2821                  affine hull {u1:real^3, w1, w2}`);
2822  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2823  (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2824  (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {w1, w2:real^3}`);
2825  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2826  (NEW_GOAL `affine hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2827  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
2828  (SET_TAC[]);
2829  (ASM_SET_TAC[]);
2830  (ASM_SET_TAC[]);
2831  (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
2832
2833  (NEW_GOAL `~(s2 = u0:real^3)`);
2834  (STRIP_TAC);
2835  (UNDISCH_TAC `s2 IN convex hull {w1, w2:real^3}` THEN ASM_REWRITE_TAC[]);
2836  (STRIP_TAC);
2837  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2838  (REWRITE_TAC[]);
2839  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2840  (REWRITE_WITH `affine hull {u0, u1, w1, w2} = 
2841                  affine hull {u1:real^3, w1, w2}`);
2842  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2843  (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2844  (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {w1, w2:real^3}`);
2845  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2846  (NEW_GOAL `affine hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2847  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
2848  (SET_TAC[]);
2849  (ASM_SET_TAC[]);
2850  (ASM_SET_TAC[]);
2851  (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
2852
2853  (STRIP_TAC);
2854  (MATCH_MP_TAC REAL_LT_MUL);
2855  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2856
2857  (REWRITE_TAC[REAL_ARITH `a < b <=> (a <= b) /\ ~(a = b)`]);
2858  (STRIP_TAC);
2859  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
2860  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
2861  (STRIP_TAC);
2862
2863
2864  (ABBREV_TAC `t1 = norm (s2 - u0:real^3)`);
2865  (ABBREV_TAC `t2 = norm (u1 - u0:real^3)`);
2866  (NEW_GOAL `~(t2 = &0)`);
2867  (EXPAND_TAC "t2" THEN REWRITE_TAC[NORM_EQ_0; 
2868    VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2869  (ASM_REWRITE_TAC[]);
2870
2871  (NEW_GOAL `s2 = t1 / t2 % u1 + (t2 - t1) / t2 % u0:real^3`);
2872  (REWRITE_TAC[VECTOR_ARITH `t1 / t2 % u1 + (t2 - t1) / t2 % u0:real^3 = 
2873    &1 / t2 % (t1 % u1 + (t2 - t1) % u0)`]);
2874  (REWRITE_WITH `t1 % u1 + (t2 - t1) % u0 = t2 % (s2:real^3)`);
2875  (UNDISCH_TAC `t1 % (u1 - u0) = t2 % (s2 - u0:real^3)` THEN VECTOR_ARITH_TAC);
2876  (REWRITE_TAC[VECTOR_ARITH `&1 / t2 % t2 % s2 = (t2 / t2) % s2`]);
2877  (REWRITE_WITH `t2 / t2 = &1`);
2878  (ASM_SIMP_TAC[REAL_DIV_REFL]);
2879  (VECTOR_ARITH_TAC);
2880  (UNDISCH_TAC `s2 IN convex hull {w1, w2:real^3}`);
2881  (ASM_REWRITE_TAC[IN; CONVEX_HULL_2; IN_ELIM_THM]);
2882  (STRIP_TAC);
2883  (ABBREV_TAC `t = t1 / t2`);
2884  (ABBREV_TAC `t' = (t1 - t2) / t2`);
2885
2886  (NEW_GOAL `u1 IN affine hull {u0, w1, w2:real^3}`);
2887  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2888  (EXISTS_TAC `t'/ t` THEN EXISTS_TAC `u / t` THEN EXISTS_TAC `v / t`);
2889  (STRIP_TAC);
2890  (ASM_REWRITE_TAC[REAL_ARITH `a / t + b/ t + c / t = (a + b + c) / t `]);
2891  (REWRITE_WITH `t' + &1 = t`);
2892  (EXPAND_TAC "t'" THEN EXPAND_TAC "t");
2893  (NEW_GOAL `t2 / t2 = &1`);
2894  (ASM_SIMP_TAC[REAL_DIV_REFL]);
2895  (UP_ASM_TAC THEN REAL_ARITH_TAC);
2896  (MATCH_MP_TAC REAL_DIV_REFL);
2897  (EXPAND_TAC "t");
2898  (ONCE_REWRITE_TAC[REAL_ARITH `a / b = a * (&1 / b)`]);
2899  (REWRITE_TAC[REAL_ENTIRE]);
2900  (REWRITE_WITH `~(t1 = &0)`);
2901  (EXPAND_TAC "t1" THEN REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH 
2902   `a - b = vec 0 <=> a = b`] THEN ASM_REWRITE_TAC[]);
2903  (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
2904  (ASM_REWRITE_TAC[]);
2905  (REWRITE_TAC[VECTOR_ARITH `t' / t % u0 + u / t % w1 + v / t % w2 = 
2906                              &1 / t % (t' % u0 + u % w1 + v % w2)`]);
2907  (REWRITE_WITH `t' % u0 + u % w1 + v % w2 = t % u1:real^3`);
2908  (EXPAND_TAC "t'");
2909  (UNDISCH_TAC `t % u1 + (t2 - t1) / t2 % u0 = u % w1 + v % w2:real^3`
2910    THEN VECTOR_ARITH_TAC);
2911  (REWRITE_TAC[VECTOR_ARITH `&1 / t % t % u = t / t % u`]);
2912  (REWRITE_WITH `t / t = &1`);
2913  (MATCH_MP_TAC REAL_DIV_REFL);
2914  (EXPAND_TAC "t");
2915  (ONCE_REWRITE_TAC[REAL_ARITH `a / b = a * (&1 / b)`]);
2916  (REWRITE_TAC[REAL_ENTIRE]);
2917  (REWRITE_WITH `~(t1 = &0)`);
2918  (EXPAND_TAC "t1" THEN REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH 
2919   `a - b = vec 0 <=> a = b`] THEN ASM_REWRITE_TAC[]);
2920  (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
2921  (ASM_REWRITE_TAC[]);
2922  (VECTOR_ARITH_TAC);
2923
2924  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2925  (REWRITE_TAC[]);
2926  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2927  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
2928
2929  (REWRITE_WITH `affine hull {u1, u0, w1, w2} = 
2930                  affine hull {u0:real^3, w1, w2}`);
2931  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2932  (ASM_REWRITE_TAC[]);
2933  (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
2934
2935  (NEW_GOAL `conic_cap (u0:real^3) u1 r1 a1 SUBSET conic_cap u0 u1 r a`);
2936  (REWRITE_TAC[conic_cap; NORMBALL_BALL] THEN MATCH_MP_TAC 
2937   (SET_RULE `a SUBSET b /\ c SUBSET d ==> a INTER c SUBSET b INTER d`));
2938  (STRIP_TAC);
2939  (MATCH_MP_TAC SUBSET_BALL);
2940  (EXPAND_TAC "r1" THEN REAL_ARITH_TAC);
2941  (MATCH_MP_TAC RCONE_GT_SUBSET);
2942  (EXPAND_TAC "a1" THEN REAL_ARITH_TAC);
2943
2944  (ASM_REWRITE_TAC[]);
2945
2946  (REWRITE_TAC[SET_RULE `b = a <=> a SUBSET b /\ b SUBSET a`]);
2947  (STRIP_TAC);
2948  (MATCH_MP_TAC (SET_RULE `a SUBSET b ==> x INTER a SUBSET x INTER b`));
2949  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
2950  (REWRITE_TAC[SUBSET; IN_INTER]);
2951  (REPEAT STRIP_TAC);
2952  (ASM_REWRITE_TAC[]);
2953
2954  (UP_ASM_TAC);
2955  (NEW_GOAL `DISJOINT {u0, u1:real^3} {w1, w2}`);
2956  (REWRITE_TAC[DISJOINT]);
2957  (ASM_CASES_TAC `w1 IN {u0, u1:real^3}`);
2958  (NEW_GOAL `F`);
2959  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2960  (REWRITE_WITH `{u0, u1, w1, w2:real^3} = {u0, u1, w2:real^3}`);
2961  (UP_ASM_TAC THEN SET_TAC[]);
2962  (REWRITE_TAC[COPLANAR_3]);
2963  (UP_ASM_TAC THEN SET_TAC[]);
2964  (ASM_CASES_TAC `w2 IN {u0, u1:real^3}`);
2965  (NEW_GOAL `F`);
2966  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2967  (REWRITE_WITH `{u0, u1, w1, w2:real^3} = {u0, u1, w1:real^3}`);
2968  (UP_ASM_TAC THEN SET_TAC[]);
2969  (REWRITE_TAC[COPLANAR_3]);
2970  (UP_ASM_TAC THEN SET_TAC[]);
2971  (ASM_SET_TAC[]);
2972
2973  (ASM_SIMP_TAC[Marchal_cells_2_new.AFF_GE_2_2; CONVEX_HULL_4; IN; IN_ELIM_THM]);
2974  (REPEAT STRIP_TAC);
2975  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
2976    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
2977  (ASM_REWRITE_TAC[]);
2978  (STRIP_TAC);
2979
2980  (REWRITE_TAC[REAL_ARITH `&0 <= t <=> ~(t < &0)`] THEN STRIP_TAC);
2981  (NEW_GOAL `!x. x IN affine hull {u1, w1, w2} ==> 
2982                  dist (u0,s:real^3) <= dist (u0,x:real^3)`);
2983  (REPEAT STRIP_TAC THEN EXPAND_TAC "s");
2984  (MATCH_MP_TAC CLOSEST_POINT_LE);
2985  (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
2986
2987  (NEW_GOAL `&1 < t2 + t3+ t4`);
2988  (ASM_REAL_ARITH_TAC);
2989  (NEW_GOAL `~(t2 + t3+ t4 = &0)`);
2990  (ASM_REAL_ARITH_TAC);
2991
2992  (ABBREV_TAC `y = t2 / (t2 + t3 + t4) % u1 + t3 / (t2 + t3 + t4) % w1 + 
2993                    t4 / (t2 + t3 + t4) % w2:real^3`);
2994  (NEW_GOAL `x = t1 % u0 + (t2 + t3 + t4) % (y:real^3)`);
2995  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "y");
2996  (REWRITE_TAC[VECTOR_ARITH 
2997  `t1 % u0 + t2 % u1 + t3 % w1 + t4 % w2 = 
2998   t1 % u0 + t % (t2 / t % u1 + t3 / t % w1 + t4 / t % w2) <=> 
2999   t2 % u1 + t3 % w1 + t4 % w2 = t / t % (t2 % u1 + t3 % w1 + t4 % w2)`]);
3000  (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
3001  (ASM_SIMP_TAC[REAL_DIV_REFL]);
3002  (VECTOR_ARITH_TAC);
3003
3004  (NEW_GOAL `y IN affine hull {u1, w1, w2:real^3}`);
3005  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3006  (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN 
3007    EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN EXISTS_TAC `t4 / (t2 + t3 + t4)`);
3008  (ASM_REWRITE_TAC[REAL_ARITH `a/x + b/ x + c/ x = (a+b+c) / x`]);
3009  (ASM_SIMP_TAC[REAL_DIV_REFL]);
3010
3011  (NEW_GOAL `dist (u0, s:real^3) <= dist (u0, y:real^3)`);
3012  (ASM_SIMP_TAC[]);
3013  (NEW_GOAL `dist (u0, s) <= dist (u0, x:real^3)`);
3014  (REWRITE_TAC[ASSUME `x = t1 % u0 + (t2 + t3 + t4) % y:real^3`; dist]);
3015  (REWRITE_WITH `u0 - (t1 % u0 + (t2 + t3 + t4) % y) = 
3016   (t1 + t2 + t3 + t4) % u0 - (t1 % u0 + (t2 + t3 + t4) % y:real^3)`);
3017  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3018  (REWRITE_TAC[VECTOR_ARITH 
3019   `(t1 + t) % u0 - (t1 % u0 + t % y) = t % (u0 - y)`; NORM_MUL]);
3020  (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`);
3021  (REWRITE_TAC[REAL_ABS_REFL] THEN ASM_REAL_ARITH_TAC);
3022  (REWRITE_TAC[GSYM dist]);
3023  (NEW_GOAL `dist (u0, y:real^3) <= (t2 + t3 + t4) * dist (u0, y)`);
3024  (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
3025  (MATCH_MP_TAC REAL_LE_MUL);
3026  (REWRITE_TAC[DIST_POS_LE]);
3027  (ASM_REAL_ARITH_TAC);
3028  (ASM_REAL_ARITH_TAC);
3029
3030  (NEW_GOAL `x IN ball (u0:real^3, r1)`);
3031  (UNDISCH_TAC `x IN conic_cap u0 (u1:real^3) r1 a1`);
3032  (REWRITE_TAC[conic_cap; NORMBALL_BALL] THEN SET_TAC[]);
3033  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
3034  (EXPAND_TAC "r1" THEN EXPAND_TAC "r2");
3035  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3036
3037
3038 (* ========================================================================= *)
3039 (* OK here *)
3040
3041  (REWRITE_TAC[REAL_ARITH `&0 <= t <=> ~(t < &0)`] THEN STRIP_TAC);
3042  (NEW_GOAL `!y. y IN convex hull {w1, w2:real^3}
3043          ==> ((y - u0) dot (u1 - u0)) / (norm (y - u0) * norm (u1 - u0)) <=
3044              ((s2 - u0) dot (u1 - u0)) / (norm (s2 - u0) * norm (u1 - u0))`);
3045  (REPEAT STRIP_TAC);
3046  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_PROPERTY);
3047  (EXISTS_TAC `w1:real^3` THEN EXISTS_TAC `w2:real^3`);
3048  (ASM_REWRITE_TAC[]);
3049  (REPEAT STRIP_TAC);
3050
3051  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3052  (REWRITE_TAC[]);
3053  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3054  (REWRITE_WITH `affine hull {u0, u1, w1, w2} = 
3055                  affine hull {u1:real^3, w1, w2}`);
3056  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
3057  (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3058  (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {w1, w2}`);
3059  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3060  (NEW_GOAL `affine hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3061  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA THEN SET_TAC[]);
3062  (ASM_SET_TAC[]);
3063  (ASM_SET_TAC[]);
3064  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR; COPLANAR_3]);
3065
3066  (NEW_GOAL `~(t3+ t4 = &0)`);
3067  (STRIP_TAC);
3068  (NEW_GOAL `t3 = &0 /\ t4 = &0`);
3069  (ASM_REAL_ARITH_TAC);
3070
3071  (NEW_GOAL `x = t1 % u0 + t2 % u1:real^3`);
3072  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3073  (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a1`);
3074  (UNDISCH_TAC `x:real^3 IN conic_cap u0 u1 r1 a1`);
3075  (REWRITE_TAC[conic_cap] THEN SET_TAC[conic_cap]);
3076  (UP_ASM_TAC THEN REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM] THEN STRIP_TAC);
3077
3078  (NEW_GOAL `(x - u0) dot (u1 - u0:real^3) <= &0`);
3079  (REWRITE_TAC[ASSUME `x = t1 % u0 + t2 % u1:real^3`]);
3080  (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = 
3081   (t1 % u0 + t2 % u1) - (t1 + t2 + t3 + t4) % u0:real^3`);
3082  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3083  (REWRITE_TAC[ASSUME `t3 = &0 /\ t4 = &0`; VECTOR_ARITH 
3084   `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; DOT_LMUL;
3085    REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
3086  (MATCH_MP_TAC REAL_LE_MUL);
3087  (REWRITE_TAC[DOT_POS_LE] THEN ASM_REAL_ARITH_TAC);
3088  (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a1`);
3089  (MATCH_MP_TAC REAL_LE_MUL);
3090  (REWRITE_TAC[DIST_POS_LE]);
3091  (MATCH_MP_TAC REAL_LE_MUL);
3092  (REWRITE_TAC[DIST_POS_LE]);
3093  (ASM_REAL_ARITH_TAC);
3094  (ASM_REAL_ARITH_TAC);
3095
3096  (ABBREV_TAC `y = t3 / (t3 + t4) % w1 + t4 / (t3 + t4) % w2:real^3`);
3097  (NEW_GOAL `x = t1 % u0 + t2 % u1 + (t3 + t4) % (y:real^3)`);
3098  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "y");
3099  (REWRITE_TAC[VECTOR_ARITH 
3100  `t1 % u0 + t2 % u1 + t3 % w1 + t4 % w2 = 
3101   t1 % u0 + t2 % u1 + t % (t3 / t % w1 + t4 / t % w2) <=> 
3102   t3 % w1 + t4 % w2 = t / t % (t3 % w1 + t4 % w2)`]);
3103  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3104  (ASM_SIMP_TAC[REAL_DIV_REFL]);
3105  (VECTOR_ARITH_TAC);
3106
3107  (NEW_GOAL `y IN convex hull {w1, w2:real^3}`);
3108  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
3109  (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
3110  (ASM_REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
3111  (REPEAT STRIP_TAC);
3112  (MATCH_MP_TAC REAL_LE_DIV);
3113  (ASM_REAL_ARITH_TAC);
3114  (MATCH_MP_TAC REAL_LE_DIV);
3115  (ASM_REAL_ARITH_TAC);
3116  (ASM_SIMP_TAC[REAL_DIV_REFL]);
3117
3118  (ABBREV_TAC `f = (\y:real^3. 
3119   ((y - u0) dot (u1 - u0)) / (norm (y - u0:real^3) * norm (u1 - u0)))`);
3120
3121  (NEW_GOAL `a1 < (f:real^3->real) x`);
3122  (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a1`);
3123  (UNDISCH_TAC `x:real^3 IN conic_cap u0 u1 r1 a1` THEN 
3124    REWRITE_TAC[conic_cap] THEN SET_TAC[]);
3125  (UP_ASM_TAC THEN REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM; dist]);
3126  (STRIP_TAC THEN EXPAND_TAC "f");
3127  (REWRITE_WITH 
3128   `a1 < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0)) <=>
3129    a1 * (norm (x - u0) * norm (u1 - u0)) < ((x - u0:real^3) dot (u1 - u0))`);
3130  (MATCH_MP_TAC REAL_LT_RDIV_EQ);
3131  (MATCH_MP_TAC REAL_LT_MUL);
3132  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `a < b <=> (a <= b) /\ ~(b = a)`]);
3133  (SIMP_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
3134  (ASM_REWRITE_TAC[]);
3135  (STRIP_TAC);
3136  (NEW_GOAL `u1 IN affine hull {u0, w1, w2:real^3}`);
3137  (REWRITE_TAC[IN; IN_ELIM_THM; AFFINE_HULL_3]);
3138
3139  (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
3140    THEN EXISTS_TAC `(--t4) / t2`);
3141  (REPEAT STRIP_TAC);
3142  (REWRITE_TAC[REAL_ARITH 
3143    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
3144  (MATCH_MP_TAC REAL_DIV_REFL);
3145  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3146  (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
3147  (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3148  (NEW_GOAL `u0 - t1 % u0 - t3 % w1 - t4 % w2:real^3 = t2 % u1`);
3149  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
3150  (ASM_REWRITE_TAC[VECTOR_ARITH 
3151    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
3152     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
3153  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
3154  (REWRITE_WITH `t2 / t2 = &1`);
3155  (MATCH_MP_TAC REAL_DIV_REFL);
3156  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3157  (VECTOR_ARITH_TAC);
3158
3159  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3160  (REWRITE_TAC[]);
3161  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
3162  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3163  (REWRITE_WITH `affine hull {u1, u0, w1, w2} = 
3164                  affine hull {u0:real^3, w1, w2}`);
3165  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
3166  (ASM_REWRITE_TAC[]);
3167  (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
3168  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3169
3170  (NEW_GOAL `(f:real^3->real) y <= f s2`);
3171  (EXPAND_TAC "f");
3172  (ASM_SIMP_TAC[]);
3173
3174  (NEW_GOAL `&1 < t1 + t3+ t4`);
3175  (ASM_REAL_ARITH_TAC);
3176  (NEW_GOAL `~(t1 + t3+ t4 = &0)`);
3177  (ASM_REAL_ARITH_TAC);
3178
3179  (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % w1 + 
3180                    t4 / (t1 + t3 + t4) % w2:real^3`);
3181
3182  (NEW_GOAL `(f:real^3->real) y = f w`);
3183  (EXPAND_TAC "f");
3184
3185  (REWRITE_WITH `y:real^3 - u0 = 
3186                 &1 / (t3 + t4) % (t3 % w1 + t4 % w2 - (t3 + t4) % u0)`);
3187  (EXPAND_TAC "y");
3188  (REWRITE_TAC[VECTOR_ARITH 
3189   `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
3190    &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
3191    (t3 + t4) / (t3 + t4) % u0 = u0`]);
3192  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3193  (MATCH_MP_TAC REAL_DIV_REFL);
3194  (ASM_REWRITE_TAC[]);
3195  (VECTOR_ARITH_TAC);
3196  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
3197
3198  (REWRITE_WITH `w:real^3 - u0 = 
3199                 &1 / (t1 + t3 + t4) % (t3 % w1 + t4 % w2 - (t3 + t4) % u0)`);
3200  (EXPAND_TAC "w");
3201  (REWRITE_TAC[VECTOR_ARITH 
3202    `(t1 / (t1 + t3 + t4) % u0 +
3203     t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
3204     &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
3205     (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
3206  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
3207  (MATCH_MP_TAC REAL_DIV_REFL);
3208  (ASM_REWRITE_TAC[]);
3209  (VECTOR_ARITH_TAC);
3210  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
3211  (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
3212  (REWRITE_TAC[REAL_ABS_REFL]);
3213  (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
3214  (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
3215  (REWRITE_TAC[REAL_ABS_REFL]);
3216  (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
3217  (ASM_REAL_ARITH_TAC);
3218
3219  (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) = 
3220                            (a * x) / (a * (y * z))`]);
3221  (ABBREV_TAC 
3222   `b1 = norm (t3 % w1 + t4 % w2 - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
3223  (NEW_GOAL `~(b1 = &0)`);
3224  (EXPAND_TAC "b1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; 
3225    VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
3226  (STRIP_TAC);
3227
3228  (NEW_GOAL `u0 IN convex hull {w1, w2:real^3}`);
3229  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
3230  (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
3231  (REPEAT STRIP_TAC);
3232  (MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC);
3233  (MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC);
3234  (ASM_SIMP_TAC[REAL_DIV_REFL; REAL_ARITH `a / x + b / x = (a + b) / x`]);
3235  (SIMP_TAC[VECTOR_ARITH `a/ x % u + b/ x % v = &1/ x % (a % u + b % v)`]);
3236  (REWRITE_TAC[ASSUME `t3 % w1 + t4 % w2 = (t3 + t4) % u0:real^3`; VECTOR_ARITH
3237   `&1 / a % (a % b) = (a / a) % b`]);
3238  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3239  (ASM_SIMP_TAC[REAL_DIV_REFL]);
3240  (VECTOR_ARITH_TAC);
3241
3242  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3243  (REWRITE_TAC[]);
3244  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3245  (REWRITE_WITH `affine hull {u0, u1, w1, w2} = 
3246                  affine hull {u1:real^3, w1, w2}`);
3247  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
3248  (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3249  (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {w1, w2}`);
3250  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3251  (NEW_GOAL `affine hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3252  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA THEN SET_TAC[]);
3253  (ASM_SET_TAC[]);
3254  (ASM_SET_TAC[]);
3255  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR; COPLANAR_3]);
3256
3257  (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
3258  (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
3259  (ASM_REWRITE_TAC[]);
3260
3261  (REWRITE_WITH 
3262  `(&1 / (t3 + t4) * ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0))) /
3263   (&1 / (t3 + t4) * b1) = 
3264   ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / b1`);
3265  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
3266
3267  (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
3268  (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
3269  (ASM_REWRITE_TAC[]);
3270
3271  (REWRITE_WITH 
3272  `(&1 / (t1 + t3 + t4) * ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0))) /
3273   (&1 / (t1 + t3 + t4) * b1) = 
3274   ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / b1`);
3275  (UP_ASM_TAC THEN UNDISCH_TAC `~(b1 = &0)` THEN
3276    MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
3277
3278  (NEW_GOAL `(f:real^3->real) x <= f w`);
3279  (EXPAND_TAC "f");
3280
3281  (REWRITE_WITH 
3282   `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
3283   ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
3284   ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <= 
3285   ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
3286  (MATCH_MP_TAC RAT_LEMMA4);
3287  (STRIP_TAC);
3288  (MATCH_MP_TAC REAL_LT_MUL);
3289  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
3290  (REPEAT STRIP_TAC);
3291
3292  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}` THEN REWRITE_TAC[]);
3293  (REWRITE_TAC[coplanar]);
3294  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `w1:real^3` THEN 
3295    EXISTS_TAC `w2:real^3`);
3296  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
3297  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
3298  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
3299  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3300  (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
3301    THEN EXISTS_TAC `(--t4) / t2`);
3302  (REPEAT STRIP_TAC);
3303  (REWRITE_TAC[REAL_ARITH 
3304    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
3305  (MATCH_MP_TAC REAL_DIV_REFL);
3306  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3307  (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
3308  (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3309  (NEW_GOAL `u0 - t1 % u0 - t3 % w1 - t4 % w2:real^3 = t2 % u1`);
3310  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
3311  (ASM_REWRITE_TAC[VECTOR_ARITH 
3312    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
3313     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
3314  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
3315  (REWRITE_WITH `t2 / t2 = &1`);
3316  (MATCH_MP_TAC REAL_DIV_REFL);
3317  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3318  (VECTOR_ARITH_TAC);
3319
3320  (MATCH_MP_TAC REAL_LT_MUL);
3321  (REWRITE_TAC[REAL_ARITH `&0 < a <=> (&0 <= a) /\ ~(a = &0)`]);
3322  (REWRITE_TAC[NORM_POS_LE; NORM_EQ_0; VECTOR_ARITH `x - y= vec 0 <=>x = y`]);
3323  (STRIP_TAC);
3324
3325  (EXPAND_TAC "w" THEN STRIP_TAC);
3326  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3327  (REWRITE_TAC[coplanar]);
3328  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `w1:real^3` THEN 
3329    EXISTS_TAC `w2:real^3`);
3330  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
3331  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
3332  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3333
3334  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
3335    THEN EXISTS_TAC `t4 / (t3 + t4)`);
3336  (REPEAT STRIP_TAC);
3337  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
3338                           (t3 + t4) / (t3 + t4)`]);
3339  (MATCH_MP_TAC REAL_DIV_REFL);
3340  (ASM_REWRITE_TAC[]);
3341  (ASM_REWRITE_TAC[VECTOR_ARITH 
3342    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
3343     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
3344  (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH 
3345    `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 = 
3346     (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
3347  (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % w1 + t4 % w2) = u0 <=> 
3348                  t1 % u0 + t3 % w1 + t4 % w2 = (t1 + t3 + t4) % u0:real^3`);
3349  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3350  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
3351  (ASM_REWRITE_TAC[]);
3352
3353  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
3354    <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
3355  (STRIP_TAC THEN ASM_REWRITE_TAC[]);
3356  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
3357  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3358  (ASM_SIMP_TAC[REAL_DIV_REFL]);
3359  (VECTOR_ARITH_TAC);
3360  (ASM_REWRITE_TAC[]);
3361
3362  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
3363  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
3364  (REWRITE_TAC[VECTOR_ARITH 
3365   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
3366    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
3367  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
3368  (ASM_SIMP_TAC[REAL_DIV_REFL]);
3369  (VECTOR_ARITH_TAC);
3370  (ABBREV_TAC `t = t1 + t3 + t4`);
3371  (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 = 
3372                 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
3373  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3374  (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
3375  (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
3376  (REWRITE_TAC[VECTOR_ARITH 
3377   `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
3378  (ABBREV_TAC `x1 = u1 - u0:real^3`);
3379  (ABBREV_TAC `x2 = w - u0:real^3`);
3380
3381  (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 = 
3382    t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
3383  (REWRITE_TAC[NORM_POW_2]);
3384  (VECTOR_ARITH_TAC);
3385
3386  (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <= 
3387              t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
3388  (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
3389    t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
3390  (MATCH_MP_TAC REAL_LE_MUL);
3391  (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
3392  (MATCH_MP_TAC REAL_LE_MUL);
3393  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
3394  (STRIP_TAC);
3395  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3396  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
3397
3398  (NEW_GOAL 
3399  `t2 * (x2 dot x1) * norm x1 * norm x1 + t * (x2 dot x1) * norm x2 * norm x1 <=    (x2 dot x1) * norm (t2 % x1 + t % x2) * norm (x1:real^3)`);
3400
3401  (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
3402  x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
3403  (MATCH_MP_TAC REAL_LE_MUL);
3404  (STRIP_TAC);
3405  (MATCH_MP_TAC REAL_LE_MUL);
3406  (REWRITE_TAC[NORM_POS_LE]);
3407  (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
3408  (NEW_GOAL `F`);
3409  (NEW_GOAL `(f:real^3->real) x <= &0`);
3410  (EXPAND_TAC "f");
3411  (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
3412  (MATCH_MP_TAC REAL_LE_DIV);
3413  (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
3414
3415  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
3416  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
3417  (REWRITE_TAC[VECTOR_ARITH 
3418   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
3419    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
3420  (EXPAND_TAC "t");
3421  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
3422  (MATCH_MP_TAC REAL_DIV_REFL);
3423  (ASM_REWRITE_TAC[]);
3424  (VECTOR_ARITH_TAC);
3425
3426  (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
3427  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 = 
3428                  (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
3429  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3430  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 = 
3431    t2 % x1 + t % x2:real^3`);
3432  (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
3433    THEN VECTOR_ARITH_TAC);
3434  (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
3435  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
3436  (MATCH_MP_TAC REAL_LE_MUL);
3437  (STRIP_TAC);
3438  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
3439    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3440  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3441  (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
3442  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
3443  (MATCH_MP_TAC REAL_LE_MUL);
3444  (STRIP_TAC);
3445  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
3446    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3447  (REWRITE_TAC[DOT_POS_LE]);
3448  (REWRITE_TAC[DOT_LADD]);
3449  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3450
3451  (UP_ASM_TAC THEN UNDISCH_TAC `a1 < (f:real^3->real) x`);
3452  (EXPAND_TAC "a1" THEN UNDISCH_TAC  `&0 <= a` THEN REAL_ARITH_TAC);
3453  (UP_ASM_TAC THEN MESON_TAC[]);
3454  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3455
3456  (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
3457  (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
3458  (AP_THM_TAC THEN AP_TERM_TAC);
3459  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3460  (REWRITE_TAC[REAL_ABS_REFL]);
3461  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
3462    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3463  (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
3464  (AP_THM_TAC THEN AP_TERM_TAC);
3465  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3466  (REWRITE_TAC[REAL_ABS_REFL]);
3467  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3468  (REWRITE_TAC[GSYM NORM_MUL]);
3469  (REWRITE_WITH 
3470   `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
3471  (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
3472  (REWRITE_TAC[NORM_TRIANGLE]);
3473  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3474
3475  (NEW_GOAL `(f:real^3->real) x <= f s2`);
3476  (UNDISCH_TAC `(f:real^3->real) y <= f s2`);
3477  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3478
3479  (NEW_GOAL `(f:real^3->real) s2 <= a1`);
3480  (EXPAND_TAC "f");
3481  (ASM_REWRITE_TAC[]);
3482  (EXPAND_TAC "a1" THEN REAL_ARITH_TAC);
3483
3484  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `a1 < (f:real^3->real) x`);
3485  (REAL_ARITH_TAC);
3486
3487  (UP_ASM_TAC THEN STRIP_TAC);
3488
3489 (* ========================================================================= *)
3490
3491  (NEW_GOAL 
3492   `NULLSET (conic_cap u0 u1 r1 a1 INTER aff_ge {u0:real^3, u1} {w1, w2})`);
3493  (ASM_REWRITE_TAC[]);
3494  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3495  (EXISTS_TAC `conic_cap u0 u1 r a INTER convex hull {u0:real^3, u1, w1, w2}`);
3496  (ASM_REWRITE_TAC[]);
3497  (UP_ASM_TAC THEN SET_TAC[]);
3498  (NEW_GOAL `vol (conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1} {w1, w2}) = &0`);
3499  (ASM_SIMP_TAC[MEASURE_EQ_0]);
3500
3501  (UP_ASM_TAC THEN REWRITE_WITH 
3502   `vol (conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1} {w1, w2}) = 
3503    vol (conic_cap u0 u1 r1 a1 INTER aff_gt {u0, u1} {w1, w2})`);
3504  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3505  (REWRITE_WITH `conic_cap u0 u1 r1 a1 INTER aff_gt {u0, u1} {w1, w2} DIFF
3506                  conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1:real^3} {w1, w2} =
3507                  {}`);
3508  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> (C INTER A) DIFF (C INTER B) = {}`));
3509  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3510  (REWRITE_TAC[SET_RULE `a UNION {} = a`]);
3511
3512  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3513  (EXISTS_TAC `aff_ge {u0, u1:real^3} {w1, w2} DIFF
3514                aff_gt {u0, u1} {w1, w2}`);
3515  (REWRITE_TAC[SET_RULE `A INTER B DIFF A INTER C SUBSET B DIFF C`]);
3516
3517  (REWRITE_WITH `aff_ge {u0, u1:real^3} {w1, w2} =
3518                  aff_gt {u0, u1} {w1, w2} UNION 
3519    UNIONS {aff_ge {u0, u1} ({w1, w2} DELETE a) | a | a IN  {w1, w2}}`);
3520  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3521  (REWRITE_TAC[Geomdetail.FINITE6]);
3522  (REWRITE_TAC[DISJOINT]);
3523
3524  (ASM_CASES_TAC `w1 IN {u0, u1:real^3}`);
3525  (NEW_GOAL `F`);
3526  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3527  (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w2:real^3}`);
3528  (UP_ASM_TAC THEN SET_TAC[]);
3529  (REWRITE_TAC[COPLANAR_3]);
3530  (UP_ASM_TAC THEN MESON_TAC[]);
3531
3532  (ASM_CASES_TAC `w2 IN {u0, u1:real^3}`);
3533  (NEW_GOAL `F`);
3534  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3535  (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w1:real^3}`);
3536  (UP_ASM_TAC THEN SET_TAC[]);
3537  (REWRITE_TAC[COPLANAR_3]);
3538  (UP_ASM_TAC THEN MESON_TAC[]);
3539  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3540
3541
3542
3543  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3544  (EXISTS_TAC 
3545   `UNIONS {aff_ge {u0, u1:real^3} ({w1, w2} DELETE a) | a | a IN {w1, w2}}`);
3546  (STRIP_TAC);
3547  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3548
3549  (EXISTS_TAC 
3550   `aff_ge {u0, u1:real^3} {w1} UNION aff_ge {u0, u1:real^3} {w2}`);
3551  (STRIP_TAC);
3552  (MATCH_MP_TAC NEGLIGIBLE_UNION);
3553  (STRIP_TAC);
3554
3555  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3556  (EXISTS_TAC `affine hull {u0, u1:real^3, w1}`);
3557  (STRIP_TAC);
3558  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3559  (REWRITE_WITH `{u0,u1,w1:real^3} = {u0,u1} UNION {w1}`);
3560  (SET_TAC[]);
3561  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3562  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3563  (EXISTS_TAC `affine hull {u0, u1:real^3, w2}`);
3564  (STRIP_TAC);
3565  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3566  (REWRITE_WITH `{u0,u1,w2:real^3} = {u0,u1} UNION {w2}`);
3567  (SET_TAC[]);
3568  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3569  (REWRITE_TAC[SET_RULE 
3570   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
3571          aff_ge {u0, u1} ({m, s3} DELETE s3) 
3572    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3573  (MATCH_MP_TAC (SET_RULE 
3574   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3575  (STRIP_TAC);
3576  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3577  (STRIP_TAC);
3578  (SET_TAC[]);
3579
3580  (REWRITE_TAC[DISJOINT]);
3581  (ASM_CASES_TAC `w1 IN {u0, u1:real^3}`);
3582  (NEW_GOAL `F`);
3583  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3584  (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w2:real^3}`);
3585  (UP_ASM_TAC THEN SET_TAC[]);
3586  (REWRITE_TAC[COPLANAR_3]);
3587  (UP_ASM_TAC THEN MESON_TAC[]);
3588  (UP_ASM_TAC THEN SET_TAC[]);
3589
3590  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3591  (STRIP_TAC);
3592  (SET_TAC[]);
3593  (REWRITE_TAC[DISJOINT]);
3594  (ASM_CASES_TAC `w2 IN {u0, u1:real^3}`);
3595  (NEW_GOAL `F`);
3596  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3597  (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w1:real^3}`);
3598  (UP_ASM_TAC THEN SET_TAC[]);
3599  (REWRITE_TAC[COPLANAR_3]);
3600  (UP_ASM_TAC THEN MESON_TAC[]);
3601  (UP_ASM_TAC THEN SET_TAC[]);
3602
3603  (SET_TAC[]);
3604  (STRIP_TAC);
3605  (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}` THEN REWRITE_TAC[]);
3606  (MATCH_MP_TAC CONIC_CAP_AFF_GT_EQ_0);
3607  (EXISTS_TAC `a1:real` THEN EXISTS_TAC `r1:real`);
3608  (ASM_REWRITE_TAC[])]);;
3609
3610 (* ==================================================================== *)
3611 (* Lemma 36 *)
3612
3613 let MEASURABLE_BALL_AFF_GE = prove
3614  (`!z r s t. measurable(ball(z,r) INTER aff_ge s t)`,
3615   MESON_TAC[MEASURABLE_CONVEX; CONVEX_INTER; CONVEX_AFF_GE; CONVEX_BALL;
3616             BOUNDED_INTER; BOUNDED_BALL]);;
3617
3618 (* ==================================================================== *)
3619 (* Currently added lemmas *)
3620 (* Lemma 37 *)
3621
3622 let FINITE_LIST_KY_LEMMA_2 = prove
3623  (`!s:A->bool.
3624        FINITE s
3625        ==> FINITE
3626         {y | ?u0 u1.
3627                u0 IN s /\
3628                u1 IN s /\
3629                y = [u0; u1]}`,
3630  REWRITE_TAC[SET_RULE 
3631                 `{y | ?u0 u1. u0 IN s /\ u1 IN s /\ y = [u0; u1]} =
3632                  {[u0;u1] | u0 IN s /\ u1 IN s}`] THEN
3633  REPEAT
3634  (GEN_TAC THEN DISCH_TAC THEN 
3635   MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]));;
3636
3637 let FINITE_SET_PRODUCT_KY_LEMMA = prove (
3638  `!s:A->bool.
3639        FINITE s ==> FINITE {{u0, u1:A} | u0 IN s /\ u1 IN s}`,
3640  REPEAT
3641  (GEN_TAC THEN DISCH_TAC THEN 
3642   MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]));;
3643
3644
3645 (* ==================================================================== *)
3646 (* Lemma 38: BETA_PAIR_THM - formal proof by TCHales *)
3647
3648 let pre_beta = prove_by_refinement
3649 (`!g u' v'. (?f. (!u v. f { u, v } = (g:A->A->B) u v)) ==>
3650     ((\ { u, v}. g u v) {u',v'} = g u' v')`,
3651 [REWRITE_TAC[GABS_DEF;GEQ_DEF];
3652  SELECT_ELIM_TAC;
3653  MESON_TAC[]]);;
3654
3655 let WELLDEFINED_FUNCTION_2 = prove_by_refinement(
3656 `(?f:C->D. (!x:A y:B.  f(s x y) = t x y)) <=>
3657    (!x x' y y'.  (s x y = s x' y') ==> t x y = t x' y')`,
3658 [ MATCH_MP_TAC EQ_TRANS ;
3659   EXISTS_TAC  `?f:C->D. !z. !x:A y:B. (s x y = z) ==> f z = t x y`;
3660   CONJ_TAC;
3661   MESON_TAC[];
3662   REWRITE_TAC[GSYM SKOLEM_THM];
3663   MESON_TAC[]]);;
3664
3665 let well_defined_unordered_pair = prove_by_refinement
3666 (`(?f. (!u v. f { u, v} = (g:A->A->B) u v)) <=>
3667    (! u v. g u v = g v u)`,
3668 [REWRITE_TAC[WELLDEFINED_FUNCTION_2];
3669  NEW_GOAL `!u v x' y'. 
3670               {u,v} = {x',y'} <=> (u:A = x' /\ v = y')\/ (u = y' /\ v = x')`;
3671  SET_TAC[];
3672  ASM_REWRITE_TAC[];
3673  MESON_TAC[]]);;
3674
3675 let BETA_PAIR_THM = prove_by_refinement(
3676 `!g u' v'. (!u v. (g:A->A->B) u v = g v u) ==>
3677     ((\ { u, v}. g u v) {u',v'} = g u' v')`,
3678 [REPEAT STRIP_TAC;
3679  MATCH_MP_TAC pre_beta;
3680  REWRITE_TAC[well_defined_unordered_pair];
3681  ASM_REWRITE_TAC[]]);;
3682
3683 (* ==================================================================== *)
3684 (* Lemma 39 *)
3685
3686 let DIHX_RANGE = prove_by_refinement (
3687  `!V X u v. &0 <= dihX V X (u,v) /\ dihX V X (u,v) <= pi`,
3688 [(REWRITE_TAC[dihX] THEN REPEAT GEN_TAC);
3689  (COND_CASES_TAC);
3690  (REWRITE_TAC[PI_POS_LE; REAL_ARITH `a <= a`]);
3691  (REPEAT LET_TAC THEN COND_CASES_TAC);
3692  (REWRITE_TAC[dihu2; DIHV_RANGE]);
3693  (COND_CASES_TAC);
3694  (REWRITE_TAC[dihu3; DIHV_RANGE]);
3695  (COND_CASES_TAC);
3696  (REWRITE_TAC[dihu4; DIHV_RANGE]);
3697  (REWRITE_TAC[PI_POS_LE; REAL_ARITH `a <= a`])]);;
3698
3699 let DIHX_LE_PI = prove (`!V X u v. dihX V X (u,v) <= pi`, 
3700                  MESON_TAC[DIHX_RANGE]);;
3701
3702 (* ==================================================================== *)
3703 (* Lemma 40 *)
3704
3705 let BOUNDED_VOLUME_MCELL = prove_by_refinement (
3706  `!V. ?c. !X. saturated V /\ packing V /\ mcell_set V X ==> vol X <= c`,
3707 [(GEN_TAC);
3708  (ASM_CASES_TAC `saturated V /\ packing V`);
3709  (EXISTS_TAC `&4 / &3 * pi * &8 pow 3`);
3710  (REPEAT STRIP_TAC);
3711  (UP_ASM_TAC THEN REWRITE_TAC[mcell_set_2; IN_ELIM_THM; IN]);
3712  (STRIP_TAC);
3713  (ASM_CASES_TAC `X:real^3->bool = {}`);
3714  (REWRITE_TAC[MEASURE_EMPTY; ASSUME `X:real^3->bool = {}`]);
3715  (REWRITE_TAC[REAL_ARITH `&0 <= &4 / &3 * pi * &8 pow 3 <=> &0 <= pi`]);
3716  (REWRITE_TAC[PI_POS_LE]);
3717  (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `~(x = {}) <=> (?v. v IN x)`]);
3718  (STRIP_TAC);
3719  (NEW_GOAL `vol X <= vol (ball (v, &8))`);
3720  (MATCH_MP_TAC MEASURE_SUBSET);
3721  (REPEAT STRIP_TAC);
3722  (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MEASURABLE_MCELL);
3723  (ASM_REWRITE_TAC[]);
3724  (REWRITE_TAC[MEASURABLE_BALL]);
3725  (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MCELL_SUBSET_BALL8);
3726  (ASM_REWRITE_TAC[]);
3727  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3728  (UP_ASM_TAC THEN SIMP_TAC[VOLUME_BALL; REAL_ARITH `&0 <= &8`]);
3729  (EXISTS_TAC `&0`);
3730  (REPEAT STRIP_TAC THEN ASM_MESON_TAC[])]);;
3731
3732 (* ==================================================================== *)
3733 (* Lemma 41 *)
3734
3735 let LEFT_ACTION_LIST_2_EXISTS = prove_by_refinement (
3736  `!u0 u1 u2 x y z d:A.
3737      CARD {u0, u1, u2, d} = 4 /\ {x, y, z} = {u0, u1, u2}
3738      ==> (?p. p permutes 0..2 /\
3739               [x; y; z; d] = left_action_list p [u0; u1; u2; d])`,
3740 [(REPEAT STRIP_TAC);
3741  (REWRITE_TAC[left_action_list; LENGTH; TABLE_4; 
3742    ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
3743  (NEW_GOAL `{u0, u1, u2:A} = 
3744              {EL 0 [u0;u1;u2;d] , EL 1 [u0;u1;u2;d], EL 2 [u0;u1;u2;d]}`);
3745  (REWRITE_TAC[EL; HD; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`; TL]);
3746  (NEW_GOAL `{x, y, z:A} = 
3747              {EL 0 [u0;u1;u2;d] , EL 1 [u0;u1;u2;d], EL 2 [u0;u1;u2;d]}`);
3748  (ASM_REWRITE_TAC[]);
3749  (NEW_GOAL `?i1. i1 IN {0,1,2} /\ EL i1 [u0;u1;u2;d] = x:A`);
3750  (UP_ASM_TAC THEN SET_TAC[]);
3751  (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3752  (NEW_GOAL `?i2. i2 IN {0,1,2} /\ EL i2 [u0;u1;u2;d] = y:A`);
3753  (UP_ASM_TAC THEN SET_TAC[]);
3754  (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3755  (NEW_GOAL `?i3. i3 IN {0,1,2} /\ EL i3 [u0;u1;u2;d] = z:A`);
3756  (UP_ASM_TAC THEN SET_TAC[]);
3757  (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3758
3759  (NEW_GOAL `~(i1 = i2) /\ ~(i1 = i3) /\ ~(i2 = i3:num)`);
3760  (REPEAT STRIP_TAC);
3761  (NEW_GOAL `{u0,u1,u2,d:A} = {x, z,d}`);
3762  (ASM_SET_TAC[]);
3763  (UNDISCH_TAC `CARD {u0,u1,u2,d:A} = 4` THEN ASM_REWRITE_TAC[]);
3764  (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3765  (NEW_GOAL `{u0,u1,u2,d:A} = {x, y,d}`);
3766  (ASM_SET_TAC[]);
3767  (UNDISCH_TAC `CARD {u0,u1,u2,d:A} = 4` THEN ASM_REWRITE_TAC[]);
3768  (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3769  (NEW_GOAL `{u0,u1,u2,d:A} = {x, y,d}`);
3770  (ASM_SET_TAC[]);
3771  (UNDISCH_TAC `CARD {u0,u1,u2,d:A} = 4` THEN ASM_REWRITE_TAC[]);
3772  (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3773  (SWITCH_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REPEAT STRIP_TAC);
3774
3775  (NEW_GOAL `{i1, i2, i3} = {0,1,2}`);
3776  (ASM_SET_TAC[]);
3777
3778  (ABBREV_TAC `p = (\i:num. if i = i1 then 0 
3779                             else if i = i2 then 1 
3780                                  else if i = i3 then 2 
3781                                       else i)`);
3782  (NEW_GOAL `p i1 = 0 /\ p i2 = 1 /\ p (i3:num) = 2`);
3783  (ASM_MESON_TAC[]);
3784
3785  (EXISTS_TAC `p:num->num`);
3786  (NEW_GOAL `p permutes 0..2`);
3787
3788  (REWRITE_TAC[permutes; EXISTS_UNIQUE; IN_NUMSEG_0; 
3789                ARITH_RULE `a <= 2 <=> a = 0 \/ a = 1 \/ a = 2`; 
3790                SET_RULE `x = 0 \/ x = 1 \/ x = 2 <=> x IN {0,1,2}`]);
3791  (NEW_GOAL `(!x. ~(x IN {0, 1, 2}) ==> p x = x)`);
3792  (REPEAT STRIP_TAC);
3793  (EXPAND_TAC "p");
3794  (COND_CASES_TAC);
3795  (ASM_SET_TAC[]);
3796  (COND_CASES_TAC);
3797  (ASM_SET_TAC[]);
3798  (COND_CASES_TAC);
3799  (ASM_SET_TAC[]);
3800  (REFL_TAC);
3801  (ASM_REWRITE_TAC[]);
3802  (REPEAT STRIP_TAC);
3803
3804  (ASM_CASES_TAC `y' = 0`);
3805  (EXISTS_TAC `i1:num`);
3806  (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
3807  (ASM_CASES_TAC `y'' = i2:num`);
3808  (NEW_GOAL `F`);
3809  (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
3810  (ARITH_TAC);
3811  (ASM_MESON_TAC[]);
3812  (ASM_CASES_TAC `y'' = i3:num`);
3813  (NEW_GOAL `F`);
3814  (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
3815  (ARITH_TAC);
3816  (ASM_MESON_TAC[]);
3817  (ASM_CASES_TAC `~(y'' IN {0,1,2})`);
3818  (NEW_GOAL `F`);
3819  (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_SIMP_TAC[]);
3820  (UP_ASM_TAC THEN SET_TAC[]);
3821  (ASM_MESON_TAC[]);
3822  (ASM_SET_TAC[]);
3823
3824  (ASM_CASES_TAC `y' = 1`);
3825  (EXISTS_TAC `i2:num`);
3826  (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
3827  (ASM_CASES_TAC `y'' = i1:num`);
3828  (NEW_GOAL `F`);
3829  (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
3830  (ARITH_TAC);
3831  (ASM_MESON_TAC[]);
3832  (ASM_CASES_TAC `y'' = i3:num`);
3833  (NEW_GOAL `F`);
3834  (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
3835  (ARITH_TAC);
3836  (ASM_MESON_TAC[]);
3837  (ASM_CASES_TAC `~(y'' IN {0,1,2})`);
3838  (NEW_GOAL `F`);
3839  (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_SIMP_TAC[]);
3840  (UP_ASM_TAC THEN SET_TAC[]);
3841  (ASM_MESON_TAC[]);
3842  (ASM_SET_TAC[]);
3843
3844  (ASM_CASES_TAC `y' = 2`);
3845  (EXISTS_TAC `i3:num`);
3846  (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
3847  (ASM_CASES_TAC `y'' = i2:num`);
3848  (NEW_GOAL `F`);
3849  (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
3850  (ARITH_TAC);
3851  (ASM_MESON_TAC[]);
3852  (ASM_CASES_TAC `y'' = i1:num`);
3853  (NEW_GOAL `F`);
3854  (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
3855  (ARITH_TAC);
3856  (ASM_MESON_TAC[]);
3857  (ASM_CASES_TAC `~(y'' IN {0,1,2})`);
3858  (NEW_GOAL `F`);
3859  (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_SIMP_TAC[]);
3860  (UP_ASM_TAC THEN SET_TAC[]);
3861  (ASM_MESON_TAC[]);
3862  (ASM_SET_TAC[]);
3863
3864  (NEW_GOAL `~(y' IN {0,1,2})`);
3865  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3866  (EXISTS_TAC `y':num`);
3867  (ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC);
3868
3869  (ASM_CASES_TAC `y'' = i1:num`);
3870  (NEW_GOAL `F`);
3871  (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
3872  (ASM_MESON_TAC[]);
3873  (ASM_CASES_TAC `y'' = i2:num`);
3874  (NEW_GOAL `F`);
3875  (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
3876  (ASM_MESON_TAC[]);
3877  (ASM_CASES_TAC `y'' = i3:num`);
3878  (NEW_GOAL `F`);
3879  (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
3880  (ASM_MESON_TAC[]);
3881
3882  (NEW_GOAL `(p:num->num) y'' = y''`);
3883  (FIRST_ASSUM MATCH_MP_TAC);
3884  (ASM_SET_TAC[]);
3885  (ASM_MESON_TAC[]);
3886
3887  (REWRITE_WITH `inverse (p:num->num) 0 = i1 /\ 
3888                  inverse p 1 = i2 /\ inverse p 2 = i3`);
3889  (UP_ASM_TAC THEN MESON_TAC[PERMUTES_INVERSE_EQ; 
3890    ASSUME `(p:num->num) i1 = 0 /\ p i2 = 1 /\ p i3 = 2`]);
3891  (ASM_REWRITE_TAC[]);
3892  (REWRITE_WITH `inverse (p:num->num) 3 = 3`);
3893  (NEW_GOAL `p 3 = 3`);
3894  (MP_TAC (ASSUME `p permutes 0..2`) THEN REWRITE_TAC[permutes]);
3895  (STRIP_TAC);
3896  (FIRST_ASSUM MATCH_MP_TAC);
3897  (REWRITE_TAC[IN_NUMSEG_0] THEN ARITH_TAC);
3898  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[PERMUTES_INVERSE_EQ]);
3899  (REWRITE_TAC[EL;HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`])]);;
3900
3901 (* ==================================================================== *)
3902 (* Lemma 42 *)
3903 let LEFT_ACTION_LIST_3_EXISTS = prove_by_refinement (
3904  `!u0 u1 u2 u3 x y z t:A.
3905      CARD {u0, u1, u2, u3} = 4 /\ {x, y, z, t} = {u0, u1, u2, u3}
3906      ==> (?p. p permutes 0..3 /\
3907               [x; y; z; t] = left_action_list p [u0; u1; u2; u3])`,
3908 [(REPEAT STRIP_TAC);
3909  (REWRITE_TAC[left_action_list; LENGTH; TABLE_4; 
3910    ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
3911  (NEW_GOAL `{u0, u1, u2, u3:A} = {EL 0 [u0;u1;u2;u3], EL 1 [u0;u1;u2;u3], 
3912                                    EL 2 [u0;u1;u2;u3], EL 3 [u0;u1;u2;u3]}`);
3913  (REWRITE_TAC[EL; HD; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; TL]);
3914  (NEW_GOAL `{x, y, z, t:A} = {EL 0 [u0;u1;u2;u3], EL 1 [u0;u1;u2;u3], 
3915                                    EL 2 [u0;u1;u2;u3], EL 3 [u0;u1;u2;u3]}`);
3916  (ASM_REWRITE_TAC[]);
3917  (NEW_GOAL `?i1. i1 IN {0,1,2,3} /\ EL i1 [u0;u1;u2;u3] = x:A`);
3918  (UP_ASM_TAC THEN SET_TAC[]);
3919  (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3920  (NEW_GOAL `?i2. i2 IN {0,1,2,3} /\ EL i2 [u0;u1;u2;u3] = y:A`);
3921  (UP_ASM_TAC THEN SET_TAC[]);
3922  (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3923  (NEW_GOAL `?i3. i3 IN {0,1,2,3} /\ EL i3 [u0;u1;u2;u3] = z:A`);
3924  (UP_ASM_TAC THEN SET_TAC[]);
3925  (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3926  (NEW_GOAL `?i4. i4 IN {0,1,2,3} /\ EL i4 [u0;u1;u2;u3] = t:A`);
3927  (UP_ASM_TAC THEN SET_TAC[]);
3928  (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3929
3930  (NEW_GOAL `~(i1 = i2) /\ ~(i1 = i3) /\ ~(i1 = i4:num) /\ ~(i2 = i3) /\ 
3931              ~(i2 = i4) /\ ~(i3 = i4)`);
3932  (REPEAT STRIP_TAC);
3933
3934  (NEW_GOAL `x = y:A`);
3935  (ASM_MESON_TAC[]);
3936  (NEW_GOAL `{u0,u1,u2,u3:A} = {x, z,t}`);
3937  (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC 
3938    THEN SET_TAC[]);
3939  (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN 
3940    REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, z, t:A}`]);
3941  (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3942
3943  (NEW_GOAL `x = z:A`);
3944  (ASM_MESON_TAC[]);
3945  (NEW_GOAL `{u0,u1,u2,u3:A} = {x, y,t}`);
3946  (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC 
3947    THEN SET_TAC[]);
3948  (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN 
3949    REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, y, t:A}`]);
3950  (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3951
3952  (NEW_GOAL `x = t:A`);
3953  (ASM_MESON_TAC[]);
3954  (NEW_GOAL `{u0,u1,u2,u3:A} = {x, y, z}`);
3955  (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC 
3956    THEN SET_TAC[]);
3957  (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN 
3958    REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, y, z:A}`]);
3959  (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3960
3961  (NEW_GOAL `y = z:A`);
3962  (ASM_MESON_TAC[]);
3963  (NEW_GOAL `{u0,u1,u2,u3:A} = {x, z,t}`);
3964  (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC 
3965    THEN SET_TAC[]);
3966  (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN 
3967    REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, z, t:A}`]);
3968  (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3969
3970  (NEW_GOAL `y = t:A`);
3971  (ASM_MESON_TAC[]);
3972  (NEW_GOAL `{u0,u1,u2,u3:A} = {x, z,t}`);
3973  (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC 
3974    THEN SET_TAC[]);
3975  (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN 
3976    REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, z, t:A}`]);
3977  (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3978
3979  (NEW_GOAL `z = t:A`);
3980  (ASM_MESON_TAC[]);
3981  (NEW_GOAL `{u0,u1,u2,u3:A} = {x, y,t}`);
3982  (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC 
3983    THEN SET_TAC[]);
3984  (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN 
3985    REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, y, t:A}`]);
3986  (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3987
3988  (SWITCH_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REPEAT STRIP_TAC);
3989
3990  (NEW_GOAL `{i1, i2, i3,i4} = {0,1,2,3}`);
3991  (REWRITE_TAC[SET_EQ_LEMMA]);
3992  (REPEAT STRIP_TAC);
3993  (ASM_SET_TAC[]);
3994  (ASM_SET_TAC[]);
3995
3996  (ABBREV_TAC `p = (\i:num. if i = i1 then 0 
3997                             else if i = i2 then 1 
3998                                  else if i = i3 then 2
3999                                       else if i = i4 then 3 
4000                                            else i)`);
4001  (NEW_GOAL `p i1 = 0 /\ p i2 = 1 /\ p (i3:num) = 2 /\ p i4 = 3`);
4002  (REPEAT STRIP_TAC);
4003  (ASM_MESON_TAC[]);
4004  (ASM_MESON_TAC[]);
4005  (ASM_MESON_TAC[]);
4006  (EXPAND_TAC "p" THEN COND_CASES_TAC);
4007  (NEW_GOAL `F`);
4008  (ASM_MESON_TAC[]);
4009  (ASM_MESON_TAC[]);
4010  (COND_CASES_TAC);
4011  (NEW_GOAL `F`);
4012  (ASM_MESON_TAC[]);
4013  (ASM_MESON_TAC[]);
4014  (COND_CASES_TAC);
4015  (NEW_GOAL `F`);
4016  (ASM_MESON_TAC[]);
4017  (ASM_MESON_TAC[]);
4018  (COND_CASES_TAC);
4019  (REFL_TAC);
4020  (NEW_GOAL `F`);
4021  (ASM_MESON_TAC[]);
4022  (ASM_MESON_TAC[]);
4023
4024
4025  (EXISTS_TAC `p:num->num`);
4026  (NEW_GOAL `p permutes 0..3`);
4027
4028  (REWRITE_TAC[permutes; EXISTS_UNIQUE; IN_NUMSEG_0; 
4029                ARITH_RULE `a <= 3 <=> a = 0 \/ a = 1 \/ a = 2 \/ a = 3`; 
4030               SET_RULE `x = 0 \/ x = 1 \/ x = 2 \/ x = 3 <=> x IN {0,1,2,3}`]);
4031  (NEW_GOAL `(!x. ~(x IN {0, 1, 2, 3}) ==> p x = x)`);
4032  (REPEAT STRIP_TAC);
4033  (EXPAND_TAC "p");
4034  (COND_CASES_TAC);
4035  (NEW_GOAL `F`);
4036  (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4037  (ASM_MESON_TAC[]);
4038  (COND_CASES_TAC);
4039  (NEW_GOAL `F`);
4040  (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4041  (ASM_MESON_TAC[]);
4042  (COND_CASES_TAC);
4043  (NEW_GOAL `F`);
4044  (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4045  (ASM_MESON_TAC[]);
4046  (COND_CASES_TAC);
4047  (NEW_GOAL `F`);
4048  (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4049  (ASM_MESON_TAC[]);
4050  (REFL_TAC);
4051
4052  (ASM_REWRITE_TAC[]);
4053  (REPEAT STRIP_TAC);
4054
4055  (ASM_CASES_TAC `y' = 0`);
4056  (EXISTS_TAC `i1:num`);
4057  (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4058  (ASM_CASES_TAC `y'' = i2:num`);
4059  (NEW_GOAL `F`);
4060  (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
4061  (ARITH_TAC);
4062  (ASM_MESON_TAC[]);
4063  (ASM_CASES_TAC `y'' = i3:num`);
4064  (NEW_GOAL `F`);
4065  (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
4066  (ARITH_TAC);
4067  (ASM_MESON_TAC[]);
4068
4069  (ASM_CASES_TAC `y'' = i4:num`);
4070  (NEW_GOAL `F`);
4071  (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
4072  (ARITH_TAC);
4073  (ASM_MESON_TAC[]);
4074
4075  (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4076  (NEW_GOAL `F`);
4077  (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_SIMP_TAC[]);
4078  (UP_ASM_TAC THEN SET_TAC[]);
4079  (ASM_MESON_TAC[]);
4080  (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN 
4081    UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4082
4083  (ASM_CASES_TAC `y' = 1`);
4084  (EXISTS_TAC `i2:num`);
4085  (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4086  (ASM_CASES_TAC `y'' = i1:num`);
4087  (NEW_GOAL `F`);
4088  (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
4089  (ARITH_TAC);
4090  (ASM_MESON_TAC[]);
4091  (ASM_CASES_TAC `y'' = i3:num`);
4092  (NEW_GOAL `F`);
4093  (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
4094  (ARITH_TAC);
4095  (ASM_MESON_TAC[]);
4096  (ASM_CASES_TAC `y'' = i4:num`);
4097  (NEW_GOAL `F`);
4098  (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
4099  (ARITH_TAC);
4100  (ASM_MESON_TAC[]);
4101  (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4102  (NEW_GOAL `F`);
4103  (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_SIMP_TAC[]);
4104  (UP_ASM_TAC THEN SET_TAC[]);
4105  (ASM_MESON_TAC[]);
4106  (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN 
4107    UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4108
4109
4110  (ASM_CASES_TAC `y' = 2`);
4111  (EXISTS_TAC `i3:num`);
4112  (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4113  (ASM_CASES_TAC `y'' = i1:num`);
4114  (NEW_GOAL `F`);
4115  (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
4116  (ARITH_TAC);
4117  (ASM_MESON_TAC[]);
4118  (ASM_CASES_TAC `y'' = i2:num`);
4119  (NEW_GOAL `F`);
4120  (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
4121  (ARITH_TAC);
4122  (ASM_MESON_TAC[]);
4123  (ASM_CASES_TAC `y'' = i4:num`);
4124  (NEW_GOAL `F`);
4125  (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
4126  (ARITH_TAC);
4127  (ASM_MESON_TAC[]);
4128  (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4129  (NEW_GOAL `F`);
4130  (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_SIMP_TAC[]);
4131  (UP_ASM_TAC THEN SET_TAC[]);
4132  (ASM_MESON_TAC[]);
4133  (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN 
4134    UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4135
4136  (ASM_CASES_TAC `y' = 3`);
4137  (EXISTS_TAC `i4:num`);
4138  (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4139  (ASM_CASES_TAC `y'' = i1:num`);
4140  (NEW_GOAL `F`);
4141  (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_REWRITE_TAC[]);
4142  (ARITH_TAC);
4143  (ASM_MESON_TAC[]);
4144  (ASM_CASES_TAC `y'' = i2:num`);
4145  (NEW_GOAL `F`);
4146  (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_REWRITE_TAC[]);
4147  (ARITH_TAC);
4148  (ASM_MESON_TAC[]);
4149  (ASM_CASES_TAC `y'' = i3:num`);
4150  (NEW_GOAL `F`);
4151  (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_REWRITE_TAC[]);
4152  (ARITH_TAC);
4153  (ASM_MESON_TAC[]);
4154  (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4155  (NEW_GOAL `F`);
4156  (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_SIMP_TAC[]);
4157  (UP_ASM_TAC THEN SET_TAC[]);
4158  (ASM_MESON_TAC[]);
4159  (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN 
4160    UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4161
4162  (NEW_GOAL `~(y' IN {0,1,2,3})`);
4163  (REPLICATE_TAC 4 UP_ASM_TAC THEN SET_TAC[]);
4164  (EXISTS_TAC `y':num`);
4165  (ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC);
4166
4167  (ASM_CASES_TAC `y'' = i1:num`);
4168  (NEW_GOAL `F`);
4169  (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4170  (ASM_MESON_TAC[]);
4171  (ASM_CASES_TAC `y'' = i2:num`);
4172  (NEW_GOAL `F`);
4173  (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4174  (ASM_MESON_TAC[]);
4175  (ASM_CASES_TAC `y'' = i3:num`);
4176  (NEW_GOAL `F`);
4177  (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4178  (ASM_MESON_TAC[]);
4179  (ASM_CASES_TAC `y'' = i4:num`);
4180  (NEW_GOAL `F`);
4181  (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4182  (ASM_MESON_TAC[]);
4183
4184  (NEW_GOAL `(p:num->num) y'' = y''`);
4185  (FIRST_ASSUM MATCH_MP_TAC);
4186  (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN 
4187    UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4188  (ASM_MESON_TAC[]);
4189
4190  (REWRITE_WITH `inverse (p:num->num) 0 = i1 /\ inverse p 3 = i4 /\
4191                  inverse p 1 = i2 /\ inverse p 2 = i3`);
4192  (UP_ASM_TAC THEN MESON_TAC[PERMUTES_INVERSE_EQ; 
4193    ASSUME `(p:num->num) i1 = 0 /\ p i2 = 1 /\ p i3 = 2 /\ p i4 = 3`]);
4194  (ASM_REWRITE_TAC[])]);;
4195
4196
4197 (* ==================================================================== *)
4198 (* Lemma 43 *)
4199
4200 let lmfun_bounded = prove_by_refinement (
4201    `!h. &0 <= h ==> lmfun h <= h0 / (h0 - &1)`,
4202 [(REPEAT STRIP_TAC THEN REWRITE_TAC[lmfun] THEN COND_CASES_TAC);
4203  (REWRITE_TAC[REAL_ARITH `(h0 - h) / (h0 - &1) <= h0 / (h0 - &1) <=> 
4204                            &0 <= h / (h0 - &1)`]);
4205  (MATCH_MP_TAC REAL_LE_DIV);
4206  (REWRITE_TAC[h0] THEN ASM_REAL_ARITH_TAC);
4207  (MATCH_MP_TAC REAL_LE_DIV);
4208  (REWRITE_TAC[h0] THEN REAL_ARITH_TAC)]);;
4209
4210 (* ==================================================================== *)
4211 (* Lemma 44 *)
4212
4213 let lmfun_pos_le = prove_by_refinement (
4214  `!h. &0 <= lmfun h`,
4215 [(REPEAT STRIP_TAC THEN REWRITE_TAC[lmfun] THEN COND_CASES_TAC);
4216  (MATCH_MP_TAC REAL_LE_DIV);
4217  (STRIP_TAC);
4218  (ASM_REAL_ARITH_TAC);
4219  (ASM_REWRITE_TAC[h0] THEN REAL_ARITH_TAC);
4220  (REAL_ARITH_TAC)]);;
4221
4222 (* ==================================================================== *)
4223 (* Lemma 45 *)
4224 let BARV_CARD_LEMMA = prove (
4225   `!V ul k.
4226            packing V /\ barV V k ul ==> CARD (set_of_list ul) = k + 1`,
4227    MESON_TAC[Rogers.BARV_IMP_LENGTH_EQ_CARD]);;
4228
4229 let BARV_LENGTH_LEMMA = prove (
4230   `!V ul k.
4231            packing V /\ barV V k ul ==> LENGTH ul = k + 1`,
4232    MESON_TAC[Rogers.BARV_IMP_LENGTH_EQ_CARD]);;
4233
4234 (* ==================================================================== *)
4235 (* Lemma 46 *)
4236
4237 let MCELL_ID_MXI_2 = prove_by_refinement (
4238  `!V i j ul vl.
4239          packing V /\
4240          saturated V /\
4241          barV V 3 ul /\
4242          barV V 3 vl /\
4243          mcell i V ul = mcell j V vl /\
4244          ~NULLSET (mcell i V ul) /\
4245          i IN {2, 3} /\
4246          j IN {2, 3}
4247          ==> mxi V ul = mxi V vl`,
4248 [(REPEAT STRIP_TAC);
4249  (NEW_GOAL `i = j /\
4250              (!k. i - 1 <= k /\ k <= 3
4251                   ==> omega_list_n V ul k = omega_list_n V vl k)`);
4252  (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
4253  (ASM_REWRITE_TAC[]);
4254  (ASM_SET_TAC[]);
4255  (UP_ASM_TAC THEN STRIP_TAC);
4256
4257  (ASM_CASES_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) >= sqrt (&2)`);
4258  (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
4259
4260  (REWRITE_WITH `mxi V ul = omega_list_n V ul 2`);
4261  (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
4262  (ASM_REWRITE_TAC[]);
4263  (NEW_GOAL `F`);
4264  (ASM_MESON_TAC[]);
4265  (ASM_MESON_TAC[]);
4266
4267  (REWRITE_WITH `mxi V vl = omega_list_n V vl 2`);
4268  (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
4269  (ASM_REWRITE_TAC[]);
4270  (NEW_GOAL `F`);
4271  (ASM_MESON_TAC[]);
4272  (ASM_MESON_TAC[]);
4273
4274  (FIRST_ASSUM MATCH_MP_TAC);
4275  (NEW_GOAL `i = 2 \/ i = 3`);
4276  (ASM_SET_TAC[]);
4277  (ASM_ARITH_TAC);
4278
4279  (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
4280  (STRIP_TAC);
4281
4282  (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
4283  (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
4284
4285  (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) = 
4286              set_of_list (truncate_simplex (i - 1) vl)`);
4287  (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
4288  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4289  (NEW_GOAL `i = 2 \/ i = 3`);
4290  (ASM_SET_TAC[]);
4291  (ASM_REWRITE_TAC[]);
4292  (REPEAT STRIP_TAC);
4293  (ASM_ARITH_TAC);
4294  (ASM_ARITH_TAC);
4295  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4296  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4297  (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
4298  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4299  (NEW_GOAL `i = 2 \/ i = 3`);
4300  (ASM_SET_TAC[]);
4301  (ASM_REWRITE_TAC[]);
4302  (REPEAT STRIP_TAC);
4303  (ASM_ARITH_TAC);
4304  (ASM_ARITH_TAC);
4305  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4306  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4307  (ASM_MESON_TAC[]);
4308
4309  (NEW_GOAL `F`);
4310  (NEW_GOAL `hl (xl:(real^3)list) <= dist (omega_list V xl, HD xl)`);
4311  (MATCH_MP_TAC Rogers.WAUFCHE1);
4312  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "xl");
4313  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4314  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4315
4316  (NEW_GOAL `!w:real^3. w IN set_of_list yl
4317                   ==> dist (circumcenter (set_of_list yl),w) = hl yl`);
4318  (MATCH_MP_TAC Rogers.HL_PROPERTIES);
4319  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
4320  (EXPAND_TAC "yl");
4321  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4322  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4323  (UP_ASM_TAC THEN REWRITE_WITH `circumcenter (set_of_list yl) = 
4324                                  omega_list V (yl:(real^3)list)`);
4325  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4326  (MATCH_MP_TAC Rogers.XNHPWAB1);
4327  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4328  (EXPAND_TAC "yl");
4329  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4330  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4331  (STRIP_TAC);
4332
4333  (NEW_GOAL `hl yl = dist (omega_list V yl, HD xl)`);
4334  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4335  (FIRST_ASSUM MATCH_MP_TAC);
4336  (NEW_GOAL `HD (xl:(real^3)list) = HD (truncate_simplex (i - 1) ul)`);
4337  (REWRITE_WITH `HD (xl:(real^3)list) = HD ul`);
4338  (EXPAND_TAC "xl");
4339  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4340  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4341  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4342  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4343  (ARITH_TAC);
4344  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4345  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4346  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4347  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4348  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4349  (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4350   `x IN {2,3} <=> x = 2 \/ x = 3`]);
4351  (ARITH_TAC);
4352  (ASM_REWRITE_TAC[]);
4353  (NEW_GOAL `HD (xl:(real^3)list) IN 
4354              set_of_list (truncate_simplex (i - 1) ul)`);
4355  (REWRITE_TAC[ASSUME `HD (xl:(real^3)list) = 
4356                        HD (truncate_simplex (i - 1) ul)`]);
4357  (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4358  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i - 1`);
4359  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4360  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4361  (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4362   `x IN {2,3} <=> x = 2 \/ x = 3`] THEN ARITH_TAC);
4363  (UP_ASM_TAC);
4364  (NEW_GOAL `set_of_list (truncate_simplex (j - 1) vl) SUBSET 
4365              set_of_list (yl:(real^3)list)`);
4366  (EXPAND_TAC "yl");
4367  (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
4368  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4369  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4370  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4371  (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4372   `x IN {2,3} <=> x = 2 \/ x = 3`]);
4373  (ARITH_TAC);
4374  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4375  (SET_TAC[]);
4376
4377  (NEW_GOAL `omega_list V xl = omega_list V yl`);
4378  (REWRITE_TAC[OMEGA_LIST]);
4379  (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
4380  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4381  (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
4382  (STRIP_TAC);
4383  (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4384  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4385                  CARD (set_of_list ul) = 3 + 1`);
4386  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4387  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4388  (ARITH_TAC);
4389  (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4390  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
4391                  CARD (set_of_list vl) = 3 + 1`);
4392  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4393  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4394  (ARITH_TAC);
4395  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
4396  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4397  (REWRITE_WITH 
4398   `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
4399    truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
4400  (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
4401  (REWRITE_WITH 
4402   `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
4403  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4404  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4405  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4406                  CARD (set_of_list ul) = 3 + 1`);
4407  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4408  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4409  (ARITH_TAC);
4410
4411  (REWRITE_WITH 
4412   `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
4413  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4414  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4415  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
4416                  CARD (set_of_list vl) = 3 + 1`);
4417  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4418  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4419  (ARITH_TAC);
4420
4421  (FIRST_ASSUM MATCH_MP_TAC);
4422  (NEW_GOAL `i = 2 \/ i = 3`);
4423  (ASM_SET_TAC[]);
4424  (ASM_ARITH_TAC);
4425
4426  (ASM_REWRITE_TAC[]);
4427  (NEW_GOAL `hl (yl:(real^3)list) = dist (omega_list V xl, HD xl)`);
4428  (ASM_REWRITE_TAC[]);
4429  (ASM_REAL_ARITH_TAC);
4430  (ASM_MESON_TAC[]);
4431
4432 (* ======================================================================= *)
4433
4434  (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
4435  (STRIP_TAC);
4436  (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
4437
4438  (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
4439  (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
4440
4441  (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) = 
4442              set_of_list (truncate_simplex (i - 1) vl)`);
4443  (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
4444  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4445  (NEW_GOAL `i = 2 \/ i = 3`);
4446  (ASM_SET_TAC[]);
4447  (ASM_REWRITE_TAC[]);
4448  (REPEAT STRIP_TAC);
4449  (ASM_ARITH_TAC);
4450  (ASM_ARITH_TAC);
4451  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4452  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4453  (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
4454  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4455  (NEW_GOAL `i = 2 \/ i = 3`);
4456  (ASM_SET_TAC[]);
4457  (ASM_REWRITE_TAC[]);
4458  (REPEAT STRIP_TAC);
4459  (ASM_ARITH_TAC);
4460  (ASM_ARITH_TAC);
4461  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4462  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4463  (ASM_MESON_TAC[]);
4464
4465  (NEW_GOAL `F`);
4466  (NEW_GOAL `hl (yl:(real^3)list) <= dist (omega_list V yl, HD yl)`);
4467  (MATCH_MP_TAC Rogers.WAUFCHE1);
4468  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "yl");
4469  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4470  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4471
4472  (NEW_GOAL `!w:real^3. w IN set_of_list xl
4473                   ==> dist (circumcenter (set_of_list xl),w) = hl xl`);
4474  (MATCH_MP_TAC Rogers.HL_PROPERTIES);
4475  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
4476  (EXPAND_TAC "xl");
4477  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4478  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4479  (UP_ASM_TAC THEN REWRITE_WITH `circumcenter (set_of_list xl) = 
4480                                  omega_list V (xl:(real^3)list)`);
4481  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4482  (MATCH_MP_TAC Rogers.XNHPWAB1);
4483  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4484  (EXPAND_TAC "xl");
4485  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4486  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4487  (STRIP_TAC);
4488
4489  (NEW_GOAL `hl xl = dist (omega_list V xl, HD yl)`);
4490  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4491  (FIRST_ASSUM MATCH_MP_TAC);
4492  (NEW_GOAL `HD (yl:(real^3)list) = HD (truncate_simplex (i - 1) vl)`);
4493  (REWRITE_WITH `HD (yl:(real^3)list) = HD vl`);
4494  (EXPAND_TAC "yl");
4495  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4496  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4497  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4498  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4499  (ARITH_TAC);
4500  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4501  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4502  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4503  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4504  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4505  (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4506   `x IN {2,3} <=> x = 2 \/ x = 3`]);
4507  (ARITH_TAC);
4508
4509  (NEW_GOAL `HD (yl:(real^3)list) IN 
4510              set_of_list (truncate_simplex (i - 1) vl)`);
4511  (REWRITE_TAC[ASSUME `HD (yl:(real^3)list) = 
4512                        HD (truncate_simplex (i - 1) vl)`]);
4513  (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4514  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i - 1`);
4515  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4516  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4517  (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4518   `x IN {2,3} <=> x = 2 \/ x = 3`] THEN ARITH_TAC);
4519  (UP_ASM_TAC);
4520  (NEW_GOAL `set_of_list (truncate_simplex (i - 1) vl) SUBSET 
4521              set_of_list (xl:(real^3)list)`);
4522  (EXPAND_TAC "xl");
4523  (REWRITE_TAC[GSYM (ASSUME
4524   `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
4525    set_of_list (truncate_simplex (i - 1) vl)`)]);
4526  (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
4527  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4528  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4529  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4530  (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4531   `x IN {2,3} <=> x = 2 \/ x = 3`]);
4532  (ARITH_TAC);
4533  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4534  (SET_TAC[]);
4535
4536  (NEW_GOAL `omega_list V xl = omega_list V yl`);
4537  (REWRITE_TAC[OMEGA_LIST]);
4538  (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
4539  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4540  (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
4541  (STRIP_TAC);
4542  (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4543  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4544                  CARD (set_of_list ul) = 3 + 1`);
4545  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4546  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4547  (ARITH_TAC);
4548  (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4549  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
4550                  CARD (set_of_list vl) = 3 + 1`);
4551  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4552  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4553  (ARITH_TAC);
4554  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
4555  (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4556  (REWRITE_WITH 
4557   `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
4558    truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
4559  (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
4560  (REWRITE_WITH 
4561   `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
4562  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4563  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4564  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4565                  CARD (set_of_list ul) = 3 + 1`);
4566  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4567  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4568  (ARITH_TAC);
4569
4570  (REWRITE_WITH 
4571   `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
4572  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4573  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4574  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
4575                  CARD (set_of_list vl) = 3 + 1`);
4576  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4577  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4578  (ARITH_TAC);
4579
4580  (FIRST_ASSUM MATCH_MP_TAC);
4581  (NEW_GOAL `i = 2 \/ i = 3`);
4582  (ASM_SET_TAC[]);
4583  (ASM_ARITH_TAC);
4584
4585  (NEW_GOAL `hl (xl:(real^3)list) = dist (omega_list V yl, HD yl)`);
4586  (ASM_REWRITE_TAC[]);
4587  (ASM_REAL_ARITH_TAC);
4588  (ASM_MESON_TAC[]);
4589  (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
4590  (STRIP_TAC);
4591
4592 (* ======================================================================= *)
4593
4594  (NEW_GOAL `sqrt (&2) <= hl (ul:(real^3)list)`);
4595  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4596  (ASM_CASES_TAC `i = 2`);
4597  (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 2`; mcell2]);
4598  (COND_CASES_TAC);
4599  (STRIP_TAC);
4600  (ASM_REWRITE_TAC[]);
4601  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4602  (NEW_GOAL `i = 3`);
4603  (ASM_SET_TAC[]);
4604  (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 3`; mcell3]);
4605  (COND_CASES_TAC);
4606  (STRIP_TAC);
4607  (ASM_REWRITE_TAC[]);
4608  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4609
4610  (NEW_GOAL `sqrt (&2) <= hl (vl:(real^3)list)`);
4611  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4612  (ASM_REWRITE_TAC[]);
4613  (ASM_CASES_TAC `j = 2`);
4614  (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 2`; mcell2]);
4615  (COND_CASES_TAC);
4616  (STRIP_TAC);
4617  (ASM_REWRITE_TAC[]);
4618  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4619  (NEW_GOAL `j = 3`);
4620  (ASM_SET_TAC[]);
4621  (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 3`; mcell3]);
4622  (COND_CASES_TAC);
4623  (STRIP_TAC);
4624  (ASM_REWRITE_TAC[]);
4625  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4626
4627  (ABBREV_TAC `s2 = omega_list_n V ul 2`);
4628  (ABBREV_TAC `s3 = omega_list_n V ul 3`);
4629  (NEW_GOAL `s2 = omega_list_n V vl 2`);
4630  (EXPAND_TAC "s2" THEN FIRST_ASSUM MATCH_MP_TAC);
4631  (NEW_GOAL `i = 2 \/ i = 3`);
4632  (ASM_SET_TAC[]);
4633  (ASM_ARITH_TAC);
4634  (NEW_GOAL `s3 = omega_list_n V vl 3`);
4635  (EXPAND_TAC "s3" THEN FIRST_ASSUM MATCH_MP_TAC);
4636  (NEW_GOAL `i = 2 \/ i = 3`);
4637  (ASM_SET_TAC[]);
4638  (ASM_ARITH_TAC);
4639  (ABBREV_TAC `u0:real^3 = HD ul`);
4640
4641  (NEW_GOAL `?s. between s (s2,s3) /\
4642                   dist (u0,s) = sqrt (&2) /\
4643                   mxi V ul = s`);
4644  (EXPAND_TAC "s2" THEN EXPAND_TAC "s3");
4645  (MATCH_MP_TAC MXI_EXPLICIT);
4646  (NEW_GOAL `?v0 u1 u2 u3. ul = [v0;u1;u2;u3:real^3]`);
4647  (MATCH_MP_TAC BARV_3_EXPLICIT);
4648  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4649  (UP_ASM_TAC THEN STRIP_TAC);
4650  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4651    EXISTS_TAC `u3:real^3`);
4652  (ASM_REWRITE_TAC[]);
4653  (REWRITE_WITH `v0:real^3 = HD ul`);
4654  (REWRITE_TAC[ASSUME `ul = [v0;u1;u2;u3:real^3]`; HD]);
4655  (ASM_REWRITE_TAC[]);
4656  (UP_ASM_TAC THEN STRIP_TAC);
4657  (ABBREV_TAC `v0:real^3 = HD vl`);
4658
4659  (NEW_GOAL `?t. between t (s2,s3) /\
4660                   dist (v0,t) = sqrt (&2) /\
4661                   mxi V vl = t`);
4662  (ASM_REWRITE_TAC[]);
4663  (EXPAND_TAC "v0");
4664  (MATCH_MP_TAC MXI_EXPLICIT);
4665  (NEW_GOAL `?w0 u1 u2 u3. vl = [w0;u1;u2;u3:real^3]`);
4666  (MATCH_MP_TAC BARV_3_EXPLICIT);
4667  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4668  (UP_ASM_TAC THEN STRIP_TAC);
4669  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4670    EXISTS_TAC `u3:real^3`);
4671  (ASM_REWRITE_TAC[HD]);
4672  (EXPAND_TAC "v0");
4673  (REWRITE_TAC[ASSUME `vl = [w0;u1;u2;u3:real^3]`; HD]);
4674  (UP_ASM_TAC THEN STRIP_TAC);
4675
4676  (NEW_GOAL `dist (u0:real^3, t) = sqrt (&2)`);
4677  (NEW_GOAL `(t:real^3) IN voronoi_list  V (truncate_simplex 2 vl)`);
4678  (NEW_GOAL `s2 IN voronoi_list  V (truncate_simplex 2 vl)`);
4679  (ASM_REWRITE_TAC[]);
4680  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4681  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4682  (NEW_GOAL `s3 IN voronoi_list  V (truncate_simplex 2 vl)`);
4683  (ASM_REWRITE_TAC[]);
4684  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4685  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4686  (NEW_GOAL `convex hull {s2, s3:real^3} SUBSET                 
4687              convex hull (voronoi_list V (truncate_simplex 2 vl))`);
4688  (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET THEN ASM_SET_TAC[]);
4689  (UP_ASM_TAC THEN REWRITE_WITH 
4690   `convex hull voronoi_list V (truncate_simplex 2 vl) =    
4691    voronoi_list V  (truncate_simplex 2 vl)`);
4692  (REWRITE_TAC[CONVEX_HULL_EQ; CONVEX_VORONOI_LIST]);
4693  (STRIP_TAC);
4694  (NEW_GOAL `t IN convex hull {s2, s3:real^3}`);
4695  (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
4696  (ASM_REWRITE_TAC[]);
4697  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4698
4699  (NEW_GOAL `u0:real^3 IN set_of_list (truncate_simplex 2 vl)`);
4700  (EXPAND_TAC "u0");
4701
4702  (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) = 
4703              set_of_list (truncate_simplex (i - 1) vl)`);
4704  (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
4705  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4706  (NEW_GOAL `i = 2 \/ i = 3`);
4707  (ASM_SET_TAC[]);
4708  (ASM_REWRITE_TAC[]);
4709  (REPEAT STRIP_TAC);
4710  (ASM_ARITH_TAC);
4711  (ASM_ARITH_TAC);
4712  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4713  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4714  (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
4715  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4716  (NEW_GOAL `i = 2 \/ i = 3`);
4717  (ASM_SET_TAC[]);
4718  (ASM_REWRITE_TAC[]);
4719  (REPEAT STRIP_TAC);
4720  (ASM_ARITH_TAC);
4721  (ASM_ARITH_TAC);
4722  (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4723  (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4724  (ASM_MESON_TAC[]);
4725
4726  (NEW_GOAL `HD (ul:(real^3)list) = HD (truncate_simplex (i - 1) ul)`);
4727  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4728  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4729  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4730  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4731  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4732  (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4733   `x IN {2,3} <=> x = 2 \/ x = 3`]);
4734  (ARITH_TAC);
4735
4736  (NEW_GOAL `HD (ul:(real^3)list) IN 
4737              set_of_list (truncate_simplex (i - 1) ul)`);
4738  (REWRITE_TAC[ASSUME `HD (ul:(real^3)list) = 
4739                        HD (truncate_simplex (i - 1) ul)`]);
4740  (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4741  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i - 1`);
4742  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4743  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4744  (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4745   `x IN {2,3} <=> x = 2 \/ x = 3`] THEN ARITH_TAC);
4746  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4747  (NEW_GOAL `set_of_list (truncate_simplex (j - 1) vl) SUBSET 
4748              set_of_list (truncate_simplex 2 (vl:(real^3)list))`);
4749  (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
4750  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4751  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4752  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4753  (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4754   `x IN {2,3} <=> x = 2 \/ x = 3`]);
4755  (ARITH_TAC);
4756  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4757  (SET_TAC[]);
4758
4759
4760  (NEW_GOAL `v0:real^3 IN set_of_list (truncate_simplex 2 vl)`);
4761  (EXPAND_TAC "v0");
4762  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 2 vl)`);
4763  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4764  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4765  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4766  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4767  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4768  (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE 
4769   `x IN {2,3} <=> x = 2 \/ x = 3`]);
4770  (ARITH_TAC);
4771  (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4772  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
4773  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4774  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4775  (ARITH_TAC);
4776
4777  (NEW_GOAL `t:real^3 IN voronoi_closed V u0`);
4778  (UNDISCH_TAC `t:real^3 IN voronoi_list V (truncate_simplex 2 vl)`);
4779  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET;]);
4780  (ASM_SET_TAC[]);
4781  (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM; voronoi_closed]);
4782  (STRIP_TAC);
4783  (NEW_GOAL `dist (u0:real^3, t) <= dist (v0:real^3, t)`);
4784  (ONCE_REWRITE_TAC[DIST_SYM]);
4785  (FIRST_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "v0");
4786  (REWRITE_TAC[MESON[IN] `(V:real^3->bool) s <=> s IN V`]);
4787  (NEW_GOAL `HD (vl:(real^3)list) IN set_of_list vl`);
4788  (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4789  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4790  (NEW_GOAL `set_of_list (vl:(real^3)list) SUBSET V`);
4791  (MATCH_MP_TAC Packing3.BARV_SUBSET);
4792  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4793  (ASM_SET_TAC[]);
4794
4795  (NEW_GOAL `t:real^3 IN voronoi_closed V v0`);
4796  (UNDISCH_TAC `t:real^3 IN voronoi_list V (truncate_simplex 2 vl)`);
4797  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET;]);
4798  (ASM_SET_TAC[]);
4799  (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM; voronoi_closed]);
4800  (STRIP_TAC);
4801  (NEW_GOAL `dist (v0:real^3, t) <= dist (u0:real^3, t)`);
4802  (ONCE_REWRITE_TAC[DIST_SYM]);
4803  (FIRST_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "u0");
4804  (REWRITE_TAC[MESON[IN] `(V:real^3->bool) s <=> s IN V`]);
4805  (NEW_GOAL `HD (ul:(real^3)list) IN set_of_list ul`);
4806  (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4807  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4808  (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET V`);
4809  (MATCH_MP_TAC Packing3.BARV_SUBSET);
4810  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4811  (ASM_SET_TAC[]);
4812  (ASM_REAL_ARITH_TAC);
4813
4814  (ASM_REWRITE_TAC[]);
4815
4816  (NEW_GOAL `!n. between n (s2, s3:real^3) ==> 
4817              dist (u0, n) pow 2 = dist (s2, n) pow 2 + dist (u0, s2) pow 2`);
4818  (REPEAT STRIP_TAC);
4819  (REWRITE_TAC[dist]);
4820  (MATCH_MP_TAC PYTHAGORAS);
4821  (REWRITE_TAC[orthogonal]);
4822  (ABBREV_TAC `zl = truncate_simplex 2 (ul:(real^3)list)`);
4823  (REWRITE_WITH `s2:real^3 = circumcenter (set_of_list zl)`);
4824  (REWRITE_WITH `s2 = omega_list V zl`);
4825  (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
4826  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4827  (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
4828  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4829                  CARD (set_of_list ul) = 3 + 1`);
4830  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4831  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4832  (ARITH_TAC);
4833  (MATCH_MP_TAC Rogers.XNHPWAB1);
4834  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4835  (EXPAND_TAC "zl");
4836  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4837  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4838  (MATCH_MP_TAC Rogers.MHFTTZN4);
4839  (EXISTS_TAC `V:real^3->bool`);
4840  (EXISTS_TAC `2`);
4841  (REPEAT STRIP_TAC);
4842  (ASM_REWRITE_TAC[]);
4843  (EXPAND_TAC "zl");
4844  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4845  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4846
4847  (NEW_GOAL `s2 IN voronoi_list V zl`);
4848  (REWRITE_WITH `s2 = omega_list V zl`);
4849  (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
4850  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4851  (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
4852  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4853                  CARD (set_of_list ul) = 3 + 1`);
4854  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4855  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4856  (ARITH_TAC);
4857  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
4858  (EXISTS_TAC `2`);
4859  (EXPAND_TAC "zl");
4860  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4861  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4862
4863  (NEW_GOAL `s3 IN voronoi_list V zl`);
4864  (EXPAND_TAC "s3" THEN EXPAND_TAC "zl");
4865  (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4866  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3 /\ 3 <= 3`]);
4867  (NEW_GOAL `affine hull {s2, s3} SUBSET affine hull voronoi_list V zl`);
4868  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
4869  (ASM_SET_TAC[]);
4870  (NEW_GOAL `n IN affine hull {s2, s3:real^3}`);
4871  (NEW_GOAL `convex hull {s2,s3} SUBSET affine hull {s2,s3:real^3}`);
4872  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4873  (NEW_GOAL `n IN convex hull {s2, s3:real^3}`);
4874  (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
4875  (ASM_REWRITE_TAC[]);
4876  (ASM_SET_TAC[]);
4877  (ASM_SET_TAC[]);
4878
4879  (MATCH_MP_TAC Marchal_cells_2_new.IN_AFFINE_KY_LEMMA1);
4880  (REWRITE_WITH `u0:real^3 = HD zl`);
4881  (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
4882  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4883  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4884  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4885                  CARD (set_of_list ul) = 3 + 1`);
4886  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4887  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4888  (ARITH_TAC);
4889  (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
4890
4891  (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\ 
4892                  CARD (set_of_list zl) = 2 + 1`);
4893  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4894  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4895  (EXPAND_TAC "zl");
4896  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4897  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4898  (ARITH_TAC);
4899
4900  (NEW_GOAL `dist (u0,s) pow 2 = dist (s2,s:real^3) pow 2 + dist (u0,s2) pow 2`);
4901  (ASM_SIMP_TAC[]);
4902  (NEW_GOAL `dist (u0,t) pow 2 = dist (s2,t:real^3) pow 2 + dist (u0,s2) pow 2`);
4903  (ASM_SIMP_TAC[]);
4904  (NEW_GOAL `dist (s2, s:real^3) = dist (s2, t)`);
4905  (REWRITE_TAC[DIST_EQ]);
4906  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
4907
4908  (UNDISCH_TAC `between s (s2, s3:real^3)` THEN 
4909    UNDISCH_TAC `between t (s2, s3:real^3)`);
4910  (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
4911  (REPEAT STRIP_TAC);
4912  (UNDISCH_TAC `dist (s2,s) = dist (s2,t:real^3)`);
4913  (REWRITE_TAC[dist;ASSUME `s = u' % s2 + v' % s3:real^3`; 
4914    ASSUME `t = u % s2 + v % s3:real^3` ]);
4915  (REWRITE_WITH `s2 - (u' % s2 + v' % s3) =
4916   (u' + v') % s2 - (u' % s2 + v' % s3:real^3)`);
4917  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4918  (REWRITE_WITH `s2 - (u % s2 + v % s3) =
4919   (u + v) % s2 - (u % s2 + v % s3:real^3)`);
4920  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4921  (REWRITE_TAC[VECTOR_ARITH `(u + v) % s - (u % s + v % t) = v % (s - t)`]);
4922  (REWRITE_TAC[NORM_MUL]);
4923  (REWRITE_WITH `abs v = v /\ abs v' = v'`);
4924  (ASM_SIMP_TAC[REAL_ABS_REFL]);
4925  (REWRITE_TAC[REAL_ARITH `a * b = c * b <=> (a - c) * b = &0`;REAL_ENTIRE]);
4926  (STRIP_TAC);
4927
4928  (REWRITE_WITH `v = v':real /\ u = u':real`);
4929  (ASM_REAL_ARITH_TAC);
4930  (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0]);
4931  (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`] THEN STRIP_TAC);
4932  (NEW_GOAL `F`);
4933  (NEW_GOAL `hl (ul:(real^3)list) <= dist (s3,u0:real^3)`);
4934  (REWRITE_WITH `s3 = omega_list V ul /\ u0 = HD ul`);
4935  (STRIP_TAC);
4936  (REWRITE_TAC[GSYM (ASSUME `omega_list_n V ul 3 = s3`); OMEGA_LIST]);
4937  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4938                  CARD (set_of_list ul) = 3 + 1`);
4939  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4940  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4941  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
4942  (ASM_REWRITE_TAC[]);
4943  (MATCH_MP_TAC Rogers.WAUFCHE1);
4944  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
4945  (ABBREV_TAC `zl:(real^3)list = truncate_simplex 2 ul`);
4946  (NEW_GOAL `hl (zl:(real^3)list) = dist (s3, u0:real^3)`);
4947
4948  (REWRITE_WITH `s3 = omega_list V zl /\ u0 = HD zl`);
4949  (STRIP_TAC);
4950  (REWRITE_TAC[GSYM (ASSUME `s2:real^3 = s3`); OMEGA_LIST]);
4951  (EXPAND_TAC "s2");
4952
4953  (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\ 
4954                  CARD (set_of_list zl) = 2 + 1`);
4955  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4956  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4957  (EXPAND_TAC "zl");
4958  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4959  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4960  (REWRITE_TAC[ARITH_RULE `(2 + 1) - 1 = 2`]);
4961  (EXPAND_TAC "zl");
4962
4963  (REWRITE_WITH `truncate_simplex 2 (ul:(real^3)list) = 
4964                  truncate_simplex (2 + 0) (ul:(real^3)list)`);
4965  (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
4966  (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4967  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4968                  CARD (set_of_list ul) = 3 + 1`);
4969  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4970  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4971  (ARITH_TAC);
4972
4973  (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
4974  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4975  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4976  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4977                  CARD (set_of_list ul) = 3 + 1`);
4978  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4979  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4980  (ARITH_TAC);
4981  (MATCH_MP_TAC Rogers.WAUFCHE2);
4982  (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4983  (EXPAND_TAC "zl");
4984  (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4985  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4986  (ASM_REAL_ARITH_TAC);
4987  (ASM_MESON_TAC[])]);;
4988
4989 (* ==================================================================== *)
4990 (* Lemma 47 *)
4991
4992 let DIHV_SYM_3 = prove_by_refinement ( 
4993            `!a b c d x y z t.
4994                          {a,b:real^3} = {c,d} /\ {x,y} = {z,t} ==> 
4995                          dihV a b x y = dihV c d z t`,
4996 [(REWRITE_TAC[SET_RULE `{a,b} = {c,d} <=> 
4997                          (a = c /\ b = d) \/ (a = d /\ b = c)`]);
4998  (REPEAT STRIP_TAC);
4999  (ASM_REWRITE_TAC[]);
5000  (ASM_REWRITE_TAC[DIHV_SYM_2]); 
5001  (ASM_REWRITE_TAC[DIHV_SYM_2; DIHV_SYM]);
5002  (ASM_REWRITE_TAC[DIHV_SYM_2; DIHV_SYM])]);;
5003
5004 (* ==================================================================== *)
5005 (* Lemma 48 *)
5006
5007 let DIHX_SYM = prove_by_refinement (
5008  `!V X u v.
5009      packing V /\ saturated V /\ mcell_set V X /\ {u, v} IN edgeX V X
5010      ==> dihX V X (u,v) = dihX V X (v,u)`,
5011 [(REPEAT STRIP_TAC);
5012  (REWRITE_TAC[dihX]);
5013  (COND_CASES_TAC);
5014  (COND_CASES_TAC);
5015  (REFL_TAC);
5016  (UP_ASM_TAC THEN MESON_TAC[]);
5017  (COND_CASES_TAC);
5018  (UP_ASM_TAC THEN MESON_TAC[]);
5019  (DEL_TAC THEN REWRITE_TAC[cell_params_d] THEN REPEAT LET_TAC);
5020
5021  (UNDISCH_TAC `{u, v} IN edgeX V X` THEN REWRITE_TAC[edgeX; IN;IN_ELIM_THM]);
5022  (REWRITE_WITH `VX V X = V INTER X`);
5023  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
5024  (ASM_REWRITE_TAC[]);
5025  (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set;IN_ELIM_THM;IN]);
5026  (MESON_TAC[]);
5027  (STRIP_TAC);
5028  (MP_TAC (ASSUME `(V INTER X) (u':real^3)`) THEN 
5029    MP_TAC (ASSUME `(V INTER X) (v':real^3)`));
5030  (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set_2;IN_ELIM_THM;IN]);
5031  (STRIP_TAC);
5032  (REWRITE_TAC[ASSUME `X = mcell i V ul''`]);
5033  (REWRITE_WITH `(V INTER mcell i V ul'') = set_of_list (truncate_simplex (i-1) ul'')`);
5034  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5035  (ASM_REWRITE_TAC[]);
5036  (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`)]);
5037  (STRIP_TAC);
5038  (REWRITE_TAC[ARITH_RULE `1 <= i <=> ~(i = 0)`]);
5039  (STRIP_TAC);
5040  (MP_TAC (ASSUME `(V INTER X) (u':real^3)`));
5041  (REWRITE_WITH `V INTER X:real^3->bool = {}`);
5042  (ASM_REWRITE_TAC[]);
5043  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
5044  (ASM_REWRITE_TAC[]);
5045  (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
5046  (SET_TAC[]);
5047  (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5048  (REPEAT STRIP_TAC);
5049  (ASM_CASES_TAC `i <= 1`);
5050  (NEW_GOAL `?w0 w1 w2 w3. ul'' = [w0;w1;w2;w3:real^3]`);
5051  (MATCH_MP_TAC BARV_3_EXPLICIT);
5052  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5053  (UP_ASM_TAC THEN STRIP_TAC);
5054  (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5055    UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5056  (NEW_GOAL `i - 1 = 0`);
5057  (UNDISCH_TAC `i <= 1` THEN ARITH_TAC);
5058  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0; set_of_list; 
5059    MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5060  (REWRITE_TAC[SET_RULE `a IN {b} <=> a = b`]);
5061  (UNDISCH_TAC `~(u' = v':real^3)`);
5062  (SET_TAC[]); 
5063  (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `~(i <= 1) <=> 2 <= i`] 
5064    THEN STRIP_TAC);
5065
5066 (* ========================================================================== *)
5067
5068  (NEW_GOAL `?p. p permutes 0..i - 1 /\ 
5069                  initial_sublist [u:real^3; v] (left_action_list p ul'')`);
5070  (NEW_GOAL `?w0 w1 w2 w3. ul'' = [w0;w1;w2;w3:real^3]`);
5071  (MATCH_MP_TAC BARV_3_EXPLICIT);
5072  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5073  (UP_ASM_TAC THEN STRIP_TAC);
5074
5075  (ASM_CASES_TAC `i = 2`);
5076  (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5077    UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5078  (NEW_GOAL `i - 1 = 1`);
5079  (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
5080  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list; 
5081    MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5082  (REPEAT STRIP_TAC);
5083  (ASM_CASES_TAC `u = w0:real^3`);
5084  (NEW_GOAL `v = w1:real^3`);
5085  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
5086   `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}` 
5087    THEN SET_TAC[]);
5088  (EXISTS_TAC `I:num->num`);
5089  (ASM_REWRITE_TAC[PERMUTES_I; Packing3.LEFT_ACTION_LIST_I]);
5090  (REWRITE_WITH `initial_sublist [w0; w1] [w0; w1; w2; w3] /\ 
5091                  LENGTH [w0;w1:real^3] = 1 + 1`);
5092  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5093  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5094  (NEW_GOAL `v = w0:real^3 /\ u = w1:real^3`);
5095  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
5096   `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}` 
5097    THEN SET_TAC[]);
5098  (ASM_REWRITE_TAC[]);
5099  (NEW_GOAL `?p. p permutes 0..1 /\ 
5100                  [w1; w0; w2; w3:real^3] = left_action_list p ul''`);
5101  (MATCH_MP_TAC Qzksykg.TWO_REARRANGEMENT_LEMMA);
5102  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5103  (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC);
5104  (EXISTS_TAC `p:num->num` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[GSYM 
5105    (ASSUME `[w1; w0; w2; w3] = left_action_list p [w0; w1; w2; w3:real^3]`)]);
5106  (REWRITE_WITH `initial_sublist [w1; w0] [w1; w0; w2; w3] /\ 
5107                  LENGTH [w1;w0:real^3] = 1 + 1`);
5108  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5109  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5110
5111  (ASM_CASES_TAC `i = 3`);
5112  (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5113    UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5114  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2;
5115    set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5116  (REPEAT STRIP_TAC);
5117
5118  (NEW_GOAL `u IN {w0, w1, w2} /\ v IN {w0, w1, w2:real^3} /\ ~(u = v)`);
5119  (ASM_SET_TAC[]);
5120  (UP_ASM_TAC THEN STRIP_TAC);
5121
5122  (NEW_GOAL `?a. {u,v, a} = {w0, w1, w2:real^3}`);
5123  (NEW_GOAL `?w:real^3. w IN {w0, w1, w2} DIFF {u, v}`);
5124  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5125  (REWRITE_WITH `{w0, w1, w2} DIFF {u, v:real^3} = {} <=> 
5126                   CARD ({w0, w1, w2} DIFF {u, v}) = 0`);
5127  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5128  (MATCH_MP_TAC CARD_EQ_0);
5129  (MATCH_MP_TAC FINITE_SUBSET);
5130  (EXISTS_TAC `{w0, w1, w2:real^3}`);
5131  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5132
5133  (NEW_GOAL `CARD {w0, w1, w2} = CARD ({w0, w1, w2} DIFF {u, v:real^3}) +
5134                                  CARD {u, v}`);
5135  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5136  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5137  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2:real^3}) = 3`);
5138  (ASM_CASES_TAC `CARD {w0,w1,w2:real^3} <= 2`);
5139  (NEW_GOAL `F`);
5140  (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} = 4`);
5141  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5142  (ASM_REWRITE_TAC[set_of_list]);
5143  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5144                  CARD (set_of_list ul'') = 3 + 1`);
5145  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5146  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5147  (ARITH_TAC);
5148  (UP_ASM_TAC THEN REWRITE_WITH `CARD {w0, w1, w2, w3} = 
5149                                  CARD {w3, w0,w1,w2:real^3}`);
5150  (AP_TERM_TAC THEN SET_TAC[]);
5151  (NEW_GOAL `CARD ({w3, w0, w1, w2}) <= SUC (CARD {w0, w1, w2:real^3})`);
5152  (SIMP_TAC[Geomdetail.CARD_CLAUSES_IMP; Geomdetail.FINITE6]);
5153  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5154  (ASM_MESON_TAC[]);
5155  (NEW_GOAL `CARD {w0, w1, w2:real^3} <= 3`);
5156  (REWRITE_TAC[Geomdetail.CARD3]);
5157  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5158
5159  (SUBGOAL_THEN `CARD {u,v:real^3} <= 2` MP_TAC);
5160  (REWRITE_TAC[Geomdetail.CARD2]);
5161  (ARITH_TAC);
5162  (UP_ASM_TAC THEN STRIP_TAC);
5163  (EXISTS_TAC `w:real^3`);
5164  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5165  (UP_ASM_TAC THEN STRIP_TAC);
5166
5167  (NEW_GOAL `?p. p permutes 0..2 /\
5168                 [u; v; a; w3] = left_action_list p [w0; w1; w2; w3:real^3]`);
5169  (MATCH_MP_TAC LEFT_ACTION_LIST_2_EXISTS);
5170  (ASM_REWRITE_TAC[]);
5171
5172  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5173  (ASM_REWRITE_TAC[set_of_list]);
5174  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5175                  CARD (set_of_list ul'') = 3 + 1`);
5176  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5177  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5178  (ARITH_TAC);
5179  (UP_ASM_TAC THEN STRIP_TAC);
5180
5181  (EXISTS_TAC `p:num->num`);
5182  (ASM_REWRITE_TAC[]);
5183  (REWRITE_TAC[GSYM (ASSUME `[u; v; a; w3:real^3] = 
5184                              left_action_list p [w0; w1; w2; w3]`)]);
5185  (REWRITE_WITH `initial_sublist [u; v] [u; v; a; w3] /\ 
5186                  LENGTH [u; v:real^3] = 1 + 1`);
5187  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5188    TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5189
5190  (NEW_GOAL `i = 4`);
5191  (ASM_ARITH_TAC);
5192  (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5193    UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5194  (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3;
5195    set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5196  (REPEAT STRIP_TAC);
5197
5198  (NEW_GOAL `u IN {w0, w1, w2, w3} /\ v IN {w0, w1, w2, w3:real^3} /\ 
5199             ~(u = v)`);
5200  (ASM_SET_TAC[]);
5201  (UP_ASM_TAC THEN STRIP_TAC);
5202
5203  (NEW_GOAL `?a b. {u,v,a,b} = {w0, w1, w2, w3:real^3}`);
5204
5205  (NEW_GOAL `?w:real^3. w IN {w0, w1, w2, w3} DIFF {u, v}`);
5206  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5207  (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v:real^3} = {} <=> 
5208                   CARD ({w0, w1, w2, w3} DIFF {u, v}) = 0`);
5209  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5210  (MATCH_MP_TAC CARD_EQ_0);
5211  (MATCH_MP_TAC FINITE_SUBSET);
5212  (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5213  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5214
5215  (NEW_GOAL `CARD {w0, w1, w2, w3} = 
5216              CARD ({w0, w1, w2, w3} DIFF {u, v:real^3}) + CARD {u, v}`);
5217  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5218  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5219
5220  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5221  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5222  (ASM_REWRITE_TAC[set_of_list]);
5223  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5224                  CARD (set_of_list ul'') = 3 + 1`);
5225  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5226  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5227  (NEW_GOAL `CARD {u, v:real^3} <= 2`);
5228  (REWRITE_TAC[Geomdetail.CARD2]);
5229  (UP_ASM_TAC THEN ARITH_TAC);
5230  (UP_ASM_TAC THEN STRIP_TAC);
5231
5232  (NEW_GOAL `?m:real^3. m IN {w0, w1, w2, w3} DIFF {u, v, w}`);
5233  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5234  (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v, w:real^3} = {} <=> 
5235                   CARD ({w0, w1, w2, w3} DIFF {u, v, w}) = 0`);
5236  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5237  (MATCH_MP_TAC CARD_EQ_0);
5238  (MATCH_MP_TAC FINITE_SUBSET);
5239  (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5240  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5241
5242  (NEW_GOAL `CARD ({w0, w1, w2, w3} DIFF {u,v,w:real^3}) = 
5243              CARD {w0, w1, w2, w3} - CARD {u,v,w}`);
5244  (MATCH_MP_TAC CARD_DIFF);
5245  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5246
5247  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5248  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5249  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5250  (ASM_REWRITE_TAC[set_of_list]);
5251  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5252                  CARD (set_of_list ul'') = 3 + 1`);
5253  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5254  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5255  (NEW_GOAL `CARD {u, v, w:real^3} <= 3`);
5256  (REWRITE_TAC[Geomdetail.CARD3]);
5257  (UP_ASM_TAC THEN ARITH_TAC);
5258  (UP_ASM_TAC THEN STRIP_TAC);
5259
5260  (EXISTS_TAC `w:real^3` THEN EXISTS_TAC `m:real^3`);
5261  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
5262    UP_ASM_TAC THEN SET_TAC[]);
5263  (UP_ASM_TAC THEN STRIP_TAC);
5264
5265  (NEW_GOAL `?p. p permutes 0..3 /\
5266                 [u; v; a; b] = left_action_list p [w0; w1; w2; w3:real^3]`);
5267  (MATCH_MP_TAC LEFT_ACTION_LIST_3_EXISTS);
5268  (ASM_REWRITE_TAC[]);
5269
5270  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5271  (ASM_REWRITE_TAC[set_of_list]);
5272  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5273                  CARD (set_of_list ul'') = 3 + 1`);
5274  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5275  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5276  (ARITH_TAC);
5277  (UP_ASM_TAC THEN STRIP_TAC);
5278
5279  (EXISTS_TAC `p:num->num`);
5280  (ASM_REWRITE_TAC[]);
5281  (REWRITE_TAC[GSYM (ASSUME `[u; v; a; b:real^3] = 
5282                              left_action_list p [w0; w1; w2; w3]`)]);
5283  (REWRITE_WITH `initial_sublist [u; v] [u; v; a; b] /\ 
5284                  LENGTH [u; v:real^3] = 1 + 1`);
5285  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5286    TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5287  (UP_ASM_TAC THEN STRIP_TAC);
5288
5289 (* ========================================================================== *)
5290
5291  (NEW_GOAL `?q. q permutes 0..i - 1 /\ 
5292                  initial_sublist [v:real^3; u] (left_action_list q ul'')`);
5293  (NEW_GOAL `?w0 w1 w2 w3. ul'' = [w0;w1;w2;w3:real^3]`);
5294  (MATCH_MP_TAC BARV_3_EXPLICIT);
5295  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5296  (UP_ASM_TAC THEN STRIP_TAC);
5297
5298  (ASM_CASES_TAC `i = 2`);
5299  (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5300    UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5301  (NEW_GOAL `i - 1 = 1`);
5302  (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
5303  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list; 
5304    MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5305  (REPEAT STRIP_TAC);
5306  (ASM_CASES_TAC `v = w0:real^3`);
5307  (NEW_GOAL `u = w1:real^3`);
5308  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
5309   `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}` 
5310    THEN SET_TAC[]);
5311  (EXISTS_TAC `I:num->num`);
5312  (ASM_REWRITE_TAC[PERMUTES_I; Packing3.LEFT_ACTION_LIST_I]);
5313  (REWRITE_WITH `initial_sublist [w0; w1] [w0; w1; w2; w3] /\ 
5314                  LENGTH [w0;w1:real^3] = 1 + 1`);
5315  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5316  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5317  (NEW_GOAL `u = w0:real^3 /\ v = w1:real^3`);
5318  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
5319   `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}` 
5320    THEN SET_TAC[]);
5321  (ASM_REWRITE_TAC[]);
5322  (NEW_GOAL `?q. q permutes 0..1 /\ 
5323                  [w1; w0; w2; w3:real^3] = left_action_list q ul''`);
5324  (MATCH_MP_TAC Qzksykg.TWO_REARRANGEMENT_LEMMA);
5325  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5326  (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC);
5327  (EXISTS_TAC `q:num->num` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[GSYM 
5328    (ASSUME `[w1; w0; w2; w3] = left_action_list q [w0; w1; w2; w3:real^3]`)]);
5329  (REWRITE_WITH `initial_sublist [w1; w0] [w1; w0; w2; w3] /\ 
5330                  LENGTH [w1;w0:real^3] = 1 + 1`);
5331  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5332  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5333
5334  (ASM_CASES_TAC `i = 3`);
5335  (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5336    UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5337  (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2;
5338    set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5339  (REPEAT STRIP_TAC);
5340
5341  (NEW_GOAL `u IN {w0, w1, w2} /\ v IN {w0, w1, w2:real^3} /\ ~(u = v)`);
5342  (ASM_SET_TAC[]);
5343  (UP_ASM_TAC THEN STRIP_TAC);
5344
5345  (NEW_GOAL `?a. {u,v, a} = {w0, w1, w2:real^3}`);
5346  (NEW_GOAL `?w:real^3. w IN {w0, w1, w2} DIFF {u, v}`);
5347  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5348  (REWRITE_WITH `{w0, w1, w2} DIFF {u, v:real^3} = {} <=> 
5349                   CARD ({w0, w1, w2} DIFF {u, v}) = 0`);
5350  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5351  (MATCH_MP_TAC CARD_EQ_0);
5352  (MATCH_MP_TAC FINITE_SUBSET);
5353  (EXISTS_TAC `{w0, w1, w2:real^3}`);
5354  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5355
5356  (NEW_GOAL `CARD {w0, w1, w2} = CARD ({w0, w1, w2} DIFF {u, v:real^3}) +
5357                                  CARD {u, v}`);
5358  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5359  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5360  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2:real^3}) = 3`);
5361  (ASM_CASES_TAC `CARD {w0,w1,w2:real^3} <= 2`);
5362  (NEW_GOAL `F`);
5363  (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} = 4`);
5364  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5365  (ASM_REWRITE_TAC[set_of_list]);
5366  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5367                  CARD (set_of_list ul'') = 3 + 1`);
5368  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5369  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5370  (ARITH_TAC);
5371  (UP_ASM_TAC THEN REWRITE_WITH `CARD {w0, w1, w2, w3} = 
5372                                  CARD {w3, w0,w1,w2:real^3}`);
5373  (AP_TERM_TAC THEN SET_TAC[]);
5374  (NEW_GOAL `CARD ({w3, w0, w1, w2}) <= SUC (CARD {w0, w1, w2:real^3})`);
5375  (SIMP_TAC[Geomdetail.CARD_CLAUSES_IMP; Geomdetail.FINITE6]);
5376  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5377  (ASM_MESON_TAC[]);
5378  (NEW_GOAL `CARD {w0, w1, w2:real^3} <= 3`);
5379  (REWRITE_TAC[Geomdetail.CARD3]);
5380  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5381
5382  (SUBGOAL_THEN `CARD {u,v:real^3} <= 2` MP_TAC);
5383  (REWRITE_TAC[Geomdetail.CARD2]);
5384  (ARITH_TAC);
5385  (UP_ASM_TAC THEN STRIP_TAC);
5386  (EXISTS_TAC `w:real^3`);
5387  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5388  (UP_ASM_TAC THEN STRIP_TAC);
5389  (UP_ASM_TAC THEN REWRITE_WITH `{u,v,a} = {v, u, a:real^3}`);
5390  (SET_TAC[]);
5391  (STRIP_TAC);
5392
5393  (NEW_GOAL `?q. q permutes 0..2 /\
5394                 [v; u; a; w3] = left_action_list q [w0; w1; w2; w3:real^3]`);
5395  (MATCH_MP_TAC LEFT_ACTION_LIST_2_EXISTS);
5396  (ASM_REWRITE_TAC[]);
5397
5398  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5399  (ASM_REWRITE_TAC[set_of_list]);
5400  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5401                  CARD (set_of_list ul'') = 3 + 1`);
5402  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5403  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5404  (ARITH_TAC);
5405  (UP_ASM_TAC THEN STRIP_TAC);
5406
5407  (EXISTS_TAC `q:num->num`);
5408  (ASM_REWRITE_TAC[]);
5409  (REWRITE_TAC[GSYM (ASSUME `[v; u; a; w3:real^3] = 
5410                              left_action_list q [w0; w1; w2; w3]`)]);
5411  (REWRITE_WITH `initial_sublist [v; u] [v; u; a; w3] /\ 
5412                  LENGTH [v; u:real^3] = 1 + 1`);
5413  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5414    TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5415
5416  (NEW_GOAL `i = 4`);
5417  (ASM_ARITH_TAC);
5418  (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5419    UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5420  (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3;
5421    set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5422  (REPEAT STRIP_TAC);
5423
5424  (NEW_GOAL `u IN {w0, w1, w2, w3} /\ v IN {w0, w1, w2, w3:real^3} /\ 
5425             ~(u = v)`);
5426  (ASM_SET_TAC[]);
5427  (UP_ASM_TAC THEN STRIP_TAC);
5428
5429  (NEW_GOAL `?a b. {u,v,a,b} = {w0, w1, w2, w3:real^3}`);
5430
5431  (NEW_GOAL `?w:real^3. w IN {w0, w1, w2, w3} DIFF {u, v}`);
5432  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5433  (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v:real^3} = {} <=> 
5434                   CARD ({w0, w1, w2, w3} DIFF {u, v}) = 0`);
5435  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5436  (MATCH_MP_TAC CARD_EQ_0);
5437  (MATCH_MP_TAC FINITE_SUBSET);
5438  (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5439  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5440
5441  (NEW_GOAL `CARD {w0, w1, w2, w3} = 
5442              CARD ({w0, w1, w2, w3} DIFF {u, v:real^3}) + CARD {u, v}`);
5443  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5444  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5445
5446  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5447  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5448  (ASM_REWRITE_TAC[set_of_list]);
5449  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5450                  CARD (set_of_list ul'') = 3 + 1`);
5451  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5452  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5453  (NEW_GOAL `CARD {u, v:real^3} <= 2`);
5454  (REWRITE_TAC[Geomdetail.CARD2]);
5455  (UP_ASM_TAC THEN ARITH_TAC);
5456  (UP_ASM_TAC THEN STRIP_TAC);
5457
5458  (NEW_GOAL `?m:real^3. m IN {w0, w1, w2, w3} DIFF {u, v, w}`);
5459  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5460  (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v, w:real^3} = {} <=> 
5461                   CARD ({w0, w1, w2, w3} DIFF {u, v, w}) = 0`);
5462  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5463  (MATCH_MP_TAC CARD_EQ_0);
5464  (MATCH_MP_TAC FINITE_SUBSET);
5465  (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5466  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5467
5468  (NEW_GOAL `CARD ({w0, w1, w2, w3} DIFF {u,v,w:real^3}) = 
5469              CARD {w0, w1, w2, w3} - CARD {u,v,w}`);
5470  (MATCH_MP_TAC CARD_DIFF);
5471  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5472
5473  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5474  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5475  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5476  (ASM_REWRITE_TAC[set_of_list]);
5477  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5478                  CARD (set_of_list ul'') = 3 + 1`);
5479  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5480  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5481  (NEW_GOAL `CARD {u, v, w:real^3} <= 3`);
5482  (REWRITE_TAC[Geomdetail.CARD3]);
5483  (UP_ASM_TAC THEN ARITH_TAC);
5484  (UP_ASM_TAC THEN STRIP_TAC);
5485
5486  (EXISTS_TAC `w:real^3` THEN EXISTS_TAC `m:real^3`);
5487  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
5488    UP_ASM_TAC THEN SET_TAC[]);
5489  (UP_ASM_TAC THEN STRIP_TAC);
5490  (UP_ASM_TAC THEN REWRITE_WITH `{u,v,a,b} = {v, u, a, b:real^3}`);
5491  (SET_TAC[]);
5492  (STRIP_TAC);
5493
5494  (NEW_GOAL `?q. q permutes 0..3 /\
5495                 [v; u; a; b] = left_action_list q [w0; w1; w2; w3:real^3]`);
5496  (MATCH_MP_TAC LEFT_ACTION_LIST_3_EXISTS);
5497  (ASM_REWRITE_TAC[]);
5498
5499  (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5500  (ASM_REWRITE_TAC[set_of_list]);
5501  (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\ 
5502                  CARD (set_of_list ul'') = 3 + 1`);
5503  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5504  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5505  (ARITH_TAC);
5506  (UP_ASM_TAC THEN STRIP_TAC);
5507
5508  (EXISTS_TAC `q:num->num`);
5509  (ASM_REWRITE_TAC[]);
5510  (REWRITE_TAC[GSYM (ASSUME `[v; u; a; b:real^3] = 
5511                              left_action_list q [w0; w1; w2; w3]`)]);
5512  (REWRITE_WITH `initial_sublist [v; u] [v; u; a; b] /\ 
5513                  LENGTH [v; u:real^3] = 1 + 1`);
5514  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5515    TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5516  (UP_ASM_TAC THEN STRIP_TAC);
5517
5518 (* ========================================================================= *)
5519
5520  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
5521                               ul IN barV V 3 /\
5522                               X = mcell k V ul /\
5523                               initial_sublist [v; u] ul)`);
5524  (NEW_GOAL `(P:num#(real^3)list->bool) (k, ul)`);
5525  (REWRITE_TAC[GSYM (ASSUME `(@) (P:num#(real^3)list->bool) = k,ul`)]);
5526  (MATCH_MP_TAC SELECT_AX);
5527
5528  (EXISTS_TAC `(i:num, left_action_list q (ul'':(real^3)list))`);
5529  (EXPAND_TAC "P" THEN REWRITE_TAC[BETA_THM]);
5530  (ASM_REWRITE_TAC[IN]);
5531  (REPEAT STRIP_TAC);
5532  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
5533  (EXISTS_TAC `ul'':(real^3)list`);
5534  (EXISTS_TAC `i:num` THEN EXISTS_TAC `q:num->num`);
5535  (ASM_REWRITE_TAC[]);
5536  (STRIP_TAC);
5537  (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5538  (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`)]);
5539  (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5540  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5541  (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
5542  (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5543
5544
5545  (ABBREV_TAC `Q = (\(k, ul). k <= 4 /\
5546                               ul IN barV V 3 /\
5547                               X = mcell k V ul /\
5548                               initial_sublist [u; v] ul)`);
5549  (NEW_GOAL `(Q:num#(real^3)list->bool) (k', ul')`);
5550  (REWRITE_TAC[GSYM (ASSUME `(@) (Q:num#(real^3)list->bool) = k',ul'`)]);
5551  (MATCH_MP_TAC SELECT_AX);
5552
5553  (EXISTS_TAC `(i:num, left_action_list p (ul'':(real^3)list))`);
5554  (EXPAND_TAC "Q" THEN REWRITE_TAC[BETA_THM]);
5555  (ASM_REWRITE_TAC[IN]);
5556  (REPEAT STRIP_TAC);
5557  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
5558  (EXISTS_TAC `ul'':(real^3)list`);
5559  (EXISTS_TAC `i:num` THEN EXISTS_TAC `p:num->num`);
5560  (ASM_REWRITE_TAC[]);
5561  (STRIP_TAC);
5562  (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5563  (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`)]);
5564  (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5565  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5566  (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
5567  (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5568
5569  (UP_ASM_TAC THEN EXPAND_TAC "Q" THEN REWRITE_TAC[] THEN DEL_TAC);
5570  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN DEL_TAC);
5571  (REPEAT STRIP_TAC);
5572
5573  (NEW_GOAL `i = k:num`);
5574  (REWRITE_WITH `i = k /\ mcell i V ul'' = mcell k V ul`);
5575  (MATCH_MP_TAC Ajripqn.AJRIPQN);
5576  (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5577  (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`); 
5578                GSYM (ASSUME `X = mcell k V ul`); SET_RULE `a INTER a = a`]);
5579  (ASM_REWRITE_TAC[]);
5580
5581  (NEW_GOAL `i = k':num`);
5582  (REWRITE_WITH `i = k' /\ mcell i V ul'' = mcell k' V ul'`);
5583  (MATCH_MP_TAC Ajripqn.AJRIPQN);
5584  (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5585  (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`);  GSYM (ASSUME `i = k:num`);
5586                GSYM (ASSUME `X = mcell k' V ul'`); SET_RULE `a INTER a = a`]);
5587  (ASM_REWRITE_TAC[]);
5588
5589  (NEW_GOAL `i = k /\ (!k. i - 1 <= k /\ k <= 3
5590                   ==> omega_list_n V ul k = omega_list_n V ul' k)`);
5591  (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
5592  (ASM_REWRITE_TAC[]);
5593  (STRIP_TAC);
5594  (ASM_MESON_TAC[]);
5595  (STRIP_TAC);
5596  (ASM_MESON_TAC[]);
5597  (REWRITE_TAC[SET_RULE `a IN {m,n,p} <=> a = m \/ a = n \/ a = p`]);
5598  (ASM_ARITH_TAC);
5599  (UP_ASM_TAC THEN STRIP_TAC);
5600
5601  (REWRITE_WITH `k' = k:num`);
5602  (ASM_MESON_TAC[]);
5603
5604  (ASM_CASES_TAC `i < 4`);
5605  (NEW_GOAL `mxi V ul' = mxi V ul`);
5606  (MATCH_MP_TAC MCELL_ID_MXI_2);
5607  (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
5608  (ASM_REWRITE_TAC[]);
5609  (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul'`)]);
5610  (REWRITE_TAC[ASSUME `X = mcell k V ul`; ASSUME `~NULLSET X`]);
5611  (REWRITE_TAC[SET_RULE `a IN {b,c} <=> a = b \/ a = c`]);
5612  (ASM_ARITH_TAC);
5613
5614  (NEW_GOAL `HD ul = HD [v; u:real^3]`);
5615  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5616  (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5617  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5618
5619  (NEW_GOAL `HD ul' = HD [u; v:real^3]`);
5620  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5621  (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5622  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5623
5624  (NEW_GOAL `EL 1 ul = EL 1 ([v; u:real^3])`);
5625  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5626  (REWRITE_WITH `[v; u:real^3] = truncate_simplex 1 ul`);
5627  (REWRITE_WITH `truncate_simplex 1 ul = [v;u:real^3] /\ 1 + 1 <= LENGTH ul`);
5628  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5629  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5630  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5631  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5632                  CARD (set_of_list ul) = 3 + 1`);
5633  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5634  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5635  (ARITH_TAC);
5636
5637  (NEW_GOAL `EL 1 ul' = EL 1 ([u; v:real^3])`);
5638  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5639  (REWRITE_WITH `[u; v:real^3] = truncate_simplex 1 ul'`);
5640  (REWRITE_WITH `truncate_simplex 1 ul' =[u;v:real^3] /\ 1 + 1 <= LENGTH ul'`);
5641  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5642  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5643  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5644  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1 /\ 
5645                  CARD (set_of_list ul') = 3 + 1`);
5646  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5647  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5648  (ARITH_TAC);
5649
5650  (COND_CASES_TAC);
5651  (COND_CASES_TAC);
5652  (REWRITE_TAC[dihu2]);
5653  (REWRITE_WITH `omega_list_n V ul 3 = omega_list_n V ul' 3`);
5654  (FIRST_ASSUM MATCH_MP_TAC);
5655  (ASM_ARITH_TAC);
5656  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`; DIHV_SYM]);
5657  (UP_ASM_TAC THEN MESON_TAC[]);
5658  (COND_CASES_TAC);
5659  (COND_CASES_TAC);
5660  (UP_ASM_TAC THEN MESON_TAC[]);
5661  (COND_CASES_TAC);
5662  (DEL_TAC THEN DEL_TAC);
5663  (REWRITE_TAC[dihu3]);
5664  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `1 = SUC 0`]);
5665
5666  (REWRITE_WITH `EL 2 ul' = EL 2 (ul:(real^3)list)`);
5667  (NEW_GOAL `set_of_list (truncate_simplex 2 (ul:(real^3)list)) = 
5668              set_of_list (truncate_simplex 2 ul')`);
5669  (REWRITE_TAC[ARITH_RULE `2 = 3 - 1`]);
5670  (REWRITE_WITH `set_of_list (truncate_simplex (3 - 1) ul) = 
5671                 (V:real^3->bool) INTER X`);
5672  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5673  (REWRITE_TAC[ASSUME `X = mcell k V ul`; ASSUME `k = 3`]);
5674  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5675  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5676  (REWRITE_TAC[GSYM (ASSUME `X = mcell k V ul`); GSYM (ASSUME `k = 3`)]);
5677  (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5678  (REWRITE_TAC[ASSUME `X = mcell k' V ul'`]);
5679  (REWRITE_WITH `k' = 3`);
5680  (ASM_ARITH_TAC);
5681  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5682  (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5683  (REWRITE_WITH `3 = k'`);
5684  (ASM_ARITH_TAC);
5685  (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul'`)]);
5686  (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5687
5688  (NEW_GOAL `?y0 y1 y2 y3. ul = [y0;y1;y2;y3:real^3]`);
5689  (MATCH_MP_TAC BARV_3_EXPLICIT);
5690  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5691  (UP_ASM_TAC THEN STRIP_TAC);
5692  (NEW_GOAL `?z0 z1 z2 z3. ul' = [z0;z1;z2;z3:real^3]`);
5693  (MATCH_MP_TAC BARV_3_EXPLICIT);
5694  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5695  (UP_ASM_TAC THEN STRIP_TAC);
5696  (UNDISCH_TAC `EL 1 ul = EL 1 [v; u:real^3]` THEN 
5697    UNDISCH_TAC `HD ul = HD [v; u:real^3]`
5698    THEN ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
5699  (REPEAT STRIP_TAC);
5700
5701  (UNDISCH_TAC `EL 1 ul' = EL 1 [u; v:real^3]` THEN 
5702    UNDISCH_TAC `HD ul' = HD [u; v:real^3]`
5703    THEN ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
5704  (REPEAT STRIP_TAC);
5705  (UNDISCH_TAC `set_of_list (truncate_simplex 2 (ul:(real^3)list)) = 
5706                 set_of_list (truncate_simplex 2 ul')`);
5707  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
5708  (NEW_GOAL `~(y2 IN {u, v:real^3})`);
5709  (STRIP_TAC);
5710  (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) <= 3`);
5711  (ASM_REWRITE_TAC[set_of_list]);
5712  (REWRITE_WITH ` {v, u, y2, y3} = {v,u, y3:real^3}`);
5713  (ASM_SET_TAC[]);
5714  (REWRITE_TAC[Geomdetail.CARD3]);
5715  (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5716  (MATCH_MP_TAC BARV_CARD_LEMMA);
5717  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5718  (ARITH_TAC);
5719  (UP_ASM_TAC THEN SET_TAC[]);
5720
5721  (REWRITE_TAC[DIHV_SYM]);
5722  (UP_ASM_TAC THEN MESON_TAC[]);
5723  (NEW_GOAL `F`);
5724  (ASM_ARITH_TAC);
5725  (ASM_MESON_TAC[]);
5726
5727  (NEW_GOAL `k = 4`);
5728  (ASM_ARITH_TAC);
5729
5730  (COND_CASES_TAC);
5731  (NEW_GOAL `F`);
5732  (ASM_ARITH_TAC);
5733  (UP_ASM_TAC THEN MESON_TAC[]);
5734  (COND_CASES_TAC);
5735  (NEW_GOAL `F`);
5736  (ASM_ARITH_TAC);
5737  (UP_ASM_TAC THEN MESON_TAC[]);
5738
5739  (COND_CASES_TAC);
5740  (COND_CASES_TAC);
5741  (ASM_MESON_TAC[]);
5742  (COND_CASES_TAC);
5743  (ASM_MESON_TAC[]);
5744  (COND_CASES_TAC);
5745
5746
5747  (REWRITE_TAC[dihu4]);
5748
5749 (* ========================================================================= *)
5750  (MATCH_MP_TAC DIHV_SYM_3);
5751  (REWRITE_TAC[EL]);
5752
5753  (NEW_GOAL `HD ul = HD [v; u:real^3]`);
5754  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5755  (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5756  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5757
5758  (NEW_GOAL `HD ul' = HD [u; v:real^3]`);
5759  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5760  (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5761  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5762
5763  (NEW_GOAL `EL 1 ul = EL 1 ([v; u:real^3])`);
5764  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5765  (REWRITE_WITH `[v; u:real^3] = truncate_simplex 1 ul`);
5766  (REWRITE_WITH `truncate_simplex 1 ul = [v;u:real^3] /\ 1 + 1 <= LENGTH ul`);
5767  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5768  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5769  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5770  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5771                  CARD (set_of_list ul) = 3 + 1`);
5772  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5773  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5774  (ARITH_TAC);
5775
5776  (NEW_GOAL `EL 1 ul' = EL 1 ([u; v:real^3])`);
5777  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5778  (REWRITE_WITH `[u; v:real^3] = truncate_simplex 1 ul'`);
5779  (REWRITE_WITH `truncate_simplex 1 ul' =[u;v:real^3] /\ 1 + 1 <= LENGTH ul'`);
5780  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5781  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5782  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5783  (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1 /\ 
5784                  CARD (set_of_list ul') = 3 + 1`);
5785  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5786  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5787  (ARITH_TAC);
5788
5789  (NEW_GOAL `?y0 y1 y2 y3. ul = [y0;y1;y2;y3:real^3]`);
5790  (MATCH_MP_TAC BARV_3_EXPLICIT);
5791  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5792  (UP_ASM_TAC THEN STRIP_TAC);
5793  (NEW_GOAL `?z0 z1 z2 z3. ul' = [z0;z1;z2;z3:real^3]`);
5794  (MATCH_MP_TAC BARV_3_EXPLICIT);
5795  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5796  (UP_ASM_TAC THEN STRIP_TAC);
5797  (UNDISCH_TAC `EL 1 ul = EL 1 [v; u:real^3]` THEN 
5798    UNDISCH_TAC `HD ul = HD [v; u:real^3]` THEN 
5799    UNDISCH_TAC `EL 1 ul' = EL 1 [u; v:real^3]` THEN 
5800    UNDISCH_TAC `HD ul' = HD [u; v:real^3]` THEN
5801    ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
5802  (REPEAT STRIP_TAC);
5803  (ASM_SET_TAC[]);
5804
5805  (NEW_GOAL `~(z2 IN {u,v:real^3})`);
5806  (STRIP_TAC);
5807  (NEW_GOAL `CARD (set_of_list (ul':(real^3)list)) <= 3`);
5808  (ASM_REWRITE_TAC[set_of_list]);
5809  (REWRITE_WITH `{u, v, z2, z3} = {v,u, z3:real^3}`);
5810  (ASM_SET_TAC[]);
5811  (REWRITE_TAC[Geomdetail.CARD3]);
5812  (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul':(real^3)list)) = 3 + 1`);
5813  (MATCH_MP_TAC BARV_CARD_LEMMA);
5814  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5815  (ARITH_TAC);
5816
5817  (NEW_GOAL `~(z3 IN {u,v:real^3})`);
5818  (STRIP_TAC);
5819  (NEW_GOAL `CARD (set_of_list (ul':(real^3)list)) <= 3`);
5820  (ASM_REWRITE_TAC[set_of_list]);
5821  (REWRITE_WITH `{u, v, z2, z3} = {v,u, z2:real^3}`);
5822  (ASM_SET_TAC[]);
5823  (REWRITE_TAC[Geomdetail.CARD3]);
5824  (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul':(real^3)list)) = 3 + 1`);
5825  (MATCH_MP_TAC BARV_CARD_LEMMA);
5826  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5827  (ARITH_TAC);
5828
5829
5830  (NEW_GOAL `~(y2 IN {u,v:real^3})`);
5831  (STRIP_TAC);
5832  (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) <= 3`);
5833  (ASM_REWRITE_TAC[set_of_list]);
5834  (REWRITE_WITH `{v, u, y2, y3} = {v,u, y3:real^3}`);
5835  (ASM_SET_TAC[]); 
5836  (REWRITE_TAC[Geomdetail.CARD3]);
5837  (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5838  (MATCH_MP_TAC BARV_CARD_LEMMA);
5839  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5840  (ARITH_TAC);
5841
5842  (NEW_GOAL `~(y3 IN {u,v:real^3})`);
5843  (STRIP_TAC);
5844  (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) <= 3`);
5845  (ASM_REWRITE_TAC[set_of_list]);
5846  (REWRITE_WITH `{v, u, y2, y3} = {v,u, y2:real^3}`);
5847  (ASM_SET_TAC[]); 
5848  (REWRITE_TAC[Geomdetail.CARD3]);
5849  (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5850  (MATCH_MP_TAC BARV_CARD_LEMMA);
5851  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5852  (ARITH_TAC);
5853
5854  (NEW_GOAL `set_of_list (truncate_simplex 3 (ul:(real^3)list)) = 
5855              set_of_list (truncate_simplex 3 ul')`);
5856  (REWRITE_WITH `set_of_list (truncate_simplex 3 (ul:(real^3)list)) = 
5857                  V INTER X`);
5858  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5859  (REWRITE_TAC[ASSUME `X = mcell k V ul`; ASSUME `k = 4`; ARITH_RULE `3 = 4 - 1`]);
5860  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5861  (REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
5862  (REWRITE_TAC[GSYM (ASSUME `X = mcell k V ul`); GSYM (ASSUME `k = 4`)]);
5863  (REPEAT STRIP_TAC);
5864  (ASM_REWRITE_TAC[]);
5865  (ASM_REWRITE_TAC[]);
5866  (ASM_REWRITE_TAC[]);
5867  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5868  (REWRITE_TAC[ASSUME `X = mcell k' V ul'`]);
5869  (REWRITE_WITH `k' = 4`);
5870  (ASM_ARITH_TAC);
5871  (REWRITE_TAC[ARITH_RULE `3 = 4 - 1`]);
5872  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5873  (REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
5874  (REWRITE_WITH `4 = k'`);
5875  (ASM_ARITH_TAC);
5876  (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul'`)]);
5877  (REPEAT STRIP_TAC);
5878  (ASM_REWRITE_TAC[]);
5879  (ASM_REWRITE_TAC[]);
5880  (ASM_REWRITE_TAC[]);
5881  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5882  (UP_ASM_TAC);
5883  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; set_of_list]);
5884  (ASM_SET_TAC[]);
5885
5886  (UP_ASM_TAC THEN MESON_TAC[]);
5887  (COND_CASES_TAC);
5888  (UP_ASM_TAC THEN MESON_TAC[]);
5889  (COND_CASES_TAC);
5890  (UP_ASM_TAC THEN MESON_TAC[]);
5891  (COND_CASES_TAC);
5892  (UP_ASM_TAC THEN MESON_TAC[]);
5893  (REFL_TAC)]);;
5894
5895 (* ==================================================================== *)
5896 (* Lemma 49 *)
5897
5898 let gammaY = new_definition 
5899  `!V X f.
5900          gammaY V X f =
5901          (\({u, v}). if {u, v} IN edgeX V X
5902                      then dihX V X (u,v) * f (hl [u; v])
5903                      else &0)`;;
5904
5905 let gamma_y_lmfun_bound = prove_by_refinement (
5906  `!V. packing V /\ saturated V
5907      ==> (?d. !X e. mcell_set V X /\ edgeX V X e ==> gammaY V X lmfun e <= d)`,
5908 [(REPEAT STRIP_TAC);
5909  (EXISTS_TAC `pi * h0 / (h0 - &1)`);
5910  (REPEAT STRIP_TAC);
5911  (ABBREV_TAC `f = (\u v. if {u, v} IN edgeX V X
5912                              then dihX V X (u,v) * lmfun (hl [u; v])
5913                           else &0)`);
5914  (REWRITE_WITH `gammaY V X lmfun = (\({u, v}). f u v)`);
5915  (EXPAND_TAC "f" THEN REWRITE_TAC[gammaY]);
5916
5917  (NEW_GOAL `!u v. (f:real^3->real^3->real) u v = f v u`);
5918  (EXPAND_TAC "f" THEN REWRITE_TAC[BETA_THM]);
5919  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
5920  (REPEAT GEN_TAC THEN COND_CASES_TAC);
5921  (COND_CASES_TAC);
5922  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
5923  (MATCH_MP_TAC DIHX_SYM);
5924  (ASM_REWRITE_TAC[]);
5925  (UP_ASM_TAC THEN MESON_TAC[]);
5926  (COND_CASES_TAC);
5927  (UP_ASM_TAC THEN MESON_TAC[]);
5928  (REFL_TAC);
5929
5930  (UNDISCH_TAC `edgeX V X e` THEN REWRITE_TAC[IN;IN_ELIM_THM; edgeX]);
5931  (STRIP_TAC);
5932  (ASM_REWRITE_TAC[]);
5933
5934  (REWRITE_WITH `(\({u, v}). f u v) {u, v} = 
5935                              (f:real^3->real^3->real) u v`);
5936  (MATCH_MP_TAC BETA_PAIR_THM);
5937  (ASM_REWRITE_TAC[]);
5938
5939  (EXPAND_TAC "f");
5940  (COND_CASES_TAC);
5941
5942  (NEW_GOAL `dihX V X (u,v) * lmfun (hl [u;v]) <= pi * lmfun (hl [u;v])`);
5943  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
5944  (MATCH_MP_TAC REAL_LE_MUL);
5945  (REWRITE_TAC[lmfun_pos_le; REAL_ARITH `&0 <= a - b <=> b <= a`; DIHX_LE_PI]);
5946
5947  (NEW_GOAL `pi * lmfun (hl [u:real^3;v]) <= pi * h0 / (h0 - &1)`);
5948  (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= (y - x) * a`]);
5949  (MATCH_MP_TAC REAL_LE_MUL);
5950  (REWRITE_TAC[PI_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
5951  (MATCH_MP_TAC lmfun_bounded);
5952  (REWRITE_TAC[HL_2; REAL_ARITH `&0 <= inv (&2) * x <=> &0 <= x`; DIST_POS_LE]);
5953  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5954  (MATCH_MP_TAC REAL_LE_MUL);
5955  (REWRITE_TAC[PI_POS_LE]);
5956  (MATCH_MP_TAC REAL_LE_DIV);
5957  (REWRITE_TAC[h0] THEN REAL_ARITH_TAC)]);;
5958
5959 (* ==================================================================== *)
5960 (* Lemma 50 *)
5961
5962 let BETA_SET_2_THM = prove
5963  (`!g:(A->bool)->B u0 v0. (\({u, v}). g {u, v}) {u0, v0} = g {u0, v0}`,
5964  GEN_TAC THEN REWRITE_TAC[GABS_DEF;GEQ_DEF] THEN
5965  CONV_TAC SELECT_CONV THEN EXISTS_TAC `g:(A->bool)->B` THEN
5966  REWRITE_TAC[]);;
5967
5968 (* ==================================================================== *)
5969 (* Lemma 51 *)
5970 (* Formal proof by John Harrison *)
5971
5972 let SUM_PAIR_2_SET = prove
5973 (`!f s:real^N->bool d.
5974  FINITE s
5975 ==> sum {(m,n) | m IN s /\ n IN s /\ ~(m = n) /\ dist(m,n) <= d}
5976  (\(m,n). f {m, n}) = &2 *
5977  sum {{m, n} | m IN s /\ n IN s /\ ~(m = n) /\ dist(m,n) <= d} f`,
5978 REPEAT STRIP_TAC THEN MP_TAC(ISPECL
5979  [`\(m:real^N,n). {m,n}`;`(\(m,n). f {m,n}):real^N#real^N->real`;
5980   `{(m,n) | m IN s /\ n IN s /\ ~(m:real^N = n) /\ dist(m,n) <= d}`;
5981   `{{m,n} | m IN s /\ n IN s /\ ~(m:real^N = n) /\ dist(m,n) <= d}`]
5982   SUM_GROUP) THEN
5983   ANTS_TAC THENL
5984  [CONJ_TAC THENL
5985  [ONCE_REWRITE_TAC[SET_RULE
5986  `m IN s /\ n IN s /\ P m n <=>
5987   m IN s /\ n IN {n | n IN s /\ P m n}`] THEN
5988   MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN
5989   ASM_SIMP_TAC[FINITE_RESTRICT];
5990   REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; FORALL_IN_GSPEC] THEN SET_TAC[]];
5991   DISCH_THEN(SUBST1_TAC o SYM) THEN REWRITE_TAC[GSYM SUM_LMUL] THEN
5992   MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[FORALL_IN_GSPEC] THEN
5993   MAP_EVERY X_GEN_TAC [`m:real^N`; `n:real^N`] THEN STRIP_TAC THEN
5994   MATCH_MP_TAC EQ_TRANS THEN
5995   EXISTS_TAC `sum {(m:real^N,n), (n,m)} (\(m,n). f {m,n})` THEN
5996   CONJ_TAC THENL
5997   [AP_THM_TAC THEN AP_TERM_TAC THEN GEN_REWRITE_TAC I [EXTENSION] THEN
5998   REWRITE_TAC[FORALL_PAIR_THM] THEN
5999   REWRITE_TAC[IN_ELIM_THM; PAIR_EQ; IN_INSERT; NOT_IN_EMPTY;
6000   SET_RULE `{a,b} = {c,d} <=> a = c /\ b = d \/ a = d /\ b = c`] THEN
6001   ASM_MESON_TAC[DIST_SYM];
6002   SIMP_TAC[SUM_CLAUSES; FINITE_INSERT; FINITE_EMPTY] THEN
6003   ASM_REWRITE_TAC[IN_SING; NOT_IN_EMPTY; PAIR_EQ; REAL_ADD_RID] THEN
6004   REWRITE_TAC[INSERT_AC] THEN REAL_ARITH_TAC]]);;
6005
6006 (* ==================================================================== *)
6007 (* Lemma 52 *)
6008
6009 open Flyspeck_constants;;
6010
6011 let H0_LT_SQRT2 = prove_by_refinement (`h0 < sqrt (&2)`,
6012 [REWRITE_TAC[h0; GSYM sqrt2]; 
6013  NEW_GOAL `#1.414213 < sqrt2`;
6014  REWRITE_TAC[bounds];
6015  ASM_REAL_ARITH_TAC]);;
6016
6017 (* ==================================================================== *)
6018 (* Lemma 53 *)
6019
6020 let gamma_y_pos_le = prove_by_refinement (
6021  `!V X e. packing V /\ saturated V /\ mcell_set V X /\ edgeX V X e
6022                         ==> &0 <= gammaY V X lmfun e`,
6023 [(REPEAT STRIP_TAC);
6024  (REWRITE_TAC[gammaY]);
6025  (NEW_GOAL `?u v. (VX V X u /\ VX V X v /\ ~(u = v)) /\ e = {u, v}`);
6026  (UP_ASM_TAC THEN REWRITE_TAC[edgeX; IN_ELIM_THM]);
6027  (UP_ASM_TAC THEN STRIP_TAC);
6028  (ASM_REWRITE_TAC[]);
6029  (ABBREV_TAC `f = (\u v. if {u, v} IN edgeX V X
6030              then dihX V X (u,v) * lmfun (hl [u; v])
6031              else &0)`);
6032  (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
6033              then dihX V X (u,v) * lmfun (hl [u; v])
6034              else &0) = (\({u, v}). f u v)`);
6035  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
6036  (REWRITE_WITH `(\({u:real^3, v}). f u v) {u, v} = (f:real^3->real^3->real) u v`);
6037  (MATCH_MP_TAC BETA_PAIR_THM);
6038  (EXPAND_TAC "f" THEN REPEAT STRIP_TAC);
6039  (REPEAT COND_CASES_TAC);
6040  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
6041  (REWRITE_WITH `dihX V X (u',v') = dihX V X (v',u')`);
6042  (MATCH_MP_TAC DIHX_SYM);
6043  (ASM_REWRITE_TAC[]);
6044  (NEW_GOAL `F`);
6045  (UP_ASM_TAC THEN REWRITE_TAC[]);
6046  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`] THEN ASM_REWRITE_TAC[]);
6047  (ASM_MESON_TAC[]);
6048  (NEW_GOAL `F`);
6049  (UP_ASM_TAC THEN REWRITE_TAC[]);
6050  (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`] THEN ASM_REWRITE_TAC[]);
6051  (ASM_MESON_TAC[]);
6052  (REFL_TAC);
6053  (EXPAND_TAC "f");
6054  (COND_CASES_TAC);
6055  (MATCH_MP_TAC REAL_LE_MUL);
6056  (REWRITE_TAC[DIHX_POS;lmfun_pos_le]);
6057  (REAL_ARITH_TAC)]);;
6058
6059 (* ==================================================================== *)
6060 (* Lemma 54 *)
6061
6062 let CARD_LIST_klemma = prove_by_refinement (
6063  `!s t. FINITE (s:A->bool) /\ FINITE t ==> 
6064          CARD {CONS u0 y1 | u0 IN s /\ y1 IN t} = CARD s * CARD t`,
6065 [(REPEAT STRIP_TAC);
6066  (ABBREV_TAC `S = {u0:A, y1:(A)list| u0 IN s /\ y1 IN t}`);
6067  (ABBREV_TAC `f = (\(u0:A, y1:(A)list). CONS u0 y1)`);
6068  (REWRITE_WITH `{CONS u0 y1 | u0 IN s /\ y1 IN t} = 
6069                  (IMAGE (f:A#(A)list->(A)list) S)`);
6070  (EXPAND_TAC "f" THEN EXPAND_TAC "S" THEN REWRITE_TAC[IMAGE]);
6071  (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
6072  (STRIP_TAC);
6073  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6074  (EXISTS_TAC `(u0:A,y1:(A)list)`);
6075  (ASM_REWRITE_TAC[]);
6076  (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:(A)list` THEN ASM_REWRITE_TAC[]);
6077  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6078  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x' = u0:A,y1:(A)list`] THEN STRIP_TAC);
6079  (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:(A)list` THEN ASM_REWRITE_TAC[]);
6080  (REWRITE_WITH `CARD (IMAGE (f:A#(A)list->(A)list) S) = CARD S`);
6081  (MATCH_MP_TAC CARD_IMAGE_INJ);
6082  (STRIP_TAC);
6083  (EXPAND_TAC "S" THEN EXPAND_TAC "f" THEN 
6084    REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6085  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x = u0:A,y1:(A)list`; 
6086    ASSUME `y = u0':A,y1':(A)list`; CONS_11]);
6087  (STRIP_TAC THEN ASM_REWRITE_TAC[]);
6088  (EXPAND_TAC "S" THEN MATCH_MP_TAC FINITE_PRODUCT THEN ASM_REWRITE_TAC[]);
6089  (EXPAND_TAC "S" THEN MATCH_MP_TAC CARD_PRODUCT THEN ASM_REWRITE_TAC[])]);;
6090
6091 (* ==================================================================== *)
6092 (* Lemma 55 *)
6093
6094 let CARD_LIST_klemma_2 = prove_by_refinement (
6095   `!s t. FINITE (s:A->bool) /\ FINITE t ==> 
6096          CARD {[u0;y1] | u0 IN s /\ y1 IN t} = CARD s * CARD t`,
6097 [(REPEAT STRIP_TAC);
6098  (ABBREV_TAC `S = {u0:A, y1:A| u0 IN s /\ y1 IN t}`);
6099  (ABBREV_TAC `f = (\(u0:A, y1:A). [u0; y1])`);
6100  (REWRITE_WITH `{[u0; y1] | u0 IN s /\ y1 IN t} = 
6101                  (IMAGE (f:A#A->(A)list) S)`);
6102  (EXPAND_TAC "f" THEN EXPAND_TAC "S" THEN REWRITE_TAC[IMAGE]);
6103  (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
6104  (STRIP_TAC);
6105  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6106  (EXISTS_TAC `(u0:A,y1:A)`);
6107  (ASM_REWRITE_TAC[]);
6108  (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:A` THEN ASM_REWRITE_TAC[]);
6109  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6110  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x' = u0:A,y1:A`] THEN STRIP_TAC);
6111  (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:A` THEN ASM_REWRITE_TAC[]);
6112  (REWRITE_WITH `CARD (IMAGE (f:A#A->(A)list) S) = CARD S`);
6113  (MATCH_MP_TAC CARD_IMAGE_INJ);
6114  (STRIP_TAC);
6115  (EXPAND_TAC "S" THEN EXPAND_TAC "f" THEN 
6116    REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6117  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x = u0:A,y1:A`; 
6118    ASSUME `y = u0':A,y1':A`]);
6119  (REWRITE_TAC[PAIR_EQ]);
6120  (STRIP_TAC);
6121  (REWRITE_WITH `u0 = HD [u0':A; y1']`);
6122  (UP_ASM_TAC THEN MESON_TAC[HD]);
6123  (REWRITE_TAC[HD]);
6124  (REWRITE_WITH `y1 = HD (TL [u0':A; y1'])`);
6125  (UP_ASM_TAC THEN MESON_TAC[HD; TL]);
6126  (REWRITE_TAC[HD; TL]);
6127  (EXPAND_TAC "S" THEN MATCH_MP_TAC FINITE_PRODUCT THEN ASM_REWRITE_TAC[]);
6128  (EXPAND_TAC "S" THEN MATCH_MP_TAC CARD_PRODUCT THEN ASM_REWRITE_TAC[])]);;
6129
6130 (* ==================================================================== *)
6131 (* Lemma 56 *)
6132
6133 let FINITE_LIST_klemma = prove (
6134  `!s t. FINITE (s:A->bool) /\ FINITE t ==> 
6135          FINITE {CONS u0 y1 | u0 IN s /\ y1 IN t}`,
6136  REPEAT STRIP_TAC THEN 
6137  MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);;
6138
6139 (* ==================================================================== *)
6140 (* Lemma 57 *)
6141
6142 let CARD_LIST_4_klemma = prove_by_refinement (
6143  `!s:A->bool.
6144        FINITE s
6145        ==> CARD
6146         {y | ?u0 u1 u2 u3.
6147                u0 IN s /\
6148                u1 IN s /\
6149                u2 IN s /\
6150                u3 IN s /\
6151                y = [u0; u1; u2; u3]} = CARD s * CARD s * CARD s * CARD s`,
6152
6153 [(REPEAT STRIP_TAC);
6154  (REWRITE_TAC[SET_RULE
6155   `{y | ?u0 u1 u2 u3. u0 IN s /\ u1 IN s /\ u2 IN s /\ u3 IN s /\
6156                       y = [u0; u1; u2; u3]} =
6157    {CONS u0 y1 | u0 IN s /\
6158                  y1 IN {CONS u1 y2 | u1 IN s /\
6159                                      y2 IN {[u2;u3] | u2 IN s /\
6160                                                       u3 IN s}}}`]);
6161  (NEW_GOAL `FINITE {[u2:A; u3] | u2 IN s /\ u3 IN s}`);
6162  (MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);
6163  (NEW_GOAL `FINITE 
6164   {CONS u1 y2 | (u1:A) IN s /\ y2 IN {[u2; u3] | u2 IN s /\ u3 IN s}}`);
6165  (MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);
6166  (NEW_GOAL `FINITE 
6167   {CONS u0 y1 | u0 IN s /\
6168                y1 IN {CONS u1 y2 | u1 IN s /\ 
6169                                    y2 IN {[u2:A; u3] | u2 IN s /\ u3 IN s}}}`);
6170  (MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);
6171  (REWRITE_WITH `CARD
6172   {CONS u0 y1 | u0 IN s /\
6173                y1 IN
6174               {CONS u1 y2 | u1 IN s /\ y2 IN {[u2:A; u3] | u2 IN s /\ u3 IN s}}}
6175  = CARD s * 
6176    CARD {CONS u1 y2 | u1 IN s /\ y2 IN {[u2; u3] | u2 IN s /\ u3 IN s}}`);
6177  (ASM_SIMP_TAC[CARD_LIST_klemma]);
6178  (REWRITE_WITH 
6179    `CARD  {CONS u1 y2 | u1 IN s /\ y2 IN {[u2:A; u3] | u2 IN s /\ u3 IN s}}
6180  = CARD s * CARD {[u2; u3] | u2 IN s /\ u3 IN s}`);
6181  (ASM_SIMP_TAC[CARD_LIST_klemma]);
6182
6183  (REWRITE_WITH `CARD {[u2:A; u3] | u2 IN s /\ u3 IN s} = CARD s * CARD s`);
6184  (ASM_SIMP_TAC[CARD_LIST_klemma_2])]);;
6185
6186 (* ==================================================================== *)
6187 (* Lemma 58 *)
6188 let BOUNDS_VGEN_klemma = prove_by_refinement(
6189  `!u0 V r. &0 <= r /\ packing V ==> 
6190              &(CARD (V INTER ball (u0,r))) <= (r + &1) pow 3`,
6191 [(REPEAT STRIP_TAC);
6192  (NEW_GOAL `sum (V INTER ball (u0,r)) (\x. vol (ball (x:real^3, &1)))
6193            = & (CARD (V INTER ball (u0,r))) * (&4 / &3 * pi)`);
6194  (NEW_GOAL `&0 <= &1`);
6195  (REAL_ARITH_TAC);
6196  (REWRITE_WITH `(\x. vol (ball (x,&1))) = (\x. &4 / &3 * pi)`);
6197  (REWRITE_TAC[FUN_EQ_THM]);
6198  (ASM_SIMP_TAC[VOLUME_BALL] THEN REAL_ARITH_TAC);
6199  (MATCH_MP_TAC SUM_CONST);
6200  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6201  (UP_ASM_TAC);
6202  (ABBREV_TAC `f = (\x:real^3. ball (x, &1))`);
6203  (REWRITE_WITH `(\x. vol (ball (x:real^3,&1))) = (\x. vol (f x))`);
6204  (REWRITE_TAC[FUN_EQ_THM] THEN STRIP_TAC);
6205  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
6206  (REWRITE_WITH `sum (V INTER ball (u0:real^3,r)) (\x. vol (f x)) = 
6207                  vol (UNIONS (IMAGE f (V INTER ball (u0,r))))`);
6208  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6209  (MATCH_MP_TAC MEASURE_DISJOINT_UNIONS_IMAGE);
6210  (EXPAND_TAC "f" THEN REWRITE_TAC[] THEN REPEAT STRIP_TAC);
6211  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6212  (REWRITE_TAC[MEASURABLE_BALL]);
6213  (REWRITE_TAC[DISJOINT; SET_RULE `a = {} <=> ~(?s. s IN a)`]);
6214  (REWRITE_TAC[IN_INTER; IN_BALL]);
6215  (STRIP_TAC);
6216  (UNDISCH_TAC `packing V` THEN REWRITE_TAC[packing]);
6217  (REPEAT STRIP_TAC);
6218  (NEW_GOAL `&2 <= dist (x,y:real^3)`);
6219  (FIRST_ASSUM MATCH_MP_TAC);
6220  (ASM_SET_TAC[]);
6221  (NEW_GOAL `dist (x,y) <= dist (x,s) + dist (y,s:real^3)`);
6222  (NORM_ARITH_TAC);
6223  (ASM_REAL_ARITH_TAC);
6224  (STRIP_TAC);
6225  (NEW_GOAL `vol (UNIONS (IMAGE f (V INTER ball (u0:real^3,r))))
6226              <= vol (ball (u0, r + &1))`);
6227  (MATCH_MP_TAC MEASURE_SUBSET);
6228  (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE; MEASURABLE_BALL]);
6229  (STRIP_TAC);
6230  (MATCH_MP_TAC MEASURABLE_UNIONS);
6231  (STRIP_TAC);
6232  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
6233  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6234  (REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6235  (ASM_REWRITE_TAC[MEASURABLE_BALL]);
6236  (REWRITE_TAC[UNIONS_SUBSET; IN_INTER; IN_BALL; IN_ELIM_THM; SUBSET]);
6237  (REPEAT STRIP_TAC);
6238  (NEW_GOAL `dist (u0, x') <= dist (u0,x:real^3) + dist (x, x')`);
6239  (NORM_ARITH_TAC);
6240  (NEW_GOAL `dist (x,x':real^3) < &1`);
6241  (REWRITE_TAC[GSYM IN_BALL] THEN ASM_MESON_TAC[]);
6242  (ASM_REAL_ARITH_TAC);
6243  (NEW_GOAL `&(CARD (V INTER ball (u0,r))) * &4 / &3 * pi <= 
6244              vol (ball (u0,r + &1))`);
6245  (ASM_REAL_ARITH_TAC);
6246
6247  (UP_ASM_TAC THEN REWRITE_WITH 
6248   `vol (ball (u0, r + &1)) = &4 / &3 * pi * (r + &1) pow 3`);
6249  (NEW_GOAL `&0 <= r + &1`);
6250  (ASM_REAL_ARITH_TAC);
6251  (SIMP_TAC[VOLUME_BALL; ASSUME `&0 <= r + &1`]);
6252
6253  (REWRITE_TAC[REAL_ARITH `a * &4 / &3 * pi <= &4 / &3 * pi * b <=> 
6254                            &0 <= pi * (b - a)`]);
6255  (STRIP_TAC);
6256  (NEW_GOAL `&0 <= (r + &1) pow 3 - &(CARD (V INTER ball (u0:real^3,r)))`);
6257  (MATCH_MP_TAC Real_ext.REAL_PROP_NN_LCANCEL);
6258  (EXISTS_TAC `pi`);
6259  (ASM_REWRITE_TAC[PI_POS]);
6260  (ASM_REAL_ARITH_TAC)]);;
6261
6262 (* ==================================================================== *)
6263 (* Lemma 59 *)
6264
6265 let BOUNDS_V4_klemma = prove_by_refinement (
6266  `!u0 V. packing V ==> CARD (V INTER ball (u0, &4)) <= 125`,
6267 [(REPEAT STRIP_TAC);
6268  (NEW_GOAL `sum (V INTER ball (u0,&4)) (\x. vol (ball (x:real^3, &1)))
6269            = & (CARD (V INTER ball (u0,&4))) * (&4 / &3 * pi)`);
6270  (NEW_GOAL `&0 <= &1`);
6271  (REAL_ARITH_TAC);
6272  (REWRITE_WITH `(\x. vol (ball (x,&1))) = (\x. &4 / &3 * pi)`);
6273  (REWRITE_TAC[FUN_EQ_THM]);
6274  (ASM_SIMP_TAC[VOLUME_BALL] THEN REAL_ARITH_TAC);
6275  (MATCH_MP_TAC SUM_CONST);
6276  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6277  (UP_ASM_TAC);
6278  (ABBREV_TAC `f = (\x:real^3. ball (x, &1))`);
6279  (REWRITE_WITH `(\x. vol (ball (x:real^3,&1))) = (\x. vol (f x))`);
6280  (REWRITE_TAC[FUN_EQ_THM] THEN STRIP_TAC);
6281  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
6282  (REWRITE_WITH `sum (V INTER ball (u0:real^3,&4)) (\x. vol (f x)) = 
6283                  vol (UNIONS (IMAGE f (V INTER ball (u0,&4))))`);
6284  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6285  (MATCH_MP_TAC MEASURE_DISJOINT_UNIONS_IMAGE);
6286  (EXPAND_TAC "f" THEN REWRITE_TAC[] THEN REPEAT STRIP_TAC);
6287  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6288  (REWRITE_TAC[MEASURABLE_BALL]);
6289  (REWRITE_TAC[DISJOINT; SET_RULE `a = {} <=> ~(?s. s IN a)`]);
6290  (REWRITE_TAC[IN_INTER; IN_BALL]);
6291  (STRIP_TAC);
6292  (UNDISCH_TAC `packing V` THEN REWRITE_TAC[packing]);
6293  (REPEAT STRIP_TAC);
6294  (NEW_GOAL `&2 <= dist (x,y:real^3)`);
6295  (FIRST_ASSUM MATCH_MP_TAC);
6296  (ASM_SET_TAC[]);
6297  (NEW_GOAL `dist (x,y) <= dist (x,s) + dist (y,s:real^3)`);
6298  (NORM_ARITH_TAC);
6299  (ASM_REAL_ARITH_TAC);
6300  (STRIP_TAC);
6301  (NEW_GOAL `vol (UNIONS (IMAGE f (V INTER ball (u0:real^3,&4))))
6302              <= vol (ball (u0, &5))`);
6303  (MATCH_MP_TAC MEASURE_SUBSET);
6304  (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE; MEASURABLE_BALL]);
6305  (STRIP_TAC);
6306  (MATCH_MP_TAC MEASURABLE_UNIONS);
6307  (STRIP_TAC);
6308  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
6309  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6310  (REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6311  (ASM_REWRITE_TAC[MEASURABLE_BALL]);
6312  (REWRITE_TAC[UNIONS_SUBSET; IN_INTER; IN_BALL; IN_ELIM_THM; SUBSET]);
6313  (REPEAT STRIP_TAC);
6314  (NEW_GOAL `dist (u0, x') <= dist (u0,x:real^3) + dist (x, x')`);
6315  (NORM_ARITH_TAC);
6316  (NEW_GOAL `dist (x,x':real^3) < &1`);
6317  (REWRITE_TAC[GSYM IN_BALL] THEN ASM_MESON_TAC[]);
6318  (ASM_REAL_ARITH_TAC);
6319  (NEW_GOAL `&(CARD (V INTER ball (u0,&4))) * &4 / &3 * pi <= 
6320              vol (ball (u0,&5))`);
6321  (ASM_REAL_ARITH_TAC);
6322  (UP_ASM_TAC THEN REWRITE_WITH 
6323   `vol (ball (u0,&5)) = &4 / &3 * pi * (&5) pow 3`);
6324  (SIMP_TAC[VOLUME_BALL; REAL_ARITH `&0 <= &5`]);
6325
6326  (REWRITE_TAC[REAL_ARITH `a * &4 / &3 * pi <= &4 / &3 * pi * b <=> 
6327                            &0 <= pi * (b - a)`]);
6328  (STRIP_TAC);
6329  (NEW_GOAL `&0 <= &5 pow 3 - &(CARD (V INTER ball (u0:real^3,&4)))`);
6330  (MATCH_MP_TAC Real_ext.REAL_PROP_NN_LCANCEL);
6331  (EXISTS_TAC `pi`);
6332  (ASM_REWRITE_TAC[PI_POS]);
6333  (REWRITE_TAC[GSYM REAL_OF_NUM_LE]);
6334  (ASM_REAL_ARITH_TAC)]);;
6335
6336 (* ==================================================================== *)
6337 (* Lemma 60 *)
6338
6339 let CARD_MCELL_CONTAINS_POINT_klemma = prove_by_refinement (
6340  `?c. (!V u0. saturated V /\ packing V /\ u0 IN V 
6341      ==> CARD {X | mcell_set V X /\ VX V X u0} <= c)`,
6342 [(EXISTS_TAC `1220703125`);
6343  (REPEAT STRIP_TAC);
6344  (ABBREV_TAC `S = {ul,i | barV V 3 ul /\ i IN 0..4 /\ 
6345                                              u0 IN set_of_list ul}`);
6346  (NEW_GOAL `FINITE (S:(real^3)list#num->bool)`);
6347  (REWRITE_WITH `S = {ul,i | ul IN {ul | barV V 3 ul /\ 
6348                                          u0 IN set_of_list ul} /\ i IN 0..4}`);
6349  (EXPAND_TAC "S");
6350  (SET_TAC[]);
6351  (MATCH_MP_TAC FINITE_PRODUCT);
6352  (REWRITE_TAC[FINITE_NUMSEG]);
6353  (MATCH_MP_TAC FINITE_SUBSET);
6354
6355  (ABBREV_TAC `T1 = V INTER ball (u0:real^3, &4)`);
6356  (NEW_GOAL `FINITE (T1:real^3->bool)`);
6357  (EXPAND_TAC "T1" THEN MATCH_MP_TAC FINITE_PACK_LEMMA);
6358  (ASM_REWRITE_TAC[]);
6359
6360  (EXISTS_TAC `{ul | ?v0 v1 v2 v3. 
6361                      v0 IN T1 /\ v1 IN T1 /\ v2 IN T1 /\ v3 IN T1 /\
6362                      ul = [v0;v1;v2;v3:real^3]}`);
6363  (STRIP_TAC);
6364  (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA THEN ASM_REWRITE_TAC[]);
6365
6366  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
6367  (REPEAT STRIP_TAC);
6368  (NEW_GOAL `?v0 v1 v2 v3. x = [v0:real^3; v1; v2; v3]`);
6369  (MATCH_MP_TAC BARV_3_EXPLICIT);
6370  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6371  (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN EXISTS_TAC
6372   `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
6373  (ASM_REWRITE_TAC[]);
6374  (NEW_GOAL `set_of_list (x:(real^3)list) SUBSET T1`);
6375  (EXPAND_TAC "T1" THEN REWRITE_TAC[SUBSET_INTER]);
6376  (STRIP_TAC);
6377  (MATCH_MP_TAC Packing3.BARV_SUBSET);
6378  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6379  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6380  (EXISTS_TAC `V:(real^3->bool)`);
6381  (ASM_REWRITE_TAC[]);
6382  (UNDISCH_TAC `set_of_list (x:(real^3)list) u0` THEN ASM_REWRITE_TAC[IN]);
6383  (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6384
6385  (ABBREV_TAC `f = (\(ul,i). mcell i V ul)`);
6386  (NEW_GOAL `{X | mcell_set V X /\ VX V X u0} SUBSET 
6387              (IMAGE (f:(real^3)list#num->real^3->bool) S) `);
6388  (EXPAND_TAC "S" THEN EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
6389  (REWRITE_TAC[mcell_set_2; SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6390  (EXISTS_TAC `ul:(real^3)list,i:num`);
6391  (REWRITE_TAC[]);
6392  (ASM_REWRITE_TAC[]);
6393  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6394  (ASM_REWRITE_TAC[]);
6395  (STRIP_TAC);
6396  (REWRITE_TAC[MESON[IN] `(0..4) i <=> i IN 0..4`]);
6397  (ASM_REWRITE_TAC[IN_NUMSEG_0]);
6398  (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6399  (ASM_REWRITE_TAC[IN_NUMSEG_0]);
6400  (NEW_GOAL `(u0:real^3) IN V INTER x`);
6401  (REWRITE_WITH `V INTER x = VX V x`);
6402  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6403  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
6404  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6405  (ASM_REWRITE_TAC[]);
6406  (STRIP_TAC);
6407  (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[VX]);
6408  (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6409  (SET_TAC[]);
6410  (ASM_REWRITE_TAC[IN]);
6411  (UP_ASM_TAC THEN REWRITE_WITH 
6412   `V INTER (x:real^3->bool) = set_of_list (truncate_simplex (i - 1) ul)`);
6413  (ASM_REWRITE_TAC[]);
6414  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
6415  (ASM_REWRITE_TAC[]);
6416  (NEW_GOAL `VX V x = V INTER x`);
6417
6418  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
6419  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6420  (ASM_REWRITE_TAC[]);
6421  (STRIP_TAC);
6422  (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[VX]);
6423  (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6424  (SET_TAC[]);
6425  (REPEAT STRIP_TAC);
6426  (ASM_CASES_TAC `i = 0`);
6427  (NEW_GOAL `F`);
6428  (UNDISCH_TAC `VX V x u0` THEN ASM_REWRITE_TAC[]);
6429  (ASM_SIMP_TAC [Lepjbdj.LEPJBDJ_0]);
6430  (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6431  (SET_TAC[]);
6432  (ASM_MESON_TAC[]);
6433  (ASM_ARITH_TAC);
6434  (UNDISCH_TAC `VX V x u0` THEN ASM_REWRITE_TAC[]);
6435  (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6436  (SET_TAC[]);
6437  (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6438  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> (u0 IN A ==> u0 IN B)`));
6439  (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
6440  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
6441  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
6442  (EXISTS_TAC `V:real^3->bool`);
6443  (ASM_REWRITE_TAC[]);
6444  (ASM_ARITH_TAC);
6445  (MATCH_MP_TAC (ARITH_RULE `(?b. a:num <= b /\ b <= c) ==> a <= c`));
6446  (EXISTS_TAC `CARD (IMAGE (f:(real^3)list#num->real^3->bool) S)`);
6447  (STRIP_TAC);
6448  (MATCH_MP_TAC CARD_SUBSET);
6449  (ASM_REWRITE_TAC[]);
6450  (MATCH_MP_TAC FINITE_IMAGE);
6451  (ASM_REWRITE_TAC[]);
6452
6453  (MATCH_MP_TAC (ARITH_RULE `(?b. a:num <= b /\ b <= c) ==> a <= c`));
6454  (EXISTS_TAC `CARD (S:(real^3)list#num->bool)`);
6455  (STRIP_TAC);
6456  (MATCH_MP_TAC CARD_IMAGE_LE);
6457  (ASM_REWRITE_TAC[]);
6458
6459  (REWRITE_WITH
6460   `S = {ul,i |ul IN {ul | barV V 3 ul /\ u0 IN set_of_list ul}/\ i IN 0..4}`);
6461  (EXPAND_TAC "S" THEN SET_TAC[]);
6462  (REWRITE_WITH 
6463   `CARD {ul,i |ul IN {ul | barV V 3 ul /\ u0 IN set_of_list ul}/\ i IN 0..4} =
6464    CARD {ul | barV V 3 ul /\ u0 IN set_of_list ul} * CARD (0..4)`);
6465  (MATCH_MP_TAC CARD_PRODUCT);
6466  (REWRITE_TAC[FINITE_NUMSEG]);
6467  (MATCH_MP_TAC FINITE_SUBSET);
6468
6469  (ABBREV_TAC `T1 = V INTER ball (u0:real^3, &4)`);
6470  (NEW_GOAL `FINITE (T1:real^3->bool)`);
6471  (EXPAND_TAC "T1" THEN MATCH_MP_TAC FINITE_PACK_LEMMA);
6472  (ASM_REWRITE_TAC[]);
6473
6474  (EXISTS_TAC `{ul | ?v0 v1 v2 v3. 
6475                      v0 IN T1 /\ v1 IN T1 /\ v2 IN T1 /\ v3 IN T1 /\
6476                      ul = [v0;v1;v2;v3:real^3]}`);
6477  (STRIP_TAC);
6478  (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA THEN ASM_REWRITE_TAC[]);
6479
6480  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
6481  (REPEAT STRIP_TAC);
6482  (NEW_GOAL `?v0 v1 v2 v3. x = [v0:real^3; v1; v2; v3]`);
6483  (MATCH_MP_TAC BARV_3_EXPLICIT);
6484  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6485  (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN EXISTS_TAC
6486   `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
6487  (ASM_REWRITE_TAC[]);
6488  (NEW_GOAL `set_of_list (x:(real^3)list) SUBSET T1`);
6489  (EXPAND_TAC "T1" THEN REWRITE_TAC[SUBSET_INTER]);
6490  (STRIP_TAC);
6491  (MATCH_MP_TAC Packing3.BARV_SUBSET);
6492  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6493  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6494  (EXISTS_TAC `V:(real^3->bool)`);
6495  (ASM_REWRITE_TAC[]);
6496  (UNDISCH_TAC `set_of_list (x:(real^3)list) u0` THEN ASM_REWRITE_TAC[IN]);
6497  (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6498
6499  (REWRITE_TAC[CARD_NUMSEG; ARITH_RULE `(4 + 1) - 0 = 5`]);
6500  (REWRITE_TAC[ARITH_RULE `a * 5 <= 1220703125 <=> a <= 244140625`]);
6501
6502  (ABBREV_TAC `T1 = V INTER ball (u0:real^3, &4)`);
6503  (NEW_GOAL `FINITE (T1:real^3->bool)`);
6504  (EXPAND_TAC "T1" THEN MATCH_MP_TAC FINITE_PACK_LEMMA);
6505  (ASM_REWRITE_TAC[]);
6506
6507  (NEW_GOAL `{ul | barV V 3 ul /\ u0 IN set_of_list ul} SUBSET 
6508              {ul | ?v0 v1 v2 v3. 
6509                      v0 IN T1 /\ v1 IN T1 /\ v2 IN T1 /\ v3 IN T1 /\
6510                      ul = [v0;v1;v2;v3]}`);
6511  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
6512  (REPEAT STRIP_TAC);
6513  (NEW_GOAL `?v0 v1 v2 v3. x = [v0:real^3; v1; v2; v3]`);
6514  (MATCH_MP_TAC BARV_3_EXPLICIT);
6515  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6516  (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN EXISTS_TAC
6517   `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
6518  (ASM_REWRITE_TAC[]);
6519  (NEW_GOAL `set_of_list (x:(real^3)list) SUBSET T1`);
6520  (EXPAND_TAC "T1" THEN REWRITE_TAC[SUBSET_INTER]);
6521  (STRIP_TAC);
6522  (MATCH_MP_TAC Packing3.BARV_SUBSET);
6523  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6524  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6525  (EXISTS_TAC `V:(real^3->bool)`);
6526  (ASM_REWRITE_TAC[]);
6527  (UNDISCH_TAC `set_of_list (x:(real^3)list) u0` THEN ASM_REWRITE_TAC[IN]);
6528  (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6529
6530  (MATCH_MP_TAC (ARITH_RULE `(?x. a <= x /\ x <= b:num) ==> a <= b`));
6531  (EXISTS_TAC `CARD {ul | ?v0 v1 v2 v3.
6532                 v0 IN T1 /\
6533                 v1 IN T1 /\
6534                 v2 IN T1 /\
6535                 v3 IN T1 /\
6536                 ul = [v0:real^3; v1; v2; v3]}`);
6537  (STRIP_TAC);
6538  (MATCH_MP_TAC CARD_SUBSET);
6539  (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
6540  (ASM_REWRITE_TAC[]);
6541  (REWRITE_WITH `CARD
6542         {y | ?u0 u1 u2 u3.
6543                u0 IN T1 /\
6544                u1 IN T1 /\
6545                u2 IN T1 /\
6546                u3 IN T1 /\
6547                y = [u0:real^3; u1; u2; u3:real^3]} = 
6548                CARD T1 * CARD T1 * CARD T1 * CARD T1`);
6549  (ASM_SIMP_TAC [CARD_LIST_4_klemma]);
6550  (NEW_GOAL `CARD (T1:real^3->bool) <= 125`);
6551  (EXPAND_TAC "T1");
6552  (MATCH_MP_TAC BOUNDS_V4_klemma);
6553  (ASM_REWRITE_TAC[]);
6554  (NEW_GOAL `CARD (T1:real^3->bool) * CARD T1 <= 125 * 125`);
6555  (MATCH_MP_TAC LE_MULT2);
6556  (ASM_REWRITE_TAC[]);
6557  (NEW_GOAL `CARD (T1:real^3->bool) * CARD T1 * CARD T1 <= 125 * 125 * 125`);
6558  (MATCH_MP_TAC LE_MULT2);
6559  (ASM_REWRITE_TAC[]);
6560  (NEW_GOAL `CARD (T1:real^3->bool) * CARD T1 * CARD T1 * CARD T1 <= 
6561              125 * 125 * 125 * 125`);
6562  (MATCH_MP_TAC LE_MULT2);
6563  (ASM_REWRITE_TAC[]);
6564  (UP_ASM_TAC THEN ARITH_TAC)]);;
6565
6566 (* ==================================================================== *)
6567 (* Lemma 61 *)
6568
6569 (* deprecated by thales Jan 1, 2013. Replaced with version in bump.hl. *)
6570
6571 (*
6572
6573 let BOUND_BETA_BUMP_DEPRECATED = prove_by_refinement (
6574  `?c. !V X e.
6575          saturated V /\ packing V /\ mcell_set V X /\ critical_edgeX V X e
6576          ==> beta_bump V e X <= c`,
6577 [(EXISTS_TAC `&614400`);
6578  (REWRITE_TAC[mcell_set_2; IN_ELIM_THM; IN; beta_bump]);
6579  (REPEAT STRIP_TAC THEN LET_TAC);
6580  (UP_ASM_TAC THEN REWRITE_TAC[cell_params]);
6581
6582  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6583  (STRIP_TAC);
6584  (ABBREV_TAC `P = (\(k,ul'). k <= 4 /\ ul' IN barV V 3 /\ 
6585                               mcell i V ul = mcell k V ul')`);
6586  (NEW_GOAL `(P:(num#(real^3)list->bool)) (k,ul')`);
6587  (ASM_REWRITE_TAC[]);
6588  (MATCH_MP_TAC SELECT_AX);
6589  (EXISTS_TAC `(i:num,ul:(real^3)list)`);
6590  (EXPAND_TAC "P");
6591  (REWRITE_TAC[BETA_THM]);
6592  (ASM_REWRITE_TAC[IN]);
6593  (UP_ASM_TAC THEN EXPAND_TAC "P");
6594  (REWRITE_TAC[BETA_THM; IN] THEN STRIP_TAC);
6595
6596  (ABBREV_TAC `S = {e',e'',p,vl | 4 = k /\
6597                 {e', e''} = critical_edgeX V X /\
6598                 e' = e /\
6599                 p permutes 0..3 /\
6600                 left_action_list p ul' = vl /\
6601                 {EL 0 vl, EL 1 vl} = e' /\
6602                 {EL 2 vl, EL 3 vl} = e''}`);
6603
6604  (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
6605  (MATCH_MP_TAC BARV_3_EXPLICIT);
6606  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6607  (UP_ASM_TAC THEN STRIP_TAC);
6608  (ABBREV_TAC `K1 = {us:real^3->bool | us SUBSET set_of_list ul}`);
6609  (NEW_GOAL `FINITE (K1:(real^3->bool)->bool)`);
6610  (EXPAND_TAC "K1" THEN MATCH_MP_TAC FINITE_POWERSET);
6611  (ASM_REWRITE_TAC[set_of_list; Geomdetail.FINITE6]);
6612
6613  (NEW_GOAL `critical_edgeX V X SUBSET K1`);
6614  (EXPAND_TAC "K1" THEN 
6615    REWRITE_TAC[critical_edgeX; edgeX; SUBSET; IN; IN_ELIM_THM]);
6616  (REPEAT STRIP_TAC);
6617
6618  (NEW_GOAL `(x:real^3->bool) SUBSET set_of_list ul`);
6619  (REWRITE_TAC[ASSUME `x = {u, v:real^3}`; ASSUME `{u, v} = {u', v':real^3}`]);
6620  (NEW_GOAL `VX V X = V INTER X`);
6621  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
6622  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6623  (ASM_REWRITE_TAC[]);
6624  (STRIP_TAC);
6625  (NEW_GOAL `VX V X = {}`);
6626  (ASM_REWRITE_TAC[VX]);
6627  (UNDISCH_TAC `VX V X u'` THEN 
6628    ASM_REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
6629  (NEW_GOAL 
6630   `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (i - 1) ul)`);
6631  (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
6632  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
6633  (ASM_REWRITE_TAC[]);
6634  (STRIP_TAC);
6635  (ASM_CASES_TAC `i = 0`);
6636  (NEW_GOAL `F`);
6637  (NEW_GOAL `VX V X = {}`);
6638  (REWRITE_TAC[ASSUME `VX V X = V INTER X`; ASSUME `X = mcell i V ul`; 
6639    ASSUME `i = 0`]);
6640  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
6641  (ASM_REWRITE_TAC[]);
6642  (UNDISCH_TAC `VX V X u'` THEN REWRITE_TAC[ASSUME `VX V X = {}`; 
6643    MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
6644  (ASM_MESON_TAC[]);
6645  (ASM_ARITH_TAC);
6646  (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = mcell k V ul'`); 
6647    GSYM (ASSUME `X = mcell i V ul`)]);
6648  (STRIP_TAC);
6649  (NEW_GOAL `NULLSET X`);
6650  (REWRITE_TAC[NEGLIGIBLE_EMPTY; ASSUME `X = {}:real^3->bool`]);
6651  (NEW_GOAL `VX V X = {}`);
6652  (REWRITE_TAC[VX; ASSUME `NULLSET X`]);
6653  (UNDISCH_TAC `VX V X u'` THEN REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`; 
6654    ASSUME `VX V X = {}`] THEN SET_TAC[]);
6655  (NEW_GOAL `set_of_list (truncate_simplex (i - 1) ul) SUBSET 
6656              set_of_list (ul:(real^3)list)`);
6657  (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
6658  (ASM_REWRITE_TAC[LENGTH] THEN ASM_ARITH_TAC);
6659  (ASM_SET_TAC[]);
6660  (ASM_SET_TAC[]);
6661
6662  (NEW_GOAL 
6663    `FINITE  
6664       (S:(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list->bool)`);
6665  (EXPAND_TAC "S");
6666  (MATCH_MP_TAC FINITE_SUBSET);
6667  (EXISTS_TAC `{e',e'',p,vl | {e', e''} = critical_edgeX V X /\
6668                                p permutes 0..3 /\
6669                                left_action_list p ul' = vl:(real^3)list}`);
6670  (STRIP_TAC);
6671  (MATCH_MP_TAC FINITE_SUBSET);
6672  (EXISTS_TAC `{e',e'',p,vl | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6673                                p permutes 0..3 /\
6674                                left_action_list p ul' = vl:(real^3)list}`);
6675  (STRIP_TAC);
6676  (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6677                          p permutes 0..3}`);
6678  (ABBREV_TAC 
6679   `f_temp = (\(e':real^3->bool,e'':real^3->bool,p). 
6680               e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6681  (MATCH_MP_TAC FINITE_SUBSET);
6682  (EXISTS_TAC `IMAGE  (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp`);
6683  (STRIP_TAC);
6684  (MATCH_MP_TAC FINITE_IMAGE);
6685
6686  (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\ 
6687                            u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6688  (EXPAND_TAC "S_temp");
6689  (SET_TAC[]);
6690  (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6691  (MATCH_MP_TAC FINITE_PRODUCT);
6692  (ASM_REWRITE_TAC[]);
6693
6694  (REWRITE_WITH 
6695   `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6696  (EXPAND_TAC "K2" THEN SET_TAC[]);
6697  (MATCH_MP_TAC FINITE_PRODUCT);
6698  (ASM_REWRITE_TAC[]);
6699  (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6700    Marchal_cells_2_new.SET_OF_0_TO_3;  
6701    Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6702  (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6703  (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6704  (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6705  (ASM_REWRITE_TAC[]);
6706  (EXISTS_TAC `e':real^3->bool` THEN 
6707    EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6708  (ASM_REWRITE_TAC[]);
6709  (UP_ASM_TAC THEN SET_TAC[]);
6710  (SET_TAC[]);
6711
6712
6713 (* ------------------------------------------------------------------------ *)
6714 (* Finish proving S is FINITE *)
6715 (* ------------------------------------------------------------------------ *)
6716
6717  (MATCH_MP_TAC (REAL_ARITH `(?x. a <= x /\ x <= b) ==> a <= b`));
6718  (EXISTS_TAC 
6719    `sum (S:(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list->bool) 
6720         (\x. &100)`);
6721  (STRIP_TAC);
6722  (MATCH_MP_TAC SUM_LE);
6723  (ASM_REWRITE_TAC[]);
6724  (EXPAND_TAC "S" THEN REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6725  (ASM_REWRITE_TAC[]);
6726  (REWRITE_TAC[GSYM (ASSUME `4 = k`); REAL_ARITH `a / &4 <= &100 <=> a <= &400`]);
6727  (REWRITE_TAC[bump]);
6728  (REWRITE_TAC[REAL_ARITH 
6729    `#0.005 * (&1 - a) - #0.005 * (&1 - b) <= &400 <=>
6730     b - a <= &80000`]);
6731  (MATCH_MP_TAC (REAL_ARITH `(&0 <= a /\ b <= c ==> b - a <= c)`));
6732  (STRIP_TAC);
6733  (MATCH_MP_TAC REAL_LE_DIV);
6734  (REWRITE_TAC[Real_ext.REAL_LE_POW_2]);
6735  (REWRITE_TAC[hplus; h0; REAL_ARITH 
6736    `a / (#1.3254 - #1.26) pow 2 <= &80000 <=> a <= #342.1728`]);
6737  (NEW_GOAL `barV V 3 vl`);
6738  (MATCH_MP_TAC Qzksykg.QZKSYKG1);
6739  (EXISTS_TAC `ul':(real^3)list`);
6740  (EXISTS_TAC `4` THEN EXISTS_TAC `p:num->num`);
6741  (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`]);
6742  (STRIP_TAC);
6743  (SET_TAC[]);
6744  (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = mcell k V ul'`); 
6745                GSYM (ASSUME `X = mcell i V ul`)]);
6746  (STRIP_TAC);
6747  (NEW_GOAL `critical_edgeX V X = {}`);
6748  (REWRITE_TAC[critical_edgeX ; edgeX; IN; IN_ELIM_THM; 
6749                SET_RULE `X = {} <=> ~(?s. s IN X)`]);
6750  (STRIP_TAC);
6751  (NEW_GOAL `NULLSET X`);
6752  (ASM_MESON_TAC[NEGLIGIBLE_EMPTY]);
6753  (UNDISCH_TAC `VX V X v'` THEN REWRITE_TAC[VX; ASSUME `NULLSET X`]);
6754  (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
6755  (UNDISCH_TAC `critical_edgeX V X e`);
6756  (REWRITE_TAC[ASSUME `critical_edgeX V X = {}`; MESON[IN] `{} x <=> x IN {}`]
6757    THEN SET_TAC[]);
6758
6759
6760  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
6761  (MATCH_MP_TAC BARV_3_EXPLICIT);
6762  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6763  (UP_ASM_TAC THEN REPEAT STRIP_TAC);
6764  (ASM_REWRITE_TAC[EL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
6765  (REWRITE_TAC[ARITH_RULE `SUC (SUC 0) = 2`]);
6766  (NEW_GOAL `(hl [v2; v3:real^3] - #1.26) pow 2 <= (&10) pow 2`);
6767  (REWRITE_TAC[GSYM REAL_LE_SQUARE_ABS; REAL_ARITH `abs (&10) = &10`]);
6768  (ASM_CASES_TAC `&0 <= hl [v2; v3:real^3] - #1.26`);
6769  (REWRITE_WITH `abs (hl [v2; v3:real^3] - #1.26) = hl [v2; v3] - #1.26`);
6770  (ASM_REAL_ARITH_TAC);
6771
6772  (REWRITE_TAC[HL_2; 
6773    REAL_ARITH `inv (&2) * a - #1.26 <= &10 <=> a <= #22.52`]);
6774  (NEW_GOAL `set_of_list vl SUBSET ball (v2:real^3,&4)`);
6775  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6776  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[set_of_list]);
6777  (SET_TAC[]);
6778  (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN STRIP_TAC);
6779  (SUBGOAL_THEN `v3:real^3 IN ball (v2, &k)` MP_TAC);
6780  (UP_ASM_TAC THEN SET_TAC[]);
6781  (REWRITE_TAC[IN_BALL; GSYM (ASSUME `4 = k`)]);
6782  (REAL_ARITH_TAC);
6783  (REWRITE_WITH `abs (hl [v2; v3] - #1.26) = #1.26 - hl [v2; v3:real^3]`);
6784  (ASM_REAL_ARITH_TAC);
6785  (MATCH_MP_TAC (REAL_ARITH `&0 <= a ==> #1.26 - a <= &10`));
6786  (REWRITE_TAC[HL_2] THEN NORM_ARITH_TAC);
6787  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6788  (ASM_SIMP_TAC[SUM_CONST]);
6789
6790
6791  (EXPAND_TAC "S");
6792  (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6793  (EXISTS_TAC `& (CARD {e',e'',p,vl | {e', e''} = critical_edgeX V X /\
6794                          p permutes 0..3 /\
6795                          left_action_list p ul' = vl:(real^3)list}) * &100 `);
6796  (STRIP_TAC);
6797  (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6798  (REWRITE_TAC[REAL_OF_NUM_LE]);
6799  (MATCH_MP_TAC CARD_SUBSET);
6800  (STRIP_TAC);
6801  (SET_TAC[]);
6802  (MATCH_MP_TAC FINITE_SUBSET);
6803
6804 (*****)
6805  (EXISTS_TAC `{e',e'',p,vl | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6806                                p permutes 0..3 /\
6807                                left_action_list p ul' = vl:(real^3)list}`);
6808  (STRIP_TAC);
6809  (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6810                          p permutes 0..3}`);
6811  (ABBREV_TAC 
6812   `f_temp = (\(e':real^3->bool,e'':real^3->bool,p). 
6813               e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6814  (MATCH_MP_TAC FINITE_SUBSET);
6815  (EXISTS_TAC `IMAGE  (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp`);
6816  (STRIP_TAC);
6817  (MATCH_MP_TAC FINITE_IMAGE);
6818
6819  (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\ 
6820                            u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6821  (EXPAND_TAC "S_temp");
6822  (SET_TAC[]);
6823  (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6824  (MATCH_MP_TAC FINITE_PRODUCT);
6825  (ASM_REWRITE_TAC[]);
6826
6827  (REWRITE_WITH 
6828   `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6829  (EXPAND_TAC "K2" THEN SET_TAC[]);
6830  (MATCH_MP_TAC FINITE_PRODUCT);
6831  (ASM_REWRITE_TAC[]);
6832  (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6833    Marchal_cells_2_new.SET_OF_0_TO_3;  
6834    Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6835  (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6836  (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6837  (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6838  (ASM_REWRITE_TAC[]);
6839  (EXISTS_TAC `e':real^3->bool` THEN 
6840    EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6841  (ASM_REWRITE_TAC[]);
6842  (SWITCH_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6843
6844  (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6845  (EXISTS_TAC `& (CARD {e',e'',p,vl | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6846                           p permutes 0..3 /\
6847                           left_action_list p ul' = vl:(real^3)list}) * &100 `);
6848  (STRIP_TAC);
6849  (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6850  (REWRITE_TAC[REAL_OF_NUM_LE]);
6851  (MATCH_MP_TAC CARD_SUBSET);
6852  (STRIP_TAC);
6853  (SWITCH_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6854
6855 (* **** *)
6856  (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6857                          p permutes 0..3}`);
6858  (ABBREV_TAC 
6859   `f_temp = (\(e':real^3->bool,e'':real^3->bool,p). 
6860               e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6861  (MATCH_MP_TAC FINITE_SUBSET);
6862  (EXISTS_TAC `IMAGE  (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp`);
6863  (STRIP_TAC);
6864  (MATCH_MP_TAC FINITE_IMAGE);
6865
6866  (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\ 
6867                            u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6868  (EXPAND_TAC "S_temp");
6869  (SET_TAC[]);
6870  (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6871  (MATCH_MP_TAC FINITE_PRODUCT);
6872  (ASM_REWRITE_TAC[]);
6873
6874  (REWRITE_WITH 
6875   `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6876  (EXPAND_TAC "K2" THEN SET_TAC[]);
6877  (MATCH_MP_TAC FINITE_PRODUCT);
6878  (ASM_REWRITE_TAC[]);
6879  (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6880    Marchal_cells_2_new.SET_OF_0_TO_3;  
6881    Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6882  (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6883  (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6884  (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6885  (ASM_REWRITE_TAC[]);
6886  (EXISTS_TAC `e':real^3->bool` THEN 
6887    EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6888  (ASM_REWRITE_TAC[]);
6889
6890
6891  (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6892  (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6893                          p permutes 0..3}`);
6894  (ABBREV_TAC 
6895   `f_temp = (\(e':real^3->bool,e'':real^3->bool,p). 
6896               e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6897  (EXISTS_TAC `& (CARD (IMAGE  (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp)) * &100`);
6898
6899  (STRIP_TAC);
6900  (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6901  (REWRITE_TAC[REAL_OF_NUM_LE]);
6902  (MATCH_MP_TAC CARD_SUBSET);
6903  (STRIP_TAC);
6904  (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6905  (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6906  (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6907  (ASM_REWRITE_TAC[]);
6908  (EXISTS_TAC `e':real^3->bool` THEN 
6909    EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6910  (ASM_REWRITE_TAC[]);
6911
6912  (MATCH_MP_TAC FINITE_IMAGE);
6913  (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\ 
6914                            u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6915  (EXPAND_TAC "S_temp");
6916  (SET_TAC[]);
6917  (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6918  (MATCH_MP_TAC FINITE_PRODUCT);
6919  (ASM_REWRITE_TAC[]);
6920
6921  (REWRITE_WITH 
6922   `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6923  (EXPAND_TAC "K2" THEN SET_TAC[]);
6924  (MATCH_MP_TAC FINITE_PRODUCT);
6925  (ASM_REWRITE_TAC[]);
6926  (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6927    Marchal_cells_2_new.SET_OF_0_TO_3;  
6928    Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6929
6930  (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6931  (EXISTS_TAC 
6932   `& (CARD (S_temp:(real^3->bool)#(real^3->bool)#(num->num)->bool)) * &100`);
6933  (STRIP_TAC);
6934  (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6935  (REWRITE_TAC[REAL_OF_NUM_LE]);
6936  (MATCH_MP_TAC CARD_IMAGE_LE);
6937  (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\ 
6938                            u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6939  (EXPAND_TAC "S_temp");
6940  (SET_TAC[]);
6941  (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6942  (MATCH_MP_TAC FINITE_PRODUCT);
6943  (ASM_REWRITE_TAC[]);
6944
6945  (REWRITE_WITH 
6946   `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6947  (EXPAND_TAC "K2" THEN SET_TAC[]);
6948  (MATCH_MP_TAC FINITE_PRODUCT);
6949  (ASM_REWRITE_TAC[]);
6950  (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6951    Marchal_cells_2_new.SET_OF_0_TO_3;  
6952    Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6953
6954  (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\ 
6955                            u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6956  (EXPAND_TAC "S_temp");
6957  (SET_TAC[]);
6958  (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6959  (REWRITE_WITH `CARD {e':real^3->bool,u:(real^3->bool)#(num->num) | 
6960                             e' IN K1 /\ u IN K2} = CARD K1 * CARD K2`);
6961  (MATCH_MP_TAC CARD_PRODUCT);
6962  (ASM_REWRITE_TAC[]);
6963
6964  (REWRITE_WITH 
6965   `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6966  (EXPAND_TAC "K2" THEN SET_TAC[]);
6967  (MATCH_MP_TAC FINITE_PRODUCT);
6968  (ASM_REWRITE_TAC[]);
6969  (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6970    Marchal_cells_2_new.SET_OF_0_TO_3;  
6971    Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6972
6973  (REWRITE_WITH `CARD (K2:(real^3->bool)#(num->num)->bool) = 
6974                  CARD (K1:(real^3->bool)->bool) * CARD {p | p permutes 0..3}`);
6975  (REWRITE_WITH 
6976   `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6977  (EXPAND_TAC "K2" THEN SET_TAC[]);
6978  (MATCH_MP_TAC CARD_PRODUCT);
6979  (ASM_REWRITE_TAC[]);
6980  (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6981    Marchal_cells_2_new.SET_OF_0_TO_3;  
6982    Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6983  (REWRITE_WITH `CARD (K1:(real^3->bool)->bool) = 16`);
6984
6985  (REWRITE_WITH `16 = 2 EXP (CARD (set_of_list (ul:(real^3)list)))`);
6986  (REWRITE_WITH `CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
6987  (MATCH_MP_TAC BARV_CARD_LEMMA);
6988  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6989  (ARITH_TAC);
6990  (EXPAND_TAC "K1");
6991  (MATCH_MP_TAC CARD_POWERSET);
6992  (ASM_REWRITE_TAC[set_of_list; Geomdetail.FINITE6]);
6993  (REWRITE_WITH `CARD {p | p permutes 0..3} = FACT (CARD (0..3))`);
6994  (MATCH_MP_TAC CARD_PERMUTATIONS);
6995  (REWRITE_TAC[FINITE_NUMSEG]);
6996  (REWRITE_TAC[CARD_NUMSEG; ARITH_RULE `16 * 16 * FACT ((3 + 1) - 0) = 6144`]);
6997
6998  (REAL_ARITH_TAC)]);;
6999
7000 *)
7001
7002 (* ==================================================================== *)
7003 (* Lemma 62 *)
7004
7005 let MCELL_SUBSET_BALL8_2 = prove (
7006  `!V X v.  packing V /\ saturated V /\ mcell_set V X /\ v IN X
7007              ==> X SUBSET ball (v,&8)`,
7008  REWRITE_TAC[mcell_set; IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN
7009  UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN 
7010  MATCH_MP_TAC MCELL_SUBSET_BALL8 THEN ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);;
7011
7012 (* ==================================================================== *)
7013 (* Lemma 63 *)
7014 let critical_edge_subset_mcell = prove_by_refinement (
7015  `!V X x. packing V /\ saturated V /\ mcell_set V X /\ critical_edgeX V X x
7016           ==> x SUBSET X`,
7017 [(REWRITE_TAC[mcell_set_2; critical_edgeX; edgeX; IN_ELIM_THM; IN]);
7018  (REPEAT STRIP_TAC);
7019  (NEW_GOAL `VX V X = V INTER X`);
7020  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ); 
7021  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7022  (ASM_REWRITE_TAC[]);
7023  (STRIP_TAC THEN UNDISCH_TAC `VX V X u'` THEN 
7024   ASM_REWRITE_TAC[VX; MESON[IN] `{} u <=> u IN {}`] THEN SET_TAC[]);
7025  (ASM_SET_TAC[])]);;
7026
7027 (* ==================================================================== *)
7028 (* Lemma 64 *)
7029
7030 let EDGEX_SUBSET_MCELL = prove_by_refinement (
7031  `!V X e. packing V /\ saturated V /\ mcell_set V X /\ edgeX V X e 
7032            ==> e SUBSET X`,
7033 [(REWRITE_TAC[edgeX; IN; IN_ELIM_THM; mcell_set] THEN REPEAT STRIP_TAC);
7034  (NEW_GOAL `VX V X = V INTER X`);
7035  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7036  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]
7037   THEN STRIP_TAC THEN UNDISCH_TAC `VX V X u` THEN 
7038   ASM_REWRITE_TAC[VX; MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
7039  (ASM_SET_TAC[])]);;
7040
7041 let CRITICAL_EDGEX_SUBSET_MCELL = prove (
7042  `!V X e. packing V /\ saturated V /\ mcell_set V X /\ critical_edgeX V X e 
7043            ==> e SUBSET X`,
7044  (REPEAT STRIP_TAC) THEN 
7045  (MATCH_MP_TAC EDGEX_SUBSET_MCELL) THEN 
7046  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]) THEN
7047  (UP_ASM_TAC THEN REWRITE_TAC[critical_edgeX] THEN SET_TAC[]));;
7048
7049 (* ==================================================================== *)
7050 (* Lemma 65 *)
7051
7052 let FINITE_VX = prove_by_refinement (
7053  `!V X. packing V /\ saturated V /\ mcell_set V X  ==> FINITE (VX V X)`,
7054 [(REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
7055  (ASM_CASES_TAC `VX V X = {}`);
7056  (ASM_REWRITE_TAC[FINITE_EMPTY]);
7057  (REWRITE_WITH `VX V X = V INTER X`);
7058  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7059  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]
7060   THEN STRIP_TAC THEN UNDISCH_TAC `~(VX V X = {})` THEN 
7061   ASM_REWRITE_TAC[VX]);
7062  (ASM_CASES_TAC `V INTER (X:real^3->bool) = {}`);
7063  (ASM_REWRITE_TAC[FINITE_EMPTY]);
7064  (REWRITE_WITH 
7065   `(V:real^3->bool) INTER X = set_of_list (truncate_simplex (i-1) ul)`);
7066  (ASM_REWRITE_TAC[]);
7067  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7068  (ASM_REWRITE_TAC[]);
7069  (STRIP_TAC);
7070  (ASM_CASES_TAC `i = 0`);
7071  (NEW_GOAL `F`);
7072  (UNDISCH_TAC `~(V INTER (X:real^3->bool) = {})`);
7073  (ASM_REWRITE_TAC[]);
7074  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7075  (ASM_REWRITE_TAC[]);
7076  (ASM_MESON_TAC[]);
7077  (ASM_ARITH_TAC);
7078  (STRIP_TAC);
7079  (UNDISCH_TAC `~(VX V X = {})` THEN ASM_REWRITE_TAC[VX; NEGLIGIBLE_EMPTY]);
7080  (REWRITE_TAC[FINITE_SET_OF_LIST])]);;
7081
7082 (* ==================================================================== *)
7083 (* Lemma 66 *)
7084
7085 let CARD_EDGEX_LE_16 = prove_by_refinement (
7086  `!V X. packing V /\ saturated V /\ mcell_set V X 
7087            ==> CARD (edgeX V X) <= 16`,
7088 [(REWRITE_TAC[edgeX] THEN REPEAT STRIP_TAC);
7089  (ABBREV_TAC `S = {u, v | VX V X u /\ VX V X v /\ ~(u = v)}`);
7090  (ABBREV_TAC `f = (\(u,v:real^3). {u,v})`);
7091  (MATCH_MP_TAC (ARITH_RULE `(?x:num. y <= x /\ x <= z) ==> y <= z`));
7092  (EXISTS_TAC `CARD (IMAGE (f:(real^3#real^3)->(real^3->bool)) S)`);
7093  (STRIP_TAC);
7094  (MATCH_MP_TAC CARD_SUBSET);
7095  (STRIP_TAC);
7096  (EXPAND_TAC "f" THEN EXPAND_TAC "S" THEN 
7097    REWRITE_TAC[IMAGE; SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
7098  (EXISTS_TAC `u:real^3,v:real^3` THEN ASM_REWRITE_TAC[]);
7099  (EXISTS_TAC `u:real^3` THEN EXISTS_TAC `v:real^3` THEN ASM_REWRITE_TAC[]);
7100  (MATCH_MP_TAC FINITE_IMAGE);
7101  (MATCH_MP_TAC FINITE_SUBSET);
7102  (EXISTS_TAC `{u,v | u IN VX V X /\ v IN VX V X}`);
7103  (STRIP_TAC);
7104  (MATCH_MP_TAC FINITE_PRODUCT);
7105  (REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_VX);
7106  (ASM_REWRITE_TAC[]);
7107  (ASM_SET_TAC[]);
7108
7109  (MATCH_MP_TAC (ARITH_RULE `(?x:num. y <= x /\ x <= z) ==> y <= z`));
7110  (EXISTS_TAC `CARD (S:(real^3#real^3)->bool)`);
7111  (STRIP_TAC);
7112  (MATCH_MP_TAC CARD_IMAGE_LE);
7113  (MATCH_MP_TAC FINITE_SUBSET);
7114  (EXISTS_TAC `{u,v | u IN VX V X /\ v IN VX V X}`);
7115  (STRIP_TAC);
7116  (MATCH_MP_TAC FINITE_PRODUCT);
7117  (REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_VX);
7118  (ASM_REWRITE_TAC[]);
7119  (ASM_SET_TAC[]);
7120
7121  (MATCH_MP_TAC (ARITH_RULE `(?x:num. y <= x /\ x <= z) ==> y <= z`));
7122  (EXISTS_TAC `CARD {u,v | u IN VX V X /\ v IN VX V X}`);
7123  (STRIP_TAC);
7124  (MATCH_MP_TAC CARD_SUBSET);
7125  (STRIP_TAC);
7126  (ASM_SET_TAC[]);
7127  (MATCH_MP_TAC FINITE_PRODUCT);
7128  (REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_VX);
7129  (ASM_REWRITE_TAC[]);
7130  (REWRITE_WITH 
7131    `CARD {u,v | u IN VX V X /\ v IN VX V X} = CARD (VX V X) * CARD (VX V X)`);
7132  (MATCH_MP_TAC CARD_PRODUCT THEN ASM_SIMP_TAC[FINITE_VX]);
7133
7134  (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
7135  (STRIP_TAC);
7136
7137  (ASM_CASES_TAC `VX V X = {}`);
7138  (ASM_REWRITE_TAC[CARD_CLAUSES] THEN ARITH_TAC);
7139  (REWRITE_WITH `VX V X = V INTER X`);
7140  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7141  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]
7142   THEN STRIP_TAC THEN UNDISCH_TAC `~(VX V X = {})` THEN 
7143   ASM_REWRITE_TAC[VX]);
7144  (ASM_CASES_TAC `V INTER (X:real^3->bool) = {}`);
7145  (ASM_REWRITE_TAC[CARD_CLAUSES] THEN ARITH_TAC);
7146  (REWRITE_WITH 
7147   `(V:real^3->bool) INTER X = set_of_list (truncate_simplex (i-1) ul)`);
7148  (ASM_REWRITE_TAC[]);
7149  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7150  (ASM_REWRITE_TAC[]);
7151  (STRIP_TAC);
7152  (ASM_CASES_TAC `i = 0`);
7153  (NEW_GOAL `F`);
7154  (UNDISCH_TAC `~(V INTER (X:real^3->bool) = {})`);
7155  (ASM_REWRITE_TAC[]);
7156  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7157  (ASM_REWRITE_TAC[]);
7158  (ASM_MESON_TAC[]);
7159  (ASM_ARITH_TAC);
7160  (STRIP_TAC);
7161  (UNDISCH_TAC `~(VX V X = {})` THEN ASM_REWRITE_TAC[VX; NEGLIGIBLE_EMPTY]);
7162  (NEW_GOAL `CARD (set_of_list (truncate_simplex (i - 1) ul)) <= 
7163              LENGTH (truncate_simplex (i - 1) (ul:(real^3)list))`);
7164  (REWRITE_TAC[CARD_SET_OF_LIST_LE]);
7165  (UP_ASM_TAC THEN REWRITE_WITH 
7166    `LENGTH (truncate_simplex (i - 1) (ul:(real^3)list)) = (i - 1 + 1)`);
7167  (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
7168  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
7169  (MATCH_MP_TAC BARV_LENGTH_LEMMA);
7170  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7171  (ASM_ARITH_TAC);
7172  (STRIP_TAC);
7173  (ABBREV_TAC 
7174    `s = CARD (set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)))`);
7175  (NEW_GOAL `s <= 4`);
7176  (ASM_ARITH_TAC);
7177  (NEW_GOAL `s * s <= s * 4 /\ s * 4 <= 4 * 4`);
7178  (ASM_REWRITE_TAC[LE_MULT_LCANCEL; LE_MULT_RCANCEL]);
7179  (ASM_ARITH_TAC)]);;
7180
7181 (* ==================================================================== *)
7182 (* Lemma 67 *)
7183 let gamma_y_lmfun_bound2 = prove_by_refinement (
7184  `?d. (!V X e. packing V /\ saturated V /\ mcell_set V X /\ edgeX V X e ==> gammaY V X lmfun e <= d)`,
7185 [
7186  (EXISTS_TAC `pi * h0 / (h0 - &1)`);
7187  (REPEAT STRIP_TAC);
7188  (ABBREV_TAC `f = (\u v. if {u, v} IN edgeX V X
7189                              then dihX V X (u,v) * lmfun (hl [u; v])
7190                           else &0)`);
7191  (REWRITE_WITH `gammaY V X lmfun = (\({u, v}). f u v)`);
7192  (EXPAND_TAC "f" THEN REWRITE_TAC[gammaY]);
7193
7194  (NEW_GOAL `!u v. (f:real^3->real^3->real) u v = f v u`);
7195  (EXPAND_TAC "f" THEN REWRITE_TAC[BETA_THM]);
7196  (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
7197  (REPEAT GEN_TAC THEN COND_CASES_TAC);
7198  (COND_CASES_TAC);
7199  (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
7200  (MATCH_MP_TAC DIHX_SYM);
7201  (ASM_REWRITE_TAC[]);
7202  (UP_ASM_TAC THEN MESON_TAC[]);
7203  (COND_CASES_TAC);
7204  (UP_ASM_TAC THEN MESON_TAC[]);
7205  (REFL_TAC);
7206
7207  (UNDISCH_TAC `edgeX V X e` THEN REWRITE_TAC[IN;IN_ELIM_THM; edgeX]);
7208  (STRIP_TAC);
7209  (ASM_REWRITE_TAC[]);
7210
7211  (REWRITE_WITH `(\({u, v}). f u v) {u, v} = 
7212                              (f:real^3->real^3->real) u v`);
7213  (MATCH_MP_TAC BETA_PAIR_THM);
7214  (ASM_REWRITE_TAC[]);
7215
7216  (EXPAND_TAC "f");
7217  (COND_CASES_TAC);
7218
7219  (NEW_GOAL `dihX V X (u,v) * lmfun (hl [u;v]) <= pi * lmfun (hl [u;v])`);
7220  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
7221  (MATCH_MP_TAC REAL_LE_MUL);
7222  (REWRITE_TAC[lmfun_pos_le; REAL_ARITH `&0 <= a - b <=> b <= a`; DIHX_LE_PI]);
7223
7224  (NEW_GOAL `pi * lmfun (hl [u:real^3;v]) <= pi * h0 / (h0 - &1)`);
7225  (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= (y - x) * a`]);
7226  (MATCH_MP_TAC REAL_LE_MUL);
7227  (REWRITE_TAC[PI_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
7228  (MATCH_MP_TAC lmfun_bounded);
7229  (REWRITE_TAC[HL_2; REAL_ARITH `&0 <= inv (&2) * x <=> &0 <= x`; DIST_POS_LE]);
7230  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7231  (MATCH_MP_TAC REAL_LE_MUL);
7232  (REWRITE_TAC[PI_POS_LE]);
7233  (MATCH_MP_TAC REAL_LE_DIV);
7234  (REWRITE_TAC[h0] THEN REAL_ARITH_TAC)]);;
7235
7236 (* ==================================================================== *)
7237 (* Lemma 68 *)
7238 let BOUND_GAMMA_X_lmfun = prove_by_refinement (
7239  `?c. 
7240   (!V X. packing V /\ saturated V /\ mcell_set V X ==> gammaX V X lmfun <= c)`,
7241 [(MP_TAC gamma_y_lmfun_bound2 THEN STRIP_TAC);
7242  (ABBREV_TAC `e = max d (&0)`);
7243  (EXISTS_TAC `&4 / &3 * pi * (&8) pow 3 + (&8 * mm2 / pi) * &16 * e`);
7244  (REPEAT STRIP_TAC);
7245  (REWRITE_TAC[gammaX]);
7246  (MATCH_MP_TAC (REAL_ARITH 
7247   `a <= x /\ &0 <= b /\ c <= y ==> a - b + c <= x + y`));
7248  (REPEAT STRIP_TAC);
7249  (ASM_CASES_TAC `X:real^3->bool = {}`);
7250  (ASM_REWRITE_TAC[MEASURE_EMPTY; 
7251    REAL_ARITH `&0 <= &4 / &3 * pi * &8 pow 3 <=> &0 <= pi`]);
7252  (REWRITE_TAC[PI_POS_LE]);
7253  (NEW_GOAL `?p:real^3. p IN X`);
7254  (ASM_SET_TAC[]);
7255  (UP_ASM_TAC THEN STRIP_TAC);
7256  (REWRITE_WITH `&4 / &3 * pi * &8 pow 3 = vol (ball (p, &8))`);
7257  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC VOLUME_BALL);
7258  (REAL_ARITH_TAC);
7259  (MATCH_MP_TAC MEASURE_SUBSET);
7260  (REWRITE_TAC[MEASURABLE_BALL]);
7261  (STRIP_TAC);
7262  (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7263  (STRIP_TAC);
7264  (ASM_REWRITE_TAC[]);
7265  (MATCH_MP_TAC MEASURABLE_MCELL);
7266  (ASM_REWRITE_TAC[]);
7267  (MATCH_MP_TAC MCELL_SUBSET_BALL8_2);
7268  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7269  (MATCH_MP_TAC REAL_LE_MUL);
7270  (STRIP_TAC);
7271  (REWRITE_TAC[REAL_ARITH `&0 <= &2 * a <=> &0 <= a`]);
7272  (MATCH_MP_TAC REAL_LE_DIV);
7273  (STRIP_TAC);
7274  (NEW_GOAL `#1.012080 < mm1`);
7275  (REWRITE_TAC[Flyspeck_constants.bounds]);
7276  (ASM_REAL_ARITH_TAC);
7277  (REWRITE_TAC[PI_POS_LE]);
7278  (REWRITE_TAC[total_solid]);
7279  (MATCH_MP_TAC SUM_POS_LE);
7280  (REPEAT STRIP_TAC);
7281  (MATCH_MP_TAC FINITE_VX);
7282  (ASM_REWRITE_TAC[]);
7283  (REWRITE_TAC[sol]);
7284
7285  (NEW_GOAL `eventually_radial (x:real^3) X`);
7286  (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7287  (STRIP_TAC);
7288  (ASM_REWRITE_TAC[]);
7289  (MATCH_MP_TAC Urrphbz2.URRPHBZ2);
7290  (ASM_REWRITE_TAC[]);
7291  (NEW_GOAL `VX V X = V INTER X`);
7292  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7293  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7294  (ASM_REWRITE_TAC[]);
7295  (STRIP_TAC THEN UNDISCH_TAC `x IN VX V X`);
7296  (ASM_REWRITE_TAC[VX] THEN SET_TAC[]);
7297  (ASM_SET_TAC[]);
7298  (UP_ASM_TAC THEN REWRITE_TAC[eventually_radial]);
7299  (STRIP_TAC);
7300
7301  (REWRITE_WITH `sol x X = &3 * vol (X INTER normball x r) / r pow 3`);
7302  (MATCH_MP_TAC sol);
7303  (REWRITE_TAC[GSYM Marchal_cells_2_new.RADIAL_VS_RADIAL_NORM; NORMBALL_BALL]);
7304  (ASM_REWRITE_TAC[]);
7305  (MATCH_MP_TAC MEASURABLE_INTER);
7306  (REWRITE_TAC[MEASURABLE_BALL]);
7307  (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7308  (STRIP_TAC);
7309  (ASM_REWRITE_TAC[]);
7310  (MATCH_MP_TAC MEASURABLE_MCELL);
7311  (ASM_REWRITE_TAC[]);
7312  (REWRITE_TAC[REAL_ARITH `&0 <= &3 * a <=> &0 <= a`]);
7313  (MATCH_MP_TAC REAL_LE_DIV);
7314  (STRIP_TAC);
7315  (MATCH_MP_TAC MEASURE_POS_LE);
7316  (REWRITE_TAC[NORMBALL_BALL]);
7317  (MATCH_MP_TAC MEASURABLE_INTER);
7318  (REWRITE_TAC[MEASURABLE_BALL]);
7319  (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7320  (STRIP_TAC);
7321  (ASM_REWRITE_TAC[]);
7322  (MATCH_MP_TAC MEASURABLE_MCELL);
7323  (ASM_REWRITE_TAC[]);
7324  (MATCH_MP_TAC Real_ext.REAL_PROP_NN_POW);
7325  (ASM_REAL_ARITH_TAC);
7326  (ONCE_REWRITE_TAC[REAL_ARITH `a <= b <=> &0 <= b - a`]);
7327  (REWRITE_TAC[REAL_ARITH `a * x - a * y = a * (x - y)`]);
7328  (MATCH_MP_TAC REAL_LE_MUL);
7329  (STRIP_TAC);
7330
7331  (REWRITE_TAC[REAL_ARITH `&0 <= &8 * a <=> &0 <= a`]);
7332  (MATCH_MP_TAC REAL_LE_DIV);
7333  (STRIP_TAC);
7334  (NEW_GOAL `#0.02541 < mm2`);
7335  (REWRITE_TAC[Flyspeck_constants.bounds]);
7336  (ASM_REAL_ARITH_TAC);
7337  (REWRITE_TAC[PI_POS_LE]);
7338  (REWRITE_TAC[GSYM gammaY]);
7339  (ONCE_REWRITE_TAC[REAL_ARITH `&0 <= b - a <=> a <= b`]);
7340  (NEW_GOAL `sum (edgeX V X) (gammaY V X lmfun) <= 
7341              sum (edgeX V X) (\x. e)`);
7342  (MATCH_MP_TAC SUM_LE);
7343  (REWRITE_TAC[Upfzbzm_support_lemmas.FINITE_edgeX]);
7344  (REPEAT STRIP_TAC);
7345  (NEW_GOAL `gammaY V X lmfun x <= d`);
7346  (FIRST_ASSUM MATCH_MP_TAC);
7347  (ASM_REWRITE_TAC[]);
7348  (UP_ASM_TAC THEN REWRITE_TAC[IN]);
7349  (ASM_REAL_ARITH_TAC);
7350
7351  (NEW_GOAL `sum (edgeX V X) (\x. e) <= &16 * e`);
7352  (REWRITE_WITH `sum (edgeX V X) (\x. e) = &(CARD (edgeX V X)) * e`);
7353  (MATCH_MP_TAC SUM_CONST);
7354  (REWRITE_TAC[Upfzbzm_support_lemmas.FINITE_edgeX]);
7355
7356  (ONCE_REWRITE_TAC[REAL_ARITH `a <= b <=> &0 <= b - a`]);
7357  (REWRITE_TAC[REAL_ARITH `a * x - b * x = x * (a - b)`]);
7358  (MATCH_MP_TAC REAL_LE_MUL);
7359  (STRIP_TAC);
7360  (ASM_REAL_ARITH_TAC);
7361  (ONCE_REWRITE_TAC[REAL_ARITH `&0 <= b - a <=> a <= b`]);
7362  (REWRITE_TAC[REAL_OF_NUM_LE]);
7363  (MATCH_MP_TAC CARD_EDGEX_LE_16);
7364  (ASM_REWRITE_TAC[]);
7365  (ASM_REAL_ARITH_TAC)]);;
7366
7367 (* ==================================================================== *)
7368 (* Lemma 69 *)
7369 (* ==================================================================== *)
7370 (* Lemma 70 *)
7371 (* ==================================================================== *)
7372 (* Lemma 71 *)
7373
7374
7375
7376 end;;