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