Update from HH
[Flyspeck/.git] / text_formalization / packing / GRUTOTI.hl
1 (* ========================================================================= *)
2 (*                FLYSPECK - BOOK FORMALIZATION                              *)
3 (*                                                                           *)
4 (*      Authour   : VU KHAC KY                                               *)
5 (*      Book lemma: GRUTOTI                                                  *)
6 (*      Chaper    : Packing                                                  *)
7 (*      Date    : March 14, 2012                                             *)
8 (*                                                                           *)
9 (* ========================================================================= *)
10 (*                                                                           *)
11 (* flyspeck_needs "packing/marchal_cells_3.hl";;                             *)
12 (*                                                                           *)
13 (* ========================================================================= *)
14
15 module Grutoti = struct
16
17 open Sphere;;
18 open Euler_main_theorem;;
19 open Pack_defs;;
20 open Pack_concl;; 
21 open Pack1;;
22 open Pack2;;
23 open Packing3;;
24 open Rogers;; 
25 open Vukhacky_tactics;;
26 open Marchal_cells;;
27 open Emnwuus;;
28 (* open Marchal_cells_2;; *)
29 open Marchal_cells_2_new;;
30 open Urrphbz1;;
31 open Lepjbdj;;
32 open Hdtfnfz;;
33 open Rvfxzbu;;
34 open Sltstlo;;
35 open Urrphbz2;;
36 open Urrphbz3;;
37 open Ynhyjit;;
38 open Njiutiu;;
39 open Tezffsk;;
40 open Qzksykg;;
41 open Ddzuphj;;
42 open Ajripqn;;
43 open Qzyzmjc;;
44 open Upfzbzm_support_lemmas;;
45
46   open Marchal_cells_3;;
47
48 let GRUTOTI1_concl = 
49 `!V u0 u1 e.
50      saturated V /\
51      packing V /\
52      u0 IN V /\
53      u1 IN V /\
54      ~(u0 = u1) /\
55      hl [u0;u1] < sqrt (&2) /\
56      e = {u0, u1}
57      ==> sum {X | mcell_set V X /\ e IN edgeX V X } (\t. dihX V t (u0,u1)) =
58          &2 * pi`;;
59
60 let GRUTOTI = prove_by_refinement (GRUTOTI1_concl,
61 [(REPEAT STRIP_TAC);
62  (NEW_GOAL `barV V 1 [u0;u1:real^3]`);
63  (MATCH_MP_TAC HL_LE_SQRT2_IMP_BARV_1);
64  (ASM_REWRITE_TAC[]);
65  (NEW_GOAL 
66   `{k | k IN 1..3 /\
67         voronoi_list V [u0;u1:real^3] =
68         UNIONS
69           {convex hull
70           ({omega_list_n V vl i | i IN 1..k - 1} UNION
71             voronoi_list V vl) | vl | barV V k vl /\
72                                       truncate_simplex 1 vl = [u0;u1]}} =
73              1..3`);
74  (MATCH_MP_TAC Rogers.GLTVHUM_lemma1);
75  (ASM_REWRITE_TAC[] THEN ARITH_TAC);
76  (NEW_GOAL 
77  `3 IN {k | k IN 1..3 /\
78           voronoi_list V [u0; u1] =
79           UNIONS
80           {convex hull
81          ({omega_list_n V vl i | i IN 1..k - 1} UNION voronoi_list V vl) | vl | 
82           barV V k vl /\
83           truncate_simplex 1 vl = [u0; u1]}}`);
84  (ASM_REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC);
85  (UP_ASM_TAC THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
86  (REWRITE_WITH 
87    `UNIONS
88    {convex hull ({omega_list_n V vl i | i IN 1..3 - 1} UNION voronoi_list V vl)      | vl | barV V 3 vl /\
89            truncate_simplex 1 vl = [u0; u1]} = 
90    UNIONS {convex hull {omega_list_n V vl 1, omega_list_n V vl 2, 
91            omega_list_n V vl 3} | vl | barV V 3 vl /\
92                                        truncate_simplex 1 vl = [u0; u1]}`);
93  (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);
94  (REWRITE_TAC[IN_UNIONS] THEN ONCE_REWRITE_TAC[IN] THEN 
95    REWRITE_TAC[IN_ELIM_THM]);
96  (REPEAT STRIP_TAC);
97  (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);
98  (EXISTS_TAC `vl:(real^3)list`);
99  (ASM_REWRITE_TAC[]);
100  (NEW_GOAL `?a. voronoi_list V vl = {a} /\
101                     a = circumcenter (set_of_list vl) /\
102                     hl vl = dist (HD vl,a)`);
103  (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);
104  (ASM_REWRITE_TAC[]);
105  (UP_ASM_TAC THEN STRIP_TAC);
106
107  (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);
108  (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
109  (REWRITE_TAC[OMEGA_LIST]);
110  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
111                  CARD (set_of_list vl) = 3 + 1`);
112  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
113  (EXISTS_TAC `V:real^3->bool`);
114  (ASM_REWRITE_TAC[]);
115  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
116  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
117  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
118  (NEW_GOAL `omega_list_n V vl 3 = a`);
119  (ASM_SET_TAC[]);
120  (ASM_REWRITE_TAC[]);
121  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG; 
122    ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);
123  (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} = 
124                  {omega_list_n V vl 1,omega_list_n V vl 2}`);
125  (SET_TAC[]);
126  (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
127    {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2,      circumcenter (set_of_list vl)}`);
128  (SET_TAC[]);
129
130  (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);
131  (EXISTS_TAC `vl:(real^3)list`);
132  (ASM_REWRITE_TAC[]);
133  (NEW_GOAL `?a. voronoi_list V vl = {a} /\
134                     a = circumcenter (set_of_list vl) /\
135                     hl vl = dist (HD vl,a)`);
136  (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);
137  (ASM_REWRITE_TAC[]);
138  (UP_ASM_TAC THEN STRIP_TAC);
139
140  (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);
141  (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
142  (REWRITE_TAC[OMEGA_LIST]);
143  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
144                  CARD (set_of_list vl) = 3 + 1`);
145  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
146  (EXISTS_TAC `V:real^3->bool`);
147  (ASM_REWRITE_TAC[]);
148  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
149  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
150  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
151  (NEW_GOAL `omega_list_n V vl 3 = a`);
152  (ASM_SET_TAC[]);
153  (ASM_REWRITE_TAC[]);
154  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG; 
155    ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);
156  (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} = 
157                  {omega_list_n V vl 1,omega_list_n V vl 2}`);
158  (SET_TAC[]);
159  (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
160    {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2,
161     circumcenter (set_of_list vl)}`);
162  (SET_TAC[]);
163  (STRIP_TAC);
164
165 (* ======================================================================= *)
166
167  (ABBREV_TAC `p = circumcenter {u0, u1:real^3}`);
168  (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0;u1]) = &3`);
169  (REWRITE_TAC[AFF_DIM_INSERT]);
170  (COND_CASES_TAC);
171  (NEW_GOAL `F`);
172
173  (NEW_GOAL `affine hull voronoi_list V [u0; u1] SUBSET 
174    affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);
175  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
176  (REWRITE_TAC[VORONOI_LIST; set_of_list; Packing3.VORONOI_SET_2]);
177  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
178  (ASM_SIMP_TAC[Pack2.INTER_VORONOI_SUBSET_BISECTOR]);
179  (NEW_GOAL 
180   `affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2} = 
181    {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);
182  (REWRITE_TAC[AFFINE_HULL_EQ]);
183  (REWRITE_TAC[AFFINE_HYPERPLANE]);
184  (NEW_GOAL 
185  `~(u0 IN {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2})`);
186  (REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
187  (ONCE_REWRITE_TAC [REAL_ARITH `a = b <=> a - b = &0`]);
188  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 - (u0 dot u0 - u1 dot u1) = 
189                 (u0 - u1) dot (u0 - u1)`]);
190  (REWRITE_TAC[DOT_EQ_0] THEN ASM_NORM_ARITH_TAC);
191  (ASM_SET_TAC[]);
192  (ASM_MESON_TAC[]);
193  (REWRITE_TAC[ARITH_RULE `a + &1 = b:int <=> a = b - &1`]);
194  (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
195  (ASM_REWRITE_TAC[]);
196
197  (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0; u1]) = &(dimindex (:3))`);
198  (ASM_REWRITE_TAC[DIMINDEX_3]);
199  (UP_ASM_TAC THEN REWRITE_TAC[AFF_DIM_EQ_FULL]);
200  (STRIP_TAC);
201
202  (ABBREV_TAC `S = voronoi_list V [u0;u1]`);
203  (NEW_GOAL `!x. x IN S ==> (x - u0) dot (u1 - u0) = 
204                             dist (p, u0) * dist (u1, u0:real^3)`);
205  (REPEAT STRIP_TAC);
206  (NEW_GOAL `p = inv (&2) % (u0 + (u1:real^3))`);
207  (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);
208  (REWRITE_TAC[dist]);
209  (REWRITE_WITH `u1 - u0 = &2 % (p - u0:real^3)`);
210  (ASM_REWRITE_TAC[]);
211  (VECTOR_ARITH_TAC);
212  (REWRITE_TAC[NORM_MUL; REAL_ARITH `abs (&2) = &2`;
213    REAL_ARITH `a * b * a = b * a pow 2`; NORM_POW_2; DOT_RMUL]);
214  (REWRITE_WITH `(x - u0) dot (p - u0:real^3) = 
215                  (p - u0) dot (p - u0) - (x - p) dot (u0 - p)`);
216  (VECTOR_ARITH_TAC);
217  (REWRITE_WITH `(x - p) dot (u0 - p:real^3) = &0`);
218  (EXPAND_TAC "p");
219  (REWRITE_WITH `{u0, u1} = set_of_list [u0; u1:real^3]`);
220  (REWRITE_TAC[set_of_list]);
221  (MATCH_MP_TAC Rogers.MHFTTZN4);
222  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
223  (REPEAT STRIP_TAC);
224  (ASM_REWRITE_TAC[]);
225  (ASM_REWRITE_TAC[]);
226  (NEW_GOAL `S SUBSET affine hull voronoi_list V [u0; u1]`);
227  (EXPAND_TAC "S");
228  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
229  (ASM_SET_TAC[]);
230  (REWRITE_TAC[set_of_list]);
231  (NEW_GOAL `{u0,u1} SUBSET affine hull {u0,u1:real^3}`);
232  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
233  (ASM_SET_TAC[]);
234  (REAL_ARITH_TAC);
235
236 (* ========================================================================= *)
237
238  (ABBREV_TAC `S1 = {x:real^3 | &2 % (u0 - u1) dot x = 
239                                 norm u0 pow 2 - norm u1 pow 2}`);
240  (ABBREV_TAC `S2:real^3->bool = (S1 DIFF (relative_interior S))`);
241  (NEW_GOAL `closed_in (subtopology euclidean (S1:real^3->bool)) S2`);
242  (EXPAND_TAC "S2");
243  (MATCH_MP_TAC CLOSED_IN_DIFF);
244  (STRIP_TAC);
245  (NEW_GOAL `closed (S1:real^3->bool)`);
246  (EXPAND_TAC "S1" THEN REWRITE_TAC[CLOSED_HYPERPLANE]);
247  (MATCH_MP_TAC CLOSED_SUBSET);
248  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
249
250  (REWRITE_WITH `S1 = affine hull (S:real^3->bool)`);
251  (EXPAND_TAC "S");
252  (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
253  (REWRITE_TAC[AFFINE_HULL_EQ]);
254  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
255  (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);
256  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
257  (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);
258  (STRIP_TAC);
259  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
260    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
261  (DEL_TAC THEN EXPAND_TAC "S1");
262  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
263  (ASM_REWRITE_TAC[]);
264  (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);
265  (DEL_TAC THEN EXPAND_TAC "S1");
266  (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
267  (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);
268  (ASM_REWRITE_TAC[]);
269  (REWRITE_TAC[DIMINDEX_3]);
270  (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);
271  (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
272  (ASM_REWRITE_TAC[]);
273  (ARITH_TAC);
274
275  (REWRITE_TAC[OPEN_IN_RELATIVE_INTERIOR]);
276
277  (NEW_GOAL `closed (S2:real^3->bool)`);
278  (MATCH_MP_TAC CLOSED_IN_CLOSED_TRANS);
279  (EXISTS_TAC `S1:real^3->bool`);
280  (ASM_REWRITE_TAC[]);
281  (EXPAND_TAC "S1");
282  (REWRITE_TAC[CLOSED_HYPERPLANE]);
283
284
285  (NEW_GOAL `~(S2:real^3->bool = {})`);
286  (EXPAND_TAC "S2");
287  (REWRITE_TAC [SET_RULE `A DIFF B = {} <=> A SUBSET B`]);
288  (REPEAT STRIP_TAC);
289  (NEW_GOAL `S1 SUBSET S:real^3->bool`);
290  (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);
291  (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);
292  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
293
294  (NEW_GOAL `S1 = S:real^3->bool`);
295  (NEW_GOAL `S SUBSET S1:real^3->bool`);
296  (EXPAND_TAC "S");
297  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
298    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
299  (EXPAND_TAC "S1");
300  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
301  (ASM_REWRITE_TAC[]);
302  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
303
304  (NEW_GOAL `bounded (S1:real^3->bool)`);
305  (REWRITE_TAC[ASSUME `S1 = S:real^3->bool`]);
306  (DEL_TAC THEN EXPAND_TAC "S");
307  (MATCH_MP_TAC Packing3.BOUNDED_VORONOI_LIST);
308  (EXISTS_TAC `1`);
309  (ASM_REWRITE_TAC[]);
310  
311  (NEW_GOAL `~bounded (S1:real^3->bool)`);
312  (EXPAND_TAC "S1");
313  (MATCH_MP_TAC UNBOUNDED_HYPERPLANE);
314  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) = vec 0 <=> u0 = u1`]);
315  (ASM_REWRITE_TAC[]);
316  (ASM_MESON_TAC[]);
317
318  (NEW_GOAL `?z:real^3. z IN S2 /\ 
319                 (!w. w IN S2 ==> dist (u0,z) <= dist (u0,w))`);
320  (MATCH_MP_TAC DISTANCE_ATTAINS_INF);
321  (ASM_REWRITE_TAC[]);
322  (UP_ASM_TAC THEN STRIP_TAC);
323
324 (* ======================================================================== *)
325
326  (ABBREV_TAC `a = dist (p, u0:real^3) / dist (z, u0)`);
327  (NEW_GOAL `&0 < a /\ a < &1`);
328  (EXPAND_TAC "a");
329  (NEW_GOAL `~(u0:real^3 IN S1)`);
330  (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
331  (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);
332  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 = 
333   (u0 - u1) dot (u0 - u1)`]);
334  (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
335  (ASM_REWRITE_TAC[]);
336  (NEW_GOAL `&0 < dist (p,u0:real^3)`);
337  (MATCH_MP_TAC DIST_POS_LT);
338  (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);
339  (REWRITE_TAC[VECTOR_ARITH `inv (&2) % (u0 + u1) = u0 <=> u0 = u1`]);
340  (ASM_REWRITE_TAC[]);
341  (NEW_GOAL `&0 < dist (z,u0:real^3)`);
342  (MATCH_MP_TAC DIST_POS_LT);
343  (STRIP_TAC);
344  (NEW_GOAL `z:real^3 IN S1`);
345  (ASM_SET_TAC[]);
346  (ASM_MESON_TAC[]);
347  (STRIP_TAC);
348  (MATCH_MP_TAC REAL_LT_DIV);
349  (ASM_REWRITE_TAC[]);
350  (REWRITE_WITH 
351   `dist (p,u0) / dist (z,u0:real^3) < &1 <=> dist (p,u0) < &1 * dist (z,u0)`);
352  (ASM_SIMP_TAC[REAL_LT_LDIV_EQ]);
353  (REWRITE_TAC[REAL_MUL_LID]);
354  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LT);
355  (REPEAT STRIP_TAC);
356  (ASM_REAL_ARITH_TAC);
357  (ASM_REAL_ARITH_TAC);
358  (REWRITE_TAC[dist]);
359  (REWRITE_WITH `norm (z - u0:real^3) pow 2 = 
360                  norm (p - u0) pow 2 + norm (z - p) pow 2`);
361  (MATCH_MP_TAC PYTHAGORAS);
362  (REWRITE_TAC[orthogonal]);
363  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
364  (ASM_REWRITE_TAC[set_of_list]);
365  (ONCE_REWRITE_TAC[DOT_SYM]);
366  (MATCH_MP_TAC Rogers.MHFTTZN4);
367  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
368  (REPEAT STRIP_TAC);
369  (ASM_REWRITE_TAC[]);
370  (ASM_REWRITE_TAC[]);
371
372  (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);
373  (REWRITE_WITH `affine hull (S:real^3->bool) = S1`);
374  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
375  (EXPAND_TAC "S");
376  (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
377  (REWRITE_TAC[AFFINE_HULL_EQ]);
378  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
379  (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);
380  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
381  (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);
382  (STRIP_TAC);
383  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
384    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
385  (DEL_TAC THEN EXPAND_TAC "S1");
386  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
387  (ASM_REWRITE_TAC[]);
388  (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);
389  (DEL_TAC THEN EXPAND_TAC "S1");
390  (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
391  (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);
392  (ASM_REWRITE_TAC[]);
393  (REWRITE_TAC[DIMINDEX_3]);
394  (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);
395  (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
396  (ASM_REWRITE_TAC[]);
397  (ARITH_TAC);
398  (ASM_SET_TAC[]);
399  (REWRITE_TAC[set_of_list]);
400  (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);
401  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
402  (ASM_SET_TAC[]);
403  (REWRITE_TAC[REAL_ARITH `a < a + b <=> &0 < b`; NORM_POW_2; DOT_POS_LT]);
404  (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
405  (STRIP_TAC);
406  (NEW_GOAL `~(z:real^3 IN S2)`);
407  (REWRITE_TAC[ASSUME `z = p:real^3`]);
408  (EXPAND_TAC "S2");
409  (NEW_GOAL `p:real^3 IN relative_interior S`);
410
411
412
413  (ABBREV_TAC `B = V INTER ball (p:real^3, &8)`);
414  (ABBREV_TAC `A = B DIFF {u0, u1:real^3}`);
415  (NEW_GOAL `FINITE (A:real^3->bool)`);
416  (EXPAND_TAC "A");
417  (MATCH_MP_TAC FINITE_DIFF);
418  (EXPAND_TAC "B");
419  (MATCH_MP_TAC Packing3.KIUMVTC THEN ASM_REWRITE_TAC[]);
420  (NEW_GOAL `?y. dist (p,y:real^3) = &4`);
421  (MATCH_MP_TAC VECTOR_CHOOSE_DIST);
422  (REAL_ARITH_TAC);
423  (UP_ASM_TAC THEN STRIP_TAC);
424  (UNDISCH_TAC `saturated (V:real^3->bool)`);
425  (REWRITE_TAC[saturated] THEN STRIP_TAC);
426  (NEW_GOAL `?z. z IN V /\ dist (y:real^3, z) < &2`);
427  (ASM_REWRITE_TAC[]);
428  (UP_ASM_TAC THEN STRIP_TAC);
429
430  (NEW_GOAL `z':real^3 IN A`);
431  (EXPAND_TAC "A" THEN EXPAND_TAC "B");
432  (REWRITE_TAC[IN_DIFF; IN_INTER; IN_BALL]);
433  (REPEAT STRIP_TAC);
434  (ASM_REWRITE_TAC[]);
435
436  (NEW_GOAL `dist (p,z') <= dist (p, y) + dist (y, z':real^3)`);
437  (REWRITE_TAC[DIST_TRIANGLE]);
438  (ASM_REAL_ARITH_TAC);
439  (NEW_GOAL `dist (p, y) <= dist (p, z') + dist (z', y:real^3)`);
440  (REWRITE_TAC[DIST_TRIANGLE]);
441  (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);
442  (STRIP_TAC);
443  (NEW_GOAL `&2 < dist (z', p:real^3)`);
444  (ASM_REAL_ARITH_TAC);
445  (UP_ASM_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);
446  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
447  (ASM_MESON_TAC[set_of_list]);
448  (NEW_GOAL `(!w. w IN set_of_list [u0;u1:real^3]
449                ==> dist (circumcenter (set_of_list [u0;u1]),w) = hl [u0;u1])`);
450  (MATCH_MP_TAC Rogers.HL_PROPERTIES);
451  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
452  (ASM_REWRITE_TAC[]);
453
454  (REWRITE_WITH `dist (circumcenter (set_of_list [u0; u1:real^3]),z') = 
455    hl [u0; u1]`);
456  (FIRST_ASSUM MATCH_MP_TAC);
457  (ASM_REWRITE_TAC[set_of_list]);
458  (NEW_GOAL `sqrt (&2) <= &2`);
459  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
460  (SIMP_TAC[REAL_ARITH `&0 <= &2`; SQRT_POS_LE; SQRT_POW_2]);
461  (REAL_ARITH_TAC);
462  (ASM_REAL_ARITH_TAC);
463
464  (NEW_GOAL `?a:real^3. a IN A /\ (!x. x IN A ==> dist (p,a) <= dist (p,x))`);
465  (MATCH_MP_TAC Packing3.REAL_FINITE_ARGMIN);
466  (ASM_REWRITE_TAC[]);
467  (UP_ASM_TAC THEN SET_TAC[]);
468  (UP_ASM_TAC THEN STRIP_TAC);
469
470
471  (ABBREV_TAC `d = inv (&4) * (dist (p, a') - dist (p, u0:real^3))`);
472  (NEW_GOAL `&0 < d`);
473  (EXPAND_TAC "d");
474  (MATCH_MP_TAC REAL_LT_MUL);
475  (STRIP_TAC);
476  (REAL_ARITH_TAC);
477  (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> a > b`]);
478  (ONCE_REWRITE_TAC[DIST_SYM]);
479  (NEW_GOAL `!u v. u IN {u0,u1} /\ v IN V DIFF {u0,u1} ==> 
480                    dist (v,p) > dist (u,p:real^3)`);
481  (MATCH_MP_TAC Rogers.XYOFCGX);
482  (REPEAT STRIP_TAC);
483  (ASM_REWRITE_TAC[]);
484  (ASM_SET_TAC[]);
485  (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_INDEPENDENT_2]);
486  (ASM_MESON_TAC[set_of_list]);
487  (REWRITE_WITH `radV {u0, u1:real^3} = hl [u0;u1]`);
488  (REWRITE_TAC[HL;set_of_list]);
489  (ASM_REWRITE_TAC[]);
490  (FIRST_ASSUM MATCH_MP_TAC);
491  (ASM_SET_TAC[]);
492
493  (REWRITE_TAC[relative_interior; IN; IN_ELIM_THM]);
494  (ABBREV_TAC `St = S INTER ball (p:real^3, d)`);
495  (EXISTS_TAC `St:real^3->bool`);
496  (REPEAT STRIP_TAC);
497
498  (REWRITE_TAC[open_in]);
499  (REPEAT STRIP_TAC);
500  (NEW_GOAL `S SUBSET affine hull (S:real^3->bool)`);
501  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
502  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
503  (EXISTS_TAC `d - dist (p:real^3, x)`);
504  (REPEAT STRIP_TAC);
505  (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);
506  (REWRITE_TAC[GSYM IN_BALL]);
507  (ASM_SET_TAC[]);
508  (EXPAND_TAC "St");
509  (REWRITE_TAC[IN_INTER]);
510  (STRIP_TAC);
511
512
513  (NEW_GOAL `dist (x',x:real^3) < d`);
514  (NEW_GOAL `&0 <= dist (p,x:real^3)`);
515  (REWRITE_TAC[DIST_POS_LE]);
516  (ASM_REAL_ARITH_TAC);
517
518  (NEW_GOAL `x' IN voronoi_closed V (u0:real^3)`);
519  (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
520  (REPEAT STRIP_TAC);
521
522  (ASM_CASES_TAC `w IN {u0, u1:real^3}`);
523  (ASM_CASES_TAC `w = u0:real^3`);
524  (REWRITE_TAC[ASSUME `w = u0:real^3`]);
525  (REAL_ARITH_TAC);
526  (NEW_GOAL `w = u1:real^3`);
527  (ASM_SET_TAC[]);
528  (REWRITE_TAC[ASSUME `w = u1:real^3`]);
529  (MATCH_MP_TAC (REAL_ARITH `a = b ==> a <= b`));
530
531  (NEW_GOAL `x':real^3 IN S1`);
532  (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
533  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
534  (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM 
535   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
536   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
537  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
538  (ASM_REWRITE_TAC[]);
539  (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);
540  (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);
541  (REWRITE_TAC[AFFINE_HULL_EQ]);
542  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
543  (ASM_SET_TAC[]);
544
545  (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);
546  (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);
547  (REWRITE_TAC[
548    VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) = 
549                 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);
550  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);
551  (STRIP_TAC);
552  (REWRITE_TAC[DIST_EQ]);
553  (ONCE_REWRITE_TAC[DIST_SYM]);
554  (ASM_REWRITE_TAC[]);
555
556  (NEW_GOAL `dist (x', u0:real^3) <= dist (x', x) + dist (x, u0)`);
557  (REWRITE_TAC[DIST_TRIANGLE]);
558  (NEW_GOAL `dist (x, u0:real^3) <= dist (x, p:real^3) + dist (p, u0)`);
559  (REWRITE_TAC[DIST_TRIANGLE]);
560  (NEW_GOAL `dist (x,p:real^3) < d`);
561  (NEW_GOAL `x IN ball (p:real^3, d)`);
562  (ASM_SET_TAC[]);
563  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
564  (REWRITE_TAC[DIST_SYM]);
565  (NEW_GOAL `dist (x',u0) < &2 * d + dist (p:real^3,u0)`);
566  (ASM_REAL_ARITH_TAC);
567
568  (NEW_GOAL `dist (p, w:real^3)- &2 * d <= dist (x',w)`);
569  (NEW_GOAL `dist (x, w:real^3) <= dist (x, x') + dist (x', w)`);
570  (REWRITE_TAC[DIST_TRIANGLE]);
571  (NEW_GOAL `dist (p, w:real^3) <= dist (p, x) + dist (x, w)`);
572  (REWRITE_TAC[DIST_TRIANGLE]);
573  (NEW_GOAL `dist (x, x':real^3) < d /\ dist (p, x:real^3) < d`);
574  (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
575  (ASM_REAL_ARITH_TAC);
576  (NEW_GOAL `dist (p, u0) + &4 * d <= dist (p, w:real^3)`);
577  (EXPAND_TAC "d");
578  (REWRITE_TAC[REAL_ARITH `&4 * inv (&4) * a = a`]);
579  (REWRITE_TAC[REAL_ARITH `a + b - a = b`]);
580
581  (ASM_CASES_TAC `w:real^3 IN B`);
582  (FIRST_ASSUM MATCH_MP_TAC);
583  (ASM_SET_TAC[]);
584  (NEW_GOAL `~(dist (p,w:real^3) < &8)`);
585  (REWRITE_TAC[GSYM IN_BALL]);
586  (ASM_SET_TAC[]);
587  (NEW_GOAL `dist (p,a':real^3) < &8`);
588  (REWRITE_TAC[GSYM IN_BALL]);
589  (ASM_SET_TAC[]);
590  (ASM_REAL_ARITH_TAC);
591  (ASM_REAL_ARITH_TAC);
592
593
594  (NEW_GOAL `x' IN voronoi_closed V (u1:real^3)`);
595  (NEW_GOAL `x':real^3 IN S1`);
596  (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
597  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
598  (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM 
599   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
600   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
601  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
602  (ASM_REWRITE_TAC[]);
603  (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);
604  (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);
605  (REWRITE_TAC[AFFINE_HULL_EQ]);
606  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
607  (ASM_SET_TAC[]);
608
609  (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);
610  (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);
611  (REWRITE_TAC[
612    VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) = 
613                 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);
614  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);
615  (STRIP_TAC);
616  (UNDISCH_TAC `x' IN voronoi_closed V (u0:real^3)`);
617  (REWRITE_TAC[voronoi_closed; IN_ELIM_THM; IN]);
618  (REPEAT STRIP_TAC);
619  (REWRITE_WITH `dist (x', u1)= dist (x', u0:real^3)`);
620  (ONCE_REWRITE_TAC[DIST_SYM]);
621  (ASM_REWRITE_TAC[DIST_EQ]);
622  (ASM_SIMP_TAC[]);
623
624  (REWRITE_TAC[GSYM 
625   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
626   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
627  (ASM_REWRITE_TAC[IN_INTER]);
628
629  (REWRITE_TAC[IN_BALL]);
630  (NEW_GOAL `dist (p,x':real^3) <= dist (p,x) + dist (x, x':real^3)`);
631  (REWRITE_TAC[DIST_TRIANGLE]);
632  (NEW_GOAL `dist (x,x':real^3) = dist (x',x)`);
633  (REWRITE_TAC[DIST_SYM]);
634  (ASM_REAL_ARITH_TAC);
635  (REWRITE_WITH `St p <=> p:real^3 IN St`);
636  (REWRITE_TAC[IN]);
637  (EXPAND_TAC "St" THEN REWRITE_TAC[IN_INTER; IN_BALL; DIST_REFL]);
638  (STRIP_TAC);
639  (REWRITE_WITH `p = omega_list V [u0; u1]`);
640  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
641  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
642  (ASM_MESON_TAC[set_of_list]);
643  (MATCH_MP_TAC Rogers.XNHPWAB1);
644  (EXISTS_TAC `1`);
645  (ASM_REWRITE_TAC[IN]);
646  (REWRITE_TAC[GSYM (ASSUME `voronoi_list V [u0;u1] = S`)]);
647  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
648  (EXISTS_TAC `1` THEN ASM_REWRITE_TAC[]);
649  (ASM_REWRITE_TAC[]);
650  (UP_ASM_TAC THEN SET_TAC[]);
651  (UP_ASM_TAC THEN SET_TAC[]);
652  (ASM_MESON_TAC[]);
653
654 (* ======================================================================== *)
655
656  (NEW_GOAL `?b. &0 < b /\ b < &1 /\ 
657                   rcone_gt u0 u1 b SUBSET aff_ge_alt {u0:real^3} S`);
658
659  (EXISTS_TAC `a:real`);
660  (REPEAT STRIP_TAC);
661  (ASM_REWRITE_TAC[]);
662  (ASM_REWRITE_TAC[]);
663  (REWRITE_TAC[SET_RULE `A SUBSET B <=> (!x. ~(x IN B) ==> ~(x IN A))`]);
664  (REPEAT STRIP_TAC);
665  (NEW_GOAL `x:real^3 IN affine hull (u0 INSERT S)`);
666  (ASM_SET_TAC[]);
667  (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);
668  (REPEAT STRIP_TAC);
669
670  (ABBREV_TAC `h = sum (s DELETE u0:real^3) u`);
671  (NEW_GOAL `(x - u0) dot (u1 - u0:real^3) = 
672               h * dist (p, u0) * dist (u1, u0:real^3)`);
673  (EXPAND_TAC "x");
674  (NEW_GOAL `u0 = vsum s (\v:real^3. (u:real^3->real) v % (u0:real^3))`);
675  (ASM_SIMP_TAC[VSUM_RMUL]);
676  (VECTOR_ARITH_TAC);
677  (REWRITE_WITH `vsum (s:real^3->bool) (\v. u v % v) - u0:real^3 = 
678                  vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0)`);
679  (ASM_REWRITE_TAC[]);
680  (UP_ASM_TAC THEN MESON_TAC[]);
681  (REWRITE_WITH `vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0:real^3) = 
682                  vsum s (\x. (\v. u v % v) x - (\v. u v % u0) x)`);
683  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
684  (MATCH_MP_TAC VSUM_SUB);
685  (ASM_REWRITE_TAC[]);
686  (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`]);
687  (REWRITE_WITH `vsum s (\x:real^3. u x % (x - u0)) dot (u1 - u0) = 
688                  sum s (\x. (\x. u x % (x - u0)) x dot (u1 - u0:real^3))`);
689  (ASM_SIMP_TAC[DOT_LSUM]);
690  (REWRITE_TAC[DOT_LMUL]);
691  (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) = 
692    sum (s DELETE u0) (\x. u x * (dist (p,u0) * dist (u1,u0)))`);
693  (ASM_CASES_TAC `u0:real^3 IN s`);
694  (NEW_GOAL `s = u0 INSERT (s DELETE u0:real^3)`);
695  (ASM_SET_TAC[]);
696  (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
697  (MATCH_MP_TAC FINITE_SUBSET);
698  (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
699
700  (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) = 
701    sum (u0 INSERT (s DELETE u0))  (\x. u x * ((x - u0) dot (u1 - u0)))`);
702  (ASM_MESON_TAC[]);
703  (ABBREV_TAC `f = (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3)))`);
704  (REWRITE_WITH `sum (u0:real^3 INSERT (s DELETE u0)) f = 
705          (if u0 IN (s DELETE u0) then sum (s DELETE u0) f 
706           else f u0 + sum (s DELETE u0) f)`);
707  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
708  (ASM_REWRITE_TAC[]);
709  (COND_CASES_TAC);
710  (NEW_GOAL `F`);
711  (ASM_SET_TAC[]);
712  (ASM_MESON_TAC[]);
713  (REWRITE_WITH `f (u0:real^3) = &0`);
714  (EXPAND_TAC "f");
715  (REWRITE_TAC[VECTOR_ARITH `(u0 - u0) dot (u1 - u0) = &0`]);
716  (REAL_ARITH_TAC);
717  (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
718  (MATCH_MP_TAC SUM_EQ);
719  (EXPAND_TAC "f");
720  (REPEAT STRIP_TAC);
721  (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);
722  (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);
723  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);
724  (FIRST_ASSUM MATCH_MP_TAC);
725  (ASM_SET_TAC[]);
726  (ASM_REWRITE_TAC[]);
727  (REAL_ARITH_TAC);
728  (REWRITE_WITH `s DELETE u0:real^3 = s`);
729  (ASM_SET_TAC[]);
730  (MATCH_MP_TAC SUM_EQ);
731  (REPEAT STRIP_TAC);
732  (REWRITE_TAC[]);
733  (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);
734  (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);
735  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);
736  (FIRST_ASSUM MATCH_MP_TAC);
737  (ASM_SET_TAC[]);
738  (ASM_REWRITE_TAC[]);
739  (REAL_ARITH_TAC);
740  (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
741  (MATCH_MP_TAC FINITE_SUBSET);
742  (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
743  (ASM_SIMP_TAC[SUM_RMUL]);
744
745  (ASM_CASES_TAC `h <= &0`);
746  (NEW_GOAL `~(x IN rcone_gt u0 (u1:real^3) a)`);
747  (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);
748  (ASM_REWRITE_TAC[]);
749  (MATCH_MP_TAC (REAL_ARITH `&0 <= x /\ y <= &0 ==> ~(y > x)`));
750  (STRIP_TAC);
751  (MATCH_MP_TAC REAL_LE_MUL);
752  (REWRITE_TAC[DIST_POS_LE]);
753  (MATCH_MP_TAC REAL_LE_MUL);
754  (REWRITE_TAC[DIST_POS_LE]);
755  (ASM_REAL_ARITH_TAC);
756
757  (REWRITE_TAC[REAL_ARITH `a * b * c <= &0 <=> &0 <= b * c * (--a)`]);
758  (MATCH_MP_TAC REAL_LE_MUL);
759  (REWRITE_TAC[DIST_POS_LE]);
760  (MATCH_MP_TAC REAL_LE_MUL);
761  (REWRITE_TAC[DIST_POS_LE]);
762  (ASM_REAL_ARITH_TAC);
763  (NEW_GOAL `F`);
764  (ASM_MESON_TAC[]);
765  (ASM_MESON_TAC[]);
766
767  (ABBREV_TAC `y = inv (h) % vsum (s DELETE u0) (\v:real^3. u v % v)`);
768  (NEW_GOAL `?t. t + h = &1 /\ x = t % u0 + h % (y:real^3)`);
769  (EXISTS_TAC `&1 - h`);
770  (STRIP_TAC);
771  (REAL_ARITH_TAC);
772  (ASM_CASES_TAC `u0:real^3 IN s`);
773  (REWRITE_TAC[GSYM (ASSUME `sum s (u:real^3->real) = &1`)]);
774
775  (EXPAND_TAC "h");
776  (REWRITE_WITH `sum s u = sum (u0 INSERT (s DELETE u0)) (u:real^3->real)`);
777  (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);
778  (ASM_SET_TAC[]);
779  (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
780  (MATCH_MP_TAC FINITE_SUBSET);
781  (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
782
783  (SIMP_TAC[Marchal_cells_2_new.SUM_CLAUSES_alt; 
784    ASSUME `FINITE (s DELETE u0:real^3)`]);
785  (COND_CASES_TAC);
786  (NEW_GOAL `F`);
787  (UP_ASM_TAC THEN SET_TAC[]);
788  (ASM_MESON_TAC[]);
789  (REWRITE_TAC[REAL_ARITH `(a + b:real) - b = a`]);
790  (ASM_REWRITE_TAC[]);
791  (EXPAND_TAC "y");
792  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
793  (REWRITE_WITH `h * inv h = &1`);
794  (NEW_GOAL `~(h = &0)`);
795  (ASM_REAL_ARITH_TAC);
796  (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV]);
797  (REWRITE_TAC[VECTOR_MUL_LID]);
798  (EXPAND_TAC "x");
799
800  (REWRITE_WITH `vsum s (\v. u v % v) = 
801    vsum (u0 INSERT (s DELETE u0)) (\v:real^3. u v % v)`);
802  (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);
803  (ASM_SET_TAC[]);
804  (SIMP_TAC[Marchal_cells_2_new.VSUM_CLAUSES_alt; 
805    ASSUME `FINITE (s DELETE u0:real^3)`]);
806  (COND_CASES_TAC);
807  (NEW_GOAL `F`);
808  (UP_ASM_TAC THEN SET_TAC[]);
809  (ASM_MESON_TAC[]);
810  (REFL_TAC);
811
812  (NEW_GOAL `h = &1`);
813  (EXPAND_TAC "h" THEN REWRITE_WITH `s DELETE u0:real^3 = s`);
814  (ASM_SET_TAC[]);
815  (ASM_REWRITE_TAC[]);
816  (EXPAND_TAC "y" THEN REWRITE_TAC[ASSUME `h = &1`]);
817  (REWRITE_WITH `s DELETE u0:real^3 = s`);
818  (ASM_SET_TAC[]);
819  (ASM_REWRITE_TAC[REAL_ARITH `inv (&1) = &1 /\ &1 - &1 = &0`]);
820  (VECTOR_ARITH_TAC);
821  (UP_ASM_TAC THEN STRIP_TAC);
822
823  (NEW_GOAL `~(y:real^3 IN S)`);
824  (STRIP_TAC);
825  (NEW_GOAL `x IN aff_ge_alt {u0:real^3} S`);
826  (REWRITE_TAC[IN; aff_ge_alt; lin_combo]);
827
828  (ABBREV_TAC `f = (\v:real^3. if v = u0 then t 
829                                 else if v = y then h else &0)`);
830  (EXISTS_TAC `f:real^3->real`);
831  (EXISTS_TAC `{y:real^3}`);
832
833  (REPEAT STRIP_TAC);
834  (REWRITE_TAC[FINITE_SING]);
835  (ASM_SET_TAC[]);
836
837  (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a, b}`]);
838  (REWRITE_WITH `vsum {u0:real^3, y} (\v. f v % v) = 
839                 (\v. f v % v) u0 + (\v. f v % v) y`);
840  (MATCH_MP_TAC Geomdetail.VSUM_DIS2);
841  (STRIP_TAC);
842  (NEW_GOAL `~(u0:real^3 IN S)`);
843  (EXPAND_TAC "S");
844  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
845    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
846  (STRIP_TAC);
847  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
848  (ASM_SET_TAC[]);
849  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
850  (REPEAT STRIP_TAC);
851  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
852  (FIRST_ASSUM MATCH_MP_TAC);
853  (ASM_SET_TAC[]);
854  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
855  (MATCH_MP_TAC DIST_POS_LT);
856  (ASM_REWRITE_TAC[]);
857  (ASM_MESON_TAC[]);
858
859  (REWRITE_WITH `(f:real^3->real) u0 = t`);
860  (EXPAND_TAC "f");
861  (COND_CASES_TAC);
862  (REFL_TAC);
863  (NEW_GOAL `F`);
864  (ASM_MESON_TAC[]);
865  (ASM_MESON_TAC[]);
866
867  (REWRITE_WITH `(f:real^3->real) y = h`);
868  (EXPAND_TAC "f");
869  (COND_CASES_TAC);
870  (NEW_GOAL `F`);
871  (NEW_GOAL `~(u0:real^3 IN S)`);
872  (EXPAND_TAC "S");
873  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
874    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
875  (STRIP_TAC);
876  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
877  (ASM_SET_TAC[]);
878  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
879  (REPEAT STRIP_TAC);
880  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
881  (FIRST_ASSUM MATCH_MP_TAC);
882  (ASM_SET_TAC[]);
883  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
884  (MATCH_MP_TAC DIST_POS_LT);
885  (ASM_REWRITE_TAC[]);
886  (ASM_MESON_TAC[]);
887  (ASM_MESON_TAC[]);
888  (COND_CASES_TAC);
889  (REFL_TAC);
890  (NEW_GOAL `F`);
891  (ASM_MESON_TAC[]);
892  (ASM_MESON_TAC[]);
893  (ASM_REWRITE_TAC[]);
894
895  (EXPAND_TAC "f");
896  (COND_CASES_TAC);
897  (NEW_GOAL `F`);
898  (NEW_GOAL `~({y:real^3} u0)`);
899  (REWRITE_WITH `~({y} u0) <=> ~(u0:real^3 IN {y})`);
900  (MESON_TAC[IN]);
901  (REWRITE_TAC[IN_SING]);
902  (STRIP_TAC);
903
904  (NEW_GOAL `~(u0:real^3 IN S)`);
905  (EXPAND_TAC "S");
906  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
907    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
908  (STRIP_TAC);
909
910  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
911  (ASM_SET_TAC[]);
912  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
913  (REPEAT STRIP_TAC);
914  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
915  (FIRST_ASSUM MATCH_MP_TAC);
916  (ASM_SET_TAC[]);
917  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
918  (MATCH_MP_TAC DIST_POS_LT);
919  (ASM_REWRITE_TAC[]);
920  (ASM_MESON_TAC[]);
921  (ASM_MESON_TAC[]);
922  (ASM_MESON_TAC[]);
923
924  (COND_CASES_TAC);
925  (ASM_REAL_ARITH_TAC);
926  (REAL_ARITH_TAC);
927
928  (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a,b}`]);
929  (REWRITE_WITH `sum {u0:real^3, y} f = f u0 + f y`);
930  (MATCH_MP_TAC Geomdetail.SUM_DIS2);
931  (STRIP_TAC);
932  (NEW_GOAL `~(u0:real^3 IN S)`);
933  (EXPAND_TAC "S");
934  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
935    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
936  (STRIP_TAC);
937  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
938  (ASM_SET_TAC[]);
939  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
940  (REPEAT STRIP_TAC);
941  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
942  (FIRST_ASSUM MATCH_MP_TAC);
943  (ASM_SET_TAC[]);
944  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
945  (MATCH_MP_TAC DIST_POS_LT);
946  (ASM_REWRITE_TAC[]);
947  (ASM_MESON_TAC[]);
948
949  (REWRITE_WITH `(f:real^3->real) u0 = t`);
950  (EXPAND_TAC "f");
951  (COND_CASES_TAC);
952  (REFL_TAC);
953  (NEW_GOAL `F`);
954  (ASM_MESON_TAC[]);
955  (ASM_MESON_TAC[]);
956
957  (REWRITE_WITH `(f:real^3->real) y = h`);
958  (EXPAND_TAC "f");
959  (COND_CASES_TAC);
960  (NEW_GOAL `F`);
961  (NEW_GOAL `~(u0:real^3 IN S)`);
962  (EXPAND_TAC "S");
963  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
964    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
965  (STRIP_TAC);
966  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
967  (ASM_SET_TAC[]);
968  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
969  (REPEAT STRIP_TAC);
970  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
971  (FIRST_ASSUM MATCH_MP_TAC);
972  (ASM_SET_TAC[]);
973  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
974  (MATCH_MP_TAC DIST_POS_LT);
975  (ASM_REWRITE_TAC[]);
976  (ASM_MESON_TAC[]);
977  (ASM_MESON_TAC[]);
978
979  (COND_CASES_TAC);
980  (REFL_TAC);
981  (NEW_GOAL `F`);
982  (ASM_MESON_TAC[]);
983  (ASM_MESON_TAC[]);
984  (ASM_REWRITE_TAC[]);
985  (ASM_MESON_TAC[]);
986
987  (NEW_GOAL `y:real^3 IN S2`);
988  (EXPAND_TAC "S2");
989  (NEW_GOAL `y:real^3 IN S1`);
990  (NEW_GOAL `y:real^3 IN affine hull S`);
991  (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT]);
992  (REWRITE_TAC[IN; IN_ELIM_THM]);
993  (EXISTS_TAC `s DELETE u0:real^3`);
994  (EXISTS_TAC `(\v:real^3. inv h * u v)`);
995  (REPEAT STRIP_TAC);
996  (ASM_REWRITE_TAC[FINITE_DELETE]);
997  (ASM_SET_TAC[]);
998  (REWRITE_TAC[SUM_LMUL]);
999  (ASM_REWRITE_TAC[]);
1000  (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV; 
1001    REAL_ARITH `~(h <= &0) ==> ~(h = &0)`]);
1002  (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);
1003  (ASM_SIMP_TAC[VSUM_LMUL; FINITE_DELETE]);
1004  (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
1005  (REWRITE_TAC[AFFINE_HULL_EQ]);
1006  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
1007
1008  (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
1009  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
1010  (EXPAND_TAC "S");
1011  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
1012    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
1013  (DEL_TAC THEN EXPAND_TAC "S1");
1014  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
1015  (ASM_REWRITE_TAC[]);
1016  (ASM_SET_TAC[]);
1017
1018  (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);
1019  (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);
1020  (ASM_SET_TAC[]);
1021
1022 (* OK until here *)
1023 (* ========================================================================= *)
1024
1025  (NEW_GOAL `dist (z,u0) <= dist (y,u0:real^3)`);
1026  (ONCE_REWRITE_TAC[DIST_SYM]);
1027  (ASM_SIMP_TAC[]);
1028  (UNDISCH_TAC `x:real^3 IN rcone_gt u0 u1 a`);
1029  (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);
1030  (ASM_REWRITE_TAC[]);
1031  (REWRITE_WITH `dist (t % u0 + h % y,u0) = h * dist (y, u0:real^3)`);
1032  (REWRITE_TAC[dist]);
1033  (REWRITE_WITH `(t % u0 + h % y:real^3) - u0 = (t % u0 + h % y) - (t + h) % u0`);
1034  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
1035  (REWRITE_TAC[VECTOR_ARITH `(t % u0 + h % y) - (t + h) % u0 = h % (y - u0)`]);
1036  (REWRITE_TAC[NORM_MUL]);
1037  (REWRITE_WITH `abs h = h`);
1038  (REWRITE_TAC[REAL_ABS_REFL]);
1039  (ASM_REAL_ARITH_TAC);
1040
1041  (REWRITE_TAC[REAL_ARITH `~(a > b) <=> a <= b`]);
1042  (REWRITE_WITH `h * dist (p,u0:real^3) * dist (u1,u0) = 
1043             (h * dist (z,u0)) * dist (u1,u0) * a`);
1044  (EXPAND_TAC "a");
1045  (REWRITE_TAC[REAL_ARITH `(a * b) * c * d / b = (a * d * c) * (b / b)`]);
1046  (REWRITE_WITH `dist (z,u0) / dist (z,u0:real^3) = &1`);
1047  (MATCH_MP_TAC REAL_DIV_REFL);
1048  (REWRITE_TAC[DIST_EQ_0]);
1049  (STRIP_TAC);
1050
1051  (NEW_GOAL `~(u0:real^3 IN S1)`);
1052  (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
1053  (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);
1054  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 = 
1055   (u0 - u1) dot (u0 - u1)`]);
1056  (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
1057  (ASM_REWRITE_TAC[]);
1058  (NEW_GOAL `z:real^3 IN S1`);
1059  (ASM_SET_TAC[]);
1060  (ASM_MESON_TAC[]);
1061
1062  (REAL_ARITH_TAC);
1063  (REWRITE_TAC[REAL_ARITH 
1064   `(a * x) * b * c <= (a * y) * b * c <=> &0 <= a * b * c *(y - x)`]);
1065  (MATCH_MP_TAC REAL_LE_MUL);
1066  (STRIP_TAC);
1067  (ASM_REAL_ARITH_TAC);
1068  (MATCH_MP_TAC REAL_LE_MUL);
1069  (REWRITE_TAC[DIST_POS_LE]);
1070  (MATCH_MP_TAC REAL_LE_MUL);
1071  (STRIP_TAC);
1072  (ASM_REAL_ARITH_TAC);
1073  (ASM_REAL_ARITH_TAC);
1074
1075  (UP_ASM_TAC THEN STRIP_TAC);
1076
1077  (ABBREV_TAC `W = aff_ge_alt {u0:real^3} S`);
1078  (ABBREV_TAC `c = max b (hl[u0;u1:real^3] / sqrt (&2))`);
1079  (NEW_GOAL `&0 < c /\ c < &1`);
1080  (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_LT_MAX]);
1081  (ASM_REWRITE_TAC[]);
1082  (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_MAX_LT]);
1083  (STRIP_TAC);
1084  (ASM_REWRITE_TAC[]);
1085  (REWRITE_WITH `hl [u0; u1:real^3] / sqrt (&2) < &1 <=> 
1086                  hl [u0; u1] < &1 * sqrt (&2)`);
1087  (MATCH_MP_TAC REAL_LT_LDIV_EQ);
1088  (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
1089  (ASM_REAL_ARITH_TAC);
1090
1091  (NEW_GOAL `rcone_gt u0 u1 c SUBSET 
1092              W INTER (rcone_gt u0 u1 (hl [u0; u1:real^3] / sqrt (&2)))`);
1093  (REWRITE_TAC[SUBSET_INTER]);
1094  (STRIP_TAC);
1095  (NEW_GOAL `rcone_gt (u0:real^3) u1 c SUBSET rcone_gt u0 u1 b`);
1096  (MATCH_MP_TAC RCONE_GT_SUBSET);
1097  (EXPAND_TAC "c" THEN REAL_ARITH_TAC);
1098  (ASM_SET_TAC[]);
1099  (MATCH_MP_TAC RCONE_GT_SUBSET);
1100  (EXPAND_TAC "c" THEN REAL_ARITH_TAC);
1101
1102  (ABBREV_TAC `C = ball (u0:real^3,&1) INTER rcone_gt u0 u1 c`);
1103  (NEW_GOAL `C SUBSET 
1104       UNIONS
1105       {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1106  (REWRITE_TAC[SUBSET]);
1107  (REPEAT STRIP_TAC);
1108  (NEW_GOAL `x IN ball (u0:real^3,&1)  /\ x IN aff_ge_alt {u0} S`);
1109  (ASM_SET_TAC[]);
1110  (UP_ASM_TAC THEN STRIP_TAC);
1111
1112 (* OK until here *)
1113 (* ===========================================================================*)
1114
1115  (NEW_GOAL `(x:real^3) IN convex hull (u0 INSERT S)`);
1116  (REWRITE_TAC[CONVEX_HULL_EXPLICIT; IN; IN_ELIM_THM]);
1117
1118  (UP_ASM_TAC THEN REWRITE_TAC[IN; aff_ge_alt; lin_combo]);
1119  (REPEAT STRIP_TAC);
1120  (EXISTS_TAC `{u0:real^3} UNION q`);
1121  (EXISTS_TAC `f:real^3->real`);
1122  (REPEAT STRIP_TAC);
1123  (REWRITE_TAC[SET_RULE `{a} UNION b = a INSERT b`; FINITE_INSERT]);
1124  (ASM_REWRITE_TAC[]);
1125  (ASM_SET_TAC[]);
1126  (ASM_CASES_TAC `x':real^3 IN q`);
1127  (FIRST_ASSUM MATCH_MP_TAC);
1128  (UP_ASM_TAC THEN MESON_TAC[IN]);
1129  (REWRITE_WITH `x' = u0:real^3`);
1130  (NEW_GOAL `x' IN ({u0:real^3} UNION q)`);
1131  (ASM_REWRITE_TAC[IN]);
1132  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
1133  (REWRITE_TAC[REAL_ARITH `&0 <= x <=> ~(x < &0)`]);
1134  (STRIP_TAC);
1135  (UNDISCH_TAC `x IN ball (u0:real^3,&1)`);
1136  (ASM_REWRITE_TAC[IN_BALL; SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);
1137  (REWRITE_WITH `vsum (u0 INSERT (q DELETE u0:real^3)) (\v. f v % v) = 
1138   (if u0 IN (q DELETE u0) then vsum (q DELETE u0) (\v. f v % v)
1139    else (\v. f v % v) u0 + vsum (q DELETE u0) (\v. f v % v))`);
1140  (MATCH_MP_TAC Marchal_cells_2_new.VSUM_CLAUSES_alt);
1141  (ASM_REWRITE_TAC[FINITE_DELETE]);
1142  (COND_CASES_TAC);
1143  (NEW_GOAL `F`);
1144  (UP_ASM_TAC THEN SET_TAC[]);
1145  (ASM_MESON_TAC[]);
1146  (ONCE_REWRITE_TAC[DIST_SYM]);
1147  (REWRITE_TAC[dist]);
1148  (REWRITE_WITH `!a. a - u0 = a - (sum ({u0:real^3} UNION q) f) % u0`);
1149  (ASM_REWRITE_TAC[]);
1150  (VECTOR_ARITH_TAC);
1151
1152
1153  (NEW_GOAL `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`);
1154  (REWRITE_TAC[SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);
1155  (REWRITE_WITH `sum (u0 INSERT (q DELETE u0:real^3)) f = 
1156   (if u0 IN (q DELETE u0) then sum (q DELETE u0) f
1157    else f u0 + sum (q DELETE u0) f)`);
1158  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
1159  (ASM_REWRITE_TAC[FINITE_DELETE]);
1160  (COND_CASES_TAC);
1161  (NEW_GOAL `F`);
1162  (UP_ASM_TAC THEN SET_TAC[]);
1163  (ASM_MESON_TAC[]);
1164  (ASM_REWRITE_TAC[]);
1165  (REWRITE_TAC[VECTOR_ADD_RDISTRIB;
1166    VECTOR_ARITH `(a + b) - (a + c:real^3) = b - c`;
1167    ASSUME `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`; ]);
1168  (ABBREV_TAC `h = sum (q DELETE u0:real^3) f`);
1169  (ABBREV_TAC `y = inv (h) % vsum (q DELETE u0) (\v:real^3. f v % v)`);
1170  (NEW_GOAL `h > &1`);
1171  (ASM_REAL_ARITH_TAC);
1172  (REWRITE_WITH `vsum (q DELETE u0) (\v. f v % v) = h % y:real^3`);
1173  (EXPAND_TAC "y");
1174  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
1175  (REWRITE_WITH `h * inv h = &1`);
1176  (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);
1177  (VECTOR_ARITH_TAC);
1178  (REWRITE_TAC[VECTOR_ARITH `h % a - h % b = h % (a - b)`; NORM_MUL]);
1179  (REWRITE_TAC[REAL_ARITH `~(a < b) <=> b <= a`]);
1180
1181  (NEW_GOAL `norm (p - u0) <= norm (y - u0:real^3)`);
1182  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
1183  (REWRITE_TAC[NORM_POS_LE]);
1184  (REWRITE_WITH 
1185   `norm (y - u0) pow 2 = norm (p - u0) pow 2 + norm (y - p:real^3) pow 2`);
1186  (MATCH_MP_TAC PYTHAGORAS);
1187  (REWRITE_TAC[orthogonal]);
1188  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
1189  (ASM_REWRITE_TAC[set_of_list]);
1190  (ONCE_REWRITE_TAC[DOT_SYM]);
1191  (MATCH_MP_TAC Rogers.MHFTTZN4);
1192  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
1193  (REPEAT STRIP_TAC);
1194  (ASM_REWRITE_TAC[]);
1195  (ASM_REWRITE_TAC[]);
1196
1197  (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);
1198  (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);
1199  (EXISTS_TAC `q DELETE u0:real^3`);
1200  (EXISTS_TAC `(\v:real^3. inv h * f v)`);
1201  (REPEAT STRIP_TAC);
1202  (ASM_REWRITE_TAC[FINITE_DELETE]);
1203  (ASM_SET_TAC[]);
1204  (ASM_REWRITE_TAC[SUM_LMUL]);
1205  (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);
1206  (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);
1207  (ASM_REWRITE_TAC[VSUM_LMUL]);
1208
1209  (REWRITE_TAC[set_of_list]);
1210  (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);
1211  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
1212  (ASM_SET_TAC[]);
1213  (REWRITE_TAC[REAL_ARITH `a <= a + b <=> &0 <= b`; NORM_POW_2; DOT_POS_LE]);
1214
1215  (NEW_GOAL `&1 <= norm (p - u0:real^3)`);
1216  (EXPAND_TAC "p");
1217  (REWRITE_TAC[CIRCUMCENTER_2; midpoint; 
1218    VECTOR_ARITH `inv (&2) % (u0 + u1) - u0 = inv (&2) % (u1 - u0)`; 
1219    NORM_MUL; REAL_ARITH `abs (inv(&2)) = inv (&2)`]);
1220  (REWRITE_TAC[GSYM dist]);
1221  (REWRITE_WITH `&1 = inv (&2) * &2`);
1222  (REAL_ARITH_TAC);
1223  (REWRITE_TAC[REAL_ARITH `inv (&2) * &2 <= inv (&2) * a <=> &2 <= a`]);
1224  (MP_TAC (ASSUME `packing (V:real^3->bool)`));
1225  (REWRITE_TAC[packing] THEN STRIP_TAC);
1226  (FIRST_ASSUM MATCH_MP_TAC);
1227  (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1228  (REWRITE_WITH `abs h = h`);
1229  (ASM_REAL_ARITH_TAC);
1230
1231  (NEW_GOAL `h <= h * norm (y - u0:real^3)`);
1232  (REWRITE_TAC[REAL_ARITH `h <= h * a <=> &0 <= h * (a - &1)`]);
1233  (MATCH_MP_TAC REAL_LE_MUL);
1234  (ASM_REAL_ARITH_TAC);
1235  (ASM_REAL_ARITH_TAC);
1236
1237  (ASM_REWRITE_TAC[]);
1238  (ASM_REWRITE_TAC[]);
1239
1240 (* ========================================================================== *)
1241  (NEW_GOAL `~(S:real^3->bool = {})`);
1242  (STRIP_TAC);
1243  (NEW_GOAL `~(aff_dim (u0:real^3 INSERT S) = &3)`);
1244  (REWRITE_TAC[ASSUME `S:real^3->bool = {}`; AFF_DIM_SING]);
1245  (ARITH_TAC);
1246  (ASM_MESON_TAC[]);
1247  (SWITCH_TAC);
1248  (UP_ASM_TAC THEN SIMP_TAC[CONVEX_HULL_INSERT; 
1249    ASSUME `~(S:real^3->bool = {})`]);
1250  (REWRITE_WITH `convex hull S = S:real^3->bool`);
1251  (REWRITE_TAC[CONVEX_HULL_EQ]);
1252  (EXPAND_TAC "S" THEN REWRITE_TAC[Packing3.CONVEX_VORONOI_LIST]);
1253  (ASM_REWRITE_TAC[]);
1254  (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);
1255  (REPEAT STRIP_TAC);
1256
1257  (EXISTS_TAC `rogers V vl`);
1258  (REPEAT STRIP_TAC);
1259  (EXISTS_TAC `vl:(real^3)list`);
1260  (ASM_REWRITE_TAC[]);
1261
1262  (ASM_SIMP_TAC[Marchal_cells_2_new.ROGERS_EXPLICIT]);
1263  (REWRITE_TAC[CONVEX_HULL_4; IN_ELIM_THM]);
1264
1265  (UNDISCH_TAC `(t:real^3->bool) b'`);
1266  (ASM_REWRITE_TAC[CONVEX_HULL_3; IN_ELIM_THM]);
1267  (REPEAT STRIP_TAC);
1268
1269  (EXISTS_TAC `u:real`);
1270  (EXISTS_TAC `v * u'`);
1271  (EXISTS_TAC `v * v'`);
1272  (EXISTS_TAC `v * w`);
1273  (ASM_SIMP_TAC[REAL_LE_MUL]);
1274  (STRIP_TAC);
1275
1276  (REWRITE_TAC[REAL_ARITH `u + v * u' + v * v' + v * w = u + v * (u' + v' +w)`]);
1277  (ASM_REWRITE_TAC[]);
1278  (ASM_REAL_ARITH_TAC);
1279
1280  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
1281  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1282  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1283  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1284  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1285  (EXISTS_TAC `V:real^3->bool`);
1286  (ASM_REWRITE_TAC[]);
1287  (ARITH_TAC);
1288
1289  (ASM_REWRITE_TAC[HD]);
1290  (VECTOR_ARITH_TAC);
1291
1292 (* ========================================================================= *)
1293 (* ========================================================================== *)
1294
1295  (NEW_GOAL 
1296  `!X. mcell_set V X /\ ~NULLSET (X INTER C)
1297      ==> (?k vl.
1298               2 <= k /\
1299               barV V 3 vl /\
1300               X = mcell k V vl /\
1301               truncate_simplex 1 vl = [u0; u1])`);
1302
1303  (REWRITE_TAC[mcell_set_2; IN_ELIM_THM]);
1304  (REPEAT STRIP_TAC);
1305
1306  (NEW_GOAL `~NULLSET (X INTER UNIONS
1307       {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]})`);
1308  (STRIP_TAC);
1309  (UNDISCH_TAC `~NULLSET (X INTER C)`);
1310  (REWRITE_TAC[]);
1311  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1312  (EXISTS_TAC `X INTER
1313        UNIONS
1314        {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1315  (STRIP_TAC);
1316  (ASM_REWRITE_TAC[]);
1317  (ASM_SET_TAC[]);
1318  (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1319  (STRIP_TAC);
1320
1321  (NEW_GOAL 
1322   `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);
1323  (MESON_TAC[NEGLIGIBLE_UNIONS]);
1324  (ABBREV_TAC `St = {X INTER x | x IN
1325                     {rogers V vl | vl | barV V 3 vl /\
1326                                         truncate_simplex 1 vl = [u0; u1]}}`);
1327  (NEW_GOAL `?t. t IN St /\ ~NULLSET t`);
1328  (FIRST_ASSUM MATCH_MP_TAC);
1329  (ASM_REWRITE_TAC[]);
1330  (EXPAND_TAC "St");
1331  (ABBREV_TAC `Sr = {rogers V vl | vl | barV V 3 vl /\
1332                                   truncate_simplex 1 vl = [u0; u1]}`);
1333  (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);
1334  (MATCH_MP_TAC FINITE_SUBSET);
1335  (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sr /\ y = f x }`);
1336  (STRIP_TAC);
1337
1338
1339
1340  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1341  (ABBREV_TAC `Ss = {vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1342  (MATCH_MP_TAC FINITE_SUBSET);
1343  (EXISTS_TAC `{y | ?vl. vl IN Ss /\ y = rogers V vl}`);
1344  (STRIP_TAC);
1345  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1346  (ABBREV_TAC `Sx = V INTER ball (u0:real^3, &4)`);
1347  (MATCH_MP_TAC FINITE_SUBSET);
1348  (EXISTS_TAC `{y | ?u0 u1 u2 u3:real^3.
1349                       u0 IN Sx /\
1350                       u1 IN Sx /\
1351                       u2 IN Sx /\
1352                       u3 IN Sx /\
1353                       y = [u0; u1; u2; u3]}`);
1354  (STRIP_TAC);
1355  (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA);
1356  (EXPAND_TAC "Sx");
1357  (MATCH_MP_TAC Pack2.KIUMVTC);
1358  (ASM_REWRITE_TAC[]);
1359  (EXPAND_TAC "Ss");
1360  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
1361  (REPEAT STRIP_TAC);
1362
1363  (NEW_GOAL `?v0 v1 v2 v3. x = [v0;v1;v2;v3:real^3]`);
1364  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1365  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1366  (UP_ASM_TAC THEN STRIP_TAC);
1367  (EXISTS_TAC `v0:real^3`);
1368  (EXISTS_TAC `v1:real^3`);
1369  (EXISTS_TAC `v2:real^3`);
1370  (EXISTS_TAC `v3:real^3`);
1371  (ASM_REWRITE_TAC[]);
1372
1373  (NEW_GOAL `{v0, v1, v2, v3:real^3} SUBSET Sx`);
1374  (EXPAND_TAC "Sx");
1375  (REWRITE_TAC[SUBSET_INTER]);
1376  (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list x`);
1377  (ASM_REWRITE_TAC[set_of_list]);
1378  (STRIP_TAC);
1379  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1380  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1381  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1382  (EXISTS_TAC `V:real^3->bool`);
1383  (ASM_REWRITE_TAC[]);
1384  (NEW_GOAL `HD (truncate_simplex 1 x) = u0:real^3`);
1385  (ASM_REWRITE_TAC[HD]);
1386  (NEW_GOAL `HD (truncate_simplex 1 x) = v0:real^3`);
1387  (REWRITE_TAC[ASSUME `x = [v0; v1; v2; v3:real^3]`;  
1388    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1389  (REWRITE_WITH `u0 = v0:real^3`);
1390  (ASM_MESON_TAC[]);
1391  (REWRITE_TAC[set_of_list] THEN SET_TAC[]);
1392  (UP_ASM_TAC THEN SET_TAC[]);
1393
1394  (EXPAND_TAC "Sr" THEN EXPAND_TAC "Ss");
1395  (SET_TAC[]);
1396  (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sr} = {f x | x IN Sr}`);
1397  (EXPAND_TAC "f");
1398  (REFL_TAC);
1399  (SET_TAC[]);
1400  (UP_ASM_TAC THEN EXPAND_TAC "St" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1401  (REPEAT STRIP_TAC);
1402
1403  (NEW_GOAL `x SUBSET UNIONS {mcell i V vl | i <= 4}`);
1404  (ASM_REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM]);
1405  (REPEAT STRIP_TAC);
1406  (NEW_GOAL `?i. i <= 4 /\ x' IN mcell i V vl`);
1407  (MATCH_MP_TAC Sltstlo.SLTSTLO1);
1408  (ASM_REWRITE_TAC[IN]);
1409  (UP_ASM_TAC THEN STRIP_TAC);
1410  (EXISTS_TAC `mcell i' V vl`);
1411  (STRIP_TAC);
1412  (EXISTS_TAC `i':num` THEN ASM_REWRITE_TAC[]);
1413  (UP_ASM_TAC THEN REWRITE_TAC[IN]);
1414
1415  (NEW_GOAL `~NULLSET (X INTER UNIONS {mcell i V vl | i <= 4})`);
1416  (STRIP_TAC);
1417  (UNDISCH_TAC `~NULLSET (t)`);
1418  (REWRITE_TAC[ASSUME `t:real^3->bool = X INTER x`]);
1419  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1420  (EXISTS_TAC `X INTER UNIONS {mcell i V vl | i <= 4}`);
1421  (STRIP_TAC);
1422  (ASM_REWRITE_TAC[]);
1423  (ASM_SET_TAC[]);
1424  (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1425  (STRIP_TAC);
1426
1427  (NEW_GOAL 
1428   `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);
1429  (MESON_TAC[NEGLIGIBLE_UNIONS]);
1430  (ABBREV_TAC `Sx = {X INTER x | x IN {mcell i V vl | i <= 4}}`);
1431  (NEW_GOAL `?t. t IN Sx /\ ~NULLSET t`);
1432  (FIRST_ASSUM MATCH_MP_TAC);
1433  (ASM_REWRITE_TAC[]);
1434  (EXPAND_TAC "Sx");
1435  (ABBREV_TAC `Sy = {mcell i V vl | i <= 4}`);
1436  (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);
1437  (MATCH_MP_TAC FINITE_SUBSET);
1438  (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sy /\ y = f x }`);
1439  (STRIP_TAC);
1440  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1441  (EXPAND_TAC "Sy");
1442  (REWRITE_TAC[GSYM IN_NUMSEG_0]);
1443  (ABBREV_TAC `g = (\i:num. mcell i V vl)`);
1444  (REWRITE_WITH `{mcell i V vl | i IN 0..4} = {g i | i IN 0..4}`);
1445  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
1446  (MATCH_MP_TAC FINITE_SUBSET);
1447  (EXISTS_TAC `{y:real^3->bool | ?i. i IN 0..4 /\ y = g i}`);
1448  (STRIP_TAC);
1449  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1450  (REWRITE_TAC[FINITE_NUMSEG]);
1451  (SET_TAC[]);
1452  (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sy} = {f x | x IN Sy}`);
1453  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
1454  (SET_TAC[]);
1455  (UP_ASM_TAC THEN EXPAND_TAC "Sx" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1456  (REPEAT STRIP_TAC);
1457
1458 (* ========================================================================= *)
1459
1460  (NEW_GOAL `i = i' /\ mcell i V ul = mcell i' V vl`);
1461  (MATCH_MP_TAC Ajripqn.AJRIPQN);
1462  (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
1463  (REPEAT STRIP_TAC);
1464  (UNDISCH_TAC `ul IN barV V 3` THEN REWRITE_TAC[IN]);
1465  (UNDISCH_TAC `~NULLSET t'`);
1466  (ASM_REWRITE_TAC[]);
1467  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
1468  (ASM_REWRITE_TAC[]);
1469
1470 (* ========================================================================= *)
1471
1472  (ASM_CASES_TAC `i' = 0`);
1473  (NEW_GOAL `F`);
1474  (UNDISCH_TAC `~NULLSET (X INTER C)`);
1475  (REWRITE_TAC[]);
1476  (REWRITE_WITH `X INTER C = {}:real^3->bool`);
1477  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
1478  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
1479  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1480  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1481  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1482  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1483  (EXISTS_TAC `V:real^3->bool`);
1484  (ASM_REWRITE_TAC[]);
1485  (ARITH_TAC);
1486  (ASM_REWRITE_TAC[HD]);
1487  (NEW_GOAL `C SUBSET ball (u0:real^3, sqrt (&2))`);
1488  (NEW_GOAL `ball (u0:real^3, &1) SUBSET ball (u0, sqrt (&2))`);
1489  (MATCH_MP_TAC SUBSET_BALL);
1490  (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));
1491  (REWRITE_TAC[Marchal_cells_2_new.ZERO_LT_SQRT_2]);
1492  (ASM_SET_TAC[]);
1493  (UP_ASM_TAC THEN SET_TAC[]);
1494  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1495  (ASM_MESON_TAC[]);
1496
1497  (ASM_CASES_TAC `i' = 1`);
1498  (NEW_GOAL `F`);
1499  (UNDISCH_TAC `~NULLSET (X INTER C)`);
1500  (REWRITE_TAC[]);
1501  (REWRITE_WITH `X INTER C = {}:real^3->bool`);
1502  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell1]);
1503  (COND_CASES_TAC);
1504  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
1505  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1506  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1507  (UP_ASM_TAC THEN STRIP_TAC);
1508  (ASM_REWRITE_TAC[HD; TL]);
1509
1510  (REWRITE_WITH `v0 = u0:real^3`);
1511  (NEW_GOAL `HD (truncate_simplex 1 vl) = u0:real^3`);
1512  (ASM_REWRITE_TAC[HD]);
1513  (NEW_GOAL `HD (truncate_simplex 1 vl) = v0:real^3`);
1514  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
1515    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1516  (ASM_MESON_TAC[]);
1517
1518  (REWRITE_WITH `v1 = u1:real^3`);
1519  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
1520  (ASM_REWRITE_TAC[HD; TL]);
1521  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
1522  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
1523    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1524  (ASM_MESON_TAC[]);
1525
1526  (NEW_GOAL `C SUBSET (rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2)))`);
1527  (EXPAND_TAC "C");
1528  (SET_TAC[ASSUME `rcone_gt u0 u1 c SUBSET
1529                    W INTER rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2))`]);
1530  (UP_ASM_TAC THEN SET_TAC[]);
1531  (SET_TAC[]);
1532  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1533  (UP_ASM_TAC THEN MESON_TAC[]);
1534  (ASM_ARITH_TAC);
1535
1536 (* ========================================================================= *)
1537
1538  (ABBREV_TAC `f1 = 
1539   (\ul. dist (u0:real^3, 
1540               closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0))`);
1541
1542  (ABBREV_TAC `P1 = { (f1:(real^3)list->real) ul |ul | barV V 3 ul /\
1543                                  ~NULLSET (mcell 3 V ul INTER C) /\
1544                                   truncate_simplex 1 ul = [u0; u1]}`);
1545
1546  (NEW_GOAL `~(P1 = {}) ==> (?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
1547  (STRIP_TAC);
1548  (MATCH_MP_TAC INF_FINITE_LEMMA);
1549  (ASM_REWRITE_TAC[]);
1550  (EXPAND_TAC "P1");
1551  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1552  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1553  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1554  (MATCH_MP_TAC FINITE_SUBSET);
1555  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1556                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1557                       v1 IN (V INTER ball (u0, &4)) /\
1558                       u2 IN (V INTER ball (u0, &4)) /\
1559                       u3 IN (V INTER ball (u0, &4)) /\
1560                       y = [v0; v1; u2; u3]}`);
1561  (STRIP_TAC);
1562  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1563  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1564  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1565  (REPEAT STRIP_TAC);
1566  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1567  (MATCH_MP_TAC BARV_3_EXPLICIT);
1568  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1569  (UP_ASM_TAC THEN STRIP_TAC);
1570  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1571    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1572  (ASM_REWRITE_TAC[]);
1573  (NEW_GOAL `v0 = u0:real^3`);
1574  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1575  (ASM_REWRITE_TAC[HD]);
1576  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1577  (ASM_REWRITE_TAC[HD]);
1578  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1579  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1580  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1581  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1582  (EXISTS_TAC `V:real^3->bool`);
1583  (ASM_REWRITE_TAC[set_of_list]);
1584  (SET_TAC[]);
1585  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1586  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1587  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1588  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1589  (SET_TAC[]);
1590
1591  (ABBREV_TAC `r1 = (if (P1 = {}:real->bool) then &1 
1592                     else (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x)))`);
1593  (NEW_GOAL `&0 < r1`);
1594  (EXPAND_TAC "r1");
1595  (COND_CASES_TAC);
1596  (REAL_ARITH_TAC);
1597  (NEW_GOAL `?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x)`);
1598  (ASM_SIMP_TAC[]);
1599  (UP_ASM_TAC THEN STRIP_TAC);
1600  (ABBREV_TAC `P  = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
1601  (ABBREV_TAC `zz = (@) (P:real->bool)`);
1602  (NEW_GOAL `(P:real->bool) zz`);
1603  (EXPAND_TAC "zz");
1604  (MATCH_MP_TAC SELECT_AX);
1605  (EXISTS_TAC `b':real`);
1606  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1607  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1608  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1609  (REPEAT STRIP_TAC);
1610  (ASM_REWRITE_TAC[]);
1611  (EXPAND_TAC "f1");
1612  (MATCH_MP_TAC DIST_POS_LT);
1613  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1614  (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0 = u0
1615   <=> u0 IN (affine hull {u1:real^3, EL 2 ul, mxi V ul})`);
1616  (MATCH_MP_TAC CLOSEST_POINT_REFL);
1617  (REWRITE_TAC[CLOSED_AFFINE_HULL]);
1618  (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
1619  (STRIP_TAC);
1620  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
1621  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1622  (EXISTS_TAC `mcell 3 V ul`);
1623  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1624  (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
1625  (COND_CASES_TAC);
1626
1627  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1628  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1629  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1630  (UP_ASM_TAC THEN STRIP_TAC);
1631  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
1632
1633  (REWRITE_WITH `v0 = u0:real^3`);
1634  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1635  (ASM_REWRITE_TAC[HD]);
1636  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1637  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1638    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1639  (ASM_MESON_TAC[]);
1640
1641  (REWRITE_WITH `v1 = u1:real^3`);
1642  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1643  (ASM_REWRITE_TAC[HD; TL]);
1644  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1645  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1646    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1647  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1648  (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
1649
1650  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1651  (EXISTS_TAC `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]}`);
1652  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1653  (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} = 
1654                  affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
1655  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
1656  (REWRITE_WITH `affine hull {u1, v2, mxi V [u0; u1; v2; v3]} = 
1657                  affine hull {u1, EL 2 ul, mxi V ul}`);
1658  (ASM_REWRITE_TAC[EL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
1659
1660  (REWRITE_WITH `v0 = u0:real^3`);
1661  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1662  (ASM_REWRITE_TAC[HD]);
1663  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1664  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1665    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1666  (ASM_MESON_TAC[]);
1667
1668  (REWRITE_WITH `v1 = u1:real^3`);
1669  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1670  (ASM_REWRITE_TAC[HD; TL]);
1671  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1672  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1673    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1674  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1675  (ASM_REWRITE_TAC[]);
1676  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1677  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1678
1679 (* ========================================================================= *)
1680
1681  (ABBREV_TAC `f2 = 
1682   (\ul. dist (u0:real^3, 
1683               closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0))`);
1684
1685  (ABBREV_TAC `P2 = { (f2:(real^3)list->real) ul |ul | barV V 3 ul /\
1686                                  ~NULLSET (mcell 4 V ul INTER C) /\
1687                                   truncate_simplex 1 ul = [u0; u1]}`);
1688
1689  (NEW_GOAL `~(P2 = {}) ==> (?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
1690  (STRIP_TAC);
1691  (MATCH_MP_TAC INF_FINITE_LEMMA);
1692  (ASM_REWRITE_TAC[]);
1693  (EXPAND_TAC "P2");
1694  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1695  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1696  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1697  (MATCH_MP_TAC FINITE_SUBSET);
1698  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1699                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1700                       v1 IN (V INTER ball (u0, &4)) /\
1701                       u2 IN (V INTER ball (u0, &4)) /\
1702                       u3 IN (V INTER ball (u0, &4)) /\
1703                       y = [v0; v1; u2; u3]}`);
1704  (STRIP_TAC);
1705  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1706  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1707  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1708  (REPEAT STRIP_TAC);
1709  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1710  (MATCH_MP_TAC BARV_3_EXPLICIT);
1711  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1712  (UP_ASM_TAC THEN STRIP_TAC);
1713  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1714    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1715  (ASM_REWRITE_TAC[]);
1716  (NEW_GOAL `v0 = u0:real^3`);
1717  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1718  (ASM_REWRITE_TAC[HD]);
1719  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1720  (ASM_REWRITE_TAC[HD]);
1721  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1722  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1723  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1724  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1725  (EXISTS_TAC `V:real^3->bool`);
1726  (ASM_REWRITE_TAC[set_of_list]);
1727  (SET_TAC[]);
1728  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1729  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1730  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1731  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1732  (SET_TAC[]);
1733
1734  (ABBREV_TAC `r2 = (if (P2 = {}:real->bool) then &1 
1735                     else (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x)))`);
1736
1737  (NEW_GOAL `&0 < r2`);
1738  (EXPAND_TAC "r2");
1739  (COND_CASES_TAC);
1740  (REAL_ARITH_TAC);
1741  (NEW_GOAL `?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x)`);
1742  (ASM_SIMP_TAC[]);
1743  (UP_ASM_TAC THEN STRIP_TAC);
1744  (ABBREV_TAC `P  = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
1745  (ABBREV_TAC `zz = (@) (P:real->bool)`);
1746  (NEW_GOAL `(P:real->bool) zz`);
1747  (EXPAND_TAC "zz");
1748  (MATCH_MP_TAC SELECT_AX);
1749  (EXISTS_TAC `b':real`);
1750  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1751  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1752  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1753  (REPEAT STRIP_TAC);
1754  (ASM_REWRITE_TAC[]);
1755  (EXPAND_TAC "f2");
1756  (MATCH_MP_TAC DIST_POS_LT);
1757  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1758  (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0 = u0
1759   <=> u0 IN (affine hull {u1:real^3, EL 2 ul, EL 3 ul})`);
1760  (MATCH_MP_TAC CLOSEST_POINT_REFL);
1761  (REWRITE_TAC[CLOSED_AFFINE_HULL]);
1762  (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
1763  (STRIP_TAC);
1764  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
1765  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1766  (EXISTS_TAC `mcell 4 V ul`);
1767  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1768  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4]);
1769  (COND_CASES_TAC);
1770
1771  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1772  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1773  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1774  (UP_ASM_TAC THEN STRIP_TAC);
1775  (ASM_REWRITE_TAC[set_of_list]);
1776
1777  (REWRITE_WITH `v0 = u0:real^3`);
1778  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1779  (ASM_REWRITE_TAC[HD]);
1780  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1781  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1782    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1783  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1784
1785  (REWRITE_WITH `v1 = u1:real^3`);
1786  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1787  (ASM_REWRITE_TAC[HD; TL]);
1788  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1789  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1790    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1791  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1792
1793  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1794  (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
1795  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1796  (REWRITE_WITH `affine hull {u0, u1, v2, v3:real^3} = 
1797                  affine hull {u1, v2, v3}`);
1798  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
1799  (REWRITE_WITH `affine hull {u1, v2, v3:real^3} = 
1800                  affine hull {u1, EL 2 ul, EL 3 ul}`);
1801  (ASM_REWRITE_TAC[EL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
1802  (ASM_REWRITE_TAC[]);
1803
1804  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1805  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1806
1807 (* ========================================================================= *)
1808
1809  (ABBREV_TAC `r = min (&1) (min r1 r2)`);
1810  (NEW_GOAL `&0 < r`);
1811  (EXPAND_TAC "r");
1812  (UNDISCH_TAC `&0 < r1` THEN UNDISCH_TAC `&0  < r2` THEN REAL_ARITH_TAC);
1813
1814 (* ========================================================================= *)
1815
1816  (ABBREV_TAC `f3 = 
1817   (\ul. (((smallest_angle_line (EL 2 ul)  (mxi V ul) u0 u1) - u0)
1818    dot (u1 - u0)) / 
1819    (norm ((smallest_angle_line (EL 2 ul)  (mxi V ul) u0 u1) - u0)
1820    * norm (u1 - u0)))`);
1821
1822  (ABBREV_TAC `P3 = {(f3:(real^3)list->real) ul |ul | barV V 3 ul /\
1823                                  ~NULLSET (mcell 3 V ul INTER C) /\
1824                                   truncate_simplex 1 ul = [u0; u1]}`);
1825
1826  (NEW_GOAL `~(P3 = {}) ==> (?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
1827  (STRIP_TAC);
1828  (MATCH_MP_TAC SUP_FINITE_LEMMA);
1829  (ASM_REWRITE_TAC[]);
1830  (EXPAND_TAC "P3");
1831  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1832  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1833  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1834  (MATCH_MP_TAC FINITE_SUBSET);
1835  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1836                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1837                       v1 IN (V INTER ball (u0, &4)) /\
1838                       u2 IN (V INTER ball (u0, &4)) /\
1839                       u3 IN (V INTER ball (u0, &4)) /\
1840                       y = [v0; v1; u2; u3]}`);
1841  (STRIP_TAC);
1842  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1843  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1844  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1845  (REPEAT STRIP_TAC);
1846  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1847  (MATCH_MP_TAC BARV_3_EXPLICIT);
1848  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1849  (UP_ASM_TAC THEN STRIP_TAC);
1850  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1851    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1852  (ASM_REWRITE_TAC[]);
1853  (NEW_GOAL `v0 = u0:real^3`);
1854  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1855  (ASM_REWRITE_TAC[HD]);
1856  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1857  (ASM_REWRITE_TAC[HD]);
1858  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1859  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1860  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1861  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1862  (EXISTS_TAC `V:real^3->bool`);
1863  (ASM_REWRITE_TAC[set_of_list]);
1864  (SET_TAC[]);
1865  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1866  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1867  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1868  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1869  (SET_TAC[]);
1870
1871  (ABBREV_TAC `d1 = (if (P3 = {}:real->bool) then c 
1872                     else (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b)))`);
1873
1874  (NEW_GOAL `d1 < &1`);
1875  (EXPAND_TAC "d1");
1876  (COND_CASES_TAC);
1877  (ASM_REWRITE_TAC[]);
1878  (NEW_GOAL `?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b)`);
1879  (ASM_SIMP_TAC[]);
1880  (UP_ASM_TAC THEN STRIP_TAC);
1881  (ABBREV_TAC `P  = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
1882  (ABBREV_TAC `zz = (@) (P:real->bool)`);
1883  (NEW_GOAL `(P:real->bool) zz`);
1884  (EXPAND_TAC "zz");
1885  (MATCH_MP_TAC SELECT_AX);
1886  (EXISTS_TAC `b':real`);
1887  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1888  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1889  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1890  (REPEAT STRIP_TAC);
1891  (ASM_REWRITE_TAC[]);
1892  (EXPAND_TAC "f3");
1893
1894  (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (mxi V ul) u0 u1`);
1895  (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
1896  (STRIP_TAC);
1897  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
1898  (STRIP_TAC);
1899  (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
1900  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
1901  (ASM_REWRITE_TAC[]);
1902  (EXPAND_TAC "xx");
1903  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN 
1904    REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
1905  (STRIP_TAC);
1906  (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, mxi V ul} /\
1907            (!y. y IN convex hull {EL 2 ul, mxi V ul}
1908                 ==> ((y - u0) dot (u1 - u0)) /
1909                     (norm (y - u0) * norm (u1 - u0)) <=
1910                     ((x - u0) dot (u1 - u0)) /
1911                     (norm (x - u0) * norm (u1 - u0))))`);
1912  (NEW_GOAL `(Q:real^3->bool) u0`);
1913  (REWRITE_TAC[ASSUME `u0 = (@) (Q:real^3->bool)`]);
1914  (MATCH_MP_TAC SELECT_AX);
1915  (EXPAND_TAC "Q");
1916  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
1917  (STRIP_TAC);
1918  (ASM_REWRITE_TAC[]);
1919
1920  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
1921  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
1922  (MATCH_MP_TAC BARV_3_EXPLICIT);
1923  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1924  (UP_ASM_TAC THEN STRIP_TAC);
1925  (EXISTS_TAC `v1:real^3` THEN     
1926    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
1927  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
1928
1929  (NEW_GOAL `v0 = u0:real^3`);
1930  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
1931  (ASM_REWRITE_TAC[HD]);
1932  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
1933  (ASM_REWRITE_TAC[HD]);
1934  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1935  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1936  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
1937  (UP_ASM_TAC THEN STRIP_TAC);
1938  (REWRITE_WITH `EL 2 ul = v2:real^3`);
1939  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
1940  (STRIP_TAC);
1941
1942  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
1943  (REWRITE_TAC[]);
1944  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1945  (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);
1946  (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
1947    TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
1948    SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);
1949  (COND_CASES_TAC);
1950  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1951  (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);
1952  (STRIP_TAC);
1953  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1954  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
1955  (REWRITE_TAC[coplanar]);
1956  (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);
1957  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
1958  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
1959    EXISTS_TAC `mxi V ul`);
1960  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
1961  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
1962  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
1963  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
1964  (STRIP_TAC);
1965  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
1966  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
1967  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1968  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1969  (SET_TAC[]);
1970
1971  (UP_ASM_TAC THEN EXPAND_TAC "Q");
1972  (STRIP_TAC);
1973  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);
1974  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1975  (EXISTS_TAC `mcell 3 V ul`);
1976  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1977  (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
1978  (COND_CASES_TAC);
1979  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
1980  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1981  (MATCH_MP_TAC BARV_3_EXPLICIT);
1982  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1983  (UP_ASM_TAC THEN STRIP_TAC);
1984  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
1985  (REWRITE_TAC[ASSUME `ul = [v0;v1;v2;v3:real^3]`]);
1986
1987  (REWRITE_WITH `v0 = u0:real^3`);
1988  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1989  (ASM_REWRITE_TAC[HD]);
1990  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1991  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1992    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1993  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1994
1995  (REWRITE_WITH `v1 = u1:real^3`);
1996  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1997  (ASM_REWRITE_TAC[HD; TL]);
1998  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1999  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2000    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2001  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2002  (UP_ASM_TAC THEN STRIP_TAC);
2003  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; 
2004    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
2005  (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);
2006
2007  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2008  (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);
2009  (REWRITE_TAC[ASSUME `ul = [u0; u1; v2; v3:real^3]`;   
2010                CONVEX_HULL_SUBSET_AFFINE_HULL]);
2011  (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} = 
2012                  affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
2013  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2014
2015  (NEW_GOAL `convex hull {EL 2 ul, mxi V ul} SUBSET 
2016              affine hull {EL 2 ul, mxi V ul}`);
2017  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2018  (NEW_GOAL `affine hull {EL 2 ul, mxi V ul} SUBSET 
2019              affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
2020  (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
2021  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
2022  (SET_TAC[]);
2023  (UP_ASM_TAC THEN UP_ASM_TAC THEN 
2024    UNDISCH_TAC `u0 IN convex hull {EL 2 ul, mxi V ul}` THEN SET_TAC[]);
2025  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2026  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2027
2028  (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));
2029  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);
2030  (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(mxi V ul)}`);
2031  (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2032  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2033  (ASM_REWRITE_TAC[]);
2034
2035  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2036  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2037  (MATCH_MP_TAC BARV_3_EXPLICIT);
2038  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2039  (UP_ASM_TAC THEN STRIP_TAC);
2040  (EXISTS_TAC `v1:real^3` THEN     
2041    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2042  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2043
2044  (NEW_GOAL `v0 = u0:real^3`);
2045  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2046  (ASM_REWRITE_TAC[HD]);
2047  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2048  (ASM_REWRITE_TAC[HD]);
2049  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2050  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2051  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2052  (UP_ASM_TAC THEN STRIP_TAC);
2053  (REWRITE_WITH `EL 2 ul = v2:real^3`);
2054  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
2055  (STRIP_TAC);
2056
2057  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
2058  (REWRITE_TAC[]);
2059  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2060  (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);
2061  (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
2062    TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
2063    SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);
2064  (COND_CASES_TAC);
2065  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2066  (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);
2067  (STRIP_TAC);
2068  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2069  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2070  (REWRITE_TAC[coplanar]);
2071  (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);
2072  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2073  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2074    EXISTS_TAC `mxi V ul`);
2075  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2076  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2077  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2078  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2079  (STRIP_TAC);
2080  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2081  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2082  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2083  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2084  (SET_TAC[]);
2085
2086  (STRIP_TAC);
2087
2088  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);
2089  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2090  (EXISTS_TAC `mcell 3 V ul`);
2091  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2092  (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
2093  (COND_CASES_TAC);
2094  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2095  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2096  (MATCH_MP_TAC BARV_3_EXPLICIT);
2097  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2098  (UP_ASM_TAC THEN STRIP_TAC);
2099  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2100  (ASM_REWRITE_TAC[]);
2101
2102  (REWRITE_WITH `v0 = u0:real^3`);
2103  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2104  (ASM_REWRITE_TAC[HD]);
2105  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2106  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2107    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2108  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2109
2110  (REWRITE_WITH `v1 = u1:real^3`);
2111  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2112  (ASM_REWRITE_TAC[HD; TL]);
2113  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2114  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2115    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2116  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2117  (UP_ASM_TAC THEN STRIP_TAC);
2118  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; 
2119    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
2120
2121  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2122  (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);
2123  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2124  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2125  (ABBREV_TAC `m = mxi V ul`);
2126  (NEW_GOAL `mxi V [u0; u1;v2;v3] = m`);
2127  (EXPAND_TAC "m" THEN AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
2128  (ASM_REWRITE_TAC[]);
2129  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2130  (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);
2131  (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);
2132  (UNDISCH_TAC `xx IN convex hull {EL 2 ul, m:real^3}`);
2133  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1/\ 1 = SUC 0`; 
2134    CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2135  (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);
2136  (ASM_REWRITE_TAC[]);
2137
2138  (STRIP_TAC); 
2139
2140  (REWRITE_TAC[coplanar]);
2141  (NEW_GOAL `~(k2 = &0)`);
2142  (EXPAND_TAC "k2");
2143  (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2144  (ASM_REWRITE_TAC[]);
2145
2146  (ASM_CASES_TAC `~(v = &0)`);
2147  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2148    EXISTS_TAC `v2:real^3`);
2149  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));
2150  (STRIP_TAC);
2151  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2152  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2153  (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);
2154  (EXISTS_TAC `k1 / (k2 * v)`);
2155  (EXISTS_TAC `(--k2 * u) / (k2 * v)`);
2156  (STRIP_TAC);
2157  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2158  (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);
2159  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2160  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);
2161  (MATCH_MP_TAC REAL_DIV_REFL);
2162  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2163
2164  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2165                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2166  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2167  (REWRITE_WITH
2168   `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = m:real^3  <=> 
2169    ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % m`);
2170  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2171  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2172  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2173  (ASM_REWRITE_TAC[VECTOR_ARITH 
2174   `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % m <=> 
2175     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2176
2177  (NEW_GOAL `~(u = &0)`);
2178  (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN  
2179    REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
2180  (REAL_ARITH_TAC);
2181
2182  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2183    EXISTS_TAC `m:real^3`);
2184  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));
2185  (STRIP_TAC);
2186  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2187  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2188
2189  (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);
2190  (EXISTS_TAC `k1 / (k2 * u)`);
2191  (EXISTS_TAC `(--k2 * v) / (k2 * u)`);
2192  (STRIP_TAC);
2193  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2194  (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);
2195  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2196  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);
2197  (MATCH_MP_TAC REAL_DIV_REFL);
2198  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2199
2200  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2201                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2202  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2203  (REWRITE_WITH
2204   `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = v2:real^3  <=> 
2205    ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = (k2 * u) % v2`);
2206  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2207  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2208  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2209  (ASM_REWRITE_TAC[VECTOR_ARITH 
2210   `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=> 
2211     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2212
2213  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2214
2215 (* ========================================================================== *)
2216
2217  (ABBREV_TAC `f4 = 
2218   (\ul. (((smallest_angle_line (EL 2 ul)  (EL 3 ul) u0 u1) - u0)
2219    dot (u1 - u0)) / 
2220    (norm ((smallest_angle_line (EL 2 ul)  (EL 3 ul) u0 u1) - u0)
2221    * norm (u1 - u0)))`);
2222
2223  (ABBREV_TAC `P4 = {(f4:(real^3)list->real) ul |ul | barV V 3 ul /\
2224                                  ~NULLSET (mcell 4 V ul INTER C) /\
2225                                   truncate_simplex 1 ul = [u0; u1]}`);
2226
2227  (NEW_GOAL `~(P4 = {}) ==> (?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
2228  (STRIP_TAC);
2229  (MATCH_MP_TAC SUP_FINITE_LEMMA);
2230  (ASM_REWRITE_TAC[]);
2231  (EXPAND_TAC "P4");
2232  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
2233  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
2234  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
2235  (MATCH_MP_TAC FINITE_SUBSET);
2236  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
2237                       v0 IN (V INTER ball (u0:real^3, &4)) /\
2238                       v1 IN (V INTER ball (u0, &4)) /\
2239                       u2 IN (V INTER ball (u0, &4)) /\
2240                       u3 IN (V INTER ball (u0, &4)) /\
2241                       y = [v0; v1; u2; u3]}`);
2242  (STRIP_TAC);
2243  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
2244  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
2245  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
2246  (REPEAT STRIP_TAC);
2247  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
2248  (MATCH_MP_TAC BARV_3_EXPLICIT);
2249  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2250  (UP_ASM_TAC THEN STRIP_TAC);
2251  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
2252    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
2253  (ASM_REWRITE_TAC[]);
2254  (NEW_GOAL `v0 = u0:real^3`);
2255  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
2256  (ASM_REWRITE_TAC[HD]);
2257  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
2258  (ASM_REWRITE_TAC[HD]);
2259  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2260  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2261  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
2262  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2263  (EXISTS_TAC `V:real^3->bool`);
2264  (ASM_REWRITE_TAC[set_of_list]);
2265  (SET_TAC[]);
2266  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
2267  (MATCH_MP_TAC Packing3.BARV_SUBSET);
2268  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2269  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
2270  (SET_TAC[]);
2271
2272  (ABBREV_TAC `d2 = (if (P4 = {}:real->bool) then c 
2273                     else (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b)))`);
2274  (NEW_GOAL `d2 < &1`);
2275  (EXPAND_TAC "d2");
2276  (COND_CASES_TAC);
2277  (ASM_REWRITE_TAC[]);
2278  (NEW_GOAL `?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b)`);
2279  (ASM_SIMP_TAC[]);
2280  (UP_ASM_TAC THEN STRIP_TAC);
2281  (ABBREV_TAC `P  = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
2282  (ABBREV_TAC `zz = (@) (P:real->bool)`);
2283  (NEW_GOAL `(P:real->bool) zz`);
2284  (EXPAND_TAC "zz");
2285  (MATCH_MP_TAC SELECT_AX);
2286  (EXISTS_TAC `b':real`);
2287  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
2288  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
2289  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
2290  (REPEAT STRIP_TAC);
2291  (ASM_REWRITE_TAC[]);
2292  (EXPAND_TAC "f4");
2293
2294  (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (EL 3 ul) u0 u1`);
2295  (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
2296  (STRIP_TAC);
2297  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
2298  (STRIP_TAC);
2299  (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
2300  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2301  (ASM_REWRITE_TAC[]);
2302  (EXPAND_TAC "xx");
2303  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN 
2304    REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2305  (STRIP_TAC);
2306  (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, EL 3 ul} /\
2307            (!y. y IN convex hull {EL 2 ul, EL 3 ul}
2308                 ==> ((y - u0) dot (u1 - u0)) /
2309                     (norm (y - u0) * norm (u1 - u0)) <=
2310                     ((x - u0) dot (u1 - u0)) /
2311                     (norm (x - u0) * norm (u1 - u0))))`);
2312  (NEW_GOAL `(Q:real^3->bool) u0`);
2313  (ONCE_ASM_REWRITE_TAC[]);
2314  (MATCH_MP_TAC SELECT_AX);
2315  (EXPAND_TAC "Q");
2316
2317  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
2318  (STRIP_TAC);
2319  (ASM_REWRITE_TAC[]);
2320
2321  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2322  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2323  (MATCH_MP_TAC BARV_3_EXPLICIT);
2324  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2325  (UP_ASM_TAC THEN STRIP_TAC);
2326  (EXISTS_TAC `v1:real^3` THEN     
2327    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2328  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2329
2330  (NEW_GOAL `v0 = u0:real^3`);
2331  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2332  (ASM_REWRITE_TAC[HD]);
2333  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2334  (ASM_REWRITE_TAC[HD]);
2335  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2336  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2337  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2338  (UP_ASM_TAC THEN STRIP_TAC);
2339  (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);
2340  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
2341  (STRIP_TAC);
2342
2343  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
2344  (REWRITE_TAC[]);
2345  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2346  (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);
2347  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`; 
2348    ASSUME `ul = [u0; v1; v2; v3:real^3]`]);
2349  (COND_CASES_TAC);
2350
2351  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2352  (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);
2353  (STRIP_TAC);
2354  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2355  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2356  (REWRITE_TAC[coplanar]);
2357  (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);
2358  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2359  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2360    EXISTS_TAC `v3:real^3`);
2361  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2362  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2363  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2364  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2365  (STRIP_TAC);
2366  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2367  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2368  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2369  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2370  (SET_TAC[]);
2371
2372  (UP_ASM_TAC THEN EXPAND_TAC "Q");
2373  (STRIP_TAC);
2374  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);
2375  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2376  (EXISTS_TAC `mcell 4 V ul`);
2377  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2378  (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
2379  (COND_CASES_TAC);
2380  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2381  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2382  (MATCH_MP_TAC BARV_3_EXPLICIT);
2383  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2384  (UP_ASM_TAC THEN STRIP_TAC);
2385  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2386  (ASM_REWRITE_TAC[]);
2387
2388  (REWRITE_WITH `v0 = u0:real^3`);
2389  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2390  (ASM_REWRITE_TAC[HD]);
2391  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2392  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2393    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2394  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2395
2396  (REWRITE_WITH `v1 = u1:real^3`);
2397  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2398  (ASM_REWRITE_TAC[HD; TL]);
2399  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2400  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2401    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2402  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2403  (ASM_REWRITE_TAC[]);
2404  (UP_ASM_TAC THEN STRIP_TAC);
2405
2406  (ASM_REWRITE_TAC[set_of_list]);
2407  (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);
2408  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2409  (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
2410  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2411  (REWRITE_WITH `affine hull {u0, u1, v2, v3} = 
2412                  affine hull {u1, v2, v3:real^3}`);
2413  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2414
2415  (NEW_GOAL `convex hull {EL 2 ul, (EL 3 ul):real^3} SUBSET 
2416              affine hull {EL 2 ul, EL 3 ul}`);
2417  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2418  (NEW_GOAL `affine hull {EL 2 ul, (EL 3 ul):real^3} SUBSET 
2419              affine hull {u1, v2, v3}`);
2420  (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
2421  (ASM_REWRITE_TAC[EL; HD; TL; 
2422    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
2423  (SET_TAC[]);
2424  (UP_ASM_TAC THEN UP_ASM_TAC THEN 
2425    UNDISCH_TAC `u0 IN convex hull {EL 2 ul, (EL 3 ul):real^3}` THEN SET_TAC[]);
2426  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2427  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2428
2429  (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));
2430  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);
2431  (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(EL 3 ul):real^3}`);
2432  (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2433  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2434  (ASM_REWRITE_TAC[]);
2435
2436  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2437  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2438  (MATCH_MP_TAC BARV_3_EXPLICIT);
2439  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2440  (UP_ASM_TAC THEN STRIP_TAC);
2441  (EXISTS_TAC `v1:real^3` THEN     
2442    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2443  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2444
2445  (NEW_GOAL `v0 = u0:real^3`);
2446  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2447  (ASM_REWRITE_TAC[HD]);
2448  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2449  (ASM_REWRITE_TAC[HD]);
2450  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2451  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2452  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2453  (UP_ASM_TAC THEN STRIP_TAC);
2454  (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);
2455  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
2456  (STRIP_TAC);
2457
2458  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
2459  (REWRITE_TAC[]);
2460  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2461  (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);
2462  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`; 
2463    ASSUME `ul = [u0; v1; v2; v3:real^3]`]);
2464  (COND_CASES_TAC);
2465
2466  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2467  (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);
2468  (STRIP_TAC);
2469  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2470  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2471  (REWRITE_TAC[coplanar]);
2472  (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);
2473  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2474  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2475    EXISTS_TAC `v3:real^3`);
2476  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2477  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2478  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2479  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2480  (STRIP_TAC);
2481  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2482  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2483  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2484  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2485  (SET_TAC[]);
2486
2487  (STRIP_TAC);
2488
2489  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);
2490  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2491  (EXISTS_TAC `mcell 4 V ul`);
2492  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2493  (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
2494  (COND_CASES_TAC);
2495  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2496  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2497  (MATCH_MP_TAC BARV_3_EXPLICIT);
2498  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2499  (UP_ASM_TAC THEN STRIP_TAC);
2500  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2501  (ASM_REWRITE_TAC[]);
2502
2503  (REWRITE_WITH `v0 = u0:real^3`);
2504  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2505  (ASM_REWRITE_TAC[HD]);
2506  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2507  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2508    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2509  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2510
2511  (REWRITE_WITH `v1 = u1:real^3`);
2512  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2513  (ASM_REWRITE_TAC[HD; TL]);
2514  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2515  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2516    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2517  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2518  (UP_ASM_TAC THEN STRIP_TAC);
2519  (ASM_REWRITE_TAC[set_of_list]);
2520
2521  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2522  (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
2523  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2524  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2525  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2526  (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);
2527  (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);
2528  (UNDISCH_TAC `xx IN convex hull {EL 2 ul,(EL 3 ul):real^3}`);
2529  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1/\ 1 = SUC 0`; 
2530    CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2531  (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);
2532  (ASM_REWRITE_TAC[]);
2533
2534  (STRIP_TAC); 
2535
2536  (REWRITE_TAC[coplanar]);
2537  (NEW_GOAL `~(k2 = &0)`);
2538  (EXPAND_TAC "k2");
2539  (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2540  (ASM_REWRITE_TAC[]);
2541
2542  (ASM_CASES_TAC `~(v = &0)`);
2543  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2544    EXISTS_TAC `v2:real^3`);
2545  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));
2546  (STRIP_TAC);
2547  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2548  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2549  (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);
2550  (EXISTS_TAC `k1 / (k2 * v)`);
2551  (EXISTS_TAC `(--k2 * u) / (k2 * v)`);
2552  (STRIP_TAC);
2553  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2554  (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);
2555  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2556  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);
2557  (MATCH_MP_TAC REAL_DIV_REFL);
2558  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2559
2560  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2561                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2562  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2563  (REWRITE_WITH
2564   `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = v3:real^3  <=> 
2565    ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % v3`);
2566  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2567  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2568  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2569  (ASM_REWRITE_TAC[VECTOR_ARITH 
2570   `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % v3 <=> 
2571     k1 % (u1 - u0) = k2 % ((u % v2 + v % v3) - u0)`]);
2572
2573  (NEW_GOAL `~(u = &0)`);
2574  (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN  
2575    REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
2576  (REAL_ARITH_TAC);
2577
2578  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2579    EXISTS_TAC `v3:real^3`);
2580  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));
2581  (STRIP_TAC);
2582  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2583  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2584
2585  (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);
2586  (EXISTS_TAC `k1 / (k2 * u)`);
2587  (EXISTS_TAC `(--k2 * v) / (k2 * u)`);
2588  (STRIP_TAC);
2589  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2590  (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);
2591  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2592  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);
2593  (MATCH_MP_TAC REAL_DIV_REFL);
2594  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2595
2596  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2597                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2598  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2599  (REWRITE_WITH
2600   `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = v2:real^3  <=> 
2601    ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = (k2 * u) % v2`);
2602  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2603  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2604  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2605  (ASM_REWRITE_TAC[VECTOR_ARITH 
2606   `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=> 
2607     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2608  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2609
2610 (* ========================================================================== *)
2611
2612  (ABBREV_TAC `d = max c (max d1 d2)`);
2613  (NEW_GOAL `d < &1`);
2614  (UNDISCH_TAC `d2 < &1` THEN UNDISCH_TAC `d1 < &1` THEN 
2615    UNDISCH_TAC `&0 < c /\ c < &1`);
2616  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2617
2618 (* ========================================================================== *)
2619
2620  (ABBREV_TAC `D = ball (u0:real^3,r) INTER rcone_gt u0 u1 d`);
2621  (NEW_GOAL `D SUBSET C:real^3->bool`);
2622  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
2623  (MATCH_MP_TAC (SET_RULE 
2624   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
2625  (STRIP_TAC);
2626  (MATCH_MP_TAC SUBSET_BALL);
2627  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2628  (MATCH_MP_TAC RCONE_GT_SUBSET);
2629  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2630
2631  (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D)
2632           ==> (?k vl.
2633                    2 <= k /\
2634                    barV V 3 vl /\
2635                    X = mcell k V vl /\
2636                    truncate_simplex 1 vl = [u0; u1])`);
2637  (REPEAT STRIP_TAC);
2638  (FIRST_ASSUM MATCH_MP_TAC);
2639  (ASM_REWRITE_TAC[]);
2640  (STRIP_TAC);
2641  (UNDISCH_TAC `~NULLSET (X INTER D)`);
2642  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2643  (EXISTS_TAC `X INTER C:real^3->bool`);
2644  (ASM_REWRITE_TAC[] THEN UNDISCH_TAC `D SUBSET C:real^3->bool`);
2645  (SET_TAC[]);
2646
2647 (* ========================================================================= *)
2648
2649  (NEW_GOAL `D = conic_cap (u0:real^3) u1 r d`);
2650  (EXPAND_TAC "D" THEN REWRITE_TAC[conic_cap; NORMBALL_BALL]);
2651
2652  (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D) ==>
2653    vol (X INTER D) = vol (D) * (dihX V X (u0,u1)) / (&2 * pi)`);
2654  (REPEAT STRIP_TAC);
2655  (NEW_GOAL `?k vl.
2656                    2 <= k /\
2657                    barV V 3 vl /\
2658                    X = mcell k V vl /\
2659                    truncate_simplex 1 vl = [u0; u1]`);
2660  (FIRST_ASSUM MATCH_MP_TAC);
2661  (ASM_REWRITE_TAC[]);
2662  (UP_ASM_TAC THEN REPEAT STRIP_TAC);
2663
2664 (* ========================================================================= *)
2665 (*  Case k = 2                                                               *)
2666 (* ========================================================================= *)
2667
2668  (ASM_CASES_TAC `k = 2`);
2669  (ABBREV_TAC `m = mxi V vl`);
2670  (ABBREV_TAC `s3 = omega_list_n V vl 3`);
2671  (ABBREV_TAC `L = aff_ge{u0, u1} {m, s3:real^3}`);
2672
2673  (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
2674  (AP_TERM_TAC);
2675  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
2676  (LET_TAC);
2677  (COND_CASES_TAC);
2678  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
2679  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
2680  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2681  (UP_ASM_TAC THEN STRIP_TAC);
2682
2683  (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);
2684  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
2685  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2686  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2687  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2688  (ASM_REWRITE_TAC[HD; TL]);
2689  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
2690  (ASM_REWRITE_TAC[HD; TL]);
2691  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
2692  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
2693    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2694  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2695
2696  (EXPAND_TAC "L");
2697  (REWRITE_TAC [SET_RULE `(A INTER B INTER C) INTER D = C INTER D 
2698                        <=> (!x. x IN C INTER D ==> x IN A /\ x IN B)`]);
2699
2700  (REPEAT GEN_TAC THEN STRIP_TAC);
2701  (NEW_GOAL `x:real^3 IN D`);
2702  (UP_ASM_TAC THEN UNDISCH_TAC `D = conic_cap (u0:real^3) u1 r d`);
2703  (SET_TAC[]);
2704  (UP_ASM_TAC THEN EXPAND_TAC "D" THEN STRIP_TAC);
2705  (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a'`);
2706  (NEW_GOAL `rcone_gt (u0:real^3) u1 d SUBSET rcone_gt u0 u1 c`);
2707  (MATCH_MP_TAC RCONE_GT_SUBSET);
2708  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2709  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
2710    `rcone_gt (u0:real^3) u1 c SUBSET W INTER rcone_gt u0 u1 a'`);
2711  (SET_TAC[]);
2712  (STRIP_TAC);
2713  (UP_ASM_TAC THEN SET_TAC[RCONE_GT_SUBSET_RCONE_GE]);
2714
2715 (* ========================================================================== *)
2716  (UP_ASM_TAC THEN REWRITE_TAC[rcone_ge; rconesgn; rcone_gt; IN; IN_ELIM_THM]);
2717  (STRIP_TAC);
2718
2719  (ABBREV_TAC `y = u0 + proj_point (u1 - u0:real^3) (x - u0)`);
2720  (NEW_GOAL `orthogonal (x - y) (u1 - u0:real^3)`);
2721  (REWRITE_WITH `x - y = (x - u0) - proj_point (u1 - u0) (x - u0:real^3)`);
2722  (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2723  (REWRITE_TAC[GSYM Marchal_cells_2_new.projection_proj_point]);
2724  (REWRITE_TAC[orthogonal; Packing3.PROJECTION_ORTHOGONAL]);
2725
2726  (NEW_GOAL `norm (x - u0) pow 2 = norm (y - u0) pow 2 + norm (x - y:real^3) pow 2`);
2727  (MATCH_MP_TAC PYTHAGORAS);
2728  (REWRITE_TAC[orthogonal]);
2729  (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = --(c dot (b - a))`]);
2730  (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);
2731  (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);
2732  (REWRITE_TAC[PRO_EXP; DOT_RMUL]);
2733  (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);
2734  (ASM_REWRITE_TAC[]);
2735  (REAL_ARITH_TAC);
2736
2737  (NEW_GOAL `norm (x - u1) pow 2 = norm (y - u1) pow 2 + norm (x - y:real^3) pow 2`);
2738  (MATCH_MP_TAC PYTHAGORAS);
2739  (REWRITE_TAC[orthogonal]);
2740  (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = c dot (a - b)`]);
2741  (REWRITE_WITH `u1 - y = (u1 - u0) - proj_point (u1 - u0) (x - u0:real^3)`);
2742  (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2743  (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x - a % x = (&1 - a) % x`]);
2744  (REWRITE_TAC[DOT_RMUL] THEN DEL_TAC);
2745  (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);
2746  (ASM_REWRITE_TAC[]);
2747  (REAL_ARITH_TAC);
2748
2749  (MP_TAC (ASSUME `(x - u0:real^3) dot (u1 - u0) > 
2750                 dist (x,u0) * dist (u1,u0) * a'`));
2751  (REWRITE_WITH `(x - u0) dot (u1 - u0) = 
2752                  (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);
2753  (VECTOR_ARITH_TAC);
2754  (REWRITE_WITH `(x - u1) dot (u0 - u1) = 
2755                  (x - y) dot (u0 - u1) + (y - u1) dot (u0 - u1:real^3)`);
2756  (VECTOR_ARITH_TAC);
2757  (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);
2758  (ASM_REWRITE_TAC[GSYM orthogonal]);
2759  (REWRITE_WITH `(x - y) dot (u0 - u1:real^3) = &0`);
2760  (ONCE_REWRITE_TAC[VECTOR_ARITH `a dot (u0 - u1) = --(a dot (u1 - u0))`]);
2761  (REWRITE_TAC[REAL_ARITH `--a = &0 <=> a = &0`]);
2762  (ASM_REWRITE_TAC[GSYM orthogonal]);
2763  (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
2764
2765  (STRIP_TAC);
2766  (NEW_GOAL `(y - u0) dot (u1 - u0) = norm (y - u0) * norm (u1 - u0:real^3)`);
2767  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
2768  (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);
2769  (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);
2770  (REWRITE_TAC[PRO_EXP; NORM_MUL; VECTOR_MUL_ASSOC]);
2771  (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));
2772  (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);
2773  (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));
2774  (REWRITE_TAC[REAL_ABS_REFL]);
2775  (MATCH_MP_TAC REAL_LE_DIV);
2776  (REWRITE_TAC[DOT_POS_LE]);
2777
2778  (REWRITE_WITH `(x - u0) dot (u1 - u0) = 
2779                  (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);
2780  (VECTOR_ARITH_TAC);
2781  (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);
2782  (ASM_REWRITE_TAC[GSYM orthogonal]);
2783  (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
2784
2785  (NEW_GOAL `y IN convex hull {u0, u1:real^3}`);
2786  (NEW_GOAL `y IN affine hull {u0, u1:real^3}`);
2787  (REWRITE_TAC[AFFINE_HULL_2; IN; IN_ELIM_THM]);
2788  (EXPAND_TAC "y" THEN REWRITE_TAC[PRO_EXP]);
2789  (ABBREV_TAC `rtemp = ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - 
2790                 u0:real^3))`);
2791  (EXISTS_TAC `&1 - rtemp` THEN EXISTS_TAC `rtemp:real`);
2792  (STRIP_TAC);
2793  (REAL_ARITH_TAC);
2794  (VECTOR_ARITH_TAC);
2795  (UP_ASM_TAC THEN REWRITE_TAC[IN; AFFINE_HULL_2; CONVEX_HULL_2; IN_ELIM_THM]);
2796  (REPEAT STRIP_TAC);
2797  (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2798  (ASM_REWRITE_TAC[]);
2799
2800  (NEW_GOAL `y - u0 = v % (u1 - u0:real^3)`);
2801  (NEW_GOAL `y - u0 = y - (u + v) % u0:real^3`);
2802  (REWRITE_TAC[ASSUME `u + v = &1`; VECTOR_MUL_LID]);
2803  (UP_ASM_TAC THEN REWRITE_WITH `y - (u + v) % u0 = v % (u1 - u0:real^3)`);
2804  (REWRITE_TAC[ASSUME `y = u % u0 + v % u1:real^3`] THEN VECTOR_ARITH_TAC);
2805
2806  (ASM_CASES_TAC `u < &0`);
2807  (NEW_GOAL `F`);
2808  (NEW_GOAL `norm (y - u0) <= norm (x - u0:real^3)`);
2809  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
2810  (REWRITE_TAC[NORM_POS_LE; ASSUME 
2811   `norm (x - u0:real^3) pow 2 = norm (y - u0) pow 2 + norm (x - y) pow 2`; 
2812    REAL_ARITH `a <= a + b <=> &0 <= b`; REAL_LE_POW_2]);
2813  (NEW_GOAL `norm (x - u0:real^3) < &1`);
2814  (REWRITE_TAC[GSYM dist] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN 
2815    REWRITE_TAC[GSYM IN_BALL]);
2816  (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
2817  (MATCH_MP_TAC SUBSET_BALL);
2818  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2819  (UP_ASM_TAC THEN UNDISCH_TAC 
2820   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
2821
2822  (NEW_GOAL `norm (y - u0) = v * norm (u1:real^3 - u0)`);
2823  (ASM_REWRITE_TAC[NORM_MUL]);
2824
2825  (REWRITE_WITH `abs v = v`);
2826  (REWRITE_TAC[REAL_ABS_REFL]);
2827  (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);
2828  (NEW_GOAL `&2 <= norm (u1 - u0:real^3)`);
2829  (REWRITE_TAC[GSYM dist]);
2830  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
2831  (REPEAT STRIP_TAC);
2832  (FIRST_ASSUM MATCH_MP_TAC);
2833  (ASM_REWRITE_TAC[]);
2834  (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);
2835  (ASM_REWRITE_TAC[]);
2836
2837  (NEW_GOAL `v * &2 <= v * norm (u1 - u0:real^3)`);
2838  (REWRITE_TAC[REAL_ARITH `a * b <= a * c <=> &0 <= a * (c - b)`]);
2839  (MATCH_MP_TAC REAL_LE_MUL);
2840  (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN UP_ASM_TAC);
2841  (REAL_ARITH_TAC);
2842
2843  (NEW_GOAL `&1 < v`);
2844  (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);
2845  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
2846    UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2847  (UP_ASM_TAC THEN MESON_TAC[]);
2848
2849  (ASM_CASES_TAC `v < &0`);
2850  (NEW_GOAL `F`);
2851  (NEW_GOAL `(y - u0) dot (u1 - u0:real^3) <= &0`);
2852  (ASM_REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
2853  (MATCH_MP_TAC REAL_LE_MUL);
2854  (REWRITE_TAC[DOT_POS_LE]);
2855  (UP_ASM_TAC THEN REAL_ARITH_TAC);
2856
2857  (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);
2858  (MATCH_MP_TAC REAL_LE_MUL);
2859  (REWRITE_TAC[DIST_POS_LE]);
2860  (MATCH_MP_TAC REAL_LE_MUL);
2861  (REWRITE_TAC[DIST_POS_LE]);
2862  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2863  (STRIP_TAC);
2864  (REWRITE_TAC[HL_2]);
2865  (MATCH_MP_TAC REAL_LE_MUL);
2866  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
2867  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
2868  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
2869  `(y - u0:real^3) dot (u1 - u0) > dist (x,u0) * dist (u1,u0) * a'`);
2870  (REAL_ARITH_TAC);
2871  (UP_ASM_TAC THEN MESON_TAC[]);
2872  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2873
2874  (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);
2875  (MATCH_MP_TAC REAL_LE_MUL);
2876  (REWRITE_TAC[DIST_POS_LE]);
2877  (MATCH_MP_TAC REAL_LE_MUL);
2878  (REWRITE_TAC[DIST_POS_LE]);
2879  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2880  (STRIP_TAC);
2881  (REWRITE_TAC[HL_2]);
2882  (MATCH_MP_TAC REAL_LE_MUL);
2883  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
2884  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
2885  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2886
2887  (NEW_GOAL `(y - u1) dot (u0 - u1) = norm (y - u1) * norm (u0 - u1:real^3)`);
2888  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
2889  (REWRITE_WITH `y - u1 = proj_point (u1 - u0) (x - u0:real^3) - (u1 - u0)`);
2890  (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2891  (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x % a - a = (x - &1) % a`; NORM_MUL;
2892                VECTOR_MUL_ASSOC]);
2893  (REWRITE_WITH ` 
2894    (norm (u0 - u1) *
2895    (((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) - &1)) % (u1 - u0) =  
2896    (norm (u0 - u1:real^3) *
2897    (&1 - ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)))) % (u0 - u1)`);
2898  (VECTOR_ARITH_TAC);
2899  (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));
2900  (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);
2901  (REWRITE_TAC[NORM_ARITH `norm (a - b) = norm (b - a)`]);
2902  (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));
2903  (REWRITE_TAC[REAL_ARITH `abs (x - &1) = abs (&1 - x)`]);
2904  (REWRITE_TAC[REAL_ABS_REFL; REAL_ARITH `&0 <= a - b <=> b <= a`]);
2905  (REWRITE_WITH `((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) <= &1
2906   <=> ((x - u0) dot (u1 - u0)) <= &1 * ((u1 - u0) dot (u1 - u0:real^3))`);
2907  (MATCH_MP_TAC REAL_LE_LDIV_EQ);
2908  (REWRITE_TAC[DOT_POS_LT; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2909  (ASM_REWRITE_TAC[]);
2910  (NEW_GOAL `(x - u0) dot (u1 - u0) <= norm (x - u0) * norm (u1 - u0:real^3)`);
2911  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
2912
2913  (NEW_GOAL `norm (x - u0) * norm (u1 - u0) <= &1 * norm (u1 - u0:real^3)`);
2914  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
2915  (MATCH_MP_TAC REAL_LE_MUL);
2916  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);
2917  (MATCH_MP_TAC (REAL_ARITH `a < x ==> a <= x`));
2918  (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
2919  (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
2920  (MATCH_MP_TAC SUBSET_BALL);
2921  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2922  (UP_ASM_TAC THEN UNDISCH_TAC 
2923   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
2924  (REWRITE_TAC[GSYM NORM_POW_2; REAL_ARITH `&1 * a pow 2 = a * a`]);
2925  (NEW_GOAL `&1 * norm (u1 - u0) <= norm (u1 - u0) * norm (u1 - u0:real^3)`);
2926  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
2927  (MATCH_MP_TAC REAL_LE_MUL);
2928  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);
2929  (MATCH_MP_TAC (REAL_ARITH `&2 <= x ==> &1 <= x`));
2930  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
2931  (STRIP_TAC);
2932  (FIRST_ASSUM MATCH_MP_TAC);
2933  (ASM_REWRITE_TAC[]);
2934  (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);
2935  (ASM_REWRITE_TAC[]);
2936  (UNDISCH_TAC `(x - u0:real^3) dot (u1 - u0) <= 
2937                 norm (x - u0) * norm (u1 - u0)` THEN 
2938    UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2939  (ASM_REWRITE_TAC[dist]);
2940  (REWRITE_TAC[REAL_ARITH `a * b >= x * b * c <=> &0 <= b * (a - x * c)`]);
2941  (MATCH_MP_TAC REAL_LE_MUL);
2942  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
2943  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
2944  (STRIP_TAC);
2945
2946  (MATCH_MP_TAC REAL_LE_MUL);
2947  (REWRITE_TAC[NORM_POS_LE]);
2948  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2949  (STRIP_TAC);
2950  (REWRITE_TAC[HL_2]);
2951  (MATCH_MP_TAC REAL_LE_MUL);
2952  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
2953  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
2954  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);
2955  (ASM_REWRITE_TAC[]);
2956  (REWRITE_TAC[REAL_ARITH `(a + b) * x <= a <=> b * x <= (&1 - x) * a`]);
2957
2958  (UNDISCH_TAC `(y - u0) dot (u1 - u0) > dist (x,u0) * dist (u1,u0:real^3) * a'`);
2959  (ASM_REWRITE_TAC[dist]);
2960  (REWRITE_TAC[REAL_ARITH `a * b > x * b * c <=> &0 < b * (a - x * c)`]);
2961  (REWRITE_TAC[REAL_MUL_POS_LT]);
2962  (REWRITE_WITH `~(norm (u1 - u0:real^3) < &0 /\ 
2963                    norm (y - u0) - norm (x - u0) * a' < &0)`);
2964  (NEW_GOAL `&0 <= norm (u1 - u0:real^3)`);
2965  (REWRITE_TAC[NORM_POS_LE]);
2966  (UP_ASM_TAC THEN REAL_ARITH_TAC);
2967  (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);
2968  (REWRITE_WITH `norm (x - u0) * a' < norm (y - u0:real^3) <=> 
2969                 (norm (x - u0) * a') pow 2 < norm (y - u0) pow 2`);
2970  (MATCH_MP_TAC Pack1.bp_bdt);
2971  (STRIP_TAC);
2972  (MATCH_MP_TAC REAL_LE_MUL);
2973  (REWRITE_TAC[NORM_POS_LE]);
2974  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2975  (STRIP_TAC);
2976  (REWRITE_TAC[HL_2]);
2977  (MATCH_MP_TAC REAL_LE_MUL);
2978  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
2979  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
2980  (REWRITE_TAC[NORM_POS_LE]);
2981
2982  (ASM_REWRITE_TAC[REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);
2983  (REWRITE_TAC[REAL_ARITH `(a + b) * x < a <=> b * x < (&1 - x) * a`]);
2984  (STRIP_TAC);
2985  
2986  (NEW_GOAL `(&1 - a' pow 2) * norm (y - u0) pow 2 <= 
2987              (&1 - a' pow 2) * norm (y - u1:real^3) pow 2`);
2988  (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= a * (y - x)`]);
2989  (MATCH_MP_TAC REAL_LE_MUL);
2990  (STRIP_TAC);
2991  (REWRITE_TAC[REAL_ARITH `&0 <= &1 - b <=> b <= &1 pow 2`]);
2992  (REWRITE_WITH `a' pow 2 <= &1 pow 2 <=> a' <= &1`);
2993  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2994  (MATCH_MP_TAC Collect_geom.POW2_COND);
2995  (REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
2996  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2997  (STRIP_TAC);
2998  (REWRITE_TAC[HL_2]);
2999  (MATCH_MP_TAC REAL_LE_MUL);
3000  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3001  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3002
3003  (EXPAND_TAC "a'");
3004  (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);
3005  (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
3006  (UNDISCH_TAC `hl [u0; u1:real^3] < sqrt (&2)` THEN REAL_ARITH_TAC);
3007  (NEW_GOAL `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2`);
3008  (REWRITE_WITH `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2 <=>
3009                  norm (x - u0)  <= norm (x - u1:real^3)`);
3010  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3011  (MATCH_MP_TAC Collect_geom.POW2_COND);
3012  (REWRITE_TAC[NORM_POS_LE]);
3013  (MATCH_MP_TAC (REAL_ARITH `&2 * x <= x + y ==> x <= y`));
3014  (REWRITE_TAC[GSYM dist]);
3015
3016  (NEW_GOAL `dist (x, u0:real^3) < &1`);
3017  (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
3018  (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
3019  (MATCH_MP_TAC SUBSET_BALL);
3020  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3021  (UP_ASM_TAC THEN UNDISCH_TAC 
3022   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
3023  (NEW_GOAL `&2 * dist (x, u0:real^3) < &2`);
3024  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3025  (NEW_GOAL `&2 <= dist (x, u0) + dist (x, u1:real^3)`);
3026  (NEW_GOAL `&2 <= dist (u0, u1:real^3)`);
3027  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
3028  (STRIP_TAC);
3029  (FIRST_ASSUM MATCH_MP_TAC);
3030  (ASM_REWRITE_TAC[]);
3031  (ONCE_REWRITE_TAC[MESON[IN] `V a <=> a:real^3 IN V`]);
3032  (ASM_REWRITE_TAC[]);
3033
3034  (NEW_GOAL `dist (u0, u1:real^3) <= dist (u0, x) + dist (x, u1)`);
3035  (REWRITE_TAC[DIST_TRIANGLE]);
3036  (UP_ASM_TAC THEN REWRITE_TAC[DIST_SYM]);
3037  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3038  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3039  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3040  (REAL_ARITH_TAC);
3041  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3042
3043  (NEW_GOAL `F`);
3044  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3045  (REWRITE_TAC[]);
3046  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3047  (EXISTS_TAC `X INTER C:real^3->bool`);
3048  (ASM_SIMP_TAC [SET_RULE `A SUBSET B ==> X INTER A SUBSET X INTER B`]);
3049  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; SET_RULE `{} INTER s = {}`]);
3050  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
3051  (UP_ASM_TAC THEN MESON_TAC[]);
3052
3053  (NEW_GOAL `~coplanar {u0, u1:real^3, m, s3}`);
3054  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3055  (STRIP_TAC);
3056  (NEW_GOAL `NULLSET X`);
3057  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3058  (EXISTS_TAC `affine hull {u0, u1, m, s3:real^3}`);
3059  (STRIP_TAC);
3060  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
3061  (UP_ASM_TAC THEN MESON_TAC[]);
3062  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
3063  (COND_CASES_TAC);
3064  (LET_TAC);
3065  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> M INTER N INTER A SUBSET B`));
3066
3067  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3068  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3069  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3070  (UP_ASM_TAC THEN STRIP_TAC);
3071  (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);
3072  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3073  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3074  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3075  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3076  (ASM_REWRITE_TAC[HD; TL]);
3077  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
3078  (ASM_REWRITE_TAC[HD; TL]);
3079  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
3080  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
3081    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3082  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3083  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1} UNION {m:real^3, s3}`);
3084  (SET_TAC[]);
3085  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3086  (SET_TAC[]);
3087  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3088  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3089  (EXISTS_TAC `X:real^3->bool`);
3090  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3091
3092 (* ========================================================================= *)
3093  (ASM_CASES_TAC `azim u0 u1 m (s3:real^3) < pi`);
3094  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m s3)`);
3095  (ASM_SIMP_TAC[WEDGE_LUNE]);
3096  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
3097                  conic_cap u0 u1 r d INTER L`);
3098  (SET_TAC[]);
3099  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3100  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
3101    aff_gt {u0, u1} {m, s3} DIFF conic_cap u0 u1 r d INTER L = {}`);
3102  (EXPAND_TAC "L");
3103  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
3104  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3105  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
3106  (EXPAND_TAC "L");
3107
3108  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3109                  aff_gt {u0, u1} {m, s3} UNION 
3110    UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN  {m, s3}}`);
3111  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3112  (REWRITE_TAC[Geomdetail.FINITE6]);
3113  (REWRITE_TAC[DISJOINT]);
3114
3115  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3116  (NEW_GOAL `F`);
3117  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3118  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);
3119  (UP_ASM_TAC THEN SET_TAC[]);
3120  (REWRITE_TAC[COPLANAR_3]);
3121  (UP_ASM_TAC THEN MESON_TAC[]);
3122
3123  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3124  (NEW_GOAL `F`);
3125  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3126  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);
3127  (UP_ASM_TAC THEN SET_TAC[]);
3128  (REWRITE_TAC[COPLANAR_3]);
3129  (UP_ASM_TAC THEN MESON_TAC[]);
3130  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3131
3132  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3133  (EXISTS_TAC 
3134   `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3135  (STRIP_TAC);
3136  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3137  (EXISTS_TAC 
3138   `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);
3139  (STRIP_TAC);
3140  (MATCH_MP_TAC NEGLIGIBLE_UNION);
3141  (STRIP_TAC);
3142
3143  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3144  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
3145  (STRIP_TAC);
3146  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3147  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
3148  (SET_TAC[]);
3149  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3150  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3151  (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);
3152  (STRIP_TAC);
3153  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3154  (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);
3155  (SET_TAC[]);
3156  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3157  (REWRITE_TAC[SET_RULE 
3158   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
3159          aff_ge {u0, u1} ({m, s3} DELETE s3) 
3160    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3161  (MATCH_MP_TAC (SET_RULE 
3162   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3163  (STRIP_TAC);
3164  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3165  (STRIP_TAC);
3166  (SET_TAC[]);
3167
3168  (REWRITE_TAC[DISJOINT]);
3169  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3170  (NEW_GOAL `F`);
3171  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3172  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);
3173  (UP_ASM_TAC THEN SET_TAC[]);
3174  (REWRITE_TAC[COPLANAR_3]);
3175  (UP_ASM_TAC THEN MESON_TAC[]);
3176  (UP_ASM_TAC THEN SET_TAC[]);
3177
3178  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3179  (STRIP_TAC);
3180  (SET_TAC[]);
3181  (REWRITE_TAC[DISJOINT]);
3182  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3183  (NEW_GOAL `F`);
3184  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3185  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);
3186  (UP_ASM_TAC THEN SET_TAC[]);
3187  (REWRITE_TAC[COPLANAR_3]);
3188  (UP_ASM_TAC THEN MESON_TAC[]);
3189  (UP_ASM_TAC THEN SET_TAC[]);
3190
3191  (SET_TAC[]);
3192
3193  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
3194  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m s3) =
3195              (if &1 < d \/ r < &0
3196               then &0
3197               else azim u0 u1 m s3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
3198  (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);
3199  (STRIP_TAC);
3200  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3201  (EXISTS_TAC `s3:real^3`);
3202  (ASM_REWRITE_TAC[]);
3203  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3204  (EXISTS_TAC `m:real^3`);
3205  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3206  (ASM_REWRITE_TAC[]);
3207
3208  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
3209  (COND_CASES_TAC);
3210  (NEW_GOAL `F`);
3211  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
3212    UP_ASM_TAC THEN REAL_ARITH_TAC);
3213  (UP_ASM_TAC THEN MESON_TAC[]);
3214
3215  (REWRITE_WITH `azim (u0:real^3) u1 m s3 = dihV u0 u1 m s3`);
3216  (MATCH_MP_TAC AZIM_DIHV_SAME);
3217  (ASM_REWRITE_TAC[]);
3218  (STRIP_TAC);
3219  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3220  (EXISTS_TAC `s3:real^3`);
3221  (ASM_REWRITE_TAC[]);
3222  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3223  (EXISTS_TAC `m:real^3`);
3224  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3225  (ASM_REWRITE_TAC[]);
3226
3227  (REWRITE_TAC[dihX]);
3228  (COND_CASES_TAC);
3229  (NEW_GOAL `F`);
3230  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3231  (REWRITE_TAC[]);
3232  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3233  (EXISTS_TAC `X:real^3->bool`);
3234  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3235  (UP_ASM_TAC THEN MESON_TAC[]);
3236
3237  (LET_TAC);
3238
3239  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
3240  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3241            ul IN barV V 3 /\
3242            X = mcell k V ul /\
3243            initial_sublist [u0; u1] ul)`);
3244  (STRIP_TAC);
3245  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
3246  (MATCH_MP_TAC SELECT_AX);
3247  (EXISTS_TAC `(2, vl:(real^3)list)`);
3248  (EXPAND_TAC "P");
3249  (REWRITE_TAC[BETA_THM]);
3250  (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);
3251  (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);
3252  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3253  (ASM_REWRITE_TAC[]);
3254
3255  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3256  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3257  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3258  (UP_ASM_TAC THEN STRIP_TAC);
3259  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3260  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3261  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
3262
3263  (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);
3264  (MATCH_MP_TAC Ajripqn.AJRIPQN);
3265  (ASM_REWRITE_TAC[]);
3266  (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);
3267  (SET_TAC[ASSUME `X = mcell k' V ul`; 
3268                ASSUME `X = mcell k V vl`; ASSUME `k = 2`]);
3269  (REPEAT STRIP_TAC);
3270  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
3271    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
3272  (SET_TAC[]);
3273  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
3274
3275  (COND_CASES_TAC);
3276  (REWRITE_TAC[dihu2]);
3277
3278  (REWRITE_WITH `omega_list_n V ul 3 = s3`);
3279  (EXPAND_TAC "s3");
3280  (NEW_GOAL `2  = 2 /\
3281              (!k. 2 - 1 <= k /\ k <= 3
3282                   ==> omega_list_n V ul k = omega_list_n V vl k)`);
3283  (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
3284  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);
3285  (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);
3286  (ASM_REWRITE_TAC[]);
3287  (UP_ASM_TAC THEN STRIP_TAC);
3288
3289  (FIRST_ASSUM MATCH_MP_TAC);
3290  (ARITH_TAC);
3291
3292  (REWRITE_WITH `mxi V ul = m`);
3293  (EXPAND_TAC "m");
3294  (MATCH_MP_TAC MCELL_ID_MXI);
3295  (EXISTS_TAC `2` THEN EXISTS_TAC `2`);
3296  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);
3297  (STRIP_TAC);
3298
3299  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3300  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3301  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3302  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
3303                  CARD (set_of_list vl) = 3 + 1`);
3304  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3305  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3306  (ARITH_TAC);
3307  (ASM_REWRITE_TAC[HD]);
3308
3309  (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);
3310  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3311  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3312  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3313                  CARD (set_of_list ul) = 3 + 1`);
3314  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3315  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3316  (ARITH_TAC);
3317
3318  (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3319  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3320  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3321  (REWRITE_TAC[HD]);
3322  (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);
3323  (ASM_REWRITE_TAC[]);
3324
3325  (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);
3326  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3327  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3328  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3329  (ASM_REWRITE_TAC[]);
3330
3331  (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
3332  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3333  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3334  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3335                  CARD (set_of_list ul) = 3 + 1`);
3336  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3337  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3338  (ARITH_TAC);
3339
3340  (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
3341  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3342  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3343  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3344                  CARD (set_of_list ul) = 3 + 1`);
3345  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3346  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3347  (ARITH_TAC);
3348  (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);
3349  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
3350  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
3351  (AP_THM_TAC THEN AP_TERM_TAC);
3352
3353  (REWRITE_WITH 
3354   `measurable (conic_cap u0 u1 r d) /\
3355              vol (conic_cap u0 u1 r d) =
3356              (if u1 = u0 \/ &1 <= d \/ r < &0
3357               then &0
3358               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
3359  (MATCH_MP_TAC VOLUME_CONIC_CAP);
3360  (EXPAND_TAC "d");
3361  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3362  (COND_CASES_TAC);
3363  (NEW_GOAL `F`);
3364  (UP_ASM_TAC THEN STRIP_TAC);
3365  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
3366  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3367  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3368  (UP_ASM_TAC THEN MESON_TAC[]);
3369  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
3370
3371
3372  (REWRITE_WITH `max d (--(&1)) = d`);
3373  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
3374  (REWRITE_TAC[REAL_NEG_LT0]);
3375  (STRIP_TAC);
3376  (EXPAND_TAC "d");
3377  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3378  (REAL_ARITH_TAC);
3379
3380  (REWRITE_WITH `
3381   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
3382   ((&2 * pi) / (&2 * pi))`);
3383  (REAL_ARITH_TAC);
3384  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
3385  (MATCH_MP_TAC REAL_DIV_REFL);
3386  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
3387  (REAL_ARITH_TAC);
3388  (NEW_GOAL `F`);
3389  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3390  (UP_ASM_TAC THEN MESON_TAC[]);
3391
3392 (* ========================================================================= *)
3393 (* OK here *)
3394
3395  (ASM_CASES_TAC `azim u0 u1 s3 (m:real^3) < pi`);
3396  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3397  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3398  (STRIP_TAC);
3399  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 s3 m)`);
3400  (ASM_SIMP_TAC[WEDGE_LUNE]);
3401  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
3402                  conic_cap u0 u1 r d INTER L`);
3403  (SET_TAC[]);
3404  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3405
3406  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
3407    aff_gt {u0, u1} {s3, m} DIFF conic_cap u0 u1 r d INTER L = {}`);
3408  (EXPAND_TAC "L");
3409  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
3410  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
3411  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3412  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
3413  (EXPAND_TAC "L");
3414  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
3415
3416  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3417                  aff_gt {u0, u1} {m, s3} UNION 
3418    UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN  {m, s3}}`);
3419  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3420  (REWRITE_TAC[Geomdetail.FINITE6]);
3421  (REWRITE_TAC[DISJOINT]);
3422
3423  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3424  (NEW_GOAL `F`);
3425  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3426  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);
3427  (UP_ASM_TAC THEN SET_TAC[]);
3428  (REWRITE_TAC[COPLANAR_3]);
3429  (UP_ASM_TAC THEN MESON_TAC[]);
3430
3431  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3432  (NEW_GOAL `F`);
3433  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3434  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);
3435  (UP_ASM_TAC THEN SET_TAC[]);
3436  (REWRITE_TAC[COPLANAR_3]);
3437  (UP_ASM_TAC THEN MESON_TAC[]);
3438  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3439
3440  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3441  (EXISTS_TAC 
3442   `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3443  (STRIP_TAC);
3444  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3445  (EXISTS_TAC 
3446   `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);
3447  (STRIP_TAC);
3448  (MATCH_MP_TAC NEGLIGIBLE_UNION);
3449  (STRIP_TAC);
3450
3451  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3452  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
3453  (STRIP_TAC);
3454  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3455  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
3456  (SET_TAC[]);
3457  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3458  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3459  (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);
3460  (STRIP_TAC);
3461  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3462  (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);
3463  (SET_TAC[]);
3464  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3465  (REWRITE_TAC[SET_RULE 
3466   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
3467          aff_ge {u0, u1} ({m, s3} DELETE s3) 
3468    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3469  (MATCH_MP_TAC (SET_RULE 
3470   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3471  (STRIP_TAC);
3472  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3473  (STRIP_TAC);
3474  (SET_TAC[]);
3475
3476  (REWRITE_TAC[DISJOINT]);
3477  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3478  (NEW_GOAL `F`);
3479  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3480  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);
3481  (UP_ASM_TAC THEN SET_TAC[]);
3482  (REWRITE_TAC[COPLANAR_3]);
3483  (UP_ASM_TAC THEN MESON_TAC[]);
3484  (UP_ASM_TAC THEN SET_TAC[]);
3485
3486  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3487  (STRIP_TAC);
3488  (SET_TAC[]);
3489  (REWRITE_TAC[DISJOINT]);
3490  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3491  (NEW_GOAL `F`);
3492  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3493  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);
3494  (UP_ASM_TAC THEN SET_TAC[]);
3495  (REWRITE_TAC[COPLANAR_3]);
3496  (UP_ASM_TAC THEN MESON_TAC[]);
3497  (UP_ASM_TAC THEN SET_TAC[]);
3498
3499  (SET_TAC[]);
3500
3501  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
3502  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 s3 m) =
3503              (if &1 < d \/ r < &0
3504               then &0
3505               else azim u0 u1 s3 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);
3506  (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);
3507  (STRIP_TAC);
3508  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3509  (EXISTS_TAC `s3:real^3`);
3510  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3511  (ASM_REWRITE_TAC[]);
3512  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3513  (EXISTS_TAC `m:real^3`);
3514  (ASM_REWRITE_TAC[]);
3515
3516  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
3517  (COND_CASES_TAC);
3518  (NEW_GOAL `F`);
3519
3520  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
3521    UP_ASM_TAC THEN REAL_ARITH_TAC);
3522  (UP_ASM_TAC THEN MESON_TAC[]);
3523
3524  (REWRITE_WITH `azim (u0:real^3) u1 s3 m = dihV u0 u1 s3 m`);
3525  (MATCH_MP_TAC AZIM_DIHV_SAME);
3526  (ASM_REWRITE_TAC[]);
3527  (STRIP_TAC);
3528
3529  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3530  (EXISTS_TAC `m:real^3`);
3531  (ASM_REWRITE_TAC[]);
3532  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3533  (EXISTS_TAC `s3:real^3`);
3534  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3535  (ASM_REWRITE_TAC[]);
3536
3537  (REWRITE_TAC[dihX]);
3538  (COND_CASES_TAC);
3539  (NEW_GOAL `F`);
3540  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3541  (REWRITE_TAC[]);
3542  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3543  (EXISTS_TAC `X:real^3->bool`);
3544  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3545  (UP_ASM_TAC THEN MESON_TAC[]);
3546
3547  (LET_TAC);
3548
3549  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
3550  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3551            ul IN barV V 3 /\
3552            X = mcell k V ul /\
3553            initial_sublist [u0; u1] ul)`);
3554  (STRIP_TAC);
3555  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
3556  (MATCH_MP_TAC SELECT_AX);
3557  (EXISTS_TAC `(2, vl:(real^3)list)`);
3558  (EXPAND_TAC "P");
3559  (REWRITE_TAC[BETA_THM]);
3560  (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);
3561  (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);
3562  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3563  (ASM_REWRITE_TAC[]);
3564
3565  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3566  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3567  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3568  (UP_ASM_TAC THEN STRIP_TAC);
3569  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3570  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3571  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
3572
3573  (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);
3574  (MATCH_MP_TAC Ajripqn.AJRIPQN);
3575  (ASM_REWRITE_TAC[]);
3576  (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);
3577  (REWRITE_TAC[ASSUME `X = mcell k V vl`; GSYM (ASSUME `X = mcell k' V ul`);
3578    ASSUME `k = 2`]);
3579  (SET_TAC[]);
3580  (REPEAT STRIP_TAC);
3581  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
3582    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
3583  (SET_TAC[]);
3584  (UNDISCH_TAC `~NULLSET X` THEN UP_ASM_TAC THEN MESON_TAC[]);
3585
3586  (COND_CASES_TAC);
3587  (REWRITE_TAC[dihu2]);
3588  (REWRITE_WITH `omega_list_n V ul 3 = s3`);
3589  (EXPAND_TAC "s3");
3590  (NEW_GOAL `2  = 2 /\
3591              (!k. 2 - 1 <= k /\ k <= 3
3592                   ==> omega_list_n V ul k = omega_list_n V vl k)`);
3593  (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
3594  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);
3595  (STRIP_TAC);
3596  (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3597    ASSUME `k = 2`; ASSUME `k' = 2`]);
3598  (REWRITE_WITH `mcell 2 V ul = X`);
3599  (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);
3600  (ASM_REWRITE_TAC[]);
3601  (UP_ASM_TAC THEN STRIP_TAC);
3602  (FIRST_ASSUM MATCH_MP_TAC);
3603  (ARITH_TAC);
3604
3605  (REWRITE_WITH `mxi V ul = m`);
3606  (EXPAND_TAC "m");
3607  (MATCH_MP_TAC MCELL_ID_MXI);
3608  (EXISTS_TAC `2` THEN EXISTS_TAC `2`);
3609  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);
3610  (STRIP_TAC);
3611
3612  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3613  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3614  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3615  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
3616                  CARD (set_of_list vl) = 3 + 1`);
3617  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3618  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3619  (ARITH_TAC);
3620  (ASM_REWRITE_TAC[HD]);
3621
3622  (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);
3623  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3624  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3625  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3626                  CARD (set_of_list ul) = 3 + 1`);
3627  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3628  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3629  (ARITH_TAC);
3630
3631  (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3632  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3633  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3634  (REWRITE_TAC[HD]);
3635
3636  (STRIP_TAC);
3637  (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3638    ASSUME `k = 2`; ASSUME `k' = 2`]);
3639  (REWRITE_WITH `mcell 2 V ul = X`);
3640  (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);
3641  (ASM_REWRITE_TAC[]);
3642
3643  (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);
3644  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3645  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3646  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3647  (ASM_REWRITE_TAC[]);
3648
3649  (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
3650  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3651  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3652  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3653                  CARD (set_of_list ul) = 3 + 1`);
3654  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3655  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3656  (ARITH_TAC);
3657
3658  (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
3659  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3660  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3661  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3662                  CARD (set_of_list ul) = 3 + 1`);
3663  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3664  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3665  (ARITH_TAC);
3666  (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);
3667  (REWRITE_TAC[DIHV_SYM_2]);
3668  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
3669
3670  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
3671  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
3672  (AP_THM_TAC THEN AP_TERM_TAC);
3673  (REWRITE_WITH 
3674   `measurable (conic_cap u0 u1 r d) /\
3675              vol (conic_cap u0 u1 r d) =
3676              (if u1 = u0 \/ &1 <= d \/ r < &0
3677               then &0
3678               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
3679  (MATCH_MP_TAC VOLUME_CONIC_CAP);
3680  (EXPAND_TAC "d");
3681  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3682  (COND_CASES_TAC);
3683  (NEW_GOAL `F`);
3684  (UP_ASM_TAC THEN STRIP_TAC);
3685  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3686
3687  (UP_ASM_TAC THEN UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);
3688  (UP_ASM_TAC THEN UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);
3689  (UP_ASM_TAC THEN MESON_TAC[]);
3690
3691  (REWRITE_WITH `max d (--(&1)) = d`);
3692  (MATCH_MP_TAC (REAL_ARITH `&0 < d ==> max d (--(&1)) = d`));
3693  (EXPAND_TAC "d");
3694  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3695  (REWRITE_WITH `
3696   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
3697   ((&2 * pi) / (&2 * pi))`);
3698  (REAL_ARITH_TAC);
3699  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
3700  (MATCH_MP_TAC REAL_DIV_REFL);
3701  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
3702  (REAL_ARITH_TAC);
3703  (NEW_GOAL `F`);
3704  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3705  (UP_ASM_TAC THEN MESON_TAC[]);
3706
3707 (* ========================================================================== *)
3708
3709  (NEW_GOAL `F`);
3710  (NEW_GOAL `azim (u0:real^3) u1 s3 m = 
3711   (if azim u0 u1 m s3 = &0 then &0 else &2 * pi - azim u0 u1 m s3)`);
3712  (MATCH_MP_TAC AZIM_COMPL);
3713  (STRIP_TAC);
3714
3715  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3716  (EXISTS_TAC `s3:real^3`);
3717  (ASM_REWRITE_TAC[]);
3718  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3719  (EXISTS_TAC `m:real^3`);
3720  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
3721  (ASM_REWRITE_TAC[]);
3722  (UP_ASM_TAC THEN COND_CASES_TAC);
3723  (NEW_GOAL `F`);
3724  (NEW_GOAL `(&0 < pi)`);
3725  (REWRITE_TAC[PI_POS]);
3726  (UNDISCH_TAC `~(azim (u0:real^3) u1 m s3 < pi)`);
3727  (ASM_REWRITE_TAC[]);
3728  (UP_ASM_TAC THEN MESON_TAC[]);
3729  (STRIP_TAC);
3730
3731  (NEW_GOAL `azim (u0:real^3) u1 m s3 = pi`);
3732  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3733  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3734  (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
3735  (ASM_REWRITE_TAC[]);
3736  (UP_ASM_TAC THEN MESON_TAC[]);
3737
3738
3739 (* ========================================================================= *)
3740 (*  Case k >= 4                                                              *)
3741 (* ========================================================================= *)
3742
3743  (ASM_CASES_TAC `k >= 4`);
3744  (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);
3745  (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);
3746  (MATCH_MP_TAC BARV_3_EXPLICIT);
3747  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3748  (UP_ASM_TAC THEN STRIP_TAC);
3749  (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
3750
3751  (REWRITE_WITH `u0 = v0:real^3`);
3752  (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);
3753  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
3754    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
3755  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
3756
3757  (REWRITE_WITH `u1 = v1:real^3`);
3758  (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);
3759  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
3760    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3761  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3762  (ASM_REWRITE_TAC[]);
3763  (UP_ASM_TAC THEN STRIP_TAC);
3764
3765  (ABBREV_TAC `L = aff_ge{u0, u1} {u2, u3:real^3}`);
3766
3767  (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
3768  (AP_TERM_TAC);
3769  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`;set_of_list]);
3770  (COND_CASES_TAC);
3771
3772  (EXPAND_TAC "L");
3773  (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
3774  (STRIP_TAC);
3775  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));
3776  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
3777  (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
3778                             A INTER B SUBSET C INTER B`));
3779  (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, u3}`);
3780  (REWRITE_TAC[DISJOINT]);
3781  (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));
3782  (STRIP_TAC);
3783  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3784  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3785  (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);
3786  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list]);
3787  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3788  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
3789  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3790  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
3791  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
3792  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
3793  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
3794  (UP_ASM_TAC THEN SET_TAC[]);
3795  (REWRITE_TAC[COPLANAR_3]);
3796  (NEW_GOAL `u3 IN {u0, u1:real^3}`);
3797  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3798  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
3799  (UP_ASM_TAC THEN SET_TAC[]);
3800  (REWRITE_TAC[COPLANAR_3]);
3801
3802  (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, u3:real^3}`; AFF_GE_2_2]);
3803  (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);
3804  (REPEAT STRIP_TAC);
3805  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
3806    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
3807  (ASM_REWRITE_TAC[]);
3808  (STRIP_TAC);
3809
3810  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
3811  (STRIP_TAC);
3812  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
3813  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
3814    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
3815  (EXPAND_TAC "D");
3816  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
3817  (DISJ1_TAC);
3818  (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
3819
3820  (NEW_GOAL `(?b1:real. b1 IN P2 /\ (!x. x IN P2 ==> b1 <= x))`);
3821  (FIRST_ASSUM MATCH_MP_TAC);
3822  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
3823  (EXISTS_TAC `(f2:(real^3)list -> real) vl`);
3824  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3825  (EXISTS_TAC `vl:(real^3)list`);
3826  (ASM_REWRITE_TAC[]);
3827  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3828  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3829  (STRIP_TAC);
3830  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3831  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3832  (EXISTS_TAC `X INTER (C:real^3->bool)`);
3833  (STRIP_TAC);
3834  (ASM_REWRITE_TAC[]);
3835  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
3836  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
3837  (MATCH_MP_TAC (SET_RULE 
3838   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
3839  (STRIP_TAC);
3840  (MATCH_MP_TAC SUBSET_BALL);
3841  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3842  (MATCH_MP_TAC RCONE_GT_SUBSET);
3843  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
3844  (FIRST_X_ASSUM CHOOSE_TAC);
3845
3846  (NEW_GOAL `r2 = (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x:real))`);
3847  (EXPAND_TAC "r2");
3848  (COND_CASES_TAC);
3849  (NEW_GOAL `F`);
3850  (UP_ASM_TAC THEN REWRITE_TAC[]);
3851  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
3852  (EXISTS_TAC `(f2:(real^3)list -> real) vl`);
3853  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3854  (EXISTS_TAC `vl:(real^3)list`);
3855  (ASM_REWRITE_TAC[]);
3856  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3857  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3858  (STRIP_TAC);
3859  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3860  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3861  (EXISTS_TAC `X INTER (C:real^3->bool)`);
3862  (STRIP_TAC);
3863  (ASM_REWRITE_TAC[]);
3864  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
3865  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
3866  (MATCH_MP_TAC (SET_RULE 
3867   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
3868  (STRIP_TAC);
3869  (MATCH_MP_TAC SUBSET_BALL);
3870  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3871  (MATCH_MP_TAC RCONE_GT_SUBSET);
3872  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
3873  (UP_ASM_TAC THEN MESON_TAC[]);
3874  (REWRITE_TAC[]);
3875
3876  (ABBREV_TAC `Q1 = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
3877  (NEW_GOAL `(Q1:real->bool) r2`);
3878  (ASM_REWRITE_TAC[]);
3879  (MATCH_MP_TAC SELECT_AX);
3880  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
3881  (ASM_REWRITE_TAC[]);
3882  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
3883  (NEW_GOAL `r2 <= f2 (vl:(real^3)list)`);
3884  (FIRST_ASSUM MATCH_MP_TAC);
3885  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3886  (EXISTS_TAC `vl:(real^3)list`);
3887  (ASM_REWRITE_TAC[]);
3888  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3889  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3890  (STRIP_TAC);
3891  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3892  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3893  (EXISTS_TAC `X INTER (C:real^3->bool)`);
3894  (STRIP_TAC);
3895  (ASM_REWRITE_TAC[]);
3896  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
3897  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
3898  (MATCH_MP_TAC (SET_RULE 
3899   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
3900  (STRIP_TAC);
3901  (MATCH_MP_TAC SUBSET_BALL);
3902  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3903  (MATCH_MP_TAC RCONE_GT_SUBSET);
3904  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
3905
3906  (UP_ASM_TAC THEN EXPAND_TAC "f2" THEN REWRITE_TAC[EL; HD; TL; 
3907    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
3908    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
3909  (NEW_GOAL `!v. v IN affine hull {u1, u2, u3:real^3} ==> r2 <= dist (u0, v)`);
3910  (REPEAT STRIP_TAC);
3911  (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, u3}) u0) <= 
3912              dist (u0, v:real^3)`);
3913  (MATCH_MP_TAC CLOSEST_POINT_LE);
3914  (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
3915  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3916
3917  (NEW_GOAL `r <= dist (u0:real^3, x)`);
3918  (REWRITE_TAC[dist]);
3919  (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);
3920  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3921  (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);
3922  (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
3923   (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) = 
3924   (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);
3925  (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 + 
3926                           t3 /(t2 + t3 + t4) % u2 + 
3927                           t4 /(t2 + t3 + t4) % u3`);
3928  (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % u3) = (t2 + t3 + t4) % (y:real^3)`);
3929  (EXPAND_TAC "y");
3930  (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 +  t3 / x % u2 + t4 / x % u3) = 
3931    (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);
3932  (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
3933  (MATCH_MP_TAC REAL_DIV_REFL);
3934  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
3935  (REAL_ARITH_TAC);
3936  (VECTOR_ARITH_TAC);
3937  (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);
3938
3939  (NEW_GOAL `&1 < t2 + t3 + t4`);
3940  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
3941  (REAL_ARITH_TAC);
3942  (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`); 
3943  (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3944  (REWRITE_TAC[GSYM dist]);
3945  (NEW_GOAL `r2 <= dist (u0, y:real^3)`);
3946  (FIRST_ASSUM MATCH_MP_TAC);
3947  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3948  (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
3949    EXISTS_TAC `t4 / (t2 + t3 + t4)`);
3950  (STRIP_TAC);
3951  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
3952  (MATCH_MP_TAC REAL_DIV_REFL);
3953  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3954  (ASM_REWRITE_TAC[]);
3955
3956  (NEW_GOAL `r2 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
3957  (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
3958  (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
3959  (MATCH_MP_TAC REAL_LE_MUL);
3960  (REWRITE_TAC[DIST_POS_LE]);
3961  (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3962  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3963  (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3964  (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3965
3966 (* ========================================================================== *)
3967
3968
3969  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
3970  (STRIP_TAC);
3971  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
3972  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
3973    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
3974  (EXPAND_TAC "D");
3975  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
3976  (DISJ2_TAC);
3977  (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);
3978
3979  (NEW_GOAL `(?b1:real. b1 IN P4 /\ (!x. x IN P4 ==> x <= b1))`);
3980  (FIRST_ASSUM MATCH_MP_TAC);
3981  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
3982  (EXISTS_TAC `(f4:(real^3)list -> real) vl`);
3983  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3984  (EXISTS_TAC `vl:(real^3)list`);
3985  (ASM_REWRITE_TAC[]);
3986  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3987  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3988  (STRIP_TAC);
3989  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3990  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3991  (EXISTS_TAC `X INTER (C:real^3->bool)`);
3992  (STRIP_TAC);
3993  (ASM_REWRITE_TAC[]);
3994  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
3995  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
3996  (MATCH_MP_TAC (SET_RULE 
3997   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
3998  (STRIP_TAC);
3999  (MATCH_MP_TAC SUBSET_BALL);
4000  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4001  (MATCH_MP_TAC RCONE_GT_SUBSET);
4002  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4003  (FIRST_X_ASSUM CHOOSE_TAC);
4004
4005  (NEW_GOAL `d2 = (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b:real))`);
4006  (EXPAND_TAC "d2");
4007  (COND_CASES_TAC);
4008  (NEW_GOAL `F`);
4009  (UP_ASM_TAC THEN REWRITE_TAC[]);
4010  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
4011  (EXISTS_TAC `(f4:(real^3)list -> real) vl`);
4012  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4013  (EXISTS_TAC `vl:(real^3)list`);
4014  (ASM_REWRITE_TAC[]);
4015  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4016  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4017  (STRIP_TAC);
4018  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4019  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4020  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4021  (STRIP_TAC);
4022  (ASM_REWRITE_TAC[]);
4023  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4024  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4025  (MATCH_MP_TAC (SET_RULE 
4026   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4027  (STRIP_TAC);
4028  (MATCH_MP_TAC SUBSET_BALL);
4029  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4030  (MATCH_MP_TAC RCONE_GT_SUBSET);
4031  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4032  (UP_ASM_TAC THEN MESON_TAC[]);
4033  (REWRITE_TAC[]);
4034
4035  (ABBREV_TAC `Q1 = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
4036  (NEW_GOAL `(Q1:real->bool) d2`);
4037  (ASM_REWRITE_TAC[]);
4038  (MATCH_MP_TAC SELECT_AX);
4039  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
4040  (ASM_REWRITE_TAC[]);
4041  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
4042
4043  (NEW_GOAL `f4 (vl:(real^3)list) <= d2`);
4044  (FIRST_ASSUM MATCH_MP_TAC);
4045  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4046  (EXISTS_TAC `vl:(real^3)list`);
4047  (ASM_REWRITE_TAC[]);
4048  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4049  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4050  (STRIP_TAC);
4051  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4052  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4053  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4054  (STRIP_TAC);
4055  (ASM_REWRITE_TAC[]);
4056  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4057  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4058  (MATCH_MP_TAC (SET_RULE 
4059   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4060  (STRIP_TAC);
4061  (MATCH_MP_TAC SUBSET_BALL);
4062  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4063  (MATCH_MP_TAC RCONE_GT_SUBSET);
4064  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4065
4066  (UP_ASM_TAC THEN EXPAND_TAC "f4");
4067  (REWRITE_TAC[EL; HD; TL; 
4068    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
4069    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
4070  (ABBREV_TAC `xx = smallest_angle_line u2 u3 u0 u1`);
4071
4072  (MP_TAC (ASSUME `smallest_angle_line u2 u3 u0 u1 = xx`));
4073  (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
4074  (ABBREV_TAC `Q2 = 
4075  (\x:real^3. x IN convex hull {u2, u3} /\
4076              (!y. y IN convex hull {u2, u3}
4077                   ==> ((y - u0) dot (u1 - u0)) /
4078                       (norm (y - u0) * norm (u1 - u0)) <=
4079                       ((x - u0) dot (u1 - u0)) /
4080                       (norm (x - u0) * norm (u1 - u0))))`);
4081  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);
4082  (NEW_GOAL `(Q2:real^3->bool) xx`);
4083  (ONCE_ASM_REWRITE_TAC[]);
4084  (MATCH_MP_TAC SELECT_AX);
4085  (EXPAND_TAC "Q2");
4086
4087  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
4088  (STRIP_TAC);
4089  (ASM_REWRITE_TAC[]);
4090  (STRIP_TAC);
4091
4092  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4093  (REWRITE_TAC[]);
4094  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4095  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4096  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`]);
4097  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4098
4099  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4100  (STRIP_TAC);
4101  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4102  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4103  (REWRITE_TAC[coplanar]);
4104  (UNDISCH_TAC `u0 IN convex hull {u2, u3:real^3}`);
4105  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
4106  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4107    EXISTS_TAC `u3:real^3`);
4108  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
4109  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4110  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4111  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
4112  (STRIP_TAC);
4113  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
4114  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
4115  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4116  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4117  (SET_TAC[]);
4118
4119  (UP_ASM_TAC THEN EXPAND_TAC "Q2");
4120  (STRIP_TAC);
4121  (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) / 
4122                                (norm (y - u0) * norm (u1 - u0)))`);
4123
4124  (NEW_GOAL `d < (g:real^3->real) x`);
4125  (EXPAND_TAC "g");
4126  (REWRITE_WITH 
4127   `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
4128    d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);
4129  (MATCH_MP_TAC REAL_LT_RDIV_EQ);
4130  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
4131  (STRIP_TAC);
4132  (MATCH_MP_TAC REAL_LE_MUL);
4133  (ASM_REWRITE_TAC[NORM_POS_LE]);
4134  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);
4135  (ASM_REWRITE_TAC[]);
4136  (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = u0:real^3 <=>
4137   t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = (t1 + t2 + t3 + t4) % u0`);
4138  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4139  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);
4140  (STRIP_TAC);
4141
4142  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
4143  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4144  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4145  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);
4146  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4147  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4148  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4149  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4150  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4151  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
4152  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
4153  (REWRITE_TAC[affine_dependent]);
4154  (EXISTS_TAC `u1:real^3`);
4155  (STRIP_TAC);
4156  (SET_TAC[]);
4157
4158  (NEW_GOAL `~(u1 IN {u0, u2, u3:real^3})`);
4159  (STRIP_TAC);
4160  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
4161  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4162  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4163  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);
4164  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4165  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4166  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4167  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4168  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4169  (REWRITE_WITH `{u0, u1, u2, u3} = {u0:real^3,u2, u3}`);
4170  (UP_ASM_TAC THEN SET_TAC[]);
4171  (REWRITE_TAC[COPLANAR_3]);
4172  (SET_TAC[]);
4173  (REWRITE_WITH `{u0, u1, u2, u3} DELETE u1 = {u0, u2, u3:real^3}`);
4174  (UP_ASM_TAC THEN SET_TAC[]);
4175  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4176  (EXISTS_TAC `(t2 + t3 + t4) / t2`);
4177  (EXISTS_TAC `(-- t3) / t2`);
4178  (EXISTS_TAC `(-- t4) / t2`);
4179
4180  (STRIP_TAC);
4181  (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);
4182  (REAL_ARITH_TAC);
4183  (MATCH_MP_TAC REAL_DIV_REFL);
4184  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4185  (REWRITE_WITH 
4186   `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3:real^3 <=> 
4187    u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % u3)`);
4188  (VECTOR_ARITH_TAC);
4189  (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % u3 = 
4190                              (t2 + t3 + t4) % u0:real^3`)]);
4191  (REWRITE_TAC[VECTOR_ARITH 
4192   `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);
4193  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
4194  (REWRITE_WITH `&1 / t2 * t2 = &1`);
4195  (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);
4196  (MATCH_MP_TAC REAL_DIV_REFL);
4197  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4198  (VECTOR_ARITH_TAC);
4199  (SET_TAC[]);
4200  (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);
4201  (ASM_REWRITE_TAC[]);
4202
4203  (NEW_GOAL `g x <= (g:real^3->real) xx`);
4204  (NEW_GOAL `!y. y IN convex hull {u2 , u3:real^3} ==> g y <= g xx`);
4205  (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);
4206  (NEW_GOAL `&0 < (t3 + t4)`);
4207  (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0)  ==> &0 < x`));
4208  (STRIP_TAC);
4209  (MATCH_MP_TAC REAL_LE_ADD);
4210  (ASM_REWRITE_TAC[]);
4211  (STRIP_TAC);
4212  (NEW_GOAL `t3 = &0 /\ t4 = &0`);
4213  (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN 
4214    UP_ASM_TAC THEN REAL_ARITH_TAC);
4215  (UP_ASM_TAC THEN STRIP_TAC);
4216
4217  (NEW_GOAL `F`);
4218  (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);
4219  (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);
4220  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4221  (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));
4222  (STRIP_TAC);
4223  (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) - 
4224                  (t1 + t2 + t3 + t4) % u0:real^3`);
4225  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4226  (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH 
4227   `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; 
4228    DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
4229  (MATCH_MP_TAC REAL_LE_MUL);
4230  (REWRITE_TAC[DOT_POS_LE]);
4231  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4232  (MATCH_MP_TAC REAL_LE_MUL);
4233  (REWRITE_TAC[DIST_POS_LE]);
4234  (MATCH_MP_TAC REAL_LE_MUL);
4235  (REWRITE_TAC[DIST_POS_LE]);
4236  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);
4237  (REAL_ARITH_TAC);
4238  (UP_ASM_TAC THEN MESON_TAC[]);
4239
4240  (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3:real^3`);
4241  (NEW_GOAL `(g:real^3->real) y <= g xx`);
4242  (FIRST_ASSUM MATCH_MP_TAC);
4243  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
4244  (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
4245  (REPEAT STRIP_TAC);
4246  (MATCH_MP_TAC REAL_LE_DIV);
4247  (ASM_SIMP_TAC[REAL_LE_ADD]);
4248  (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);
4249  (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
4250  (MATCH_MP_TAC REAL_DIV_REFL);
4251  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4252  (ASM_REWRITE_TAC[]);
4253
4254  (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 + 
4255                    t4 / (t1 + t3 + t4) % u3:real^3`);
4256  (NEW_GOAL `(g:real^3->real) y = g w`);
4257  (EXPAND_TAC "g");
4258
4259  (REWRITE_WITH `y:real^3 - u0 = 
4260                 &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);
4261  (EXPAND_TAC "y");
4262  (REWRITE_TAC[VECTOR_ARITH 
4263   `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
4264    &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
4265    (t3 + t4) / (t3 + t4) % u0 = u0`]);
4266  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4267  (MATCH_MP_TAC REAL_DIV_REFL);
4268  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4269  (VECTOR_ARITH_TAC);
4270  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
4271
4272  (REWRITE_WITH `w:real^3 - u0 = 
4273                 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);
4274  (EXPAND_TAC "w");
4275  (REWRITE_TAC[VECTOR_ARITH 
4276    `(t1 / (t1 + t3 + t4) % u0 +
4277     t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
4278     &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
4279     (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
4280  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4281  (MATCH_MP_TAC REAL_DIV_REFL);
4282  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
4283    THEN REAL_ARITH_TAC);
4284  (VECTOR_ARITH_TAC);
4285  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
4286  (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
4287  (REWRITE_TAC[REAL_ABS_REFL]);
4288  (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
4289  (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
4290  (REWRITE_TAC[REAL_ABS_REFL]);
4291  (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
4292  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
4293    THEN REAL_ARITH_TAC);
4294  (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) = 
4295                            (a * x) / (a * (y * z))`]);
4296  (ABBREV_TAC 
4297   `a1 = norm (t3 % u2 + t4 % u3 - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
4298  (NEW_GOAL `~(a1 = &0)`);
4299  (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; 
4300    VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
4301  (STRIP_TAC);
4302
4303  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4304  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4305  (EXISTS_TAC `(X:real^3->bool)`);
4306  (STRIP_TAC);
4307  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4308  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4309  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4310  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4311  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4312  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4313  (REWRITE_TAC[coplanar]);
4314  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4315    EXISTS_TAC `u3:real^3`);
4316  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4317  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4318  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4319  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
4320    THEN EXISTS_TAC `t4 / (t3 + t4)`);
4321  (REPEAT STRIP_TAC);
4322  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
4323                           (t3 + t4) / (t3 + t4)`]);
4324  (MATCH_MP_TAC REAL_DIV_REFL);
4325  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4326  (ASM_REWRITE_TAC[VECTOR_ARITH 
4327    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
4328     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
4329  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4330  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4331  (MATCH_MP_TAC REAL_DIV_REFL);
4332  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4333  (VECTOR_ARITH_TAC);
4334  (SET_TAC[]);
4335
4336  (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
4337  (NEW_GOAL `&0 < &1 / (t3 + t4)`);
4338  (MATCH_MP_TAC REAL_LT_DIV);
4339  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
4340  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4341
4342  (REWRITE_WITH 
4343  `(&1 / (t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4344   (&1 / (t3 + t4) * a1) = 
4345   ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
4346  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
4347
4348  (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
4349  (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);
4350  (MATCH_MP_TAC REAL_LT_DIV);
4351  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
4352  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4353    REAL_ARITH_TAC);
4354  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4355
4356  (REWRITE_WITH 
4357  `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4358   (&1 / (t1 + t3 + t4) * a1) = 
4359   ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
4360  (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
4361    MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
4362
4363  (NEW_GOAL `(g:real^3->real) x <= g w`);
4364  (EXPAND_TAC "g");
4365
4366  (REWRITE_WITH 
4367   `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
4368   ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
4369   ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <= 
4370   ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
4371  (MATCH_MP_TAC RAT_LEMMA4);
4372  (STRIP_TAC);
4373  (MATCH_MP_TAC REAL_LT_MUL);
4374  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
4375  (STRIP_TAC);
4376  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4377  (REWRITE_TAC[]);
4378
4379  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4380  (EXISTS_TAC `(X:real^3->bool)`);
4381  (STRIP_TAC);
4382  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4383  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4384  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4385  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4386  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4387  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4388  (REWRITE_TAC[coplanar]);
4389  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4390    EXISTS_TAC `u3:real^3`);
4391  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
4392  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4393  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4394  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4395  (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
4396    THEN EXISTS_TAC `(--t4) / t2`);
4397  (REPEAT STRIP_TAC);
4398  (REWRITE_TAC[REAL_ARITH 
4399    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
4400  (MATCH_MP_TAC REAL_DIV_REFL);
4401  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4402  (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
4403  (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4404  (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % u3:real^3 = t2 % u1`);
4405  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
4406  (ASM_REWRITE_TAC[VECTOR_ARITH 
4407    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
4408     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
4409  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4410  (REWRITE_WITH `t2 / t2 = &1`);
4411  (MATCH_MP_TAC REAL_DIV_REFL);
4412  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4413  (VECTOR_ARITH_TAC);
4414  (SET_TAC[]);
4415
4416  (MATCH_MP_TAC REAL_LT_MUL);
4417  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
4418  (EXPAND_TAC "w" THEN STRIP_TAC);
4419  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4420  (REWRITE_TAC[]);
4421
4422  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4423  (EXISTS_TAC `(X:real^3->bool)`);
4424  (STRIP_TAC);
4425  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4426  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4427  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4428  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4429  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4430  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4431  (REWRITE_TAC[coplanar]);
4432  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4433    EXISTS_TAC `u3:real^3`);
4434  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4435  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4436  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4437
4438  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
4439    THEN EXISTS_TAC `t4 / (t3 + t4)`);
4440  (REPEAT STRIP_TAC);
4441  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
4442                           (t3 + t4) / (t3 + t4)`]);
4443  (MATCH_MP_TAC REAL_DIV_REFL);
4444  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4445  (ASM_REWRITE_TAC[VECTOR_ARITH 
4446    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
4447     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
4448  (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH 
4449    `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 = 
4450     (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4451  (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % u3) = u0 <=> 
4452                  t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0:real^3`);
4453  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4454  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
4455  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN 
4456    REAL_ARITH_TAC);
4457
4458  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
4459    <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
4460  (STRIP_TAC THEN ASM_REWRITE_TAC[]);
4461  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4462  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4463  (MATCH_MP_TAC REAL_DIV_REFL);
4464  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4465  (VECTOR_ARITH_TAC);
4466  (SET_TAC[]);
4467
4468  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
4469  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
4470  (REWRITE_TAC[VECTOR_ARITH 
4471   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
4472    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4473  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4474  (MATCH_MP_TAC REAL_DIV_REFL);
4475  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4476    REAL_ARITH_TAC);
4477  (VECTOR_ARITH_TAC);
4478  (ABBREV_TAC `t = t1 + t3 + t4`);
4479  (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 = 
4480                 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
4481  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4482  (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
4483  (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
4484  (REWRITE_TAC[VECTOR_ARITH 
4485   `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
4486  (ABBREV_TAC `x1 = u1 - u0:real^3`);
4487  (ABBREV_TAC `x2 = w - u0:real^3`);
4488
4489  (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 = 
4490    t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
4491  (REWRITE_TAC[NORM_POW_2]);
4492  (VECTOR_ARITH_TAC);
4493
4494  (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <= 
4495              t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
4496  (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
4497    t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
4498  (MATCH_MP_TAC REAL_LE_MUL);
4499  (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
4500  (MATCH_MP_TAC REAL_LE_MUL);
4501  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
4502  (STRIP_TAC);
4503  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4504  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
4505
4506  (NEW_GOAL 
4507  `t2 * (x2 dot x1) * norm x1 * norm x1 + t * (x2 dot x1) * norm x2 * norm x1 <= 
4508   (x2 dot x1) * norm (t2 % x1 + t % x2) * norm (x1:real^3)`);
4509
4510  (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
4511  x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
4512  (MATCH_MP_TAC REAL_LE_MUL);
4513  (STRIP_TAC);
4514  (MATCH_MP_TAC REAL_LE_MUL);
4515  (REWRITE_TAC[NORM_POS_LE]);
4516  (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
4517  (NEW_GOAL `F`);
4518  (NEW_GOAL `(g:real^3->real) x <= &0`);
4519  (EXPAND_TAC "g");
4520  (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
4521  (MATCH_MP_TAC REAL_LE_DIV);
4522  (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
4523
4524  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
4525  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
4526  (REWRITE_TAC[VECTOR_ARITH 
4527   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
4528    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4529  (EXPAND_TAC "t");
4530  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4531  (MATCH_MP_TAC REAL_DIV_REFL);
4532  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4533    REAL_ARITH_TAC);
4534  (VECTOR_ARITH_TAC);
4535
4536  (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
4537  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 = 
4538                  (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
4539  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4540  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 = 
4541    t2 % x1 + t % x2:real^3`);
4542  (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
4543    THEN VECTOR_ARITH_TAC);
4544  (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
4545  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
4546  (MATCH_MP_TAC REAL_LE_MUL);
4547  (STRIP_TAC);
4548  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4549    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4550  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4551  (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
4552  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
4553  (MATCH_MP_TAC REAL_LE_MUL);
4554  (STRIP_TAC);
4555  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4556    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4557  (REWRITE_TAC[DOT_POS_LE]);
4558  (REWRITE_TAC[DOT_LADD]);
4559  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4560  (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);
4561  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);
4562  (REAL_ARITH_TAC);
4563  (UP_ASM_TAC THEN MESON_TAC[]);
4564  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4565
4566  (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
4567  (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
4568  (AP_THM_TAC THEN AP_TERM_TAC);
4569  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4570  (REWRITE_TAC[REAL_ABS_REFL]);
4571  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4572    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4573  (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
4574  (AP_THM_TAC THEN AP_TERM_TAC);
4575  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4576  (REWRITE_TAC[REAL_ABS_REFL]);
4577  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4578  (REWRITE_TAC[GSYM NORM_MUL]);
4579  (REWRITE_WITH 
4580   `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
4581  (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
4582  (REWRITE_TAC[NORM_TRIANGLE]);
4583  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4584  (UNDISCH_TAC `(g:real^3->real) y <= g xx`);
4585  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4586
4587  (NEW_GOAL `(g:real^3->real) xx <= d2`);
4588  (FIRST_ASSUM MATCH_MP_TAC);
4589  (EXPAND_TAC "P4");
4590  (EXPAND_TAC "g" THEN EXPAND_TAC "f4");
4591  (REWRITE_TAC[IN_ELIM_THM; IN]);
4592  (EXISTS_TAC `vl:(real^3)list`);
4593  (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`; 
4594                TRUNCATE_SIMPLEX_EXPLICIT_1]);
4595  (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
4596  (EXPAND_TAC "xx");
4597  (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4598  (REWRITE_WITH `mcell 4 V vl = mcell k V vl`);
4599  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4600  (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);
4601  (STRIP_TAC);
4602
4603  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4604  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4605  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4606  (STRIP_TAC);
4607  (ASM_REWRITE_TAC[]);
4608  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4609  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4610  (MATCH_MP_TAC (SET_RULE 
4611   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4612  (STRIP_TAC);
4613  (MATCH_MP_TAC SUBSET_BALL);
4614  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4615  (MATCH_MP_TAC RCONE_GT_SUBSET);
4616  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4617
4618  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");
4619  (REAL_ARITH_TAC);
4620
4621  (NEW_GOAL `F`);
4622  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4623  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4624  (EXISTS_TAC `(X:real^3->bool)`);
4625  (STRIP_TAC);
4626  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4627  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4628  (SET_TAC[]);
4629  (UP_ASM_TAC THEN MESON_TAC[]);
4630
4631
4632 (* ========================================================================= *)
4633
4634  (NEW_GOAL `~coplanar {u0, u1, u2, u3:real^3}`);
4635  (STRIP_TAC);
4636  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4637  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4638  (EXISTS_TAC `X:real^3->bool`);
4639  (STRIP_TAC);
4640  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4641  (COND_CASES_TAC);
4642  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4643  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4644  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4645  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4646  (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4647  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4648  (SET_TAC[]);
4649
4650  (ASM_CASES_TAC `azim u0 u1 u2 (u3:real^3) < pi`);
4651  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 u3)`);
4652  (ASM_SIMP_TAC[WEDGE_LUNE]);
4653  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
4654                  conic_cap u0 u1 r d INTER L`);
4655  (SET_TAC[]);
4656  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
4657  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
4658    aff_gt {u0, u1} {u2, u3} DIFF conic_cap u0 u1 r d INTER L = {}`);
4659  (EXPAND_TAC "L");
4660  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
4661  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
4662  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
4663  (EXPAND_TAC "L");
4664
4665  (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
4666                  aff_gt {u0, u1} {u2, u3} UNION 
4667    UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN  {u2, u3}}`);
4668  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
4669  (REWRITE_TAC[Geomdetail.FINITE6]);
4670  (REWRITE_TAC[DISJOINT]);
4671
4672  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
4673  (NEW_GOAL `F`);
4674  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4675  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
4676  (UP_ASM_TAC THEN SET_TAC[]);
4677  (REWRITE_TAC[COPLANAR_3]);
4678  (UP_ASM_TAC THEN MESON_TAC[]);
4679
4680  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
4681  (NEW_GOAL `F`);
4682  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4683  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
4684  (UP_ASM_TAC THEN SET_TAC[]); 
4685  (REWRITE_TAC[COPLANAR_3]);
4686  (UP_ASM_TAC THEN MESON_TAC[]);
4687  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4688
4689  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4690  (EXISTS_TAC 
4691   `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
4692  (STRIP_TAC);
4693  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4694  (EXISTS_TAC 
4695   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);
4696  (STRIP_TAC);
4697  (MATCH_MP_TAC NEGLIGIBLE_UNION);
4698  (STRIP_TAC);
4699
4700  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4701  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
4702  (STRIP_TAC);
4703  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
4704  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
4705  (SET_TAC[]);
4706  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
4707  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4708  (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);
4709  (STRIP_TAC);
4710  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
4711  (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);
4712  (SET_TAC[]);
4713  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
4714  (REWRITE_TAC[SET_RULE 
4715   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
4716          aff_ge {u0, u1} ({m, s3} DELETE s3) 
4717    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
4718  (MATCH_MP_TAC (SET_RULE 
4719   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
4720  (STRIP_TAC);
4721  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
4722  (STRIP_TAC);
4723  (SET_TAC[]);
4724
4725  (REWRITE_TAC[DISJOINT]);
4726  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
4727  (NEW_GOAL `F`);
4728  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4729  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
4730  (UP_ASM_TAC THEN SET_TAC[]);
4731  (REWRITE_TAC[COPLANAR_3]);
4732  (UP_ASM_TAC THEN MESON_TAC[]);
4733  (UP_ASM_TAC THEN SET_TAC[]);
4734
4735  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
4736  (STRIP_TAC);
4737  (SET_TAC[]);
4738  (REWRITE_TAC[DISJOINT]);
4739  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
4740  (NEW_GOAL `F`);
4741  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4742  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
4743  (UP_ASM_TAC THEN SET_TAC[]);
4744  (REWRITE_TAC[COPLANAR_3]);
4745  (UP_ASM_TAC THEN MESON_TAC[]);
4746  (UP_ASM_TAC THEN SET_TAC[]);
4747
4748  (SET_TAC[]);
4749
4750 (* begin the computation *)
4751
4752  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
4753  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 u3) =
4754              (if &1 < d \/ r < &0
4755               then &0
4756               else azim u0 u1 u2 u3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
4757  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);
4758  (STRIP_TAC);
4759  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4760  (EXISTS_TAC `u3:real^3`);
4761  (ASM_REWRITE_TAC[]);
4762  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4763  (EXISTS_TAC `u2:real^3`);
4764  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
4765  (ASM_REWRITE_TAC[]);
4766
4767  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
4768  (COND_CASES_TAC);
4769  (NEW_GOAL `F`);
4770  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
4771    UP_ASM_TAC THEN REAL_ARITH_TAC);
4772  (UP_ASM_TAC THEN MESON_TAC[]);
4773
4774  (REWRITE_WITH `azim (u0:real^3) u1 u2 u3 = dihV u0 u1 u2 u3`);
4775  (MATCH_MP_TAC AZIM_DIHV_SAME);
4776  (ASM_REWRITE_TAC[]);
4777  (STRIP_TAC);
4778  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4779  (EXISTS_TAC `u3:real^3`);
4780  (ASM_REWRITE_TAC[]);
4781  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4782  (EXISTS_TAC `u2:real^3`);
4783  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
4784  (ASM_REWRITE_TAC[]);
4785
4786  (REWRITE_TAC[dihX]);
4787  (COND_CASES_TAC);
4788  (NEW_GOAL `F`);
4789  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4790  (REWRITE_TAC[]);
4791  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4792  (EXISTS_TAC `X:real^3->bool`);
4793  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
4794  (UP_ASM_TAC THEN MESON_TAC[]);
4795
4796  (LET_TAC);
4797
4798  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
4799  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
4800            ul IN barV V 3 /\
4801            X = mcell k V ul /\
4802            initial_sublist [u0; u1] ul)`);
4803  (STRIP_TAC);
4804  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
4805  (MATCH_MP_TAC SELECT_AX);
4806  (EXISTS_TAC `(4, vl:(real^3)list)`);
4807  (EXPAND_TAC "P");
4808  (REWRITE_TAC[BETA_THM]);
4809  (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);
4810  (STRIP_TAC);
4811  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4812
4813  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
4814                  LENGTH [u0;u1] = 1 + 1`);
4815  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
4816  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4817  (ASM_REWRITE_TAC[]);
4818  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
4819  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4820  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
4821
4822  (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);
4823  (MATCH_MP_TAC Ajripqn.AJRIPQN);
4824  (ASM_REWRITE_TAC[]);
4825  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4826  (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);
4827  (REWRITE_WITH `mcell 4 V vl = X`);
4828  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4829  (SET_TAC[ASSUME `X = mcell k' V ul`]);
4830
4831  (REPEAT STRIP_TAC);
4832  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
4833    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
4834  (SET_TAC[]);
4835  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
4836
4837  (COND_CASES_TAC);
4838  (NEW_GOAL `F`);
4839  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
4840  (UP_ASM_TAC THEN MESON_TAC[]);
4841  (COND_CASES_TAC);
4842  (NEW_GOAL `F`);
4843  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
4844  (UP_ASM_TAC THEN MESON_TAC[]);
4845  (COND_CASES_TAC);
4846
4847  (REWRITE_TAC[dihu4]);
4848
4849  (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) = 
4850    dihV u0 u1 u2 (u3:real^3)`);
4851
4852  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
4853  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
4854  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
4855
4856  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
4857  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4858  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
4859  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4860                  CARD (set_of_list ul) = 3 + 1`);
4861  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4862  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4863  (ARITH_TAC);
4864
4865  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
4866  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4867  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
4868  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4869                  CARD (set_of_list ul) = 3 + 1`);
4870  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4871  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4872  (ARITH_TAC);
4873
4874  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);
4875  (REWRITE_WITH `
4876     {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
4877     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = 
4878     convex hull {u0, u1,u2,u3:real^3}`);
4879  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4880  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
4881  (REPEAT STRIP_TAC);
4882
4883  (UNDISCH_TAC `~NULLSET X`);
4884  (REWRITE_TAC[]);
4885  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
4886    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
4887  (COND_CASES_TAC);
4888  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
4889  (MATCH_MP_TAC BARV_3_EXPLICIT);
4890  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4891  (UP_ASM_TAC THEN STRIP_TAC);
4892  (ASM_REWRITE_TAC[set_of_list]);
4893  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4894  (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
4895  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4896  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4897  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4898  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
4899  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
4900  (UNDISCH_TAC 
4901    `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);
4902  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
4903                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
4904
4905  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4906
4907  (UNDISCH_TAC `~NULLSET X`);
4908  (REWRITE_TAC[]);
4909  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
4910  (COND_CASES_TAC);
4911  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4912  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4913  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4914  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4915  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4916  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
4917  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
4918  (ASM_REWRITE_TAC[]);
4919  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4920
4921  (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);
4922  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
4923  (COND_CASES_TAC);
4924  (MESON_TAC[]);
4925  (NEW_GOAL `F`);
4926  (UNDISCH_TAC `~NULLSET X`);
4927  (REWRITE_TAC[]);
4928  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
4929  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4930  (UP_ASM_TAC THEN MESON_TAC[]);
4931
4932  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
4933    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
4934  (COND_CASES_TAC);
4935  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
4936  (MATCH_MP_TAC BARV_3_EXPLICIT);
4937  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4938  (UP_ASM_TAC THEN STRIP_TAC);
4939  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
4940  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
4941  (NEW_GOAL `F`);
4942  (UNDISCH_TAC `~NULLSET X`);
4943  (REWRITE_TAC[]);
4944  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
4945    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
4946  (COND_CASES_TAC);
4947  (NEW_GOAL `F`);
4948  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);
4949  (UP_ASM_TAC THEN MESON_TAC[]);
4950  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4951  (UP_ASM_TAC THEN MESON_TAC[]);
4952
4953  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
4954  (STRIP_TAC);
4955
4956  (ASM_CASES_TAC `EL 2 ul = u2:real^3`);
4957  (NEW_GOAL `EL 3 ul = u3:real^3`);
4958  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
4959  (STRIP_TAC);
4960  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);
4961  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4962  (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
4963    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
4964    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);
4965  (ASM_REWRITE_TAC[]);
4966
4967  (NEW_GOAL `EL 2 ul = u3:real^3`);
4968  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
4969  (STRIP_TAC); 
4970  (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);
4971  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4972  (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
4973    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
4974    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);
4975
4976  (NEW_GOAL `EL 3 ul = u2:real^3`);
4977  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
4978  (STRIP_TAC);
4979  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);
4980  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4981  (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
4982    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
4983    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);
4984  (ASM_REWRITE_TAC[]);
4985  (REWRITE_TAC[DIHV_SYM_2]);
4986
4987  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
4988  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
4989  (AP_THM_TAC THEN AP_TERM_TAC);
4990
4991  (REWRITE_WITH 
4992   `measurable (conic_cap u0 u1 r d) /\
4993              vol (conic_cap u0 u1 r d) =
4994              (if u1 = u0 \/ &1 <= d \/ r < &0
4995               then &0
4996               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
4997  (MATCH_MP_TAC VOLUME_CONIC_CAP);
4998  (EXPAND_TAC "d");
4999  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5000  (COND_CASES_TAC);
5001  (NEW_GOAL `F`);
5002  (UP_ASM_TAC THEN STRIP_TAC);
5003  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
5004  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5005  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5006  (UP_ASM_TAC THEN MESON_TAC[]);
5007  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
5008
5009  (REWRITE_WITH `max d (--(&1)) = d`);
5010  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
5011  (REWRITE_TAC[REAL_NEG_LT0]);
5012  (STRIP_TAC);
5013  (EXPAND_TAC "d");
5014  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5015  (REAL_ARITH_TAC);
5016
5017  (REWRITE_WITH `
5018   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
5019   ((&2 * pi) / (&2 * pi))`);
5020  (REAL_ARITH_TAC);
5021  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
5022  (MATCH_MP_TAC REAL_DIV_REFL);
5023  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
5024  (REAL_ARITH_TAC);
5025  (NEW_GOAL `F`);
5026  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
5027    THEN MESON_TAC[]);
5028  (UP_ASM_TAC THEN MESON_TAC[]);
5029
5030 (* ========================================================================= *)
5031 (* OK here *)
5032
5033  (ASM_CASES_TAC `azim u0 u1 u3 (u2:real^3) < pi`);
5034  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
5035  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5036  (STRIP_TAC);
5037  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u3 u2)`);
5038  (ASM_SIMP_TAC[WEDGE_LUNE]);
5039  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
5040                  conic_cap u0 u1 r d INTER L`);
5041  (SET_TAC[]);
5042  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
5043
5044  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
5045    aff_gt {u0, u1} {u3, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);
5046  (EXPAND_TAC "L");
5047  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
5048  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
5049  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
5050  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
5051  (EXPAND_TAC "L");
5052  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
5053
5054  (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
5055                  aff_gt {u0, u1} {u2, u3} UNION 
5056    UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN  {u2, u3}}`);
5057  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
5058  (REWRITE_TAC[Geomdetail.FINITE6]);
5059  (REWRITE_TAC[DISJOINT]);
5060
5061  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5062  (NEW_GOAL `F`);
5063  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5064  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);
5065  (UP_ASM_TAC THEN SET_TAC[]);
5066  (REWRITE_TAC[COPLANAR_3]);
5067  (UP_ASM_TAC THEN MESON_TAC[]);
5068
5069  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
5070  (NEW_GOAL `F`);
5071  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5072  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);
5073  (UP_ASM_TAC THEN SET_TAC[]);
5074  (REWRITE_TAC[COPLANAR_3]);
5075  (UP_ASM_TAC THEN MESON_TAC[]);
5076  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5077
5078  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5079  (EXISTS_TAC 
5080   `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
5081  (STRIP_TAC);
5082  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5083  (EXISTS_TAC 
5084   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);
5085  (STRIP_TAC);
5086  (MATCH_MP_TAC NEGLIGIBLE_UNION);
5087  (STRIP_TAC);
5088
5089  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5090  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
5091  (STRIP_TAC);
5092  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
5093  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
5094  (SET_TAC[]);
5095  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
5096  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5097  (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);
5098  (STRIP_TAC);
5099  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
5100  (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);
5101  (SET_TAC[]);
5102  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
5103  (REWRITE_TAC[SET_RULE 
5104   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
5105          aff_ge {u0, u1} ({m, s3} DELETE s3) 
5106    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
5107  (MATCH_MP_TAC (SET_RULE 
5108   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
5109  (STRIP_TAC);
5110  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
5111  (STRIP_TAC);
5112  (SET_TAC[]);
5113
5114  (REWRITE_TAC[DISJOINT]);
5115  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5116  (NEW_GOAL `F`);
5117  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5118  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);
5119  (UP_ASM_TAC THEN SET_TAC[]);
5120  (REWRITE_TAC[COPLANAR_3]);
5121  (UP_ASM_TAC THEN MESON_TAC[]);
5122  (UP_ASM_TAC THEN SET_TAC[]);
5123
5124  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
5125  (STRIP_TAC);
5126  (SET_TAC[]);
5127  (REWRITE_TAC[DISJOINT]);
5128  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
5129  (NEW_GOAL `F`);
5130  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5131  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);
5132  (UP_ASM_TAC THEN SET_TAC[]);
5133  (REWRITE_TAC[COPLANAR_3]);
5134  (UP_ASM_TAC THEN MESON_TAC[]);
5135  (UP_ASM_TAC THEN SET_TAC[]);
5136
5137  (SET_TAC[]);
5138
5139  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
5140  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u3 u2) =
5141              (if &1 < d \/ r < &0
5142               then &0
5143               else azim u0 u1 u3 u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
5144  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);
5145  (STRIP_TAC);
5146  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5147  (EXISTS_TAC `u3:real^3`);
5148  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5149  (ASM_REWRITE_TAC[]);
5150  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5151  (EXISTS_TAC `u2:real^3`);
5152  (ASM_REWRITE_TAC[]);
5153
5154  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
5155  (COND_CASES_TAC);
5156  (NEW_GOAL `F`);
5157
5158  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
5159    UP_ASM_TAC THEN REAL_ARITH_TAC);
5160  (UP_ASM_TAC THEN MESON_TAC[]);
5161
5162  (REWRITE_WITH `azim (u0:real^3) u1 u3 u2 = dihV u0 u1 u3 u2`);
5163  (MATCH_MP_TAC AZIM_DIHV_SAME);
5164  (ASM_REWRITE_TAC[]);
5165  (STRIP_TAC);
5166
5167  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5168  (EXISTS_TAC `u2:real^3`);
5169  (ASM_REWRITE_TAC[]);
5170  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5171  (EXISTS_TAC `u3:real^3`);
5172  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5173  (ASM_REWRITE_TAC[]);
5174
5175  (REWRITE_TAC[dihX]);
5176  (COND_CASES_TAC);
5177  (NEW_GOAL `F`);
5178  (UNDISCH_TAC `~NULLSET (X INTER D)`);
5179  (REWRITE_TAC[]);
5180  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5181  (EXISTS_TAC `X:real^3->bool`);
5182  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
5183  (UP_ASM_TAC THEN MESON_TAC[]);
5184
5185  (LET_TAC);
5186
5187  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
5188  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
5189            ul IN barV V 3 /\
5190            X = mcell k V ul /\
5191            initial_sublist [u0; u1] ul)`);
5192  (STRIP_TAC);
5193  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
5194  (MATCH_MP_TAC SELECT_AX);
5195  (EXISTS_TAC `(4, vl:(real^3)list)`);
5196  (EXPAND_TAC "P");
5197  (REWRITE_TAC[BETA_THM]);
5198  (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);
5199  (STRIP_TAC);
5200  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5201
5202  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
5203                  LENGTH [u0;u1] = 1 + 1`);
5204  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5205  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
5206  (ASM_REWRITE_TAC[]);
5207  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5208  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5209  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
5210
5211  (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);
5212  (MATCH_MP_TAC Ajripqn.AJRIPQN);
5213  (ASM_REWRITE_TAC[]);
5214  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
5215  (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);
5216  (REWRITE_WITH `mcell 4 V vl = X`);
5217  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5218  (SET_TAC[ASSUME `X = mcell k' V ul`]);
5219
5220  (REPEAT STRIP_TAC);
5221  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
5222    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
5223  (SET_TAC[]);
5224  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
5225
5226  (COND_CASES_TAC);
5227  (NEW_GOAL `F`);
5228  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5229  (UP_ASM_TAC THEN MESON_TAC[]);
5230  (COND_CASES_TAC);
5231  (NEW_GOAL `F`);
5232  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5233  (UP_ASM_TAC THEN MESON_TAC[]);
5234  (COND_CASES_TAC);
5235
5236  (REWRITE_TAC[dihu4]);
5237
5238  (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) = 
5239    dihV u0 u1 u2 (u3:real^3)`);
5240
5241  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
5242  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5243  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5244
5245  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
5246  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5247  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5248  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5249                  CARD (set_of_list ul) = 3 + 1`);
5250  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5251  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5252  (ARITH_TAC);
5253
5254  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
5255  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5256  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5257  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5258                  CARD (set_of_list ul) = 3 + 1`);
5259  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5260  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5261  (ARITH_TAC);
5262
5263  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);
5264  (REWRITE_WITH `
5265     {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
5266     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = 
5267     convex hull {u0, u1,u2,u3:real^3}`);
5268  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5269  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
5270  (REPEAT STRIP_TAC);
5271
5272  (UNDISCH_TAC `~NULLSET X`);
5273  (REWRITE_TAC[]);
5274  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5275    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5276  (COND_CASES_TAC);
5277  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5278  (MATCH_MP_TAC BARV_3_EXPLICIT);
5279  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5280  (UP_ASM_TAC THEN STRIP_TAC);
5281  (ASM_REWRITE_TAC[set_of_list]);
5282  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5283  (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
5284  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5285  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5286  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5287  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5288  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5289  (UNDISCH_TAC 
5290    `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);
5291  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
5292                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5293
5294  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5295
5296  (UNDISCH_TAC `~NULLSET X`);
5297  (REWRITE_TAC[]);
5298  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5299  (COND_CASES_TAC);
5300  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5301  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
5302  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5303  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5304  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5305  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5306  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5307  (ASM_REWRITE_TAC[]);
5308  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5309
5310  (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);
5311  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5312  (COND_CASES_TAC);
5313  (MESON_TAC[]);
5314  (NEW_GOAL `F`);
5315  (UNDISCH_TAC `~NULLSET X`);
5316  (REWRITE_TAC[]);
5317  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5318  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5319  (UP_ASM_TAC THEN MESON_TAC[]);
5320
5321  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5322    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5323  (COND_CASES_TAC);
5324  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5325  (MATCH_MP_TAC BARV_3_EXPLICIT);
5326  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5327  (UP_ASM_TAC THEN STRIP_TAC);
5328  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5329  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5330  (NEW_GOAL `F`);
5331  (UNDISCH_TAC `~NULLSET X`);
5332  (REWRITE_TAC[]);
5333  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5334    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5335  (COND_CASES_TAC);
5336  (NEW_GOAL `F`);
5337  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);
5338  (UP_ASM_TAC THEN MESON_TAC[]);
5339  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5340  (UP_ASM_TAC THEN MESON_TAC[]);
5341
5342  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
5343  (STRIP_TAC);
5344
5345  (ASM_CASES_TAC `EL 2 ul = u2:real^3`);
5346  (NEW_GOAL `EL 3 ul = u3:real^3`);
5347  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5348  (STRIP_TAC);
5349  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);
5350  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5351  (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5352  (REWRITE_TAC[]);
5353  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5354  (REWRITE_TAC[
5355    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5356    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);
5357  (ASM_REWRITE_TAC[]);
5358
5359  (NEW_GOAL `EL 2 ul = u3:real^3`);
5360  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5361  (STRIP_TAC); 
5362  (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);
5363  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5364  (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5365  (REWRITE_TAC[]);
5366  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5367
5368
5369  (REWRITE_TAC[
5370    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5371    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);
5372  (NEW_GOAL `EL 3 ul = u2:real^3`);
5373  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5374  (STRIP_TAC);
5375  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);
5376  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5377  (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5378  (REWRITE_TAC[]);
5379  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5380
5381  (REWRITE_TAC[
5382    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5383    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);
5384  (ASM_REWRITE_TAC[]);
5385  (REWRITE_TAC[DIHV_SYM_2]);
5386
5387  (REWRITE_TAC[DIHV_SYM_2]);
5388  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
5389  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
5390  (AP_THM_TAC THEN AP_TERM_TAC);
5391
5392  (REWRITE_WITH 
5393   `measurable (conic_cap u0 u1 r d) /\
5394              vol (conic_cap u0 u1 r d) =
5395              (if u1 = u0 \/ &1 <= d \/ r < &0
5396               then &0
5397               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
5398  (MATCH_MP_TAC VOLUME_CONIC_CAP);
5399  (EXPAND_TAC "d");
5400  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5401  (COND_CASES_TAC);
5402  (NEW_GOAL `F`);
5403  (UP_ASM_TAC THEN STRIP_TAC);
5404  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
5405  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5406  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5407  (UP_ASM_TAC THEN MESON_TAC[]);
5408
5409  (REWRITE_WITH `max d (--(&1)) = d`);
5410  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
5411  (REWRITE_TAC[REAL_NEG_LT0]);
5412  (STRIP_TAC);
5413  (EXPAND_TAC "d");
5414  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5415  (REAL_ARITH_TAC);
5416
5417  (REWRITE_WITH `
5418   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
5419   ((&2 * pi) / (&2 * pi))`);
5420  (REAL_ARITH_TAC);
5421  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
5422  (MATCH_MP_TAC REAL_DIV_REFL);
5423  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
5424  (REAL_ARITH_TAC);
5425  (NEW_GOAL `F`);
5426  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
5427    THEN MESON_TAC[]);
5428  (UP_ASM_TAC THEN MESON_TAC[]);
5429
5430 (* ========================================================================== *)
5431
5432  (NEW_GOAL `F`);
5433  (NEW_GOAL `azim (u0:real^3) u1 u3 u2 = 
5434   (if azim u0 u1 u2 u3 = &0 then &0 else &2 * pi - azim u0 u1 u2 u3)`);
5435  (MATCH_MP_TAC AZIM_COMPL);
5436  (STRIP_TAC);
5437
5438  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5439  (EXISTS_TAC `u3:real^3`);
5440  (ASM_REWRITE_TAC[]);
5441  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5442  (EXISTS_TAC `u2:real^3`);
5443  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
5444  (ASM_REWRITE_TAC[]);
5445  (UP_ASM_TAC THEN COND_CASES_TAC);
5446  (NEW_GOAL `F`);
5447  (NEW_GOAL `(&0 < pi)`);
5448  (REWRITE_TAC[PI_POS]);
5449  (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 u3 < pi)`);
5450  (ASM_REWRITE_TAC[]);
5451  (UP_ASM_TAC THEN MESON_TAC[]);
5452  (STRIP_TAC);
5453
5454  (NEW_GOAL `azim (u0:real^3) u1 u2 u3 = pi`);
5455  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5456  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
5457  (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
5458  (ASM_REWRITE_TAC[]);
5459  (UP_ASM_TAC THEN MESON_TAC[]);
5460
5461 (* ========================================================================= *)
5462 (*  Case k = 3                                                               *)
5463 (* ========================================================================= *)
5464
5465  (NEW_GOAL `k = 3`);
5466  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
5467  (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);
5468  (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);
5469  (MATCH_MP_TAC BARV_3_EXPLICIT);
5470  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5471  (UP_ASM_TAC THEN STRIP_TAC);
5472  (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
5473
5474  (REWRITE_WITH `u0 = v0:real^3`);
5475  (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);
5476  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
5477    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
5478  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
5479
5480  (REWRITE_WITH `u1 = v1:real^3`);
5481  (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);
5482  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
5483    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
5484  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
5485  (ASM_REWRITE_TAC[]);
5486  (UP_ASM_TAC THEN STRIP_TAC);
5487
5488  (ABBREV_TAC `L = aff_ge{u0, u1} {u2, mxi V vl}`);
5489
5490  (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
5491  (AP_TERM_TAC);
5492  (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
5493    mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5494  (COND_CASES_TAC);
5495  (ABBREV_TAC `m = mxi V vl`);
5496  (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);
5497  (EXPAND_TAC "m" THEN DEL_TAC THEN ASM_REWRITE_TAC[]);
5498
5499  (EXPAND_TAC "L");
5500  (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
5501  (STRIP_TAC);
5502  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));
5503  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
5504  (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
5505                             A INTER B SUBSET C INTER B`));
5506  (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, m}`);
5507  (REWRITE_TAC[DISJOINT]);
5508  (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));
5509  (STRIP_TAC);
5510  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5511  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5512  (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);
5513
5514
5515  (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
5516    mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5517  (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);
5518  (EXPAND_TAC "m" THEN REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5519  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5520  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5521  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5522  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5523  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5524
5525  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5526  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
5527  (UP_ASM_TAC THEN SET_TAC[]);
5528  (REWRITE_TAC[COPLANAR_3]);
5529  (NEW_GOAL `m IN {u0, u1:real^3}`);
5530  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5531  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
5532  (UP_ASM_TAC THEN SET_TAC[]);
5533  (REWRITE_TAC[COPLANAR_3]);
5534
5535  (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, m:real^3}`; AFF_GE_2_2]);
5536  (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);
5537  (REPEAT STRIP_TAC);
5538  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
5539    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
5540  (ASM_REWRITE_TAC[]);
5541  (STRIP_TAC);
5542
5543  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
5544  (STRIP_TAC);
5545  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
5546  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5547    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
5548  (EXPAND_TAC "D");
5549  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
5550  (DISJ1_TAC);
5551  (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
5552
5553  (NEW_GOAL `(?b1:real. b1 IN P1 /\ (!x. x IN P1 ==> b1 <= x))`);
5554  (FIRST_ASSUM MATCH_MP_TAC);
5555  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5556  (EXISTS_TAC `(f1:(real^3)list -> real) vl`);
5557  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5558  (EXISTS_TAC `vl:(real^3)list`);
5559  (ASM_REWRITE_TAC[]);
5560  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5561  (ASM_REWRITE_TAC[]);
5562  (STRIP_TAC);
5563  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5564  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5565  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5566  (STRIP_TAC);
5567  (ASM_REWRITE_TAC[]);
5568  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5569  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5570  (MATCH_MP_TAC (SET_RULE 
5571   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5572  (STRIP_TAC);
5573  (MATCH_MP_TAC SUBSET_BALL);
5574  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5575  (MATCH_MP_TAC RCONE_GT_SUBSET);
5576  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5577  (FIRST_X_ASSUM CHOOSE_TAC);
5578
5579  (NEW_GOAL `r1 = (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x:real))`);
5580  (EXPAND_TAC "r1");
5581  (COND_CASES_TAC);
5582  (NEW_GOAL `F`);
5583  (UP_ASM_TAC THEN REWRITE_TAC[]);
5584  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5585  (EXISTS_TAC `(f1:(real^3)list -> real) vl`);
5586  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5587  (EXISTS_TAC `vl:(real^3)list`);
5588  (ASM_REWRITE_TAC[]);
5589  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5590  (ASM_SIMP_TAC[]);
5591  (STRIP_TAC);
5592  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5593  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5594  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5595  (STRIP_TAC);
5596  (ASM_REWRITE_TAC[]);
5597  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5598  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5599  (MATCH_MP_TAC (SET_RULE 
5600   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5601  (STRIP_TAC);
5602  (MATCH_MP_TAC SUBSET_BALL);
5603  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5604  (MATCH_MP_TAC RCONE_GT_SUBSET);
5605  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5606  (UP_ASM_TAC THEN MESON_TAC[]);
5607  (REWRITE_TAC[]);
5608
5609  (ABBREV_TAC `Q1 = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
5610  (NEW_GOAL `(Q1:real->bool) r1`);
5611  (ASM_REWRITE_TAC[]);
5612  (MATCH_MP_TAC SELECT_AX);
5613  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
5614  (ASM_REWRITE_TAC[]);
5615  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
5616  (NEW_GOAL `r1 <= f1 (vl:(real^3)list)`);
5617  (FIRST_ASSUM MATCH_MP_TAC);
5618  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5619  (EXISTS_TAC `vl:(real^3)list`);
5620  (ASM_REWRITE_TAC[]);
5621  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5622  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5623  (STRIP_TAC);
5624  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5625  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5626  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5627  (STRIP_TAC);
5628  (ASM_REWRITE_TAC[]);
5629  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5630  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5631  (MATCH_MP_TAC (SET_RULE 
5632   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5633  (STRIP_TAC);
5634  (MATCH_MP_TAC SUBSET_BALL);
5635  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5636  (MATCH_MP_TAC RCONE_GT_SUBSET);
5637  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5638
5639  (UP_ASM_TAC THEN EXPAND_TAC "f1" THEN REWRITE_TAC[EL; HD; TL; 
5640    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
5641    ASSUME `vl= [u0; u1; u2; u3:real^3]`]);
5642  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5643  (EXPAND_TAC "m");
5644  (REWRITE_TAC[ASSUME `vl = [u0;u1;u2;u3:real^3]`]);
5645  (STRIP_TAC);
5646
5647  (NEW_GOAL `!v. v IN affine hull {u1, u2, m:real^3} ==> r1 <= dist (u0, v)`);
5648  (REPEAT STRIP_TAC);
5649  (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, m}) u0) <= 
5650              dist (u0, v:real^3)`);
5651  (MATCH_MP_TAC CLOSEST_POINT_LE);
5652  (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
5653  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5654
5655  (NEW_GOAL `r <= dist (u0:real^3, x)`);
5656  (REWRITE_TAC[dist]);
5657  (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);
5658  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5659  (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);
5660  (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
5661   (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) = 
5662   (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);
5663  (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 + 
5664                           t3 /(t2 + t3 + t4) % u2 + 
5665                           t4 /(t2 + t3 + t4) % m`);
5666  (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % m) = (t2 + t3 + t4) % (y:real^3)`);
5667  (EXPAND_TAC "y");
5668  (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 +  t3 / x % u2 + t4 / x % u3) = 
5669    (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);
5670  (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
5671  (MATCH_MP_TAC REAL_DIV_REFL);
5672  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
5673  (REAL_ARITH_TAC);
5674  (VECTOR_ARITH_TAC);
5675  (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);
5676
5677  (NEW_GOAL `&1 < t2 + t3 + t4`);
5678  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
5679  (REAL_ARITH_TAC);
5680  (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`); 
5681  (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5682  (REWRITE_TAC[GSYM dist]);
5683  (NEW_GOAL `r1 <= dist (u0, y:real^3)`);
5684  (FIRST_ASSUM MATCH_MP_TAC);
5685  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
5686  (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
5687    EXISTS_TAC `t4 / (t2 + t3 + t4)`);
5688  (STRIP_TAC);
5689  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
5690  (MATCH_MP_TAC REAL_DIV_REFL);
5691  (UP_ASM_TAC THEN REAL_ARITH_TAC);
5692  (ASM_REWRITE_TAC[]);
5693
5694  (NEW_GOAL `r1 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
5695  (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
5696  (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
5697  (MATCH_MP_TAC REAL_LE_MUL);
5698  (REWRITE_TAC[DIST_POS_LE]);
5699  (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5700  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5701  (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5702  (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5703
5704 (* ========================================================================== *)
5705
5706  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
5707  (STRIP_TAC);
5708  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
5709  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5710    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
5711  (EXPAND_TAC "D");
5712  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
5713  (DISJ2_TAC);
5714  (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);
5715
5716  (NEW_GOAL `(?b1:real. b1 IN P3 /\ (!x. x IN P3 ==> x <= b1))`);
5717  (FIRST_ASSUM MATCH_MP_TAC);
5718  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5719  (EXISTS_TAC `(f3:(real^3)list -> real) vl`);
5720  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5721  (EXISTS_TAC `vl:(real^3)list`);
5722  (ASM_REWRITE_TAC[]);
5723  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5724  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5725  (STRIP_TAC);
5726  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5727  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5728  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5729  (STRIP_TAC);
5730  (ASM_REWRITE_TAC[]);
5731  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5732  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5733  (MATCH_MP_TAC (SET_RULE 
5734   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5735  (STRIP_TAC);
5736  (MATCH_MP_TAC SUBSET_BALL);
5737  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5738  (MATCH_MP_TAC RCONE_GT_SUBSET);
5739  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5740  (FIRST_X_ASSUM CHOOSE_TAC);
5741
5742  (NEW_GOAL `d1 = (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b:real))`);
5743  (EXPAND_TAC "d1");
5744  (COND_CASES_TAC);
5745  (NEW_GOAL `F`);
5746  (UP_ASM_TAC THEN REWRITE_TAC[]);
5747  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5748  (EXISTS_TAC `(f3:(real^3)list -> real) vl`);
5749  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5750  (EXISTS_TAC `vl:(real^3)list`);
5751  (ASM_REWRITE_TAC[]);
5752  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5753  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5754  (STRIP_TAC);
5755  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5756  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5757  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5758  (STRIP_TAC);
5759  (ASM_REWRITE_TAC[]);
5760  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5761  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5762  (MATCH_MP_TAC (SET_RULE 
5763   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5764  (STRIP_TAC);
5765  (MATCH_MP_TAC SUBSET_BALL);
5766  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5767  (MATCH_MP_TAC RCONE_GT_SUBSET);
5768  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5769  (UP_ASM_TAC THEN MESON_TAC[]);
5770  (REWRITE_TAC[]);
5771
5772  (ABBREV_TAC `Q1 = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
5773  (NEW_GOAL `(Q1:real->bool) d1`);
5774  (ASM_REWRITE_TAC[]);
5775  (MATCH_MP_TAC SELECT_AX);
5776  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
5777  (ASM_REWRITE_TAC[]);
5778  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
5779
5780  (NEW_GOAL `f3 (vl:(real^3)list) <= d1`);
5781  (FIRST_ASSUM MATCH_MP_TAC);
5782  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5783  (EXISTS_TAC `vl:(real^3)list`);
5784  (ASM_REWRITE_TAC[]);
5785  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5786  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5787  (STRIP_TAC);
5788  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5789  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5790  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5791  (STRIP_TAC);
5792  (ASM_REWRITE_TAC[]);
5793  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5794  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5795  (MATCH_MP_TAC (SET_RULE 
5796   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5797  (STRIP_TAC);
5798  (MATCH_MP_TAC SUBSET_BALL);
5799  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5800  (MATCH_MP_TAC RCONE_GT_SUBSET);
5801  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5802
5803  (UP_ASM_TAC THEN EXPAND_TAC "f3");
5804  (REWRITE_TAC[EL; HD; TL; 
5805    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; ASSUME `mxi V vl = m`; 
5806    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
5807
5808  (ABBREV_TAC `xx = smallest_angle_line u2 m u0 u1`);
5809
5810  (MP_TAC (ASSUME `smallest_angle_line u2 m u0 u1 = xx`));
5811  (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
5812  (ABBREV_TAC `Q2 = 
5813  (\x:real^3. x IN convex hull {u2, m} /\
5814              (!y. y IN convex hull {u2, m}
5815                   ==> ((y - u0) dot (u1 - u0)) /
5816                       (norm (y - u0) * norm (u1 - u0)) <=
5817                       ((x - u0) dot (u1 - u0)) /
5818                       (norm (x - u0) * norm (u1 - u0))))`);
5819  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);
5820  (NEW_GOAL `(Q2:real^3->bool) xx`);
5821  (ONCE_ASM_REWRITE_TAC[]);
5822  (MATCH_MP_TAC SELECT_AX);
5823  (EXPAND_TAC "Q2");
5824
5825  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
5826  (STRIP_TAC);
5827  (ASM_REWRITE_TAC[]);
5828  (STRIP_TAC);
5829
5830  (UNDISCH_TAC `~NULLSET (X INTER D)`);
5831  (REWRITE_TAC[]);
5832  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5833  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
5834  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;TRUNCATE_SIMPLEX_EXPLICIT_2;
5835     SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5836  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5837  (EXPAND_TAC "m");
5838  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5839
5840  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5841
5842  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5843  (STRIP_TAC);
5844  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5845  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5846  (REWRITE_TAC[coplanar]);
5847  (UNDISCH_TAC `u0 IN convex hull {u2, m:real^3}`);
5848  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
5849  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
5850    EXISTS_TAC `m:real^3`);
5851  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
5852  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
5853  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
5854  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
5855  (STRIP_TAC);
5856  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
5857  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
5858  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5859  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5860  (SET_TAC[]);
5861
5862  (UP_ASM_TAC THEN EXPAND_TAC "Q2");
5863  (STRIP_TAC);
5864  (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) / 
5865                                (norm (y - u0) * norm (u1 - u0)))`);
5866
5867  (NEW_GOAL `d < (g:real^3->real) x`);
5868  (EXPAND_TAC "g");
5869  (REWRITE_WITH 
5870   `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
5871    d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);
5872  (MATCH_MP_TAC REAL_LT_RDIV_EQ);
5873  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
5874  (STRIP_TAC);
5875  (MATCH_MP_TAC REAL_LE_MUL);
5876  (ASM_REWRITE_TAC[NORM_POS_LE]);
5877  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);
5878  (ASM_REWRITE_TAC[]);
5879  (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = u0:real^3 <=>
5880   t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = (t1 + t2 + t3 + t4) % u0`);
5881  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5882  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);
5883  (STRIP_TAC);
5884
5885  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
5886  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5887  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
5888  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list; 
5889    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5890  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5891  (EXPAND_TAC "m");
5892  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5893  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5894
5895  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5896  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5897  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5898  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5899  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5900  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5901  (REWRITE_TAC[affine_dependent]);
5902  (EXISTS_TAC `u1:real^3`);
5903  (STRIP_TAC);
5904  (SET_TAC[]);
5905
5906  (NEW_GOAL `~(u1 IN {u0, u2, m:real^3})`);
5907  (STRIP_TAC);
5908  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
5909  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5910  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
5911  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list; 
5912    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5913  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5914  (EXPAND_TAC "m");
5915  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5916  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5917  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5918  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5919  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5920  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5921  (REWRITE_WITH `{u0, u1, u2, m} = {u0:real^3,u2, m}`);
5922  (UP_ASM_TAC THEN SET_TAC[]);
5923  (REWRITE_TAC[COPLANAR_3]);
5924  (SET_TAC[]);
5925  (REWRITE_WITH `{u0, u1, u2, m} DELETE u1 = {u0, u2, m:real^3}`);
5926  (UP_ASM_TAC THEN SET_TAC[]);
5927  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
5928  (EXISTS_TAC `(t2 + t3 + t4) / t2`);
5929  (EXISTS_TAC `(-- t3) / t2`);
5930  (EXISTS_TAC `(-- t4) / t2`);
5931
5932  (STRIP_TAC);
5933  (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);
5934  (REAL_ARITH_TAC);
5935  (MATCH_MP_TAC REAL_DIV_REFL);
5936  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
5937  (REWRITE_WITH 
5938   `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % m:real^3 <=> 
5939    u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % m)`);
5940  (VECTOR_ARITH_TAC);
5941  (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % m = 
5942                              (t2 + t3 + t4) % u0:real^3`)]);
5943  (REWRITE_TAC[VECTOR_ARITH 
5944   `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);
5945  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
5946  (REWRITE_WITH `&1 / t2 * t2 = &1`);
5947  (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);
5948  (MATCH_MP_TAC REAL_DIV_REFL);
5949  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
5950  (VECTOR_ARITH_TAC);
5951  (SET_TAC[]);
5952  (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);
5953  (ASM_REWRITE_TAC[]);
5954
5955  (NEW_GOAL `g x <= (g:real^3->real) xx`);
5956  (NEW_GOAL `!y. y IN convex hull {u2 , m:real^3} ==> g y <= g xx`);
5957  (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);
5958  (NEW_GOAL `&0 < (t3 + t4)`);
5959  (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0)  ==> &0 < x`));
5960  (STRIP_TAC);
5961  (MATCH_MP_TAC REAL_LE_ADD);
5962  (ASM_REWRITE_TAC[]);
5963  (STRIP_TAC);
5964  (NEW_GOAL `t3 = &0 /\ t4 = &0`);
5965  (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN 
5966    UP_ASM_TAC THEN REAL_ARITH_TAC);
5967  (UP_ASM_TAC THEN STRIP_TAC);
5968
5969  (NEW_GOAL `F`);
5970  (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);
5971  (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);
5972  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5973  (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));
5974  (STRIP_TAC);
5975  (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) - 
5976                  (t1 + t2 + t3 + t4) % u0:real^3`);
5977  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5978  (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH 
5979   `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; 
5980    DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
5981  (MATCH_MP_TAC REAL_LE_MUL);
5982  (REWRITE_TAC[DOT_POS_LE]);
5983  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
5984  (MATCH_MP_TAC REAL_LE_MUL);
5985  (REWRITE_TAC[DIST_POS_LE]);
5986  (MATCH_MP_TAC REAL_LE_MUL);
5987  (REWRITE_TAC[DIST_POS_LE]);
5988  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);
5989  (REAL_ARITH_TAC);
5990  (UP_ASM_TAC THEN MESON_TAC[]);
5991
5992  (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % m:real^3`);
5993  (NEW_GOAL `(g:real^3->real) y <= g xx`);
5994  (FIRST_ASSUM MATCH_MP_TAC);
5995  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
5996  (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
5997  (REPEAT STRIP_TAC);
5998  (MATCH_MP_TAC REAL_LE_DIV);
5999  (ASM_SIMP_TAC[REAL_LE_ADD]);
6000  (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);
6001  (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
6002  (MATCH_MP_TAC REAL_DIV_REFL);
6003  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6004  (ASM_REWRITE_TAC[]);
6005
6006  (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 + 
6007                    t4 / (t1 + t3 + t4) % m:real^3`);
6008  (NEW_GOAL `(g:real^3->real) y = g w`);
6009  (EXPAND_TAC "g");
6010
6011  (REWRITE_WITH `y:real^3 - u0 = 
6012                 &1 / (t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);
6013  (EXPAND_TAC "y");
6014  (REWRITE_TAC[VECTOR_ARITH 
6015   `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
6016    &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
6017    (t3 + t4) / (t3 + t4) % u0 = u0`]);
6018  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6019  (MATCH_MP_TAC REAL_DIV_REFL);
6020  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6021  (VECTOR_ARITH_TAC);
6022  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
6023
6024  (REWRITE_WITH `w:real^3 - u0 = 
6025                 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);
6026  (EXPAND_TAC "w");
6027  (REWRITE_TAC[VECTOR_ARITH 
6028    `(t1 / (t1 + t3 + t4) % u0 +
6029     t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
6030     &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
6031     (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
6032  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6033  (MATCH_MP_TAC REAL_DIV_REFL);
6034  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
6035    THEN REAL_ARITH_TAC);
6036  (VECTOR_ARITH_TAC);
6037  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
6038  (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
6039  (REWRITE_TAC[REAL_ABS_REFL]);
6040  (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
6041  (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
6042  (REWRITE_TAC[REAL_ABS_REFL]);
6043  (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
6044  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
6045    THEN REAL_ARITH_TAC);
6046  (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) = 
6047                            (a * x) / (a * (y * z))`]);
6048  (ABBREV_TAC 
6049   `a1 = norm (t3 % u2 + t4 % m - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
6050  (NEW_GOAL `~(a1 = &0)`);
6051  (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; 
6052    VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
6053  (STRIP_TAC);
6054
6055  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6056  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6057  (EXISTS_TAC `(X:real^3->bool)`);
6058  (STRIP_TAC);
6059
6060  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6061                 set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6062  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6063  (EXPAND_TAC "m");
6064  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6065
6066  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6067  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6068  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6069  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6070  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6071  (REWRITE_TAC[coplanar]);
6072  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6073    EXISTS_TAC `m:real^3`);
6074  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6075  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6076  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6077  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
6078    THEN EXISTS_TAC `t4 / (t3 + t4)`);
6079  (REPEAT STRIP_TAC);
6080  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
6081                           (t3 + t4) / (t3 + t4)`]);
6082  (MATCH_MP_TAC REAL_DIV_REFL);
6083  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6084  (ASM_REWRITE_TAC[VECTOR_ARITH 
6085    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
6086     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
6087  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6088  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6089  (MATCH_MP_TAC REAL_DIV_REFL);
6090  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6091  (VECTOR_ARITH_TAC);
6092  (SET_TAC[]);
6093
6094  (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
6095  (NEW_GOAL `&0 < &1 / (t3 + t4)`);
6096  (MATCH_MP_TAC REAL_LT_DIV);
6097  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
6098  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6099
6100  (REWRITE_WITH 
6101  `(&1 / (t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6102   (&1 / (t3 + t4) * a1) = 
6103   ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
6104  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
6105
6106  (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
6107  (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);
6108  (MATCH_MP_TAC REAL_LT_DIV);
6109  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
6110  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6111    REAL_ARITH_TAC);
6112  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6113
6114  (REWRITE_WITH 
6115  `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6116   (&1 / (t1 + t3 + t4) * a1) = 
6117   ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
6118  (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
6119    MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
6120
6121  (NEW_GOAL `(g:real^3->real) x <= g w`);
6122  (EXPAND_TAC "g");
6123
6124  (REWRITE_WITH 
6125   `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
6126   ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
6127   ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <= 
6128   ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
6129  (MATCH_MP_TAC RAT_LEMMA4);
6130  (STRIP_TAC);
6131  (MATCH_MP_TAC REAL_LT_MUL);
6132  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
6133  (STRIP_TAC);
6134  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6135  (REWRITE_TAC[]);
6136
6137  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6138  (EXISTS_TAC `(X:real^3->bool)`);
6139  (STRIP_TAC);
6140  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6141    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6142  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6143  (EXPAND_TAC "m");
6144  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6145  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6146  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6147  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6148  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6149  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6150  (REWRITE_TAC[coplanar]);
6151  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6152    EXISTS_TAC `m:real^3`);
6153  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
6154  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6155  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6156  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6157  (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
6158    THEN EXISTS_TAC `(--t4) / t2`);
6159  (REPEAT STRIP_TAC);
6160  (REWRITE_TAC[REAL_ARITH 
6161    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
6162  (MATCH_MP_TAC REAL_DIV_REFL);
6163  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6164  (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
6165  (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6166  (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % m:real^3 = t2 % u1`);
6167  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
6168  (ASM_REWRITE_TAC[VECTOR_ARITH 
6169    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
6170     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
6171  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6172  (REWRITE_WITH `t2 / t2 = &1`);
6173  (MATCH_MP_TAC REAL_DIV_REFL);
6174  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6175  (VECTOR_ARITH_TAC);
6176  (SET_TAC[]);
6177
6178  (MATCH_MP_TAC REAL_LT_MUL);
6179  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
6180  (EXPAND_TAC "w" THEN STRIP_TAC);
6181  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6182  (REWRITE_TAC[]);
6183
6184  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6185  (EXISTS_TAC `(X:real^3->bool)`);
6186  (STRIP_TAC);
6187  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6188    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6189  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6190  (EXPAND_TAC "m");
6191  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6192  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6193  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6194  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6195  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6196  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6197  (REWRITE_TAC[coplanar]);
6198  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6199    EXISTS_TAC `m:real^3`);
6200  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6201  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6202  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6203
6204  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
6205    THEN EXISTS_TAC `t4 / (t3 + t4)`);
6206  (REPEAT STRIP_TAC);
6207  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
6208                           (t3 + t4) / (t3 + t4)`]);
6209  (MATCH_MP_TAC REAL_DIV_REFL);
6210  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6211  (ASM_REWRITE_TAC[VECTOR_ARITH 
6212    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
6213     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
6214  (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH 
6215    `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 = 
6216     (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6217  (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % m) = u0 <=> 
6218                  t1 % u0 + t3 % u2 + t4 % m = (t1 + t3 + t4) % u0:real^3`);
6219  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6220  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
6221  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN 
6222    REAL_ARITH_TAC);
6223
6224  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
6225    <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
6226  (STRIP_TAC THEN ASM_REWRITE_TAC[]);
6227  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6228  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6229  (MATCH_MP_TAC REAL_DIV_REFL);
6230  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6231  (VECTOR_ARITH_TAC);
6232  (SET_TAC[]);
6233
6234  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
6235  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
6236  (REWRITE_TAC[VECTOR_ARITH 
6237   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
6238    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6239  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6240  (MATCH_MP_TAC REAL_DIV_REFL);
6241  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6242    REAL_ARITH_TAC);
6243  (VECTOR_ARITH_TAC);
6244  (ABBREV_TAC `t = t1 + t3 + t4`);
6245  (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 = 
6246                 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
6247  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6248  (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
6249  (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
6250  (REWRITE_TAC[VECTOR_ARITH 
6251   `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
6252  (ABBREV_TAC `x1 = u1 - u0:real^3`);
6253  (ABBREV_TAC `x2 = w - u0:real^3`);
6254
6255  (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 = 
6256    t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
6257  (REWRITE_TAC[NORM_POW_2]);
6258  (VECTOR_ARITH_TAC);
6259
6260  (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <= 
6261              t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
6262  (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
6263    t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
6264  (MATCH_MP_TAC REAL_LE_MUL);
6265  (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
6266  (MATCH_MP_TAC REAL_LE_MUL);
6267  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
6268  (STRIP_TAC);
6269  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6270  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
6271
6272  (NEW_GOAL 
6273  `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)`);
6274
6275  (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
6276  x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
6277  (MATCH_MP_TAC REAL_LE_MUL);
6278  (STRIP_TAC);
6279  (MATCH_MP_TAC REAL_LE_MUL);
6280  (REWRITE_TAC[NORM_POS_LE]);
6281  (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
6282  (NEW_GOAL `F`);
6283  (NEW_GOAL `(g:real^3->real) x <= &0`);
6284  (EXPAND_TAC "g");
6285  (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
6286  (MATCH_MP_TAC REAL_LE_DIV);
6287  (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
6288
6289  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
6290  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
6291  (REWRITE_TAC[VECTOR_ARITH 
6292   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
6293    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6294  (EXPAND_TAC "t");
6295  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6296  (MATCH_MP_TAC REAL_DIV_REFL);
6297  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6298    REAL_ARITH_TAC);
6299  (VECTOR_ARITH_TAC);
6300
6301  (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
6302  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 = 
6303                  (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
6304  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6305  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 = 
6306    t2 % x1 + t % x2:real^3`);
6307  (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
6308    THEN VECTOR_ARITH_TAC);
6309  (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
6310  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
6311  (MATCH_MP_TAC REAL_LE_MUL);
6312  (STRIP_TAC);
6313  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6314    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6315  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6316  (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
6317  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
6318  (MATCH_MP_TAC REAL_LE_MUL);
6319  (STRIP_TAC);
6320  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6321    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6322  (REWRITE_TAC[DOT_POS_LE]);
6323  (REWRITE_TAC[DOT_LADD]);
6324  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6325  (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);
6326  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);
6327  (REAL_ARITH_TAC);
6328  (UP_ASM_TAC THEN MESON_TAC[]);
6329  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6330
6331  (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
6332  (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
6333  (AP_THM_TAC THEN AP_TERM_TAC);
6334  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6335  (REWRITE_TAC[REAL_ABS_REFL]);
6336  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6337    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6338  (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
6339  (AP_THM_TAC THEN AP_TERM_TAC);
6340  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6341  (REWRITE_TAC[REAL_ABS_REFL]);
6342  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6343  (REWRITE_TAC[GSYM NORM_MUL]);
6344  (REWRITE_WITH 
6345   `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
6346  (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
6347  (REWRITE_TAC[NORM_TRIANGLE]);
6348  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6349  (UNDISCH_TAC `(g:real^3->real) y <= g xx`);
6350  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6351
6352  (NEW_GOAL `(g:real^3->real) xx <= d1`);
6353  (FIRST_ASSUM MATCH_MP_TAC);
6354  (EXPAND_TAC "P3");
6355  (EXPAND_TAC "g" THEN EXPAND_TAC "f3");
6356  (REWRITE_TAC[IN_ELIM_THM; IN]);
6357  (EXISTS_TAC `vl:(real^3)list`);
6358  (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`; 
6359                TRUNCATE_SIMPLEX_EXPLICIT_1]);
6360  (STRIP_TAC);
6361  (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6362  (REWRITE_WITH `mcell 3 V vl = mcell k V vl`);
6363  (ASM_SIMP_TAC[]);
6364  (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);
6365  (STRIP_TAC);
6366
6367  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6368  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6369  (EXISTS_TAC `X INTER (C:real^3->bool)`);
6370  (STRIP_TAC);
6371  (ASM_REWRITE_TAC[]);
6372  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
6373  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
6374  (MATCH_MP_TAC (SET_RULE 
6375   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
6376  (STRIP_TAC);
6377  (MATCH_MP_TAC SUBSET_BALL);
6378  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
6379  (MATCH_MP_TAC RCONE_GT_SUBSET);
6380  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
6381
6382
6383  (EXPAND_TAC "xx");
6384  (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
6385  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6386  (EXPAND_TAC "m");
6387  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6388
6389  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");
6390  (REAL_ARITH_TAC);
6391
6392  (NEW_GOAL `F`);
6393  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6394  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6395  (EXISTS_TAC `(X:real^3->bool)`);
6396  (STRIP_TAC);
6397  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6398                set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6399  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6400  (SET_TAC[]);
6401  (UP_ASM_TAC THEN MESON_TAC[]);
6402
6403 (* ========================================================================= *)
6404
6405  (ABBREV_TAC `m = mxi V vl`);
6406  (NEW_GOAL `~coplanar {u0, u1, u2, m:real^3}`);
6407  (STRIP_TAC);
6408  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6409  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6410  (EXISTS_TAC `X:real^3->bool`);
6411  (STRIP_TAC);
6412  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6413  (COND_CASES_TAC);
6414  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6415    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6416  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6417  (EXPAND_TAC "m");
6418  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6419
6420  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6421  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6422  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6423  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6424  (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6425  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6426  (SET_TAC[]);
6427
6428  (ASM_CASES_TAC `azim u0 u1 u2 (m:real^3) < pi`);
6429  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 m)`);
6430  (ASM_SIMP_TAC[WEDGE_LUNE]);
6431  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
6432                  conic_cap u0 u1 r d INTER L`);
6433  (SET_TAC[]);
6434  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
6435  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
6436    aff_gt {u0, u1} {u2, m} DIFF conic_cap u0 u1 r d INTER L = {}`);
6437  (EXPAND_TAC "L");
6438  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
6439  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
6440  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
6441  (EXPAND_TAC "L");
6442
6443  (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, m} =
6444                  aff_gt {u0, u1} {u2, m} UNION 
6445    UNIONS {aff_ge {u0, u1} ({u2, m} DELETE a) | a | a IN  {u2, m}}`);
6446  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
6447  (REWRITE_TAC[Geomdetail.FINITE6]);
6448  (REWRITE_TAC[DISJOINT]);
6449
6450  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6451  (NEW_GOAL `F`);
6452  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6453  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
6454  (UP_ASM_TAC THEN SET_TAC[]);
6455  (REWRITE_TAC[COPLANAR_3]);
6456  (UP_ASM_TAC THEN MESON_TAC[]);
6457
6458  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6459  (NEW_GOAL `F`);
6460  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6461  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
6462  (UP_ASM_TAC THEN SET_TAC[]); 
6463  (REWRITE_TAC[COPLANAR_3]);
6464  (UP_ASM_TAC THEN MESON_TAC[]);
6465  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6466
6467  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6468  (EXISTS_TAC 
6469   `UNIONS {aff_ge {u0, u1:real^3} ({u2, m} DELETE a) | a | a IN {u2, m}}`);
6470  (STRIP_TAC);
6471  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6472  (EXISTS_TAC 
6473   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);
6474  (STRIP_TAC);
6475  (MATCH_MP_TAC NEGLIGIBLE_UNION);
6476  (STRIP_TAC);
6477
6478  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6479  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
6480  (STRIP_TAC);
6481  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6482  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
6483  (SET_TAC[]);
6484  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6485  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6486  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
6487  (STRIP_TAC);
6488  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6489  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
6490  (SET_TAC[]);
6491  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6492  (REWRITE_TAC[SET_RULE 
6493   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
6494          aff_ge {u0, u1} ({m, s3} DELETE s3) 
6495    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
6496  (MATCH_MP_TAC (SET_RULE 
6497   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
6498  (STRIP_TAC);
6499  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6500  (STRIP_TAC);
6501  (SET_TAC[]);
6502
6503  (REWRITE_TAC[DISJOINT]);
6504  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6505  (NEW_GOAL `F`);
6506  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6507  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
6508  (UP_ASM_TAC THEN SET_TAC[]);
6509  (REWRITE_TAC[COPLANAR_3]);
6510  (UP_ASM_TAC THEN MESON_TAC[]);
6511  (UP_ASM_TAC THEN SET_TAC[]);
6512
6513  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6514  (STRIP_TAC);
6515  (SET_TAC[]);
6516  (REWRITE_TAC[DISJOINT]);
6517  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6518  (NEW_GOAL `F`);
6519  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6520  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
6521  (UP_ASM_TAC THEN SET_TAC[]);
6522  (REWRITE_TAC[COPLANAR_3]);
6523  (UP_ASM_TAC THEN MESON_TAC[]);
6524  (UP_ASM_TAC THEN SET_TAC[]);
6525
6526  (SET_TAC[]);
6527
6528 (* begin the computation *)
6529
6530  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
6531  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 m) =
6532              (if &1 < d \/ r < &0
6533               then &0
6534               else azim u0 u1 u2 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);
6535  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);
6536  (STRIP_TAC);
6537  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6538  (EXISTS_TAC `m:real^3`);
6539  (ASM_REWRITE_TAC[]);
6540  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6541  (EXISTS_TAC `u2:real^3`);
6542  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6543  (ASM_REWRITE_TAC[]);
6544  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
6545
6546  (COND_CASES_TAC);
6547  (NEW_GOAL `F`);
6548  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
6549    UP_ASM_TAC THEN REAL_ARITH_TAC);
6550  (UP_ASM_TAC THEN MESON_TAC[]);
6551
6552  (REWRITE_WITH `azim (u0:real^3) u1 u2 m = dihV u0 u1 u2 m`);
6553  (MATCH_MP_TAC AZIM_DIHV_SAME);
6554  (ASM_REWRITE_TAC[]);
6555  (STRIP_TAC);
6556  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6557  (EXISTS_TAC `m:real^3`);
6558  (ASM_REWRITE_TAC[]);
6559  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6560  (EXISTS_TAC `u2:real^3`);
6561  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6562  (ASM_REWRITE_TAC[]);
6563
6564  (REWRITE_TAC[dihX]);
6565  (COND_CASES_TAC);
6566  (NEW_GOAL `F`);
6567  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6568  (REWRITE_TAC[]);
6569  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6570  (EXISTS_TAC `X:real^3->bool`);
6571  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
6572  (UP_ASM_TAC THEN MESON_TAC[]);
6573
6574  (LET_TAC);
6575
6576  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
6577  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
6578            ul IN barV V 3 /\
6579            X = mcell k V ul /\
6580            initial_sublist [u0; u1] ul)`);
6581  (STRIP_TAC);
6582  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
6583  (MATCH_MP_TAC SELECT_AX);
6584  (EXISTS_TAC `(3, vl:(real^3)list)`);
6585  (EXPAND_TAC "P");
6586  (REWRITE_TAC[BETA_THM]);
6587  (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);
6588  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
6589                  LENGTH [u0;u1] = 1 + 1`);
6590  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6591  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6592  (ASM_REWRITE_TAC[]);
6593  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6594  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
6595  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
6596
6597  (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);
6598  (MATCH_MP_TAC Ajripqn.AJRIPQN);
6599  (ASM_REWRITE_TAC[]);
6600  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6601  (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);
6602  (REWRITE_WITH `mcell 3 V vl = X`);
6603  (ASM_SIMP_TAC[]);
6604  (SET_TAC[ASSUME `X = mcell k' V ul`]);
6605
6606  (REPEAT STRIP_TAC);
6607  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
6608    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
6609  (SET_TAC[]);
6610  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
6611
6612  (COND_CASES_TAC);
6613  (NEW_GOAL `F`);
6614  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
6615  (UP_ASM_TAC THEN MESON_TAC[]);
6616  (COND_CASES_TAC);
6617
6618  (REWRITE_TAC[dihu3]);
6619
6620  (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) = 
6621    dihV u0 u1 u2 (m:real^3)`);
6622
6623  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
6624  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6625  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6626
6627  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
6628  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6629  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6630  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6631                  CARD (set_of_list ul) = 3 + 1`);
6632  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6633  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6634  (ARITH_TAC);
6635
6636  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
6637  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6638  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6639  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6640                  CARD (set_of_list ul) = 3 + 1`);
6641  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6642  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6643  (ARITH_TAC);
6644
6645  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);
6646  (REWRITE_WITH `
6647     {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
6648     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = 
6649     convex hull {u0, u1,u2,m:real^3}`);
6650  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6651  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
6652  (REPEAT STRIP_TAC);
6653
6654  (UNDISCH_TAC `~NULLSET X`);
6655  (REWRITE_TAC[]);
6656  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6657  (COND_CASES_TAC);
6658  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
6659  (MATCH_MP_TAC BARV_3_EXPLICIT);
6660  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6661  (UP_ASM_TAC THEN STRIP_TAC);
6662  (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6663                    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6664  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6665  (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
6666  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6667  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6668  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6669  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6670  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6671  (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);
6672  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
6673                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
6674
6675  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6676
6677  (UNDISCH_TAC `~NULLSET X`);
6678  (REWRITE_TAC[]);
6679  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
6680    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6681  (COND_CASES_TAC);
6682  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6683  (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);
6684  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6685  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6686  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6687  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6688  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6689  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6690  (EXPAND_TAC "m");
6691  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6692  (ASM_REWRITE_TAC[]);
6693
6694  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6695
6696  (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);
6697  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6698  (COND_CASES_TAC);
6699  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6700    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6701  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6702  (EXPAND_TAC "m");
6703  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6704
6705  (NEW_GOAL `F`);
6706  (UNDISCH_TAC `~NULLSET X`);
6707  (REWRITE_TAC[]);
6708  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6709  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6710  (UP_ASM_TAC THEN MESON_TAC[]);
6711
6712  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6713  (COND_CASES_TAC);
6714  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
6715  (MATCH_MP_TAC BARV_3_EXPLICIT);
6716  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6717  (UP_ASM_TAC THEN STRIP_TAC);
6718  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
6719                TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6720                SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6721  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
6722  (NEW_GOAL `F`);
6723  (UNDISCH_TAC `~NULLSET X`);
6724  (REWRITE_TAC[]);
6725  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6726  (ASM_REWRITE_TAC[]);
6727  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6728  (UP_ASM_TAC THEN MESON_TAC[]);
6729
6730  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
6731
6732  (NEW_GOAL `mxi V ul = m`);
6733  (EXPAND_TAC "m");
6734  (MATCH_MP_TAC MCELL_ID_MXI);
6735  (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
6736  (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);
6737  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
6738  (ASM_REWRITE_TAC[]);
6739  (ASM_REWRITE_TAC[HD]);
6740  (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);
6741  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6742  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
6743  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6744                  CARD (set_of_list ul) = 3 + 1`);
6745  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6746  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6747  (ARITH_TAC);
6748  (ASM_REWRITE_TAC[HD]);
6749  (ASM_REWRITE_TAC[]);
6750
6751  (STRIP_TAC);
6752  (NEW_GOAL `EL 2 ul = u2:real^3`);
6753  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
6754  (STRIP_TAC);
6755  (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);
6756  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6757  (UNDISCH_TAC `~coplanar {u0,u1,u2,m:real^3}` THEN REWRITE_TAC[
6758    GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
6759    ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);
6760  (ASM_REWRITE_TAC[]);
6761
6762  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
6763  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
6764  (AP_THM_TAC THEN AP_TERM_TAC);
6765
6766  (REWRITE_WITH 
6767   `measurable (conic_cap u0 u1 r d) /\
6768              vol (conic_cap u0 u1 r d) =
6769              (if u1 = u0 \/ &1 <= d \/ r < &0
6770               then &0
6771               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
6772  (MATCH_MP_TAC VOLUME_CONIC_CAP);
6773  (EXPAND_TAC "d");
6774  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
6775  (COND_CASES_TAC);
6776  (NEW_GOAL `F`);
6777  (UP_ASM_TAC THEN STRIP_TAC);
6778  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
6779  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6780  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6781  (UP_ASM_TAC THEN MESON_TAC[]);
6782  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
6783
6784  (REWRITE_WITH `max d (--(&1)) = d`);
6785  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
6786  (REWRITE_TAC[REAL_NEG_LT0]);
6787  (STRIP_TAC);
6788  (EXPAND_TAC "d");
6789  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
6790  (REAL_ARITH_TAC);
6791
6792  (REWRITE_WITH `
6793   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
6794   ((&2 * pi) / (&2 * pi))`);
6795  (REAL_ARITH_TAC);
6796  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
6797  (MATCH_MP_TAC REAL_DIV_REFL);
6798  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
6799  (REAL_ARITH_TAC);
6800  (NEW_GOAL `F`);
6801  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
6802    THEN MESON_TAC[]);
6803  (UP_ASM_TAC THEN MESON_TAC[]);
6804
6805 (* ========================================================================= *)
6806
6807  (ASM_CASES_TAC `azim u0 u1 m (u2:real^3) < pi`);
6808  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6809  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6810  (STRIP_TAC);
6811  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m u2)`);
6812  (ASM_SIMP_TAC[WEDGE_LUNE]);
6813  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
6814                  conic_cap u0 u1 r d INTER L`);
6815  (SET_TAC[]);
6816  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
6817
6818  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
6819    aff_gt {u0, u1} {m, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);
6820  (EXPAND_TAC "L");
6821  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
6822  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
6823  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
6824  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
6825  (EXPAND_TAC "L");
6826  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
6827
6828  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, u2} =
6829                  aff_gt {u0, u1} {m, u2} UNION 
6830    UNIONS {aff_ge {u0, u1} ({m, u2} DELETE a) | a | a IN  {m, u2}}`);
6831  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
6832  (REWRITE_TAC[Geomdetail.FINITE6]);
6833  (REWRITE_TAC[DISJOINT]);
6834
6835  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6836  (NEW_GOAL `F`);
6837  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
6838  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);
6839  (UP_ASM_TAC THEN SET_TAC[]);
6840  (REWRITE_TAC[COPLANAR_3]);
6841  (UP_ASM_TAC THEN MESON_TAC[]);
6842
6843  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6844  (NEW_GOAL `F`);
6845  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
6846  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);
6847  (UP_ASM_TAC THEN SET_TAC[]);
6848  (REWRITE_TAC[COPLANAR_3]);
6849  (UP_ASM_TAC THEN MESON_TAC[]);
6850  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6851
6852  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6853  (EXISTS_TAC 
6854   `UNIONS {aff_ge {u0, u1:real^3} ({m, u2} DELETE a) | a | a IN {m, u2}}`);
6855  (STRIP_TAC);
6856  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6857  (EXISTS_TAC 
6858   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);
6859  (STRIP_TAC);
6860  (MATCH_MP_TAC NEGLIGIBLE_UNION);
6861  (STRIP_TAC);
6862
6863  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6864  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
6865  (STRIP_TAC);
6866  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6867  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
6868  (SET_TAC[]);
6869  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6870  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6871  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
6872  (STRIP_TAC);
6873  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6874  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
6875  (SET_TAC[]);
6876  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6877  (REWRITE_TAC[SET_RULE 
6878   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
6879          aff_ge {u0, u1} ({m, s3} DELETE s3) 
6880    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
6881  (MATCH_MP_TAC (SET_RULE 
6882   `A SUBSET D /\ C SUBSET B ==> A UNION C SUBSET B UNION D`));
6883  (STRIP_TAC);
6884  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6885  (STRIP_TAC);
6886  (SET_TAC[]);
6887
6888  (REWRITE_TAC[DISJOINT]);
6889  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6890  (NEW_GOAL `F`);
6891  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
6892  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);
6893  (UP_ASM_TAC THEN SET_TAC[]);
6894  (REWRITE_TAC[COPLANAR_3]);
6895  (UP_ASM_TAC THEN MESON_TAC[]);
6896  (UP_ASM_TAC THEN SET_TAC[]);
6897
6898  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6899  (STRIP_TAC);
6900  (SET_TAC[]);
6901  (REWRITE_TAC[DISJOINT]);
6902  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6903  (NEW_GOAL `F`);
6904  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
6905  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);
6906  (UP_ASM_TAC THEN SET_TAC[]);
6907  (REWRITE_TAC[COPLANAR_3]);
6908  (UP_ASM_TAC THEN MESON_TAC[]);
6909  (UP_ASM_TAC THEN SET_TAC[]);
6910
6911  (SET_TAC[]);
6912
6913  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
6914  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m u2) =
6915              (if &1 < d \/ r < &0
6916               then &0
6917               else azim u0 u1 m u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
6918  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);
6919  (STRIP_TAC);
6920  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6921  (EXISTS_TAC `m:real^3`);
6922  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6923  (ASM_REWRITE_TAC[]);
6924  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6925  (EXISTS_TAC `u2:real^3`);
6926  (ASM_REWRITE_TAC[]);
6927
6928  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
6929  (COND_CASES_TAC);
6930  (NEW_GOAL `F`);
6931
6932  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
6933    UP_ASM_TAC THEN REAL_ARITH_TAC);
6934  (UP_ASM_TAC THEN MESON_TAC[]);
6935
6936  (REWRITE_WITH `azim (u0:real^3) u1 m u2 = dihV u0 u1 m u2`);
6937  (MATCH_MP_TAC AZIM_DIHV_SAME);
6938  (ASM_REWRITE_TAC[]);
6939  (STRIP_TAC);
6940
6941  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6942  (EXISTS_TAC `u2:real^3`);
6943  (ASM_REWRITE_TAC[]);
6944  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6945  (EXISTS_TAC `m:real^3`);
6946  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6947  (ASM_REWRITE_TAC[]);
6948
6949  (REWRITE_TAC[dihX]);
6950  (COND_CASES_TAC);
6951  (NEW_GOAL `F`);
6952  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6953  (REWRITE_TAC[]);
6954  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6955  (EXISTS_TAC `X:real^3->bool`);
6956  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
6957  (UP_ASM_TAC THEN MESON_TAC[]);
6958
6959  (LET_TAC);
6960
6961  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
6962  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
6963            ul IN barV V 3 /\
6964            X = mcell k V ul /\
6965            initial_sublist [u0; u1] ul)`);
6966  (STRIP_TAC);
6967  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
6968  (MATCH_MP_TAC SELECT_AX);
6969  (EXISTS_TAC `(3, vl:(real^3)list)`);
6970  (EXPAND_TAC "P");
6971  (REWRITE_TAC[BETA_THM]);
6972  (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);
6973
6974  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
6975                  LENGTH [u0;u1] = 1 + 1`);
6976  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6977  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6978  (ASM_REWRITE_TAC[]);
6979  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6980  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
6981  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
6982
6983  (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);
6984  (MATCH_MP_TAC Ajripqn.AJRIPQN);
6985  (ASM_REWRITE_TAC[]);
6986  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6987  (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);
6988  (REWRITE_WITH `mcell 3 V vl = X`);
6989  (ASM_SIMP_TAC[]);
6990  (SET_TAC[ASSUME `X = mcell k' V ul`]);
6991
6992  (REPEAT STRIP_TAC);
6993  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
6994    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
6995  (SET_TAC[]);
6996  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
6997
6998  (COND_CASES_TAC);
6999  (NEW_GOAL `F`);
7000  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
7001  (UP_ASM_TAC THEN MESON_TAC[]);
7002  (COND_CASES_TAC);
7003
7004  (REWRITE_TAC[dihu3]);
7005
7006  (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) = 
7007    dihV u0 u1 u2 (m:real^3)`);
7008
7009  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
7010  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
7011  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
7012
7013  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
7014  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7015  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
7016  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7017                  CARD (set_of_list ul) = 3 + 1`);
7018  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7019  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7020  (ARITH_TAC);
7021
7022  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
7023  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7024  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
7025  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7026                  CARD (set_of_list ul) = 3 + 1`);
7027  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7028  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7029  (ARITH_TAC);
7030
7031  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);
7032  (REWRITE_WITH `
7033     {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
7034     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = 
7035     convex hull {u0, u1,u2,m:real^3}`);
7036  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7037  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
7038  (REPEAT STRIP_TAC);
7039
7040  (UNDISCH_TAC `~NULLSET X`);
7041  (REWRITE_TAC[]);
7042  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7043  (COND_CASES_TAC);
7044  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
7045  (MATCH_MP_TAC BARV_3_EXPLICIT);
7046  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7047  (UP_ASM_TAC THEN STRIP_TAC);
7048  (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2; 
7049                    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7050  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7051  (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
7052  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7053  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7054  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7055  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
7056  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
7057  (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);
7058  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
7059                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
7060
7061  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7062
7063  (UNDISCH_TAC `~NULLSET X`);
7064  (REWRITE_TAC[]);
7065  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7066    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7067  (COND_CASES_TAC);
7068  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7069  (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);
7070  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7071  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7072  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7073  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
7074  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
7075  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
7076  (EXPAND_TAC "m");
7077  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
7078  (ASM_REWRITE_TAC[]);
7079
7080  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7081
7082  (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);
7083  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
7084  (COND_CASES_TAC);
7085  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7086    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7087  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
7088  (EXPAND_TAC "m");
7089  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
7090
7091  (NEW_GOAL `F`);
7092  (UNDISCH_TAC `~NULLSET X`);
7093  (REWRITE_TAC[]);
7094  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
7095  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7096  (UP_ASM_TAC THEN MESON_TAC[]);
7097
7098  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7099  (COND_CASES_TAC);
7100  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
7101  (MATCH_MP_TAC BARV_3_EXPLICIT);
7102  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7103  (UP_ASM_TAC THEN STRIP_TAC);
7104  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
7105                TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7106                SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7107  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
7108  (NEW_GOAL `F`);
7109  (UNDISCH_TAC `~NULLSET X`);
7110  (REWRITE_TAC[]);
7111  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7112  (ASM_REWRITE_TAC[]);
7113  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7114  (UP_ASM_TAC THEN MESON_TAC[]);
7115
7116  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
7117
7118  (NEW_GOAL `mxi V ul = m`);
7119  (EXPAND_TAC "m");
7120  (MATCH_MP_TAC MCELL_ID_MXI);
7121  (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
7122  (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);
7123  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
7124  (ASM_REWRITE_TAC[]);
7125  (ASM_REWRITE_TAC[HD]);
7126  (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);
7127  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7128  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
7129  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7130                  CARD (set_of_list ul) = 3 + 1`);
7131  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7132  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7133  (ARITH_TAC);
7134  (ASM_REWRITE_TAC[HD]);
7135  (ASM_REWRITE_TAC[]);
7136
7137  (STRIP_TAC);
7138  (NEW_GOAL `EL 2 ul = u2:real^3`);
7139  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
7140  (STRIP_TAC);
7141  (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);
7142  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7143  (UNDISCH_TAC `~coplanar {u0,u1,m,u2:real^3}`);
7144  (REWRITE_TAC[]);
7145  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
7146  (REWRITE_TAC[GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
7147               ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);
7148  (ASM_REWRITE_TAC[]);
7149  (REWRITE_TAC[DIHV_SYM_2]);
7150
7151  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
7152  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
7153  (AP_THM_TAC THEN AP_TERM_TAC);
7154
7155  (REWRITE_WITH 
7156   `measurable (conic_cap u0 u1 r d) /\
7157              vol (conic_cap u0 u1 r d) =
7158              (if u1 = u0 \/ &1 <= d \/ r < &0
7159               then &0
7160               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
7161  (MATCH_MP_TAC VOLUME_CONIC_CAP);
7162  (EXPAND_TAC "d");
7163  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7164  (COND_CASES_TAC);
7165  (NEW_GOAL `F`);
7166  (UP_ASM_TAC THEN STRIP_TAC);
7167  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
7168  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7169  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7170  (UP_ASM_TAC THEN MESON_TAC[]);
7171  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
7172
7173  (REWRITE_WITH `max d (--(&1)) = d`);
7174  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
7175  (REWRITE_TAC[REAL_NEG_LT0]);
7176  (STRIP_TAC);
7177  (EXPAND_TAC "d");
7178  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7179  (REAL_ARITH_TAC);
7180
7181  (REWRITE_WITH `
7182   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
7183   ((&2 * pi) / (&2 * pi))`);
7184  (REAL_ARITH_TAC);
7185  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
7186  (MATCH_MP_TAC REAL_DIV_REFL);
7187  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
7188  (REAL_ARITH_TAC);
7189  (NEW_GOAL `F`);
7190  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
7191    THEN MESON_TAC[]);
7192  (UP_ASM_TAC THEN MESON_TAC[]);
7193
7194 (* ========================================================================= *)
7195
7196  (NEW_GOAL `F`);
7197  (NEW_GOAL `azim (u0:real^3) u1 m u2 = 
7198   (if azim u0 u1 u2 m = &0 then &0 else &2 * pi - azim u0 u1 u2 m)`);
7199  (MATCH_MP_TAC AZIM_COMPL);
7200  (STRIP_TAC);
7201
7202  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7203  (EXISTS_TAC `m:real^3`);
7204  (ASM_REWRITE_TAC[]);
7205  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7206  (EXISTS_TAC `u2:real^3`);
7207  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
7208  (ASM_REWRITE_TAC[]);
7209  (UP_ASM_TAC THEN COND_CASES_TAC);
7210  (NEW_GOAL `F`);
7211  (NEW_GOAL `(&0 < pi)`);
7212  (REWRITE_TAC[PI_POS]);
7213  (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 m < pi)`);
7214  (ASM_REWRITE_TAC[]);
7215  (UP_ASM_TAC THEN MESON_TAC[]);
7216  (STRIP_TAC);
7217
7218  (NEW_GOAL `azim (u0:real^3) u1 u2 m = pi`);
7219  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7220  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
7221  (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
7222  (ASM_REWRITE_TAC[]);
7223  (UP_ASM_TAC THEN MESON_TAC[]);
7224
7225 (* ========================================================================= *)
7226 (* ========================================================================= *)
7227  (ABBREV_TAC `s = {X | mcell_set V X /\ edgeX V X e}`);
7228  (NEW_GOAL `sum s (\t. vol (t INTER D)) = vol (D)`);
7229  (ABBREV_TAC `f = (\t:real^3->bool. t INTER D)`);
7230  (REWRITE_WITH `(\t. vol (t INTER D)) = (\x:real^3->bool. vol (f x))`);
7231  (EXPAND_TAC "f");
7232  (REWRITE_TAC[]);
7233  (REWRITE_WITH `sum s (\x:real^3->bool. vol (f x)) = vol (UNIONS (IMAGE f s))`);
7234  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7235  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE);
7236  (REPEAT STRIP_TAC); 
7237
7238  (EXPAND_TAC "s");
7239  (MATCH_MP_TAC FINITE_EDGE_X2);
7240  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7241  (ASM_REWRITE_TAC[]);
7242
7243  (EXPAND_TAC "f");
7244  (MATCH_MP_TAC MEASURABLE_INTER);
7245  (STRIP_TAC);
7246  (UP_ASM_TAC THEN EXPAND_TAC "s");
7247  (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7248  (REPEAT STRIP_TAC);
7249  (ASM_SIMP_TAC[MEASURABLE_MCELL]);
7250  (ASM_REWRITE_TAC[MEASURABLE_CONIC_CAP]);
7251
7252  (EXPAND_TAC "f");
7253  (UNDISCH_TAC `(x:real^3->bool) IN s` THEN 
7254    UNDISCH_TAC `(y:real^3->bool) IN s` THEN EXPAND_TAC "s");
7255  (REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
7256  (REPEAT STRIP_TAC);
7257  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7258  (EXISTS_TAC `x INTER (y:real^3->bool)`);
7259  (ASM_REWRITE_TAC[SET_RULE `(x INTER D) INTER y INTER D SUBSET x INTER y`]);
7260  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
7261  (STRIP_TAC);
7262
7263  (NEW_GOAL `i' = i /\ mcell i' V ul' = mcell i V ul`);
7264  (MATCH_MP_TAC Ajripqn.AJRIPQN);
7265  (ASM_REWRITE_TAC[SET_RULE `i IN {0, 1, 2, 3, 4} <=>
7266                              i = 0 \/ i = 1 \/ i = 2 \/ i = 3 \/ i = 4`]);
7267  (UNDISCH_TAC `i <= 4` THEN UNDISCH_TAC `i' <= 4` THEN ARITH_TAC);
7268  (UNDISCH_TAC `~(x = y:real^3->bool)` THEN ASM_REWRITE_TAC[]);
7269
7270
7271  (EXPAND_TAC "s");
7272  (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
7273
7274 (* OK here *)
7275
7276
7277
7278  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
7279  (REWRITE_WITH 
7280    `UNIONS {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}
7281     DIFF D = {}`);
7282  (REWRITE_TAC[SET_RULE `A DIFF B = {} <=> A SUBSET B`]);
7283  (REWRITE_TAC[UNIONS_SUBSET; IN; IN_ELIM_THM]);
7284  (SET_TAC[]);
7285  (REWRITE_TAC[SET_RULE `{} UNION A = A`]);
7286
7287  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7288  (EXISTS_TAC `UNIONS {y | ?x. x IN {X | mcell_set V X /\ NULLSET (X INTER D) /\ 
7289             ~(X INTER D = {})} /\  y = x INTER D}`);
7290  (STRIP_TAC);
7291  (MATCH_MP_TAC NEGLIGIBLE_UNIONS);
7292  (STRIP_TAC);
7293  (REWRITE_WITH 
7294   `{y | ?x. x IN {X | mcell_set V X /\ NULLSET (X INTER D) /\ 
7295                 ~(X INTER D = {})} /\ 
7296             y = x INTER D} = 
7297    {y | ?x. x IN {X | mcell_set V X /\ NULLSET (X INTER D) /\ 
7298                 ~(X INTER D = {})} /\ 
7299             y = f x }`);
7300  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
7301  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
7302
7303 (* ========================================================================= *)
7304 (* ========================================================================= *)
7305 (* ========================================================================= *)
7306
7307  (MATCH_MP_TAC FINITE_SUBSET);
7308  (EXISTS_TAC `{X | X SUBSET ball (u0, &10) /\ mcell_set V X}`);
7309  (STRIP_TAC);
7310  (ASM_SIMP_TAC[FINITE_MCELL_SET_LEMMA_2]);
7311  (REWRITE_TAC[SUBSET; IN_BALL; IN; IN_ELIM_THM; mcell_set] THEN 
7312    REPEAT STRIP_TAC);
7313
7314  (NEW_GOAL `?v1:real^3. v1 IN x /\ v1 IN D`);
7315  (REWRITE_TAC[GSYM IN_INTER]);
7316  (UNDISCH_TAC `~(x:real^3->bool INTER D = {})` THEN SET_TAC[]);
7317  (UP_ASM_TAC THEN STRIP_TAC);
7318  (NEW_GOAL `dist (u0, x') <= dist (u0, v1:real^3) + dist (v1, x')`);
7319  (NORM_ARITH_TAC);
7320  (NEW_GOAL `dist (u0, v1:real^3) < &1`);
7321  (REWRITE_TAC[GSYM IN_BALL]);
7322  (NEW_GOAL `D SUBSET ball (u0:real^3, &1)`);
7323  (EXPAND_TAC "D");
7324  (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);
7325  (MATCH_MP_TAC SUBSET_BALL);
7326  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
7327  (UP_ASM_TAC THEN SET_TAC[]);
7328  (UP_ASM_TAC THEN UNDISCH_TAC `v1:real^3 IN D` THEN SET_TAC[]);
7329  (NEW_GOAL `dist (v1,x':real^3) < &8`);
7330  (REWRITE_TAC[GSYM IN_BALL]);
7331
7332  (NEW_GOAL `x SUBSET ball (v1:real^3, &8)`);
7333  (ASM_REWRITE_TAC[]);
7334  (MATCH_MP_TAC MCELL_SUBSET_BALL8);
7335  (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN ASM_REWRITE_TAC[]);
7336  (UNDISCH_TAC `(x:real^3->bool) x'` THEN UP_ASM_TAC THEN SET_TAC[]);
7337  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7338  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list`);
7339  (ASM_REWRITE_TAC[]);
7340
7341 (* ========================================================================= *)
7342
7343  (REWRITE_TAC[IN; IN_ELIM_THM]);
7344  (REPEAT STRIP_TAC);
7345  (REWRITE_TAC[ASSUME `t:real^3->bool = x INTER D`]);
7346  (ASM_REWRITE_TAC[]);
7347
7348  (REWRITE_TAC[SUBSET; IN_UNIONS]);
7349  (REPEAT STRIP_TAC);
7350
7351  (NEW_GOAL `?v:real^3. v IN V /\ x IN voronoi_closed V v`);
7352  (ASM_SIMP_TAC[TIWWFYQ]);
7353  (UP_ASM_TAC THEN STRIP_TAC);
7354  (UP_ASM_TAC THEN REWRITE_WITH 
7355    `x IN voronoi_closed V v <=>  (?vl. vl IN barV V 3 /\ x IN rogers V vl /\
7356                                        truncate_simplex 0 vl = [v])`);
7357  (ASM_SIMP_TAC[GLTVHUM]);
7358  (REWRITE_TAC[IN] THEN STRIP_TAC);
7359  (NEW_GOAL `?i. i <= 4 /\ x IN mcell i V vl`);
7360  (ASM_SIMP_TAC[IN;SLTSTLO1]);
7361  (UP_ASM_TAC THEN STRIP_TAC);
7362
7363  (ABBREV_TAC `X = mcell i V vl`);
7364  (NEW_GOAL `~NULLSET (X INTER D) ==> F`);
7365  (STRIP_TAC);
7366
7367  (NEW_GOAL `?k ul.
7368                    2 <= k /\
7369                    barV V 3 ul /\
7370                    X = mcell k V ul /\
7371                    truncate_simplex 1 ul = [u0; u1]`);
7372  (FIRST_ASSUM MATCH_MP_TAC);
7373  (STRIP_TAC);
7374  (REWRITE_TAC[mcell_set; IN_ELIM_THM; IN]);
7375  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7376  (ASM_REWRITE_TAC[]);
7377  (ASM_REWRITE_TAC[]);
7378  (UP_ASM_TAC THEN STRIP_TAC);
7379
7380  (MP_TAC (ASSUME `x IN
7381       D DIFF
7382       UNIONS
7383       {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}`));
7384  (REWRITE_TAC[IN_DIFF; MESON[] `~(A /\ ~B) <=> ~A \/ B`]);
7385  (DISJ2_TAC);
7386  (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);
7387  (EXISTS_TAC `X INTER (D:real^3->bool)`);
7388  (STRIP_TAC);
7389
7390  (EXISTS_TAC `(X:real^3->bool)`);
7391  (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM] THEN STRIP_TAC);
7392  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7393  (ASM_REWRITE_TAC[]);
7394
7395  (REWRITE_TAC[edgeX; IN_ELIM_THM]);
7396  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7397  (STRIP_TAC);
7398
7399  (NEW_GOAL `VX V X = V INTER X`);
7400  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7401  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `(if k < 4 then k else 4)`);
7402  (ASM_REWRITE_TAC[]);
7403  (STRIP_TAC);
7404  (COND_CASES_TAC);
7405  (MESON_TAC[]);
7406  (NEW_GOAL `k >= 4`);
7407  (UP_ASM_TAC THEN ARITH_TAC);
7408  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7409  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN ASM_REWRITE_TAC[]);
7410  (MESON_TAC[NEGLIGIBLE_SUBSET; SET_RULE `A INTER B SUBSET A`]);
7411
7412  (NEW_GOAL `(V:real^3->bool) INTER X = 
7413             set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7414  (REWRITE_WITH `X = mcell (if k < 4 then k else 4) V ul`);
7415  (ASM_REWRITE_TAC[]);
7416  (COND_CASES_TAC);
7417  (REFL_TAC);
7418  (NEW_GOAL `k >= 4`);
7419  (UP_ASM_TAC THEN ARITH_TAC);
7420  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7421
7422  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7423  (ASM_REWRITE_TAC[]);
7424  (STRIP_TAC);
7425  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7426  (STRIP_TAC);
7427  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7428  (REWRITE_WITH `mcell (if k < 4 then k else 4) V ul = X`);
7429  (ASM_REWRITE_TAC[]);
7430  (COND_CASES_TAC);
7431  (REFL_TAC);
7432  (NEW_GOAL `k >= 4`);
7433  (UP_ASM_TAC THEN ARITH_TAC);
7434  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7435  (STRIP_TAC);
7436  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN 
7437    REWRITE_TAC[ASSUME `X = {}:real^3->bool`; SET_RULE `{} INTER x = {}`;
7438    NEGLIGIBLE_EMPTY]);
7439  (ASM_REWRITE_TAC[]);
7440  (NEW_GOAL `set_of_list (truncate_simplex 1 (ul:(real^3)list)) SUBSET 
7441            set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7442  (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
7443  (REWRITE_WITH `LENGTH ul = 3 + 1 /\ 
7444                  CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
7445  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7446  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7447  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7448  (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`]);
7449
7450  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `truncate_simplex 1 ul = [u0; u1:real^3]`;
7451     set_of_list]);
7452  (SET_TAC[]);
7453  (ASM_REWRITE_TAC[]);
7454  (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`; IN_INTER]);
7455  (STRIP_TAC);
7456  (ASM_REWRITE_TAC[]);
7457  (UNDISCH_TAC `x IN
7458       D DIFF
7459       UNIONS
7460       {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}`);
7461  (SET_TAC[]);
7462  (UP_ASM_TAC THEN REWRITE_TAC[] THEN STRIP_TAC);
7463  (EXISTS_TAC `X INTER (D:real^3 ->bool)`);
7464  (STRIP_TAC);
7465  (REWRITE_TAC[IN_ELIM_THM]);
7466  (EXISTS_TAC `(X:real^3 ->bool)`);
7467  (STRIP_TAC);
7468  (STRIP_TAC);
7469
7470  (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7471  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7472  (ASM_REWRITE_TAC[]);
7473  (STRIP_TAC);
7474  (ASM_REWRITE_TAC[]);
7475
7476  (REWRITE_TAC[SET_RULE `~(a = {}) <=> (?x. x IN a)`]);
7477  (EXISTS_TAC `x:real^3`);
7478
7479  (REWRITE_TAC[IN_INTER]);
7480  (STRIP_TAC);
7481  (ASM_REWRITE_TAC[]);
7482  (UNDISCH_TAC `x IN
7483       D DIFF
7484       UNIONS
7485       {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}`);
7486  (SET_TAC[]);
7487  (REWRITE_TAC[]);
7488
7489  (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`; IN_INTER]);
7490  (STRIP_TAC);
7491  (ASM_REWRITE_TAC[]);
7492  (UNDISCH_TAC `x IN
7493       D DIFF
7494       UNIONS
7495       {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}`);
7496  (SET_TAC[]);
7497
7498 (* ========================================================================= *)
7499 (* ========================================================================= *)
7500 (* ========================================================================= *)
7501
7502  (UP_ASM_TAC);
7503  (ABBREV_TAC `t ={X | mcell_set V X /\ edgeX V X e /\ ~NULLSET (X INTER D)}`);
7504
7505  (REWRITE_WITH `sum s (\t. vol (t INTER D)) = 
7506                  sum t (\t. vol (t INTER D))`);
7507  (MATCH_MP_TAC SUM_SUPERSET);
7508  (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);
7509  (SET_TAC[]);
7510  (MATCH_MP_TAC MEASURE_EQ_0);
7511  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );
7512  (MESON_TAC[]);
7513
7514
7515  (REWRITE_WITH `sum s (\t. dihX V t (u0,u1)) = 
7516                  sum t (\t. dihX V t (u0,u1))`);
7517  (MATCH_MP_TAC SUM_SUPERSET);
7518  (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);
7519  (SET_TAC[]);
7520
7521  (NEW_GOAL `NULLSET (x INTER D)`);
7522  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );
7523  (MESON_TAC[]);
7524
7525  (NEW_GOAL `mcell_set V x /\ edgeX V x e`);
7526  (UNDISCH_TAC `x IN {X | mcell_set V X /\ edgeX V X e}`);
7527  (REWRITE_TAC[IN; IN_ELIM_THM]);
7528  (UP_ASM_TAC THEN REWRITE_TAC[mcell_set_2; IN_ELIM_THM;IN] THEN STRIP_TAC);
7529
7530  (NEW_GOAL `~NULLSET x`);
7531  (UP_ASM_TAC THEN REWRITE_TAC[edgeX; VX; IN_ELIM_THM]);
7532  (COND_CASES_TAC THEN REPEAT STRIP_TAC);
7533  (UNDISCH_TAC `{} (u:real^3)` THEN REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
7534  (SET_TAC[]);
7535
7536  (NEW_GOAL `VX V x = V INTER (x:real^3->bool)`);
7537  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7538  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7539  (ASM_REWRITE_TAC[]);
7540
7541  (NEW_GOAL `V INTER (x:real^3->bool) = 
7542              set_of_list (truncate_simplex (i - 1) ul)`);
7543  (ASM_REWRITE_TAC[]);
7544  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7545  (ASM_REWRITE_TAC[]);
7546  (STRIP_TAC);
7547  (ASM_CASES_TAC `i = 0`);
7548  (NEW_GOAL `V INTER (x:real^3->bool) = {}`);
7549  (ASM_REWRITE_TAC[]);
7550  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7551  (ASM_REWRITE_TAC[]);
7552  (NEW_GOAL `F`);
7553  (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM]);
7554  (STRIP_TAC);
7555  (UNDISCH_TAC `VX V x u` THEN ASM_REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
7556  (SET_TAC[]);
7557  (UP_ASM_TAC THEN MESON_TAC[]);
7558  (UP_ASM_TAC THEN ARITH_TAC);
7559  (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN STRIP_TAC);
7560  (UNDISCH_TAC `~NULLSET x` THEN REWRITE_TAC[ASSUME `x:real^3->bool = {}`;
7561    NEGLIGIBLE_EMPTY]);
7562
7563  (NEW_GOAL `(u0:real^3) IN VX V x /\ u1 IN VX V x`);
7564  (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM; 
7565    ASSUME `e = {u0, u1:real^3}`]);
7566  (STRIP_TAC);
7567  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7568
7569 (* ========================================================================== *)
7570  (NEW_GOAL `F`);
7571
7572  (ASM_CASES_TAC `i <= 1`);
7573  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7574  (MATCH_MP_TAC BARV_3_EXPLICIT);
7575  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7576  (UP_ASM_TAC THEN STRIP_TAC);
7577  (NEW_GOAL `i - 1 = 0`);
7578  (UNDISCH_TAC `i <= 1` THEN ARITH_TAC);
7579  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7580  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0; set_of_list]);
7581  (UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7582
7583  (ASM_CASES_TAC `i = 3`);
7584  (NEW_GOAL `vol (x INTER D) > &0`);
7585  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7586  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7587  (MATCH_MP_TAC BARV_3_EXPLICIT);
7588  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7589  (UP_ASM_TAC THEN STRIP_TAC);
7590  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; TRUNCATE_SIMPLEX_EXPLICIT_2; 
7591    set_of_list; SET_RULE `{a,c,d} UNION {x} = {a,c,d,x}`]);
7592  (COND_CASES_TAC);
7593  (NEW_GOAL `i - 1 = 2`);
7594  (UNDISCH_TAC `i = 3` THEN ARITH_TAC);
7595  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7596  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
7597  (STRIP_TAC);
7598  (NEW_GOAL `?v:real^3. {u0, u1, v} = {v0, v1, v2}`);
7599  (NEW_GOAL `?v:real^3. v IN {v0, v1, v2} DIFF {u0, u1}`);
7600  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7601  (REWRITE_WITH `{v0, v1, v2} DIFF {u0, u1:real^3} = {} <=> 
7602                   CARD ({v0, v1, v2} DIFF {u0, u1}) = 0`);
7603  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7604  (MATCH_MP_TAC CARD_EQ_0);
7605  (MATCH_MP_TAC FINITE_SUBSET);
7606  (EXISTS_TAC `{v0, v1, v2:real^3}`);
7607  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7608  (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7609
7610  (NEW_GOAL `CARD {v0, v1, v2} = CARD ({v0, v1, v2} DIFF {u0, u1:real^3}) +
7611                                  CARD {u0, u1}`);
7612  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
7613  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7614  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2:real^3}) = 3`);
7615  (REWRITE_WITH `{v0, v1, v2:real^3} = set_of_list (truncate_simplex 2 ul)`);
7616  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
7617  (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
7618  (REWRITE_WITH `LENGTH (xl:(real^3)list) = 2 + 1 /\ 
7619                  CARD (set_of_list xl) = 2 + 1`);
7620  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7621  (EXISTS_TAC `V:real^3->bool` THEN STRIP_TAC);
7622  (ASM_REWRITE_TAC[]);
7623  (EXPAND_TAC "xl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
7624  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
7625  (ARITH_TAC);
7626
7627  (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);
7628  (REWRITE_TAC[Geomdetail.CARD2]);
7629  (UP_ASM_TAC THEN ARITH_TAC);
7630  (UP_ASM_TAC THEN STRIP_TAC);
7631  (EXISTS_TAC `v:real^3`);
7632  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
7633    UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7634  (UP_ASM_TAC THEN STRIP_TAC);
7635  (NEW_GOAL `{v0, v1, v2, mxi V [v0; v1; v2; v3]} = 
7636              {u0, u1, v, mxi V [v0; v1; v2; v3]}`);
7637  (UP_ASM_TAC THEN SET_TAC[]);
7638  (ASM_REWRITE_TAC[]);
7639  (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
7640  (ASM_REWRITE_TAC[]);
7641  (STRIP_TAC);
7642  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7643  (REWRITE_TAC[GSYM (ASSUME `{v0, v1, v2, mxi V [v0; v1; v2; v3]} =
7644                {u0, u1, v, mxi V [v0; v1; v2; v3]}`)] THEN STRIP_TAC);
7645  (UNDISCH_TAC `~NULLSET x`);
7646  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7647    TRUNCATE_SIMPLEX_EXPLICIT_2]);
7648  (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7649  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7650  (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
7651  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7652  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7653  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7654  (ASM_REWRITE_TAC[]);
7655
7656  (NEW_GOAL `F`);
7657  (UNDISCH_TAC `~NULLSET x`);
7658  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7659    TRUNCATE_SIMPLEX_EXPLICIT_2]);
7660  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7661  (UP_ASM_TAC THEN MESON_TAC[]);
7662
7663  (NEW_GOAL `vol (x INTER D) = &0`);
7664  (MATCH_MP_TAC MEASURE_EQ_0);
7665  (ASM_REWRITE_TAC[]);
7666  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7667
7668
7669 (* ========================================== *)
7670
7671  (ASM_CASES_TAC `i = 4`);
7672  (NEW_GOAL `vol (x INTER D) > &0`);
7673  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7674  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7675  (MATCH_MP_TAC BARV_3_EXPLICIT);
7676  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7677  (UP_ASM_TAC THEN STRIP_TAC);
7678  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`; 
7679    set_of_list]);
7680  (COND_CASES_TAC);
7681  (NEW_GOAL `i - 1 = 3`);
7682  (UNDISCH_TAC `i = 4` THEN ARITH_TAC);
7683  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7684  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; set_of_list]);
7685  (STRIP_TAC);
7686
7687  (NEW_GOAL `?v w:real^3. {u0, u1, v, w} = {v0, v1, v2, v3}`);
7688
7689  (NEW_GOAL `?v:real^3. v IN {v0, v1, v2, v3} DIFF {u0, u1}`);
7690  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7691  (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1:real^3} = {} <=> 
7692                   CARD ({v0, v1, v2, v3} DIFF {u0, u1}) = 0`);
7693  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7694  (MATCH_MP_TAC CARD_EQ_0);
7695  (MATCH_MP_TAC FINITE_SUBSET);
7696  (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);
7697  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7698  (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7699
7700  (NEW_GOAL `CARD {v0, v1, v2, v3} = 
7701              CARD ({v0, v1, v2, v3} DIFF {u0, u1:real^3}) + CARD {u0, u1}`);
7702  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
7703  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7704
7705  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);
7706  (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);
7707  (ASM_REWRITE_TAC[set_of_list]);
7708  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7709                  CARD (set_of_list ul) = 3 + 1`);
7710  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7711  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7712  (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);
7713  (REWRITE_TAC[Geomdetail.CARD2]);
7714  (UP_ASM_TAC THEN ARITH_TAC);
7715  (UP_ASM_TAC THEN STRIP_TAC);
7716
7717  (NEW_GOAL `?w:real^3. w IN {v0, v1, v2, v3} DIFF {u0, u1, v}`);
7718  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7719  (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1, v:real^3} = {} <=> 
7720                   CARD ({v0, v1, v2, v3} DIFF {u0, u1, v}) = 0`);
7721  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7722  (MATCH_MP_TAC CARD_EQ_0);
7723  (MATCH_MP_TAC FINITE_SUBSET);
7724  (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);
7725  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7726  (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7727
7728  (NEW_GOAL `CARD ({v0, v1, v2, v3} DIFF {u0, u1,v:real^3}) = 
7729              CARD {v0, v1, v2, v3} - CARD {u0,u1,v}`);
7730  (MATCH_MP_TAC CARD_DIFF);
7731  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7732  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7733  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);
7734  (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);
7735  (ASM_REWRITE_TAC[set_of_list]);
7736  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7737                  CARD (set_of_list ul) = 3 + 1`);
7738  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7739  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7740  (NEW_GOAL `CARD {u0, u1, v:real^3} <= 3`);
7741  (REWRITE_TAC[Geomdetail.CARD3]);
7742  (UP_ASM_TAC THEN ARITH_TAC);
7743  (UP_ASM_TAC THEN STRIP_TAC);
7744
7745  (EXISTS_TAC `v:real^3` THEN EXISTS_TAC `w:real^3`);
7746  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
7747    UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7748  (UP_ASM_TAC THEN STRIP_TAC);
7749  (REWRITE_TAC[GSYM (ASSUME `{u0:real^3, u1, v, w} = {v0, v1, v2, v3}`)]);
7750  (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
7751  (ASM_REWRITE_TAC[]);
7752  (STRIP_TAC);
7753  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7754  (STRIP_TAC);
7755  (UNDISCH_TAC `~NULLSET x`);
7756  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`; 
7757    ASSUME `x  = mcell i V ul`; ASSUME `i = 4`; 
7758    ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
7759  (COND_CASES_TAC);
7760  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7761  (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
7762  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7763  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7764  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7765  (ASM_REWRITE_TAC[]);
7766  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7767
7768  (NEW_GOAL `F`);
7769  (UNDISCH_TAC `~NULLSET x`);
7770  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`; 
7771    ASSUME `x  = mcell i V ul`; ASSUME `i = 4`; 
7772    ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
7773  (COND_CASES_TAC);
7774  (NEW_GOAL `F`);
7775  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7776  (UP_ASM_TAC THEN MESON_TAC[]);
7777  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7778  (UP_ASM_TAC THEN MESON_TAC[]);
7779
7780  (NEW_GOAL `vol (x INTER D) = &0`);
7781  (MATCH_MP_TAC MEASURE_EQ_0);
7782  (ASM_REWRITE_TAC[]);
7783  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7784
7785 (* ========================================== *)
7786
7787  (NEW_GOAL `i = 2`);
7788  (UNDISCH_TAC `i <= 4` THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC 
7789    THEN ARITH_TAC);
7790
7791
7792  (NEW_GOAL `vol (x INTER D) > &0`);
7793  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7794  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7795  (MATCH_MP_TAC BARV_3_EXPLICIT);
7796  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7797  (UP_ASM_TAC THEN STRIP_TAC);
7798  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; TRUNCATE_SIMPLEX_EXPLICIT_1; 
7799    set_of_list; HD; TL]);
7800  (LET_TAC);
7801  (COND_CASES_TAC);
7802
7803  (NEW_GOAL `i - 1 = 1`);
7804  (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
7805  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7806  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list]);
7807  (STRIP_TAC);
7808  (NEW_GOAL `{u0, u1} = {v0, v1:real^3}`);
7809  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN
7810    SET_TAC[]);
7811  (REWRITE_TAC[SET_RULE `A INTER B INTER C INTER D = 
7812                         (A INTER (B INTER C)) INTER D`]);
7813  (REWRITE_WITH `rcone_ge v0 v1 a' INTER rcone_ge v1 v0 a' = 
7814                  rcone_ge u0 u1 a' INTER rcone_ge u1 (u0:real^3) a'`);
7815  (ASM_CASES_TAC `u0:real^3 = v0`);
7816  (NEW_GOAL `u1 = v1:real^3`);
7817  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7818  (ASM_REWRITE_TAC[]);
7819  (NEW_GOAL `u0 = v1:real^3`);
7820  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7821  (NEW_GOAL `u1 = v0:real^3`);
7822  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7823  (ASM_REWRITE_TAC[]);
7824  (SET_TAC[]);
7825
7826  (REWRITE_WITH 
7827   `conic_cap u0 u1 r d INTER rcone_ge u0 u1 a' INTER rcone_ge u1 u0 a' =
7828    conic_cap (u0:real^3) u1 r d`);
7829  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER B = A`));
7830
7831  (NEW_GOAL `conic_cap (u0:real^3) u1 r d SUBSET rcone_ge u0 u1 a'`);
7832  (REWRITE_TAC[conic_cap]);
7833  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET B`));
7834  (NEW_GOAL `rcone_gt u0 u1 d SUBSET rcone_gt (u0:real^3) u1 a'`);
7835  (MATCH_MP_TAC RCONE_GT_SUBSET);
7836  (EXPAND_TAC "d" THEN EXPAND_TAC "c");
7837  (MATCH_MP_TAC (REAL_ARITH `a = x ==> a <= max (max y x) (max z t)`));
7838  (EXPAND_TAC "a'" THEN REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);
7839  (NEW_GOAL `rcone_gt u0 u1 a' SUBSET rcone_ge (u0:real^3) u1 a'`);
7840  (REWRITE_TAC[RCONE_GT_SUBSET_RCONE_GE]);
7841  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7842  (REWRITE_TAC[SUBSET_INTER] THEN STRIP_TAC);
7843  (ASM_REWRITE_TAC[]);
7844
7845  (REWRITE_TAC[SUBSET]);
7846  (REPEAT STRIP_TAC);
7847  (MATCH_MP_TAC Marchal_cells_2_new.RCONEGE_INTER_VORONOI_CLOSED_IMP_RCONEGE);
7848  (EXISTS_TAC `V:real^3->bool`);
7849  (ASM_REWRITE_TAC[]);
7850  (REPEAT STRIP_TAC);
7851
7852  (REWRITE_WITH `a' = hl [u0; u1:real^3] / sqrt (&2)`);
7853  (EXPAND_TAC "a'");
7854  (REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);
7855  (MATCH_MP_TAC REAL_LT_DIV);
7856  (REWRITE_TAC[HL_2]);
7857  (STRIP_TAC);
7858  (MATCH_MP_TAC REAL_LT_MUL);
7859  (REWRITE_TAC[REAL_ARITH `&0 < inv (&2)`]);
7860  (MATCH_MP_TAC DIST_POS_LT);
7861  (ASM_REWRITE_TAC[]);
7862  (MATCH_MP_TAC SQRT_POS_LT);
7863  (REAL_ARITH_TAC);
7864  (EXPAND_TAC "a'");
7865  (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);
7866  (STRIP_TAC);
7867  (MATCH_MP_TAC SQRT_POS_LT);
7868  (REAL_ARITH_TAC);
7869  (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));
7870  (ASM_REWRITE_TAC[]);
7871
7872  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7873  (NEW_GOAL `x':real^3 IN ball (u0, (&1))`);
7874  (UP_ASM_TAC THEN REWRITE_TAC[conic_cap;NORMBALL_BALL] THEN STRIP_TAC);
7875  (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);
7876  (MATCH_MP_TAC SUBSET_BALL);
7877  (EXPAND_TAC "r");
7878  (REAL_ARITH_TAC);
7879  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7880  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL] THEN ONCE_REWRITE_TAC[DIST_SYM] 
7881    THEN STRIP_TAC);
7882  (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
7883  (REPEAT STRIP_TAC);
7884  (ASM_CASES_TAC `u0 = w:real^3`);
7885  (ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
7886  (NEW_GOAL `&2 <= dist (u0, w:real^3)`);
7887  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
7888  (STRIP_TAC);
7889  (FIRST_ASSUM MATCH_MP_TAC);
7890  (ASM_REWRITE_TAC[]);
7891  (UNDISCH_TAC `u0:real^3 IN V` THEN REWRITE_TAC[IN]);
7892  (NEW_GOAL `dist (x', u0) >= dist (u0, w) - dist (x', w:real^3)`);
7893  (NORM_ARITH_TAC);
7894  (UP_ASM_TAC THEN UP_ASM_TAC THEN DEL_TAC THEN DEL_TAC THEN UP_ASM_TAC
7895    THEN REAL_ARITH_TAC);
7896  (ABBREV_TAC `M = mxi V [v0; v1; v2; v3]`);
7897  (ABBREV_TAC `R = omega_list_n V [v0; v1; v2; v3] 3`);
7898
7899  (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0:real^3,v1,M,R}) 
7900          <=  vol (conic_cap u0 u1 r d INTER aff_ge {v0, v1} {M, R})`);
7901  (MATCH_MP_TAC MEASURE_SUBSET);
7902  (REPEAT STRIP_TAC);
7903  (MATCH_MP_TAC MEASURABLE_INTER);
7904  (REWRITE_TAC[MEASURABLE_CONIC_CAP]);
7905  (MATCH_MP_TAC MEASURABLE_CONVEX_HULL);
7906  (MATCH_MP_TAC FINITE_IMP_BOUNDED);
7907  (REWRITE_TAC[Geomdetail.FINITE6]);
7908
7909  (REWRITE_TAC[conic_cap; NORMBALL_BALL]);
7910  (ONCE_REWRITE_TAC[SET_RULE `(a INTER b) INTER c = 
7911                               (a INTER b) INTER (a INTER c)`]);
7912  (MATCH_MP_TAC MEASURABLE_INTER);
7913  (REWRITE_TAC[MEASURABLE_BALL_AFF_GE]);
7914  (REWRITE_TAC[GSYM conic_cap; GSYM NORMBALL_BALL; MEASURABLE_CONIC_CAP]);
7915
7916  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET C INTER B`));
7917  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
7918
7919
7920
7921  (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0, v1, M, R}) > &0`);
7922  (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);
7923  (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);
7924  (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
7925  (ASM_REWRITE_TAC[]);
7926  (REPEAT STRIP_TAC);
7927  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7928
7929  (UNDISCH_TAC `~NULLSET x`);
7930  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
7931    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
7932  (LET_TAC);
7933  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7934  (EXISTS_TAC `aff_ge {v0, v1} {M, R:real^3}`);
7935  (REWRITE_TAC[SET_RULE `a INTER B INTER c SUBSET c`]);
7936  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7937  (EXISTS_TAC `affine hull ({v0, v1} UNION {M, R:real^3})`);
7938  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL; SET_RULE 
7939   `{a, b} UNION {c, d} = {a,b,c,d}`]);
7940  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7941  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7942  (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);
7943  (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);
7944  (ASM_REWRITE_TAC[]);
7945  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7946
7947  (NEW_GOAL `F`);
7948  (UNDISCH_TAC `~NULLSET x`);
7949  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
7950    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
7951  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7952  (UP_ASM_TAC THEN MESON_TAC[]);
7953
7954  (NEW_GOAL `vol (x INTER D) = &0`);
7955  (MATCH_MP_TAC MEASURE_EQ_0);
7956  (ASM_REWRITE_TAC[]);
7957  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7958  (UP_ASM_TAC THEN MESON_TAC[]);
7959
7960 (* ========================================== *)
7961
7962  (REWRITE_WITH `sum t (\t. vol (t INTER D)) = 
7963                  sum t (\t. vol D * dihX V t (u0,u1) / (&2 * pi))`);
7964  (MATCH_MP_TAC SUM_EQ);
7965  (EXPAND_TAC "t" THEN REWRITE_TAC[IN_ELIM_THM; IN] THEN REPEAT STRIP_TAC);
7966  (ASM_SIMP_TAC[]);
7967  (REWRITE_TAC[REAL_ARITH `a * b / c = (a / c) * b`]);
7968  (REWRITE_TAC[SUM_LMUL]);
7969  (ABBREV_TAC `R = sum t (\t. dihX V t (u0,u1))`);
7970  (REWRITE_TAC[REAL_ARITH `a / b * c = (a * c) / b`]);
7971  (REWRITE_WITH `(vol D * R) / (&2 * pi) = vol D <=> 
7972                  (vol D * R) = vol D * (&2 * pi)`);
7973  (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
7974  (MATCH_MP_TAC REAL_LT_MUL);
7975  (REWRITE_TAC[PI_POS]);
7976  (REAL_ARITH_TAC);
7977  (REWRITE_TAC[REAL_ARITH `a * b = a * c <=> a * (b - c) = &0`]);
7978  (REWRITE_TAC[REAL_ENTIRE]);
7979  (STRIP_TAC);
7980  (NEW_GOAL `F`);
7981  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
7982
7983  (NEW_GOAL `&0 < d`);
7984  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7985  (ASM_SIMP_TAC[VOLUME_CONIC_CAP]);
7986  (COND_CASES_TAC);
7987  (REWRITE_TAC[]);
7988  (UNDISCH_TAC `d < &1` THEN UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC 
7989    THEN REAL_ARITH_TAC);
7990  (REWRITE_TAC[REAL_ARITH `&2 / &3 * a = &0 <=> a = &0`]);
7991  (REWRITE_TAC[REAL_ENTIRE]);
7992  (NEW_GOAL `~(pi = &0)`);
7993  (MP_TAC PI_POS THEN REAL_ARITH_TAC);
7994  (NEW_GOAL `~(&1 - d = &0)`);
7995  (UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);
7996  (NEW_GOAL `~(r pow 3 = &0)`);
7997  (MATCH_MP_TAC REAL_POW_NZ);
7998  (UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);
7999  (ASM_REWRITE_TAC[]);
8000  (UP_ASM_TAC THEN MESON_TAC[]);
8001  (UP_ASM_TAC THEN REAL_ARITH_TAC)]);;
8002
8003
8004
8005 end;;