Update from HH
[Flyspeck/.git] / legacy / oldpacking / packing / development / Backup / GRUTOTI.hl
1 (* ========================================================================= *)
2 (*                FLYSPECK - BOOK FORMALIZATION                              *)
3 (*                                                                           *)
4 (*      Authour   : VU KHAC KY                                               *)
5 (*      Book lemma: GRUTOTI                                                  *)
6 (*      Chaper    : Packing                                                  *)
7 (*                                                                           *)
8 (* ========================================================================= *)
9 (*                                                                           *)
10 (* flyspeck_needs "packing/marchal_cells_3.hl";;                             *)
11 (*                                                                           *)
12 (* ========================================================================= *)
13
14 let GRUTOTI1_concl = 
15 `!V u0 u1 e.
16      saturated V /\
17      packing V /\
18      u0 IN V /\
19      u1 IN V /\
20      ~(u0 = u1) /\
21      hl [u0;u1] < sqrt (&2) /\
22      e = {u0, u1}
23      ==> sum {X | mcell_set V X /\ e IN edgeX V X } (\t. dihX V t (u0,u1)) =
24          &2 * pi`;;
25
26 let GRUTOTI = prove_by_refinement (GRUTOTI1_concl,
27 [(REPEAT STRIP_TAC);
28  (NEW_GOAL `barV V 1 [u0;u1:real^3]`);
29  (MATCH_MP_TAC HL_LE_SQRT2_IMP_BARV_1);
30  (ASM_REWRITE_TAC[]);
31  (NEW_GOAL 
32   `{k | k IN 1..3 /\
33         voronoi_list V [u0;u1:real^3] =
34         UNIONS
35           {convex hull
36           ({omega_list_n V vl i | i IN 1..k - 1} UNION
37             voronoi_list V vl) | vl | barV V k vl /\
38                                       truncate_simplex 1 vl = [u0;u1]}} =
39              1..3`);
40  (MATCH_MP_TAC Rogers.GLTVHUM_lemma1);
41  (ASM_REWRITE_TAC[] THEN ARITH_TAC);
42  (NEW_GOAL 
43  `3 IN {k | k IN 1..3 /\
44           voronoi_list V [u0; u1] =
45           UNIONS
46           {convex hull
47          ({omega_list_n V vl i | i IN 1..k - 1} UNION voronoi_list V vl) | vl | 
48           barV V k vl /\
49           truncate_simplex 1 vl = [u0; u1]}}`);
50  (ASM_REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC);
51  (UP_ASM_TAC THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
52  (REWRITE_WITH 
53    `UNIONS
54    {convex hull ({omega_list_n V vl i | i IN 1..3 - 1} UNION voronoi_list V vl)      | vl | barV V 3 vl /\
55            truncate_simplex 1 vl = [u0; u1]} = 
56    UNIONS {convex hull {omega_list_n V vl 1, omega_list_n V vl 2, 
57            omega_list_n V vl 3} | vl | barV V 3 vl /\
58                                        truncate_simplex 1 vl = [u0; u1]}`);
59  (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);
60  (REWRITE_TAC[IN_UNIONS] THEN ONCE_REWRITE_TAC[IN] THEN 
61    REWRITE_TAC[IN_ELIM_THM]);
62  (REPEAT STRIP_TAC);
63  (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);
64  (EXISTS_TAC `vl:(real^3)list`);
65  (ASM_REWRITE_TAC[]);
66  (NEW_GOAL `?a. voronoi_list V vl = {a} /\
67                     a = circumcenter (set_of_list vl) /\
68                     hl vl = dist (HD vl,a)`);
69  (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);
70  (ASM_REWRITE_TAC[]);
71  (UP_ASM_TAC THEN STRIP_TAC);
72
73  (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);
74  (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
75  (REWRITE_TAC[OMEGA_LIST]);
76  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
77                  CARD (set_of_list vl) = 3 + 1`);
78  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
79  (EXISTS_TAC `V:real^3->bool`);
80  (ASM_REWRITE_TAC[]);
81  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
82  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
83  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
84  (NEW_GOAL `omega_list_n V vl 3 = a`);
85  (ASM_SET_TAC[]);
86  (ASM_REWRITE_TAC[]);
87  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG; 
88    ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);
89  (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} = 
90                  {omega_list_n V vl 1,omega_list_n V vl 2}`);
91  (SET_TAC[]);
92  (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
93    {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2,      circumcenter (set_of_list vl)}`);
94  (SET_TAC[]);
95
96  (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);
97  (EXISTS_TAC `vl:(real^3)list`);
98  (ASM_REWRITE_TAC[]);
99  (NEW_GOAL `?a. voronoi_list V vl = {a} /\
100                     a = circumcenter (set_of_list vl) /\
101                     hl vl = dist (HD vl,a)`);
102  (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);
103  (ASM_REWRITE_TAC[]);
104  (UP_ASM_TAC THEN STRIP_TAC);
105
106  (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);
107  (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
108  (REWRITE_TAC[OMEGA_LIST]);
109  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
110                  CARD (set_of_list vl) = 3 + 1`);
111  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
112  (EXISTS_TAC `V:real^3->bool`);
113  (ASM_REWRITE_TAC[]);
114  (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
115  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
116  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
117  (NEW_GOAL `omega_list_n V vl 3 = a`);
118  (ASM_SET_TAC[]);
119  (ASM_REWRITE_TAC[]);
120  (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG; 
121    ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);
122  (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} = 
123                  {omega_list_n V vl 1,omega_list_n V vl 2}`);
124  (SET_TAC[]);
125  (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
126    {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2,
127     circumcenter (set_of_list vl)}`);
128  (SET_TAC[]);
129  (STRIP_TAC);
130
131 (* ======================================================================= *)
132
133  (ABBREV_TAC `p = circumcenter {u0, u1:real^3}`);
134  (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0;u1]) = &3`);
135  (REWRITE_TAC[AFF_DIM_INSERT]);
136  (COND_CASES_TAC);
137  (NEW_GOAL `F`);
138
139  (NEW_GOAL `affine hull voronoi_list V [u0; u1] SUBSET 
140    affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);
141  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
142  (REWRITE_TAC[VORONOI_LIST; set_of_list; Packing3.VORONOI_SET_2]);
143  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
144  (ASM_SIMP_TAC[Pack2.INTER_VORONOI_SUBSET_BISECTOR]);
145  (NEW_GOAL 
146   `affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2} = 
147    {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);
148  (REWRITE_TAC[AFFINE_HULL_EQ]);
149  (REWRITE_TAC[AFFINE_HYPERPLANE]);
150  (NEW_GOAL 
151  `~(u0 IN {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2})`);
152  (REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
153  (ONCE_REWRITE_TAC [REAL_ARITH `a = b <=> a - b = &0`]);
154  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 - (u0 dot u0 - u1 dot u1) = 
155                 (u0 - u1) dot (u0 - u1)`]);
156  (REWRITE_TAC[DOT_EQ_0] THEN ASM_NORM_ARITH_TAC);
157  (ASM_SET_TAC[]);
158  (ASM_MESON_TAC[]);
159  (REWRITE_TAC[ARITH_RULE `a + &1 = b:int <=> a = b - &1`]);
160  (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
161  (ASM_REWRITE_TAC[]);
162
163  (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0; u1]) = &(dimindex (:3))`);
164  (ASM_REWRITE_TAC[DIMINDEX_3]);
165  (UP_ASM_TAC THEN REWRITE_TAC[AFF_DIM_EQ_FULL]);
166  (STRIP_TAC);
167
168  (ABBREV_TAC `S = voronoi_list V [u0;u1]`);
169  (NEW_GOAL `!x. x IN S ==> (x - u0) dot (u1 - u0) = 
170                             dist (p, u0) * dist (u1, u0:real^3)`);
171  (REPEAT STRIP_TAC);
172  (NEW_GOAL `p = inv (&2) % (u0 + (u1:real^3))`);
173  (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);
174  (REWRITE_TAC[dist]);
175  (REWRITE_WITH `u1 - u0 = &2 % (p - u0:real^3)`);
176  (ASM_REWRITE_TAC[]);
177  (VECTOR_ARITH_TAC);
178  (REWRITE_TAC[NORM_MUL; REAL_ARITH `abs (&2) = &2`;
179    REAL_ARITH `a * b * a = b * a pow 2`; NORM_POW_2; DOT_RMUL]);
180  (REWRITE_WITH `(x - u0) dot (p - u0:real^3) = 
181                  (p - u0) dot (p - u0) - (x - p) dot (u0 - p)`);
182  (VECTOR_ARITH_TAC);
183  (REWRITE_WITH `(x - p) dot (u0 - p:real^3) = &0`);
184  (EXPAND_TAC "p");
185  (REWRITE_WITH `{u0, u1} = set_of_list [u0; u1:real^3]`);
186  (REWRITE_TAC[set_of_list]);
187  (MATCH_MP_TAC Rogers.MHFTTZN4);
188  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
189  (REPEAT STRIP_TAC);
190  (ASM_REWRITE_TAC[]);
191  (ASM_REWRITE_TAC[]);
192  (NEW_GOAL `S SUBSET affine hull voronoi_list V [u0; u1]`);
193  (EXPAND_TAC "S");
194  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
195  (ASM_SET_TAC[]);
196  (REWRITE_TAC[set_of_list]);
197  (NEW_GOAL `{u0,u1} SUBSET affine hull {u0,u1:real^3}`);
198  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
199  (ASM_SET_TAC[]);
200  (REAL_ARITH_TAC);
201
202 (* ========================================================================= *)
203
204  (ABBREV_TAC `S1 = {x:real^3 | &2 % (u0 - u1) dot x = 
205                                 norm u0 pow 2 - norm u1 pow 2}`);
206  (ABBREV_TAC `S2:real^3->bool = (S1 DIFF (relative_interior S))`);
207  (NEW_GOAL `closed_in (subtopology euclidean (S1:real^3->bool)) S2`);
208  (EXPAND_TAC "S2");
209  (MATCH_MP_TAC CLOSED_IN_DIFF);
210  (STRIP_TAC);
211  (NEW_GOAL `closed (S1:real^3->bool)`);
212  (EXPAND_TAC "S1" THEN REWRITE_TAC[CLOSED_HYPERPLANE]);
213  (MATCH_MP_TAC CLOSED_SUBSET);
214  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
215
216  (REWRITE_WITH `S1 = affine hull (S:real^3->bool)`);
217  (EXPAND_TAC "S");
218  (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
219  (REWRITE_TAC[AFFINE_HULL_EQ]);
220  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
221  (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);
222  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
223  (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);
224  (STRIP_TAC);
225  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
226    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
227  (DEL_TAC THEN EXPAND_TAC "S1");
228  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
229  (ASM_REWRITE_TAC[]);
230  (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);
231  (DEL_TAC THEN EXPAND_TAC "S1");
232  (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
233  (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);
234  (ASM_REWRITE_TAC[]);
235  (REWRITE_TAC[DIMINDEX_3]);
236  (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);
237  (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
238  (ASM_REWRITE_TAC[]);
239  (ARITH_TAC);
240
241  (REWRITE_TAC[OPEN_IN_RELATIVE_INTERIOR]);
242
243  (NEW_GOAL `closed (S2:real^3->bool)`);
244  (MATCH_MP_TAC CLOSED_IN_CLOSED_TRANS);
245  (EXISTS_TAC `S1:real^3->bool`);
246  (ASM_REWRITE_TAC[]);
247  (EXPAND_TAC "S1");
248  (REWRITE_TAC[CLOSED_HYPERPLANE]);
249
250
251  (NEW_GOAL `~(S2:real^3->bool = {})`);
252  (EXPAND_TAC "S2");
253  (REWRITE_TAC [SET_RULE `A DIFF B = {} <=> A SUBSET B`]);
254  (REPEAT STRIP_TAC);
255  (NEW_GOAL `S1 SUBSET S:real^3->bool`);
256  (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);
257  (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);
258  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
259
260  (NEW_GOAL `S1 = S:real^3->bool`);
261  (NEW_GOAL `S SUBSET S1:real^3->bool`);
262  (EXPAND_TAC "S");
263  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
264    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
265  (EXPAND_TAC "S1");
266  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
267  (ASM_REWRITE_TAC[]);
268  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
269
270  (NEW_GOAL `bounded (S1:real^3->bool)`);
271  (REWRITE_TAC[ASSUME `S1 = S:real^3->bool`]);
272  (DEL_TAC THEN EXPAND_TAC "S");
273  (MATCH_MP_TAC Packing3.BOUNDED_VORONOI_LIST);
274  (EXISTS_TAC `1`);
275  (ASM_REWRITE_TAC[]);
276  
277  (NEW_GOAL `~bounded (S1:real^3->bool)`);
278  (EXPAND_TAC "S1");
279  (MATCH_MP_TAC UNBOUNDED_HYPERPLANE);
280  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) = vec 0 <=> u0 = u1`]);
281  (ASM_REWRITE_TAC[]);
282  (ASM_MESON_TAC[]);
283
284  (NEW_GOAL `?z:real^3. z IN S2 /\ 
285                 (!w. w IN S2 ==> dist (u0,z) <= dist (u0,w))`);
286  (MATCH_MP_TAC DISTANCE_ATTAINS_INF);
287  (ASM_REWRITE_TAC[]);
288  (UP_ASM_TAC THEN STRIP_TAC);
289
290 (* ======================================================================== *)
291
292  (ABBREV_TAC `a = dist (p, u0:real^3) / dist (z, u0)`);
293  (NEW_GOAL `&0 < a /\ a < &1`);
294  (EXPAND_TAC "a");
295  (NEW_GOAL `~(u0:real^3 IN S1)`);
296  (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
297  (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);
298  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 = 
299   (u0 - u1) dot (u0 - u1)`]);
300  (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
301  (ASM_REWRITE_TAC[]);
302  (NEW_GOAL `&0 < dist (p,u0:real^3)`);
303  (MATCH_MP_TAC DIST_POS_LT);
304  (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);
305  (REWRITE_TAC[VECTOR_ARITH `inv (&2) % (u0 + u1) = u0 <=> u0 = u1`]);
306  (ASM_REWRITE_TAC[]);
307  (NEW_GOAL `&0 < dist (z,u0:real^3)`);
308  (MATCH_MP_TAC DIST_POS_LT);
309  (STRIP_TAC);
310  (NEW_GOAL `z:real^3 IN S1`);
311  (ASM_SET_TAC[]);
312  (ASM_MESON_TAC[]);
313  (STRIP_TAC);
314  (MATCH_MP_TAC REAL_LT_DIV);
315  (ASM_REWRITE_TAC[]);
316  (REWRITE_WITH 
317   `dist (p,u0) / dist (z,u0:real^3) < &1 <=> dist (p,u0) < &1 * dist (z,u0)`);
318  (ASM_SIMP_TAC[REAL_LT_LDIV_EQ]);
319  (REWRITE_TAC[REAL_MUL_LID]);
320  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LT);
321  (REPEAT STRIP_TAC);
322  (ASM_REAL_ARITH_TAC);
323  (ASM_REAL_ARITH_TAC);
324  (REWRITE_TAC[dist]);
325  (REWRITE_WITH `norm (z - u0:real^3) pow 2 = 
326                  norm (p - u0) pow 2 + norm (z - p) pow 2`);
327  (MATCH_MP_TAC PYTHAGORAS);
328  (REWRITE_TAC[orthogonal]);
329  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
330  (ASM_REWRITE_TAC[set_of_list]);
331  (ONCE_REWRITE_TAC[DOT_SYM]);
332  (MATCH_MP_TAC Rogers.MHFTTZN4);
333  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
334  (REPEAT STRIP_TAC);
335  (ASM_REWRITE_TAC[]);
336  (ASM_REWRITE_TAC[]);
337
338  (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);
339  (REWRITE_WITH `affine hull (S:real^3->bool) = S1`);
340  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
341  (EXPAND_TAC "S");
342  (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
343  (REWRITE_TAC[AFFINE_HULL_EQ]);
344  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
345  (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);
346  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
347  (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);
348  (STRIP_TAC);
349  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
350    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
351  (DEL_TAC THEN EXPAND_TAC "S1");
352  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
353  (ASM_REWRITE_TAC[]);
354  (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);
355  (DEL_TAC THEN EXPAND_TAC "S1");
356  (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
357  (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);
358  (ASM_REWRITE_TAC[]);
359  (REWRITE_TAC[DIMINDEX_3]);
360  (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);
361  (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
362  (ASM_REWRITE_TAC[]);
363  (ARITH_TAC);
364  (ASM_SET_TAC[]);
365  (REWRITE_TAC[set_of_list]);
366  (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);
367  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
368  (ASM_SET_TAC[]);
369  (REWRITE_TAC[REAL_ARITH `a < a + b <=> &0 < b`; NORM_POW_2; DOT_POS_LT]);
370  (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
371  (STRIP_TAC);
372  (NEW_GOAL `~(z:real^3 IN S2)`);
373  (REWRITE_TAC[ASSUME `z = p:real^3`]);
374  (EXPAND_TAC "S2");
375  (NEW_GOAL `p:real^3 IN relative_interior S`);
376
377
378
379  (ABBREV_TAC `B = V INTER ball (p:real^3, &8)`);
380  (ABBREV_TAC `A = B DIFF {u0, u1:real^3}`);
381  (NEW_GOAL `FINITE (A:real^3->bool)`);
382  (EXPAND_TAC "A");
383  (MATCH_MP_TAC FINITE_DIFF);
384  (EXPAND_TAC "B");
385  (MATCH_MP_TAC Packing3.KIUMVTC THEN ASM_REWRITE_TAC[]);
386  (NEW_GOAL `?y. dist (p,y:real^3) = &4`);
387  (MATCH_MP_TAC VECTOR_CHOOSE_DIST);
388  (REAL_ARITH_TAC);
389  (UP_ASM_TAC THEN STRIP_TAC);
390  (UNDISCH_TAC `saturated (V:real^3->bool)`);
391  (REWRITE_TAC[saturated] THEN STRIP_TAC);
392  (NEW_GOAL `?z. z IN V /\ dist (y:real^3, z) < &2`);
393  (ASM_REWRITE_TAC[]);
394  (UP_ASM_TAC THEN STRIP_TAC);
395
396  (NEW_GOAL `z':real^3 IN A`);
397  (EXPAND_TAC "A" THEN EXPAND_TAC "B");
398  (REWRITE_TAC[IN_DIFF; IN_INTER; IN_BALL]);
399  (REPEAT STRIP_TAC);
400  (ASM_REWRITE_TAC[]);
401
402  (NEW_GOAL `dist (p,z') <= dist (p, y) + dist (y, z':real^3)`);
403  (REWRITE_TAC[DIST_TRIANGLE]);
404  (ASM_REAL_ARITH_TAC);
405  (NEW_GOAL `dist (p, y) <= dist (p, z') + dist (z', y:real^3)`);
406  (REWRITE_TAC[DIST_TRIANGLE]);
407  (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);
408  (STRIP_TAC);
409  (NEW_GOAL `&2 < dist (z', p:real^3)`);
410  (ASM_REAL_ARITH_TAC);
411  (UP_ASM_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);
412  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
413  (ASM_MESON_TAC[set_of_list]);
414  (NEW_GOAL `(!w. w IN set_of_list [u0;u1:real^3]
415                ==> dist (circumcenter (set_of_list [u0;u1]),w) = hl [u0;u1])`);
416  (MATCH_MP_TAC Rogers.HL_PROPERTIES);
417  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
418  (ASM_REWRITE_TAC[]);
419
420  (REWRITE_WITH `dist (circumcenter (set_of_list [u0; u1:real^3]),z') = 
421    hl [u0; u1]`);
422  (FIRST_ASSUM MATCH_MP_TAC);
423  (ASM_REWRITE_TAC[set_of_list]);
424  (NEW_GOAL `sqrt (&2) <= &2`);
425  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
426  (SIMP_TAC[REAL_ARITH `&0 <= &2`; SQRT_POS_LE; SQRT_POW_2]);
427  (REAL_ARITH_TAC);
428  (ASM_REAL_ARITH_TAC);
429
430  (NEW_GOAL `?a:real^3. a IN A /\ (!x. x IN A ==> dist (p,a) <= dist (p,x))`);
431  (MATCH_MP_TAC Packing3.REAL_FINITE_ARGMIN);
432  (ASM_REWRITE_TAC[]);
433  (UP_ASM_TAC THEN SET_TAC[]);
434  (UP_ASM_TAC THEN STRIP_TAC);
435
436
437  (ABBREV_TAC `d = inv (&4) * (dist (p, a') - dist (p, u0:real^3))`);
438  (NEW_GOAL `&0 < d`);
439  (EXPAND_TAC "d");
440  (MATCH_MP_TAC REAL_LT_MUL);
441  (STRIP_TAC);
442  (REAL_ARITH_TAC);
443  (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> a > b`]);
444  (ONCE_REWRITE_TAC[DIST_SYM]);
445  (NEW_GOAL `!u v. u IN {u0,u1} /\ v IN V DIFF {u0,u1} ==> 
446                    dist (v,p) > dist (u,p:real^3)`);
447  (MATCH_MP_TAC Rogers.XYOFCGX);
448  (REPEAT STRIP_TAC);
449  (ASM_REWRITE_TAC[]);
450  (ASM_SET_TAC[]);
451  (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_INDEPENDENT_2]);
452  (ASM_MESON_TAC[set_of_list]);
453  (REWRITE_WITH `radV {u0, u1:real^3} = hl [u0;u1]`);
454  (REWRITE_TAC[HL;set_of_list]);
455  (ASM_REWRITE_TAC[]);
456  (FIRST_ASSUM MATCH_MP_TAC);
457  (ASM_SET_TAC[]);
458
459  (REWRITE_TAC[relative_interior; IN; IN_ELIM_THM]);
460  (ABBREV_TAC `St = S INTER ball (p:real^3, d)`);
461  (EXISTS_TAC `St:real^3->bool`);
462  (REPEAT STRIP_TAC);
463
464  (REWRITE_TAC[open_in]);
465  (REPEAT STRIP_TAC);
466  (NEW_GOAL `S SUBSET affine hull (S:real^3->bool)`);
467  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
468  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
469  (EXISTS_TAC `d - dist (p:real^3, x)`);
470  (REPEAT STRIP_TAC);
471  (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);
472  (REWRITE_TAC[GSYM IN_BALL]);
473  (ASM_SET_TAC[]);
474  (EXPAND_TAC "St");
475  (REWRITE_TAC[IN_INTER]);
476  (STRIP_TAC);
477
478
479  (NEW_GOAL `dist (x',x:real^3) < d`);
480  (NEW_GOAL `&0 <= dist (p,x:real^3)`);
481  (REWRITE_TAC[DIST_POS_LE]);
482  (ASM_REAL_ARITH_TAC);
483
484  (NEW_GOAL `x' IN voronoi_closed V (u0:real^3)`);
485  (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
486  (REPEAT STRIP_TAC);
487
488  (ASM_CASES_TAC `w IN {u0, u1:real^3}`);
489  (ASM_CASES_TAC `w = u0:real^3`);
490  (REWRITE_TAC[ASSUME `w = u0:real^3`]);
491  (REAL_ARITH_TAC);
492  (NEW_GOAL `w = u1:real^3`);
493  (ASM_SET_TAC[]);
494  (REWRITE_TAC[ASSUME `w = u1:real^3`]);
495  (MATCH_MP_TAC (REAL_ARITH `a = b ==> a <= b`));
496
497  (NEW_GOAL `x':real^3 IN S1`);
498  (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
499  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
500  (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM 
501   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
502   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
503  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
504  (ASM_REWRITE_TAC[]);
505  (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);
506  (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);
507  (REWRITE_TAC[AFFINE_HULL_EQ]);
508  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
509  (ASM_SET_TAC[]);
510
511  (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);
512  (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);
513  (REWRITE_TAC[
514    VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) = 
515                 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);
516  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);
517  (STRIP_TAC);
518  (REWRITE_TAC[DIST_EQ]);
519  (ONCE_REWRITE_TAC[DIST_SYM]);
520  (ASM_REWRITE_TAC[]);
521
522  (NEW_GOAL `dist (x', u0:real^3) <= dist (x', x) + dist (x, u0)`);
523  (REWRITE_TAC[DIST_TRIANGLE]);
524  (NEW_GOAL `dist (x, u0:real^3) <= dist (x, p:real^3) + dist (p, u0)`);
525  (REWRITE_TAC[DIST_TRIANGLE]);
526  (NEW_GOAL `dist (x,p:real^3) < d`);
527  (NEW_GOAL `x IN ball (p:real^3, d)`);
528  (ASM_SET_TAC[]);
529  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
530  (REWRITE_TAC[DIST_SYM]);
531  (NEW_GOAL `dist (x',u0) < &2 * d + dist (p:real^3,u0)`);
532  (ASM_REAL_ARITH_TAC);
533
534  (NEW_GOAL `dist (p, w:real^3)- &2 * d <= dist (x',w)`);
535  (NEW_GOAL `dist (x, w:real^3) <= dist (x, x') + dist (x', w)`);
536  (REWRITE_TAC[DIST_TRIANGLE]);
537  (NEW_GOAL `dist (p, w:real^3) <= dist (p, x) + dist (x, w)`);
538  (REWRITE_TAC[DIST_TRIANGLE]);
539  (NEW_GOAL `dist (x, x':real^3) < d /\ dist (p, x:real^3) < d`);
540  (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
541  (ASM_REAL_ARITH_TAC);
542  (NEW_GOAL `dist (p, u0) + &4 * d <= dist (p, w:real^3)`);
543  (EXPAND_TAC "d");
544  (REWRITE_TAC[REAL_ARITH `&4 * inv (&4) * a = a`]);
545  (REWRITE_TAC[REAL_ARITH `a + b - a = b`]);
546
547  (ASM_CASES_TAC `w:real^3 IN B`);
548  (FIRST_ASSUM MATCH_MP_TAC);
549  (ASM_SET_TAC[]);
550  (NEW_GOAL `~(dist (p,w:real^3) < &8)`);
551  (REWRITE_TAC[GSYM IN_BALL]);
552  (ASM_SET_TAC[]);
553  (NEW_GOAL `dist (p,a':real^3) < &8`);
554  (REWRITE_TAC[GSYM IN_BALL]);
555  (ASM_SET_TAC[]);
556  (ASM_REAL_ARITH_TAC);
557  (ASM_REAL_ARITH_TAC);
558
559
560  (NEW_GOAL `x' IN voronoi_closed V (u1:real^3)`);
561  (NEW_GOAL `x':real^3 IN S1`);
562  (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
563  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
564  (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM 
565   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
566   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
567  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
568  (ASM_REWRITE_TAC[]);
569  (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);
570  (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);
571  (REWRITE_TAC[AFFINE_HULL_EQ]);
572  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
573  (ASM_SET_TAC[]);
574
575  (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);
576  (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);
577  (REWRITE_TAC[
578    VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) = 
579                 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);
580  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);
581  (STRIP_TAC);
582  (UNDISCH_TAC `x' IN voronoi_closed V (u0:real^3)`);
583  (REWRITE_TAC[voronoi_closed; IN_ELIM_THM; IN]);
584  (REPEAT STRIP_TAC);
585  (REWRITE_WITH `dist (x', u1)= dist (x', u0:real^3)`);
586  (ONCE_REWRITE_TAC[DIST_SYM]);
587  (ASM_REWRITE_TAC[DIST_EQ]);
588  (ASM_SIMP_TAC[]);
589
590  (REWRITE_TAC[GSYM 
591   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
592   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
593  (ASM_REWRITE_TAC[IN_INTER]);
594
595  (REWRITE_TAC[IN_BALL]);
596  (NEW_GOAL `dist (p,x':real^3) <= dist (p,x) + dist (x, x':real^3)`);
597  (REWRITE_TAC[DIST_TRIANGLE]);
598  (NEW_GOAL `dist (x,x':real^3) = dist (x',x)`);
599  (REWRITE_TAC[DIST_SYM]);
600  (ASM_REAL_ARITH_TAC);
601  (REWRITE_WITH `St p <=> p:real^3 IN St`);
602  (REWRITE_TAC[IN]);
603  (EXPAND_TAC "St" THEN REWRITE_TAC[IN_INTER; IN_BALL; DIST_REFL]);
604  (STRIP_TAC);
605  (REWRITE_WITH `p = omega_list V [u0; u1]`);
606  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
607  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
608  (ASM_MESON_TAC[set_of_list]);
609  (MATCH_MP_TAC Rogers.XNHPWAB1);
610  (EXISTS_TAC `1`);
611  (ASM_REWRITE_TAC[IN]);
612  (REWRITE_TAC[GSYM (ASSUME `voronoi_list V [u0;u1] = S`)]);
613  (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
614  (EXISTS_TAC `1` THEN ASM_REWRITE_TAC[]);
615  (ASM_REWRITE_TAC[]);
616  (UP_ASM_TAC THEN SET_TAC[]);
617  (UP_ASM_TAC THEN SET_TAC[]);
618  (ASM_MESON_TAC[]);
619
620 (* ======================================================================== *)
621
622  (NEW_GOAL `?b. &0 < b /\ b < &1 /\ 
623                   rcone_gt u0 u1 b SUBSET aff_ge_alt {u0:real^3} S`);
624
625  (EXISTS_TAC `a:real`);
626  (REPEAT STRIP_TAC);
627  (ASM_REWRITE_TAC[]);
628  (ASM_REWRITE_TAC[]);
629  (REWRITE_TAC[SET_RULE `A SUBSET B <=> (!x. ~(x IN B) ==> ~(x IN A))`]);
630  (REPEAT STRIP_TAC);
631  (NEW_GOAL `x:real^3 IN affine hull (u0 INSERT S)`);
632  (ASM_SET_TAC[]);
633  (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);
634  (REPEAT STRIP_TAC);
635
636  (ABBREV_TAC `h = sum (s DELETE u0:real^3) u`);
637  (NEW_GOAL `(x - u0) dot (u1 - u0:real^3) = 
638               h * dist (p, u0) * dist (u1, u0:real^3)`);
639  (EXPAND_TAC "x");
640  (NEW_GOAL `u0 = vsum s (\v:real^3. (u:real^3->real) v % (u0:real^3))`);
641  (ASM_SIMP_TAC[VSUM_RMUL]);
642  (VECTOR_ARITH_TAC);
643  (REWRITE_WITH `vsum (s:real^3->bool) (\v. u v % v) - u0:real^3 = 
644                  vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0)`);
645  (ASM_REWRITE_TAC[]);
646  (UP_ASM_TAC THEN MESON_TAC[]);
647  (REWRITE_WITH `vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0:real^3) = 
648                  vsum s (\x. (\v. u v % v) x - (\v. u v % u0) x)`);
649  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
650  (MATCH_MP_TAC VSUM_SUB);
651  (ASM_REWRITE_TAC[]);
652  (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`]);
653  (REWRITE_WITH `vsum s (\x:real^3. u x % (x - u0)) dot (u1 - u0) = 
654                  sum s (\x. (\x. u x % (x - u0)) x dot (u1 - u0:real^3))`);
655  (ASM_SIMP_TAC[DOT_LSUM]);
656  (REWRITE_TAC[DOT_LMUL]);
657  (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) = 
658    sum (s DELETE u0) (\x. u x * (dist (p,u0) * dist (u1,u0)))`);
659  (ASM_CASES_TAC `u0:real^3 IN s`);
660  (NEW_GOAL `s = u0 INSERT (s DELETE u0:real^3)`);
661  (ASM_SET_TAC[]);
662  (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
663  (MATCH_MP_TAC FINITE_SUBSET);
664  (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
665
666  (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) = 
667    sum (u0 INSERT (s DELETE u0))  (\x. u x * ((x - u0) dot (u1 - u0)))`);
668  (ASM_MESON_TAC[]);
669  (ABBREV_TAC `f = (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3)))`);
670  (REWRITE_WITH `sum (u0:real^3 INSERT (s DELETE u0)) f = 
671          (if u0 IN (s DELETE u0) then sum (s DELETE u0) f 
672           else f u0 + sum (s DELETE u0) f)`);
673  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
674  (ASM_REWRITE_TAC[]);
675  (COND_CASES_TAC);
676  (NEW_GOAL `F`);
677  (ASM_SET_TAC[]);
678  (ASM_MESON_TAC[]);
679  (REWRITE_WITH `f (u0:real^3) = &0`);
680  (EXPAND_TAC "f");
681  (REWRITE_TAC[VECTOR_ARITH `(u0 - u0) dot (u1 - u0) = &0`]);
682  (REAL_ARITH_TAC);
683  (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
684  (MATCH_MP_TAC SUM_EQ);
685  (EXPAND_TAC "f");
686  (REPEAT STRIP_TAC);
687  (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);
688  (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);
689  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);
690  (FIRST_ASSUM MATCH_MP_TAC);
691  (ASM_SET_TAC[]);
692  (ASM_REWRITE_TAC[]);
693  (REAL_ARITH_TAC);
694  (REWRITE_WITH `s DELETE u0:real^3 = s`);
695  (ASM_SET_TAC[]);
696  (MATCH_MP_TAC SUM_EQ);
697  (REPEAT STRIP_TAC);
698  (REWRITE_TAC[]);
699  (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);
700  (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);
701  (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);
702  (FIRST_ASSUM MATCH_MP_TAC);
703  (ASM_SET_TAC[]);
704  (ASM_REWRITE_TAC[]);
705  (REAL_ARITH_TAC);
706  (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
707  (MATCH_MP_TAC FINITE_SUBSET);
708  (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
709  (ASM_SIMP_TAC[SUM_RMUL]);
710
711  (ASM_CASES_TAC `h <= &0`);
712  (NEW_GOAL `~(x IN rcone_gt u0 (u1:real^3) a)`);
713  (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);
714  (ASM_REWRITE_TAC[]);
715  (MATCH_MP_TAC (REAL_ARITH `&0 <= x /\ y <= &0 ==> ~(y > x)`));
716  (STRIP_TAC);
717  (MATCH_MP_TAC REAL_LE_MUL);
718  (REWRITE_TAC[DIST_POS_LE]);
719  (MATCH_MP_TAC REAL_LE_MUL);
720  (REWRITE_TAC[DIST_POS_LE]);
721  (ASM_REAL_ARITH_TAC);
722
723  (REWRITE_TAC[REAL_ARITH `a * b * c <= &0 <=> &0 <= b * c * (--a)`]);
724  (MATCH_MP_TAC REAL_LE_MUL);
725  (REWRITE_TAC[DIST_POS_LE]);
726  (MATCH_MP_TAC REAL_LE_MUL);
727  (REWRITE_TAC[DIST_POS_LE]);
728  (ASM_REAL_ARITH_TAC);
729  (NEW_GOAL `F`);
730  (ASM_MESON_TAC[]);
731  (ASM_MESON_TAC[]);
732
733  (ABBREV_TAC `y = inv (h) % vsum (s DELETE u0) (\v:real^3. u v % v)`);
734  (NEW_GOAL `?t. t + h = &1 /\ x = t % u0 + h % (y:real^3)`);
735  (EXISTS_TAC `&1 - h`);
736  (STRIP_TAC);
737  (REAL_ARITH_TAC);
738  (ASM_CASES_TAC `u0:real^3 IN s`);
739  (REWRITE_TAC[GSYM (ASSUME `sum s (u:real^3->real) = &1`)]);
740
741  (EXPAND_TAC "h");
742  (REWRITE_WITH `sum s u = sum (u0 INSERT (s DELETE u0)) (u:real^3->real)`);
743  (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);
744  (ASM_SET_TAC[]);
745  (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
746  (MATCH_MP_TAC FINITE_SUBSET);
747  (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
748
749  (SIMP_TAC[Marchal_cells_2_new.SUM_CLAUSES_alt; 
750    ASSUME `FINITE (s DELETE u0:real^3)`]);
751  (COND_CASES_TAC);
752  (NEW_GOAL `F`);
753  (UP_ASM_TAC THEN SET_TAC[]);
754  (ASM_MESON_TAC[]);
755  (REWRITE_TAC[REAL_ARITH `(a + b:real) - b = a`]);
756  (ASM_REWRITE_TAC[]);
757  (EXPAND_TAC "y");
758  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
759  (REWRITE_WITH `h * inv h = &1`);
760  (NEW_GOAL `~(h = &0)`);
761  (ASM_REAL_ARITH_TAC);
762  (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV]);
763  (REWRITE_TAC[VECTOR_MUL_LID]);
764  (EXPAND_TAC "x");
765
766  (REWRITE_WITH `vsum s (\v. u v % v) = 
767    vsum (u0 INSERT (s DELETE u0)) (\v:real^3. u v % v)`);
768  (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);
769  (ASM_SET_TAC[]);
770  (SIMP_TAC[Marchal_cells_2_new.VSUM_CLAUSES_alt; 
771    ASSUME `FINITE (s DELETE u0:real^3)`]);
772  (COND_CASES_TAC);
773  (NEW_GOAL `F`);
774  (UP_ASM_TAC THEN SET_TAC[]);
775  (ASM_MESON_TAC[]);
776  (REFL_TAC);
777
778  (NEW_GOAL `h = &1`);
779  (EXPAND_TAC "h" THEN REWRITE_WITH `s DELETE u0:real^3 = s`);
780  (ASM_SET_TAC[]);
781  (ASM_REWRITE_TAC[]);
782  (EXPAND_TAC "y" THEN REWRITE_TAC[ASSUME `h = &1`]);
783  (REWRITE_WITH `s DELETE u0:real^3 = s`);
784  (ASM_SET_TAC[]);
785  (ASM_REWRITE_TAC[REAL_ARITH `inv (&1) = &1 /\ &1 - &1 = &0`]);
786  (VECTOR_ARITH_TAC);
787  (UP_ASM_TAC THEN STRIP_TAC);
788
789  (NEW_GOAL `~(y:real^3 IN S)`);
790  (STRIP_TAC);
791  (NEW_GOAL `x IN aff_ge_alt {u0:real^3} S`);
792  (REWRITE_TAC[IN; aff_ge_alt; lin_combo]);
793
794  (ABBREV_TAC `f = (\v:real^3. if v = u0 then t 
795                                 else if v = y then h else &0)`);
796  (EXISTS_TAC `f:real^3->real`);
797  (EXISTS_TAC `{y:real^3}`);
798
799  (REPEAT STRIP_TAC);
800  (REWRITE_TAC[FINITE_SING]);
801  (ASM_SET_TAC[]);
802
803  (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a, b}`]);
804  (REWRITE_WITH `vsum {u0:real^3, y} (\v. f v % v) = 
805                 (\v. f v % v) u0 + (\v. f v % v) y`);
806  (MATCH_MP_TAC Geomdetail.VSUM_DIS2);
807  (STRIP_TAC);
808  (NEW_GOAL `~(u0:real^3 IN S)`);
809  (EXPAND_TAC "S");
810  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
811    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
812  (STRIP_TAC);
813  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
814  (ASM_SET_TAC[]);
815  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
816  (REPEAT STRIP_TAC);
817  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
818  (FIRST_ASSUM MATCH_MP_TAC);
819  (ASM_SET_TAC[]);
820  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
821  (MATCH_MP_TAC DIST_POS_LT);
822  (ASM_REWRITE_TAC[]);
823  (ASM_MESON_TAC[]);
824
825  (REWRITE_WITH `(f:real^3->real) u0 = t`);
826  (EXPAND_TAC "f");
827  (COND_CASES_TAC);
828  (REFL_TAC);
829  (NEW_GOAL `F`);
830  (ASM_MESON_TAC[]);
831  (ASM_MESON_TAC[]);
832
833  (REWRITE_WITH `(f:real^3->real) y = h`);
834  (EXPAND_TAC "f");
835  (COND_CASES_TAC);
836  (NEW_GOAL `F`);
837  (NEW_GOAL `~(u0:real^3 IN S)`);
838  (EXPAND_TAC "S");
839  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
840    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
841  (STRIP_TAC);
842  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
843  (ASM_SET_TAC[]);
844  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
845  (REPEAT STRIP_TAC);
846  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
847  (FIRST_ASSUM MATCH_MP_TAC);
848  (ASM_SET_TAC[]);
849  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
850  (MATCH_MP_TAC DIST_POS_LT);
851  (ASM_REWRITE_TAC[]);
852  (ASM_MESON_TAC[]);
853  (ASM_MESON_TAC[]);
854  (COND_CASES_TAC);
855  (REFL_TAC);
856  (NEW_GOAL `F`);
857  (ASM_MESON_TAC[]);
858  (ASM_MESON_TAC[]);
859  (ASM_REWRITE_TAC[]);
860
861  (EXPAND_TAC "f");
862  (COND_CASES_TAC);
863  (NEW_GOAL `F`);
864  (NEW_GOAL `~({y:real^3} u0)`);
865  (REWRITE_WITH `~({y} u0) <=> ~(u0:real^3 IN {y})`);
866  (MESON_TAC[IN]);
867  (REWRITE_TAC[IN_SING]);
868  (STRIP_TAC);
869
870  (NEW_GOAL `~(u0:real^3 IN S)`);
871  (EXPAND_TAC "S");
872  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
873    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
874  (STRIP_TAC);
875
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  (ASM_MESON_TAC[]);
889
890  (COND_CASES_TAC);
891  (ASM_REAL_ARITH_TAC);
892  (REAL_ARITH_TAC);
893
894  (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a,b}`]);
895  (REWRITE_WITH `sum {u0:real^3, y} f = f u0 + f y`);
896  (MATCH_MP_TAC Geomdetail.SUM_DIS2);
897  (STRIP_TAC);
898  (NEW_GOAL `~(u0:real^3 IN S)`);
899  (EXPAND_TAC "S");
900  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
901    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
902  (STRIP_TAC);
903  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
904  (ASM_SET_TAC[]);
905  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
906  (REPEAT STRIP_TAC);
907  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
908  (FIRST_ASSUM MATCH_MP_TAC);
909  (ASM_SET_TAC[]);
910  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
911  (MATCH_MP_TAC DIST_POS_LT);
912  (ASM_REWRITE_TAC[]);
913  (ASM_MESON_TAC[]);
914
915  (REWRITE_WITH `(f:real^3->real) u0 = t`);
916  (EXPAND_TAC "f");
917  (COND_CASES_TAC);
918  (REFL_TAC);
919  (NEW_GOAL `F`);
920  (ASM_MESON_TAC[]);
921  (ASM_MESON_TAC[]);
922
923  (REWRITE_WITH `(f:real^3->real) y = h`);
924  (EXPAND_TAC "f");
925  (COND_CASES_TAC);
926  (NEW_GOAL `F`);
927  (NEW_GOAL `~(u0:real^3 IN S)`);
928  (EXPAND_TAC "S");
929  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
930    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
931  (STRIP_TAC);
932  (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
933  (ASM_SET_TAC[]);
934  (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
935  (REPEAT STRIP_TAC);
936  (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
937  (FIRST_ASSUM MATCH_MP_TAC);
938  (ASM_SET_TAC[]);
939  (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
940  (MATCH_MP_TAC DIST_POS_LT);
941  (ASM_REWRITE_TAC[]);
942  (ASM_MESON_TAC[]);
943  (ASM_MESON_TAC[]);
944
945  (COND_CASES_TAC);
946  (REFL_TAC);
947  (NEW_GOAL `F`);
948  (ASM_MESON_TAC[]);
949  (ASM_MESON_TAC[]);
950  (ASM_REWRITE_TAC[]);
951  (ASM_MESON_TAC[]);
952
953  (NEW_GOAL `y:real^3 IN S2`);
954  (EXPAND_TAC "S2");
955  (NEW_GOAL `y:real^3 IN S1`);
956  (NEW_GOAL `y:real^3 IN affine hull S`);
957  (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT]);
958  (REWRITE_TAC[IN; IN_ELIM_THM]);
959  (EXISTS_TAC `s DELETE u0:real^3`);
960  (EXISTS_TAC `(\v:real^3. inv h * u v)`);
961  (REPEAT STRIP_TAC);
962  (ASM_REWRITE_TAC[FINITE_DELETE]);
963  (ASM_SET_TAC[]);
964  (REWRITE_TAC[SUM_LMUL]);
965  (ASM_REWRITE_TAC[]);
966  (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV; 
967    REAL_ARITH `~(h <= &0) ==> ~(h = &0)`]);
968  (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);
969  (ASM_SIMP_TAC[VSUM_LMUL; FINITE_DELETE]);
970  (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
971  (REWRITE_TAC[AFFINE_HULL_EQ]);
972  (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
973
974  (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
975  (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
976  (EXPAND_TAC "S");
977  (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
978    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
979  (DEL_TAC THEN EXPAND_TAC "S1");
980  (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
981  (ASM_REWRITE_TAC[]);
982  (ASM_SET_TAC[]);
983
984  (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);
985  (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);
986  (ASM_SET_TAC[]);
987
988 (* OK until here *)
989 (* ========================================================================= *)
990
991  (NEW_GOAL `dist (z,u0) <= dist (y,u0:real^3)`);
992  (ONCE_REWRITE_TAC[DIST_SYM]);
993  (ASM_SIMP_TAC[]);
994  (UNDISCH_TAC `x:real^3 IN rcone_gt u0 u1 a`);
995  (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);
996  (ASM_REWRITE_TAC[]);
997  (REWRITE_WITH `dist (t % u0 + h % y,u0) = h * dist (y, u0:real^3)`);
998  (REWRITE_TAC[dist]);
999  (REWRITE_WITH `(t % u0 + h % y:real^3) - u0 = (t % u0 + h % y) - (t + h) % u0`);
1000  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
1001  (REWRITE_TAC[VECTOR_ARITH `(t % u0 + h % y) - (t + h) % u0 = h % (y - u0)`]);
1002  (REWRITE_TAC[NORM_MUL]);
1003  (REWRITE_WITH `abs h = h`);
1004  (REWRITE_TAC[REAL_ABS_REFL]);
1005  (ASM_REAL_ARITH_TAC);
1006
1007  (REWRITE_TAC[REAL_ARITH `~(a > b) <=> a <= b`]);
1008  (REWRITE_WITH `h * dist (p,u0:real^3) * dist (u1,u0) = 
1009             (h * dist (z,u0)) * dist (u1,u0) * a`);
1010  (EXPAND_TAC "a");
1011  (REWRITE_TAC[REAL_ARITH `(a * b) * c * d / b = (a * d * c) * (b / b)`]);
1012  (REWRITE_WITH `dist (z,u0) / dist (z,u0:real^3) = &1`);
1013  (MATCH_MP_TAC REAL_DIV_REFL);
1014  (REWRITE_TAC[DIST_EQ_0]);
1015  (STRIP_TAC);
1016
1017  (NEW_GOAL `~(u0:real^3 IN S1)`);
1018  (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
1019  (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);
1020  (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 = 
1021   (u0 - u1) dot (u0 - u1)`]);
1022  (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
1023  (ASM_REWRITE_TAC[]);
1024  (NEW_GOAL `z:real^3 IN S1`);
1025  (ASM_SET_TAC[]);
1026  (ASM_MESON_TAC[]);
1027
1028  (REAL_ARITH_TAC);
1029  (REWRITE_TAC[REAL_ARITH 
1030   `(a * x) * b * c <= (a * y) * b * c <=> &0 <= a * b * c *(y - x)`]);
1031  (MATCH_MP_TAC REAL_LE_MUL);
1032  (STRIP_TAC);
1033  (ASM_REAL_ARITH_TAC);
1034  (MATCH_MP_TAC REAL_LE_MUL);
1035  (REWRITE_TAC[DIST_POS_LE]);
1036  (MATCH_MP_TAC REAL_LE_MUL);
1037  (STRIP_TAC);
1038  (ASM_REAL_ARITH_TAC);
1039  (ASM_REAL_ARITH_TAC);
1040
1041  (UP_ASM_TAC THEN STRIP_TAC);
1042
1043  (ABBREV_TAC `W = aff_ge_alt {u0:real^3} S`);
1044  (ABBREV_TAC `c = max b (hl[u0;u1:real^3] / sqrt (&2))`);
1045  (NEW_GOAL `&0 < c /\ c < &1`);
1046  (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_LT_MAX]);
1047  (ASM_REWRITE_TAC[]);
1048  (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_MAX_LT]);
1049  (STRIP_TAC);
1050  (ASM_REWRITE_TAC[]);
1051  (REWRITE_WITH `hl [u0; u1:real^3] / sqrt (&2) < &1 <=> 
1052                  hl [u0; u1] < &1 * sqrt (&2)`);
1053  (MATCH_MP_TAC REAL_LT_LDIV_EQ);
1054  (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
1055  (ASM_REAL_ARITH_TAC);
1056
1057  (NEW_GOAL `rcone_gt u0 u1 c SUBSET 
1058              W INTER (rcone_gt u0 u1 (hl [u0; u1:real^3] / sqrt (&2)))`);
1059  (REWRITE_TAC[SUBSET_INTER]);
1060  (STRIP_TAC);
1061  (NEW_GOAL `rcone_gt (u0:real^3) u1 c SUBSET rcone_gt u0 u1 b`);
1062  (MATCH_MP_TAC RCONE_GT_SUBSET);
1063  (EXPAND_TAC "c" THEN REAL_ARITH_TAC);
1064  (ASM_SET_TAC[]);
1065  (MATCH_MP_TAC RCONE_GT_SUBSET);
1066  (EXPAND_TAC "c" THEN REAL_ARITH_TAC);
1067
1068  (ABBREV_TAC `C = ball (u0:real^3,&1) INTER rcone_gt u0 u1 c`);
1069  (NEW_GOAL `C SUBSET 
1070       UNIONS
1071       {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1072  (REWRITE_TAC[SUBSET]);
1073  (REPEAT STRIP_TAC);
1074  (NEW_GOAL `x IN ball (u0:real^3,&1)  /\ x IN aff_ge_alt {u0} S`);
1075  (ASM_SET_TAC[]);
1076  (UP_ASM_TAC THEN STRIP_TAC);
1077
1078 (* OK until here *)
1079 (* ===========================================================================*)
1080
1081  (NEW_GOAL `(x:real^3) IN convex hull (u0 INSERT S)`);
1082  (REWRITE_TAC[CONVEX_HULL_EXPLICIT; IN; IN_ELIM_THM]);
1083
1084  (UP_ASM_TAC THEN REWRITE_TAC[IN; aff_ge_alt; lin_combo]);
1085  (REPEAT STRIP_TAC);
1086  (EXISTS_TAC `{u0:real^3} UNION q`);
1087  (EXISTS_TAC `f:real^3->real`);
1088  (REPEAT STRIP_TAC);
1089  (REWRITE_TAC[SET_RULE `{a} UNION b = a INSERT b`; FINITE_INSERT]);
1090  (ASM_REWRITE_TAC[]);
1091  (ASM_SET_TAC[]);
1092  (ASM_CASES_TAC `x':real^3 IN q`);
1093  (FIRST_ASSUM MATCH_MP_TAC);
1094  (UP_ASM_TAC THEN MESON_TAC[IN]);
1095  (REWRITE_WITH `x' = u0:real^3`);
1096  (NEW_GOAL `x' IN ({u0:real^3} UNION q)`);
1097  (ASM_REWRITE_TAC[IN]);
1098  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
1099  (REWRITE_TAC[REAL_ARITH `&0 <= x <=> ~(x < &0)`]);
1100  (STRIP_TAC);
1101  (UNDISCH_TAC `x IN ball (u0:real^3,&1)`);
1102  (ASM_REWRITE_TAC[IN_BALL; SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);
1103  (REWRITE_WITH `vsum (u0 INSERT (q DELETE u0:real^3)) (\v. f v % v) = 
1104   (if u0 IN (q DELETE u0) then vsum (q DELETE u0) (\v. f v % v)
1105    else (\v. f v % v) u0 + vsum (q DELETE u0) (\v. f v % v))`);
1106  (MATCH_MP_TAC Marchal_cells_2_new.VSUM_CLAUSES_alt);
1107  (ASM_REWRITE_TAC[FINITE_DELETE]);
1108  (COND_CASES_TAC);
1109  (NEW_GOAL `F`);
1110  (UP_ASM_TAC THEN SET_TAC[]);
1111  (ASM_MESON_TAC[]);
1112  (ONCE_REWRITE_TAC[DIST_SYM]);
1113  (REWRITE_TAC[dist]);
1114  (REWRITE_WITH `!a. a - u0 = a - (sum ({u0:real^3} UNION q) f) % u0`);
1115  (ASM_REWRITE_TAC[]);
1116  (VECTOR_ARITH_TAC);
1117
1118
1119  (NEW_GOAL `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`);
1120  (REWRITE_TAC[SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);
1121  (REWRITE_WITH `sum (u0 INSERT (q DELETE u0:real^3)) f = 
1122   (if u0 IN (q DELETE u0) then sum (q DELETE u0) f
1123    else f u0 + sum (q DELETE u0) f)`);
1124  (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
1125  (ASM_REWRITE_TAC[FINITE_DELETE]);
1126  (COND_CASES_TAC);
1127  (NEW_GOAL `F`);
1128  (UP_ASM_TAC THEN SET_TAC[]);
1129  (ASM_MESON_TAC[]);
1130  (ASM_REWRITE_TAC[]);
1131  (REWRITE_TAC[VECTOR_ADD_RDISTRIB;
1132    VECTOR_ARITH `(a + b) - (a + c:real^3) = b - c`;
1133    ASSUME `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`; ]);
1134  (ABBREV_TAC `h = sum (q DELETE u0:real^3) f`);
1135  (ABBREV_TAC `y = inv (h) % vsum (q DELETE u0) (\v:real^3. f v % v)`);
1136  (NEW_GOAL `h > &1`);
1137  (ASM_REAL_ARITH_TAC);
1138  (REWRITE_WITH `vsum (q DELETE u0) (\v. f v % v) = h % y:real^3`);
1139  (EXPAND_TAC "y");
1140  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
1141  (REWRITE_WITH `h * inv h = &1`);
1142  (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);
1143  (VECTOR_ARITH_TAC);
1144  (REWRITE_TAC[VECTOR_ARITH `h % a - h % b = h % (a - b)`; NORM_MUL]);
1145  (REWRITE_TAC[REAL_ARITH `~(a < b) <=> b <= a`]);
1146
1147  (NEW_GOAL `norm (p - u0) <= norm (y - u0:real^3)`);
1148  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
1149  (REWRITE_TAC[NORM_POS_LE]);
1150  (REWRITE_WITH 
1151   `norm (y - u0) pow 2 = norm (p - u0) pow 2 + norm (y - p:real^3) pow 2`);
1152  (MATCH_MP_TAC PYTHAGORAS);
1153  (REWRITE_TAC[orthogonal]);
1154  (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
1155  (ASM_REWRITE_TAC[set_of_list]);
1156  (ONCE_REWRITE_TAC[DOT_SYM]);
1157  (MATCH_MP_TAC Rogers.MHFTTZN4);
1158  (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
1159  (REPEAT STRIP_TAC);
1160  (ASM_REWRITE_TAC[]);
1161  (ASM_REWRITE_TAC[]);
1162
1163  (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);
1164  (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);
1165  (EXISTS_TAC `q DELETE u0:real^3`);
1166  (EXISTS_TAC `(\v:real^3. inv h * f v)`);
1167  (REPEAT STRIP_TAC);
1168  (ASM_REWRITE_TAC[FINITE_DELETE]);
1169  (ASM_SET_TAC[]);
1170  (ASM_REWRITE_TAC[SUM_LMUL]);
1171  (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);
1172  (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);
1173  (ASM_REWRITE_TAC[VSUM_LMUL]);
1174
1175  (REWRITE_TAC[set_of_list]);
1176  (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);
1177  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
1178  (ASM_SET_TAC[]);
1179  (REWRITE_TAC[REAL_ARITH `a <= a + b <=> &0 <= b`; NORM_POW_2; DOT_POS_LE]);
1180
1181  (NEW_GOAL `&1 <= norm (p - u0:real^3)`);
1182  (EXPAND_TAC "p");
1183  (REWRITE_TAC[CIRCUMCENTER_2; midpoint; 
1184    VECTOR_ARITH `inv (&2) % (u0 + u1) - u0 = inv (&2) % (u1 - u0)`; 
1185    NORM_MUL; REAL_ARITH `abs (inv(&2)) = inv (&2)`]);
1186  (REWRITE_TAC[GSYM dist]);
1187  (REWRITE_WITH `&1 = inv (&2) * &2`);
1188  (REAL_ARITH_TAC);
1189  (REWRITE_TAC[REAL_ARITH `inv (&2) * &2 <= inv (&2) * a <=> &2 <= a`]);
1190  (MP_TAC (ASSUME `packing (V:real^3->bool)`));
1191  (REWRITE_TAC[packing] THEN STRIP_TAC);
1192  (FIRST_ASSUM MATCH_MP_TAC);
1193  (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1194  (REWRITE_WITH `abs h = h`);
1195  (ASM_REAL_ARITH_TAC);
1196
1197  (NEW_GOAL `h <= h * norm (y - u0:real^3)`);
1198  (REWRITE_TAC[REAL_ARITH `h <= h * a <=> &0 <= h * (a - &1)`]);
1199  (MATCH_MP_TAC REAL_LE_MUL);
1200  (ASM_REAL_ARITH_TAC);
1201  (ASM_REAL_ARITH_TAC);
1202
1203  (ASM_REWRITE_TAC[]);
1204  (ASM_REWRITE_TAC[]);
1205
1206 (* ========================================================================== *)
1207  (NEW_GOAL `~(S:real^3->bool = {})`);
1208  (STRIP_TAC);
1209  (NEW_GOAL `~(aff_dim (u0:real^3 INSERT S) = &3)`);
1210  (REWRITE_TAC[ASSUME `S:real^3->bool = {}`; AFF_DIM_SING]);
1211  (ARITH_TAC);
1212  (ASM_MESON_TAC[]);
1213  (SWITCH_TAC);
1214  (UP_ASM_TAC THEN SIMP_TAC[CONVEX_HULL_INSERT; 
1215    ASSUME `~(S:real^3->bool = {})`]);
1216  (REWRITE_WITH `convex hull S = S:real^3->bool`);
1217  (REWRITE_TAC[CONVEX_HULL_EQ]);
1218  (EXPAND_TAC "S" THEN REWRITE_TAC[Packing3.CONVEX_VORONOI_LIST]);
1219  (ASM_REWRITE_TAC[]);
1220  (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);
1221  (REPEAT STRIP_TAC);
1222
1223  (EXISTS_TAC `rogers V vl`);
1224  (REPEAT STRIP_TAC);
1225  (EXISTS_TAC `vl:(real^3)list`);
1226  (ASM_REWRITE_TAC[]);
1227
1228  (ASM_SIMP_TAC[Marchal_cells_2.ROGERS_EXPLICIT]);
1229  (REWRITE_TAC[CONVEX_HULL_4; IN_ELIM_THM]);
1230
1231  (UNDISCH_TAC `(t:real^3->bool) b'`);
1232  (ASM_REWRITE_TAC[CONVEX_HULL_3; IN_ELIM_THM]);
1233  (REPEAT STRIP_TAC);
1234
1235  (EXISTS_TAC `u:real`);
1236  (EXISTS_TAC `v * u'`);
1237  (EXISTS_TAC `v * v'`);
1238  (EXISTS_TAC `v * w`);
1239  (ASM_SIMP_TAC[REAL_LE_MUL]);
1240  (STRIP_TAC);
1241
1242  (REWRITE_TAC[REAL_ARITH `u + v * u' + v * v' + v * w = u + v * (u' + v' +w)`]);
1243  (ASM_REWRITE_TAC[]);
1244  (ASM_REAL_ARITH_TAC);
1245
1246  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
1247  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1248  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1249  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1250  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1251  (EXISTS_TAC `V:real^3->bool`);
1252  (ASM_REWRITE_TAC[]);
1253  (ARITH_TAC);
1254
1255  (ASM_REWRITE_TAC[HD]);
1256  (VECTOR_ARITH_TAC);
1257
1258 (* ========================================================================= *)
1259 (* ========================================================================== *)
1260
1261  (NEW_GOAL 
1262  `!X. mcell_set V X /\ ~NULLSET (X INTER C)
1263      ==> (?k vl.
1264               2 <= k /\
1265               barV V 3 vl /\
1266               X = mcell k V vl /\
1267               truncate_simplex 1 vl = [u0; u1])`);
1268
1269  (REWRITE_TAC[mcell_set_2; IN_ELIM_THM]);
1270  (REPEAT STRIP_TAC);
1271
1272  (NEW_GOAL `~NULLSET (X INTER UNIONS
1273       {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]})`);
1274  (STRIP_TAC);
1275  (UNDISCH_TAC `~NULLSET (X INTER C)`);
1276  (REWRITE_TAC[]);
1277  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1278  (EXISTS_TAC `X INTER
1279        UNIONS
1280        {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1281  (STRIP_TAC);
1282  (ASM_REWRITE_TAC[]);
1283  (ASM_SET_TAC[]);
1284  (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1285  (STRIP_TAC);
1286
1287  (NEW_GOAL 
1288   `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);
1289  (MESON_TAC[NEGLIGIBLE_UNIONS]);
1290  (ABBREV_TAC `St = {X INTER x | x IN
1291                     {rogers V vl | vl | barV V 3 vl /\
1292                                         truncate_simplex 1 vl = [u0; u1]}}`);
1293  (NEW_GOAL `?t. t IN St /\ ~NULLSET t`);
1294  (FIRST_ASSUM MATCH_MP_TAC);
1295  (ASM_REWRITE_TAC[]);
1296  (EXPAND_TAC "St");
1297  (ABBREV_TAC `Sr = {rogers V vl | vl | barV V 3 vl /\
1298                                   truncate_simplex 1 vl = [u0; u1]}`);
1299  (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);
1300  (MATCH_MP_TAC FINITE_SUBSET);
1301  (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sr /\ y = f x }`);
1302  (STRIP_TAC);
1303
1304
1305
1306  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1307  (ABBREV_TAC `Ss = {vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1308  (MATCH_MP_TAC FINITE_SUBSET);
1309  (EXISTS_TAC `{y | ?vl. vl IN Ss /\ y = rogers V vl}`);
1310  (STRIP_TAC);
1311  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1312  (ABBREV_TAC `Sx = V INTER ball (u0:real^3, &4)`);
1313  (MATCH_MP_TAC FINITE_SUBSET);
1314  (EXISTS_TAC `{y | ?u0 u1 u2 u3:real^3.
1315                       u0 IN Sx /\
1316                       u1 IN Sx /\
1317                       u2 IN Sx /\
1318                       u3 IN Sx /\
1319                       y = [u0; u1; u2; u3]}`);
1320  (STRIP_TAC);
1321  (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA);
1322  (EXPAND_TAC "Sx");
1323  (MATCH_MP_TAC Pack2.KIUMVTC);
1324  (ASM_REWRITE_TAC[]);
1325  (EXPAND_TAC "Ss");
1326  (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
1327  (REPEAT STRIP_TAC);
1328
1329  (NEW_GOAL `?v0 v1 v2 v3. x = [v0;v1;v2;v3:real^3]`);
1330  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1331  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1332  (UP_ASM_TAC THEN STRIP_TAC);
1333  (EXISTS_TAC `v0:real^3`);
1334  (EXISTS_TAC `v1:real^3`);
1335  (EXISTS_TAC `v2:real^3`);
1336  (EXISTS_TAC `v3:real^3`);
1337  (ASM_REWRITE_TAC[]);
1338
1339  (NEW_GOAL `{v0, v1, v2, v3:real^3} SUBSET Sx`);
1340  (EXPAND_TAC "Sx");
1341  (REWRITE_TAC[SUBSET_INTER]);
1342  (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list x`);
1343  (ASM_REWRITE_TAC[set_of_list]);
1344  (STRIP_TAC);
1345  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1346  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1347  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1348  (EXISTS_TAC `V:real^3->bool`);
1349  (ASM_REWRITE_TAC[]);
1350  (NEW_GOAL `HD (truncate_simplex 1 x) = u0:real^3`);
1351  (ASM_REWRITE_TAC[HD]);
1352  (NEW_GOAL `HD (truncate_simplex 1 x) = v0:real^3`);
1353  (REWRITE_TAC[ASSUME `x = [v0; v1; v2; v3:real^3]`;  
1354    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1355  (REWRITE_WITH `u0 = v0:real^3`);
1356  (ASM_MESON_TAC[]);
1357  (REWRITE_TAC[set_of_list] THEN SET_TAC[]);
1358  (UP_ASM_TAC THEN SET_TAC[]);
1359
1360  (EXPAND_TAC "Sr" THEN EXPAND_TAC "Ss");
1361  (SET_TAC[]);
1362  (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sr} = {f x | x IN Sr}`);
1363  (EXPAND_TAC "f");
1364  (REFL_TAC);
1365  (SET_TAC[]);
1366  (UP_ASM_TAC THEN EXPAND_TAC "St" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1367  (REPEAT STRIP_TAC);
1368
1369  (NEW_GOAL `x SUBSET UNIONS {mcell i V vl | i <= 4}`);
1370  (ASM_REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM]);
1371  (REPEAT STRIP_TAC);
1372  (NEW_GOAL `?i. i <= 4 /\ x' IN mcell i V vl`);
1373  (MATCH_MP_TAC Sltstlo.SLTSTLO1);
1374  (ASM_REWRITE_TAC[IN]);
1375  (UP_ASM_TAC THEN STRIP_TAC);
1376  (EXISTS_TAC `mcell i' V vl`);
1377  (STRIP_TAC);
1378  (EXISTS_TAC `i':num` THEN ASM_REWRITE_TAC[]);
1379  (UP_ASM_TAC THEN REWRITE_TAC[IN]);
1380
1381  (NEW_GOAL `~NULLSET (X INTER UNIONS {mcell i V vl | i <= 4})`);
1382  (STRIP_TAC);
1383  (UNDISCH_TAC `~NULLSET (t)`);
1384  (REWRITE_TAC[ASSUME `t:real^3->bool = X INTER x`]);
1385  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1386  (EXISTS_TAC `X INTER UNIONS {mcell i V vl | i <= 4}`);
1387  (STRIP_TAC);
1388  (ASM_REWRITE_TAC[]);
1389  (ASM_SET_TAC[]);
1390  (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1391  (STRIP_TAC);
1392
1393  (NEW_GOAL 
1394   `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);
1395  (MESON_TAC[NEGLIGIBLE_UNIONS]);
1396  (ABBREV_TAC `Sx = {X INTER x | x IN {mcell i V vl | i <= 4}}`);
1397  (NEW_GOAL `?t. t IN Sx /\ ~NULLSET t`);
1398  (FIRST_ASSUM MATCH_MP_TAC);
1399  (ASM_REWRITE_TAC[]);
1400  (EXPAND_TAC "Sx");
1401  (ABBREV_TAC `Sy = {mcell i V vl | i <= 4}`);
1402  (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);
1403  (MATCH_MP_TAC FINITE_SUBSET);
1404  (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sy /\ y = f x }`);
1405  (STRIP_TAC);
1406  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1407  (EXPAND_TAC "Sy");
1408  (REWRITE_TAC[GSYM IN_NUMSEG_0]);
1409  (ABBREV_TAC `g = (\i:num. mcell i V vl)`);
1410  (REWRITE_WITH `{mcell i V vl | i IN 0..4} = {g i | i IN 0..4}`);
1411  (EXPAND_TAC "g" THEN REWRITE_TAC[]);
1412  (MATCH_MP_TAC FINITE_SUBSET);
1413  (EXISTS_TAC `{y:real^3->bool | ?i. i IN 0..4 /\ y = g i}`);
1414  (STRIP_TAC);
1415  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1416  (REWRITE_TAC[FINITE_NUMSEG]);
1417  (SET_TAC[]);
1418  (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sy} = {f x | x IN Sy}`);
1419  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
1420  (SET_TAC[]);
1421  (UP_ASM_TAC THEN EXPAND_TAC "Sx" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1422  (REPEAT STRIP_TAC);
1423
1424 (* ========================================================================= *)
1425
1426  (NEW_GOAL `i = i' /\ mcell i V ul = mcell i' V vl`);
1427  (MATCH_MP_TAC Ajripqn.AJRIPQN);
1428  (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
1429  (REPEAT STRIP_TAC);
1430  (UNDISCH_TAC `ul IN barV V 3` THEN REWRITE_TAC[IN]);
1431  (UNDISCH_TAC `~NULLSET t'`);
1432  (ASM_REWRITE_TAC[]);
1433  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
1434  (ASM_REWRITE_TAC[]);
1435
1436 (* ========================================================================= *)
1437
1438  (ASM_CASES_TAC `i' = 0`);
1439  (NEW_GOAL `F`);
1440  (UNDISCH_TAC `~NULLSET (X INTER C)`);
1441  (REWRITE_TAC[]);
1442  (REWRITE_WITH `X INTER C = {}:real^3->bool`);
1443  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
1444  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
1445  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1446  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1447  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1448  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1449  (EXISTS_TAC `V:real^3->bool`);
1450  (ASM_REWRITE_TAC[]);
1451  (ARITH_TAC);
1452  (ASM_REWRITE_TAC[HD]);
1453  (NEW_GOAL `C SUBSET ball (u0:real^3, sqrt (&2))`);
1454  (NEW_GOAL `ball (u0:real^3, &1) SUBSET ball (u0, sqrt (&2))`);
1455  (MATCH_MP_TAC SUBSET_BALL);
1456  (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));
1457  (REWRITE_TAC[Marchal_cells_2_new.ZERO_LT_SQRT_2]);
1458  (ASM_SET_TAC[]);
1459  (UP_ASM_TAC THEN SET_TAC[]);
1460  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1461  (ASM_MESON_TAC[]);
1462
1463  (ASM_CASES_TAC `i' = 1`);
1464  (NEW_GOAL `F`);
1465  (UNDISCH_TAC `~NULLSET (X INTER C)`);
1466  (REWRITE_TAC[]);
1467  (REWRITE_WITH `X INTER C = {}:real^3->bool`);
1468  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell1]);
1469  (COND_CASES_TAC);
1470  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
1471  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1472  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1473  (UP_ASM_TAC THEN STRIP_TAC);
1474  (ASM_REWRITE_TAC[HD; TL]);
1475
1476  (REWRITE_WITH `v0 = u0:real^3`);
1477  (NEW_GOAL `HD (truncate_simplex 1 vl) = u0:real^3`);
1478  (ASM_REWRITE_TAC[HD]);
1479  (NEW_GOAL `HD (truncate_simplex 1 vl) = v0:real^3`);
1480  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
1481    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1482  (ASM_MESON_TAC[]);
1483
1484  (REWRITE_WITH `v1 = u1:real^3`);
1485  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
1486  (ASM_REWRITE_TAC[HD; TL]);
1487  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
1488  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
1489    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1490  (ASM_MESON_TAC[]);
1491
1492  (NEW_GOAL `C SUBSET (rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2)))`);
1493  (EXPAND_TAC "C");
1494  (SET_TAC[ASSUME `rcone_gt u0 u1 c SUBSET
1495                    W INTER rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2))`]);
1496  (UP_ASM_TAC THEN SET_TAC[]);
1497  (SET_TAC[]);
1498  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1499  (UP_ASM_TAC THEN MESON_TAC[]);
1500  (ASM_ARITH_TAC);
1501
1502 (* ========================================================================= *)
1503
1504  (ABBREV_TAC `f1 = 
1505   (\ul. dist (u0:real^3, 
1506               closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0))`);
1507
1508  (ABBREV_TAC `P1 = { (f1:(real^3)list->real) ul |ul | barV V 3 ul /\
1509                                  ~NULLSET (mcell 3 V ul INTER C) /\
1510                                   truncate_simplex 1 ul = [u0; u1]}`);
1511
1512  (NEW_GOAL `~(P1 = {}) ==> (?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
1513  (STRIP_TAC);
1514  (MATCH_MP_TAC INF_FINITE_LEMMA);
1515  (ASM_REWRITE_TAC[]);
1516  (EXPAND_TAC "P1");
1517  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1518  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1519  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1520  (MATCH_MP_TAC FINITE_SUBSET);
1521  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1522                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1523                       v1 IN (V INTER ball (u0, &4)) /\
1524                       u2 IN (V INTER ball (u0, &4)) /\
1525                       u3 IN (V INTER ball (u0, &4)) /\
1526                       y = [v0; v1; u2; u3]}`);
1527  (STRIP_TAC);
1528  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1529  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1530  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1531  (REPEAT STRIP_TAC);
1532  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1533  (MATCH_MP_TAC BARV_3_EXPLICIT);
1534  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1535  (UP_ASM_TAC THEN STRIP_TAC);
1536  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1537    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1538  (ASM_REWRITE_TAC[]);
1539  (NEW_GOAL `v0 = u0:real^3`);
1540  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1541  (ASM_REWRITE_TAC[HD]);
1542  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1543  (ASM_REWRITE_TAC[HD]);
1544  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1545  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1546  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1547  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1548  (EXISTS_TAC `V:real^3->bool`);
1549  (ASM_REWRITE_TAC[set_of_list]);
1550  (SET_TAC[]);
1551  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1552  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1553  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1554  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1555  (SET_TAC[]);
1556
1557  (ABBREV_TAC `r1 = (if (P1 = {}:real->bool) then &1 
1558                     else (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x)))`);
1559  (NEW_GOAL `&0 < r1`);
1560  (EXPAND_TAC "r1");
1561  (COND_CASES_TAC);
1562  (REAL_ARITH_TAC);
1563  (NEW_GOAL `?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x)`);
1564  (ASM_SIMP_TAC[]);
1565  (UP_ASM_TAC THEN STRIP_TAC);
1566  (ABBREV_TAC `P  = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
1567  (ABBREV_TAC `zz = (@) (P:real->bool)`);
1568  (NEW_GOAL `(P:real->bool) zz`);
1569  (EXPAND_TAC "zz");
1570  (MATCH_MP_TAC SELECT_AX);
1571  (EXISTS_TAC `b':real`);
1572  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1573  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1574  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1575  (REPEAT STRIP_TAC);
1576  (ASM_REWRITE_TAC[]);
1577  (EXPAND_TAC "f1");
1578  (MATCH_MP_TAC DIST_POS_LT);
1579  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1580  (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0 = u0
1581   <=> u0 IN (affine hull {u1:real^3, EL 2 ul, mxi V ul})`);
1582  (MATCH_MP_TAC CLOSEST_POINT_REFL);
1583  (REWRITE_TAC[CLOSED_AFFINE_HULL]);
1584  (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
1585  (STRIP_TAC);
1586  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
1587  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1588  (EXISTS_TAC `mcell 3 V ul`);
1589  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1590  (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
1591  (COND_CASES_TAC);
1592
1593  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1594  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1595  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1596  (UP_ASM_TAC THEN STRIP_TAC);
1597  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
1598
1599  (REWRITE_WITH `v0 = u0:real^3`);
1600  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1601  (ASM_REWRITE_TAC[HD]);
1602  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1603  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1604    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1605  (ASM_MESON_TAC[]);
1606
1607  (REWRITE_WITH `v1 = u1:real^3`);
1608  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1609  (ASM_REWRITE_TAC[HD; TL]);
1610  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1611  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1612    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1613  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1614  (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
1615
1616  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1617  (EXISTS_TAC `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]}`);
1618  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1619  (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} = 
1620                  affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
1621  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
1622  (REWRITE_WITH `affine hull {u1, v2, mxi V [u0; u1; v2; v3]} = 
1623                  affine hull {u1, EL 2 ul, mxi V ul}`);
1624  (ASM_REWRITE_TAC[EL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
1625
1626  (REWRITE_WITH `v0 = u0:real^3`);
1627  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1628  (ASM_REWRITE_TAC[HD]);
1629  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1630  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1631    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1632  (ASM_MESON_TAC[]);
1633
1634  (REWRITE_WITH `v1 = u1:real^3`);
1635  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1636  (ASM_REWRITE_TAC[HD; TL]);
1637  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1638  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1639    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1640  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1641  (ASM_REWRITE_TAC[]);
1642  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1643  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1644
1645 (* ========================================================================= *)
1646
1647  (ABBREV_TAC `f2 = 
1648   (\ul. dist (u0:real^3, 
1649               closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0))`);
1650
1651  (ABBREV_TAC `P2 = { (f2:(real^3)list->real) ul |ul | barV V 3 ul /\
1652                                  ~NULLSET (mcell 4 V ul INTER C) /\
1653                                   truncate_simplex 1 ul = [u0; u1]}`);
1654
1655  (NEW_GOAL `~(P2 = {}) ==> (?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
1656  (STRIP_TAC);
1657  (MATCH_MP_TAC INF_FINITE_LEMMA);
1658  (ASM_REWRITE_TAC[]);
1659  (EXPAND_TAC "P2");
1660  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1661  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1662  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1663  (MATCH_MP_TAC FINITE_SUBSET);
1664  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1665                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1666                       v1 IN (V INTER ball (u0, &4)) /\
1667                       u2 IN (V INTER ball (u0, &4)) /\
1668                       u3 IN (V INTER ball (u0, &4)) /\
1669                       y = [v0; v1; u2; u3]}`);
1670  (STRIP_TAC);
1671  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1672  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1673  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1674  (REPEAT STRIP_TAC);
1675  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1676  (MATCH_MP_TAC BARV_3_EXPLICIT);
1677  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1678  (UP_ASM_TAC THEN STRIP_TAC);
1679  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1680    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1681  (ASM_REWRITE_TAC[]);
1682  (NEW_GOAL `v0 = u0:real^3`);
1683  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1684  (ASM_REWRITE_TAC[HD]);
1685  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1686  (ASM_REWRITE_TAC[HD]);
1687  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1688  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1689  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1690  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1691  (EXISTS_TAC `V:real^3->bool`);
1692  (ASM_REWRITE_TAC[set_of_list]);
1693  (SET_TAC[]);
1694  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1695  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1696  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1697  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1698  (SET_TAC[]);
1699
1700  (ABBREV_TAC `r2 = (if (P2 = {}:real->bool) then &1 
1701                     else (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x)))`);
1702
1703  (NEW_GOAL `&0 < r2`);
1704  (EXPAND_TAC "r2");
1705  (COND_CASES_TAC);
1706  (REAL_ARITH_TAC);
1707  (NEW_GOAL `?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x)`);
1708  (ASM_SIMP_TAC[]);
1709  (UP_ASM_TAC THEN STRIP_TAC);
1710  (ABBREV_TAC `P  = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
1711  (ABBREV_TAC `zz = (@) (P:real->bool)`);
1712  (NEW_GOAL `(P:real->bool) zz`);
1713  (EXPAND_TAC "zz");
1714  (MATCH_MP_TAC SELECT_AX);
1715  (EXISTS_TAC `b':real`);
1716  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1717  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1718  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1719  (REPEAT STRIP_TAC);
1720  (ASM_REWRITE_TAC[]);
1721  (EXPAND_TAC "f2");
1722  (MATCH_MP_TAC DIST_POS_LT);
1723  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1724  (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0 = u0
1725   <=> u0 IN (affine hull {u1:real^3, EL 2 ul, EL 3 ul})`);
1726  (MATCH_MP_TAC CLOSEST_POINT_REFL);
1727  (REWRITE_TAC[CLOSED_AFFINE_HULL]);
1728  (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
1729  (STRIP_TAC);
1730  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
1731  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1732  (EXISTS_TAC `mcell 4 V ul`);
1733  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1734  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4]);
1735  (COND_CASES_TAC);
1736
1737  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1738  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1739  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1740  (UP_ASM_TAC THEN STRIP_TAC);
1741  (ASM_REWRITE_TAC[set_of_list]);
1742
1743  (REWRITE_WITH `v0 = u0:real^3`);
1744  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1745  (ASM_REWRITE_TAC[HD]);
1746  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1747  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1748    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1749  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1750
1751  (REWRITE_WITH `v1 = u1:real^3`);
1752  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1753  (ASM_REWRITE_TAC[HD; TL]);
1754  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1755  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1756    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1757  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1758
1759  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1760  (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
1761  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1762  (REWRITE_WITH `affine hull {u0, u1, v2, v3:real^3} = 
1763                  affine hull {u1, v2, v3}`);
1764  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
1765  (REWRITE_WITH `affine hull {u1, v2, v3:real^3} = 
1766                  affine hull {u1, EL 2 ul, EL 3 ul}`);
1767  (ASM_REWRITE_TAC[EL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
1768  (ASM_REWRITE_TAC[]);
1769
1770  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1771  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1772
1773 (* ========================================================================= *)
1774
1775  (ABBREV_TAC `r = min (&1) (min r1 r2)`);
1776  (NEW_GOAL `&0 < r`);
1777  (EXPAND_TAC "r");
1778  (UNDISCH_TAC `&0 < r1` THEN UNDISCH_TAC `&0  < r2` THEN REAL_ARITH_TAC);
1779
1780 (* ========================================================================= *)
1781
1782  (ABBREV_TAC `f3 = 
1783   (\ul. (((smallest_angle_line (EL 2 ul)  (mxi V ul) u0 u1) - u0)
1784    dot (u1 - u0)) / 
1785    (norm ((smallest_angle_line (EL 2 ul)  (mxi V ul) u0 u1) - u0)
1786    * norm (u1 - u0)))`);
1787
1788  (ABBREV_TAC `P3 = {(f3:(real^3)list->real) ul |ul | barV V 3 ul /\
1789                                  ~NULLSET (mcell 3 V ul INTER C) /\
1790                                   truncate_simplex 1 ul = [u0; u1]}`);
1791
1792  (NEW_GOAL `~(P3 = {}) ==> (?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
1793  (STRIP_TAC);
1794  (MATCH_MP_TAC SUP_FINITE_LEMMA);
1795  (ASM_REWRITE_TAC[]);
1796  (EXPAND_TAC "P3");
1797  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1798  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1799  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1800  (MATCH_MP_TAC FINITE_SUBSET);
1801  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1802                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1803                       v1 IN (V INTER ball (u0, &4)) /\
1804                       u2 IN (V INTER ball (u0, &4)) /\
1805                       u3 IN (V INTER ball (u0, &4)) /\
1806                       y = [v0; v1; u2; u3]}`);
1807  (STRIP_TAC);
1808  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1809  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1810  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1811  (REPEAT STRIP_TAC);
1812  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1813  (MATCH_MP_TAC BARV_3_EXPLICIT);
1814  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1815  (UP_ASM_TAC THEN STRIP_TAC);
1816  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1817    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1818  (ASM_REWRITE_TAC[]);
1819  (NEW_GOAL `v0 = u0:real^3`);
1820  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1821  (ASM_REWRITE_TAC[HD]);
1822  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1823  (ASM_REWRITE_TAC[HD]);
1824  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1825  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1826  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1827  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1828  (EXISTS_TAC `V:real^3->bool`);
1829  (ASM_REWRITE_TAC[set_of_list]);
1830  (SET_TAC[]);
1831  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1832  (MATCH_MP_TAC Packing3.BARV_SUBSET);
1833  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1834  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1835  (SET_TAC[]);
1836
1837  (ABBREV_TAC `d1 = (if (P3 = {}:real->bool) then c 
1838                     else (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b)))`);
1839
1840  (NEW_GOAL `d1 < &1`);
1841  (EXPAND_TAC "d1");
1842  (COND_CASES_TAC);
1843  (ASM_REWRITE_TAC[]);
1844  (NEW_GOAL `?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b)`);
1845  (ASM_SIMP_TAC[]);
1846  (UP_ASM_TAC THEN STRIP_TAC);
1847  (ABBREV_TAC `P  = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
1848  (ABBREV_TAC `zz = (@) (P:real->bool)`);
1849  (NEW_GOAL `(P:real->bool) zz`);
1850  (EXPAND_TAC "zz");
1851  (MATCH_MP_TAC SELECT_AX);
1852  (EXISTS_TAC `b':real`);
1853  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1854  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1855  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1856  (REPEAT STRIP_TAC);
1857  (ASM_REWRITE_TAC[]);
1858  (EXPAND_TAC "f3");
1859
1860  (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (mxi V ul) u0 u1`);
1861  (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
1862  (STRIP_TAC);
1863  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
1864  (STRIP_TAC);
1865  (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
1866  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
1867  (ASM_REWRITE_TAC[]);
1868  (EXPAND_TAC "xx");
1869  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN 
1870    REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
1871  (STRIP_TAC);
1872  (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, mxi V ul} /\
1873            (!y. y IN convex hull {EL 2 ul, mxi V ul}
1874                 ==> ((y - u0) dot (u1 - u0)) /
1875                     (norm (y - u0) * norm (u1 - u0)) <=
1876                     ((x - u0) dot (u1 - u0)) /
1877                     (norm (x - u0) * norm (u1 - u0))))`);
1878  (NEW_GOAL `(Q:real^3->bool) u0`);
1879  (REWRITE_TAC[ASSUME `u0 = (@) (Q:real^3->bool)`]);
1880  (MATCH_MP_TAC SELECT_AX);
1881  (EXPAND_TAC "Q");
1882  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
1883  (STRIP_TAC);
1884  (ASM_REWRITE_TAC[]);
1885
1886  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
1887  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
1888  (MATCH_MP_TAC BARV_3_EXPLICIT);
1889  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1890  (UP_ASM_TAC THEN STRIP_TAC);
1891  (EXISTS_TAC `v1:real^3` THEN     
1892    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
1893  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
1894
1895  (NEW_GOAL `v0 = u0:real^3`);
1896  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
1897  (ASM_REWRITE_TAC[HD]);
1898  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
1899  (ASM_REWRITE_TAC[HD]);
1900  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1901  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1902  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
1903  (UP_ASM_TAC THEN STRIP_TAC);
1904  (REWRITE_WITH `EL 2 ul = v2:real^3`);
1905  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
1906  (STRIP_TAC);
1907
1908  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
1909  (REWRITE_TAC[]);
1910  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1911  (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);
1912  (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
1913    TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
1914    SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);
1915  (COND_CASES_TAC);
1916  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1917  (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);
1918  (STRIP_TAC);
1919  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1920  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
1921  (REWRITE_TAC[coplanar]);
1922  (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);
1923  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
1924  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
1925    EXISTS_TAC `mxi V ul`);
1926  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
1927  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
1928  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
1929  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
1930  (STRIP_TAC);
1931  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
1932  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
1933  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1934  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1935  (SET_TAC[]);
1936
1937  (UP_ASM_TAC THEN EXPAND_TAC "Q");
1938  (STRIP_TAC);
1939  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);
1940  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1941  (EXISTS_TAC `mcell 3 V ul`);
1942  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1943  (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
1944  (COND_CASES_TAC);
1945  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
1946  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1947  (MATCH_MP_TAC BARV_3_EXPLICIT);
1948  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1949  (UP_ASM_TAC THEN STRIP_TAC);
1950  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
1951  (REWRITE_TAC[ASSUME `ul = [v0;v1;v2;v3:real^3]`]);
1952
1953  (REWRITE_WITH `v0 = u0:real^3`);
1954  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1955  (ASM_REWRITE_TAC[HD]);
1956  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1957  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1958    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1959  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1960
1961  (REWRITE_WITH `v1 = u1:real^3`);
1962  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1963  (ASM_REWRITE_TAC[HD; TL]);
1964  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1965  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1966    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1967  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1968  (UP_ASM_TAC THEN STRIP_TAC);
1969  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; 
1970    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
1971  (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);
1972
1973  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1974  (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);
1975  (REWRITE_TAC[ASSUME `ul = [u0; u1; v2; v3:real^3]`;   
1976                CONVEX_HULL_SUBSET_AFFINE_HULL]);
1977  (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} = 
1978                  affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
1979  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
1980
1981  (NEW_GOAL `convex hull {EL 2 ul, mxi V ul} SUBSET 
1982              affine hull {EL 2 ul, mxi V ul}`);
1983  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1984  (NEW_GOAL `affine hull {EL 2 ul, mxi V ul} SUBSET 
1985              affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
1986  (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
1987  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
1988  (SET_TAC[]);
1989  (UP_ASM_TAC THEN UP_ASM_TAC THEN 
1990    UNDISCH_TAC `u0 IN convex hull {EL 2 ul, mxi V ul}` THEN SET_TAC[]);
1991  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1992  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1993
1994  (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));
1995  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);
1996  (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(mxi V ul)}`);
1997  (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
1998  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
1999  (ASM_REWRITE_TAC[]);
2000
2001  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2002  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2003  (MATCH_MP_TAC BARV_3_EXPLICIT);
2004  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2005  (UP_ASM_TAC THEN STRIP_TAC);
2006  (EXISTS_TAC `v1:real^3` THEN     
2007    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2008  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2009
2010  (NEW_GOAL `v0 = u0:real^3`);
2011  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2012  (ASM_REWRITE_TAC[HD]);
2013  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2014  (ASM_REWRITE_TAC[HD]);
2015  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2016  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2017  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2018  (UP_ASM_TAC THEN STRIP_TAC);
2019  (REWRITE_WITH `EL 2 ul = v2:real^3`);
2020  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
2021  (STRIP_TAC);
2022
2023  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
2024  (REWRITE_TAC[]);
2025  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2026  (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);
2027  (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
2028    TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
2029    SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);
2030  (COND_CASES_TAC);
2031  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2032  (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);
2033  (STRIP_TAC);
2034  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2035  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2036  (REWRITE_TAC[coplanar]);
2037  (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);
2038  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2039  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2040    EXISTS_TAC `mxi V ul`);
2041  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2042  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2043  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2044  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2045  (STRIP_TAC);
2046  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2047  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2048  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2049  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2050  (SET_TAC[]);
2051
2052  (STRIP_TAC);
2053
2054  (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);
2055  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2056  (EXISTS_TAC `mcell 3 V ul`);
2057  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2058  (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
2059  (COND_CASES_TAC);
2060  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2061  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2062  (MATCH_MP_TAC BARV_3_EXPLICIT);
2063  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2064  (UP_ASM_TAC THEN STRIP_TAC);
2065  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2066  (ASM_REWRITE_TAC[]);
2067
2068  (REWRITE_WITH `v0 = u0:real^3`);
2069  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2070  (ASM_REWRITE_TAC[HD]);
2071  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2072  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2073    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2074  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2075
2076  (REWRITE_WITH `v1 = u1:real^3`);
2077  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2078  (ASM_REWRITE_TAC[HD; TL]);
2079  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2080  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2081    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2082  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2083  (UP_ASM_TAC THEN STRIP_TAC);
2084  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; 
2085    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
2086
2087  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2088  (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);
2089  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2090  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2091  (ABBREV_TAC `m = mxi V ul`);
2092  (NEW_GOAL `mxi V [u0; u1;v2;v3] = m`);
2093  (EXPAND_TAC "m" THEN AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
2094  (ASM_REWRITE_TAC[]);
2095  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2096  (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);
2097  (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);
2098  (UNDISCH_TAC `xx IN convex hull {EL 2 ul, m:real^3}`);
2099  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1/\ 1 = SUC 0`; 
2100    CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2101  (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);
2102  (ASM_REWRITE_TAC[]);
2103
2104  (STRIP_TAC); 
2105
2106  (REWRITE_TAC[coplanar]);
2107  (NEW_GOAL `~(k2 = &0)`);
2108  (EXPAND_TAC "k2");
2109  (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2110  (ASM_REWRITE_TAC[]);
2111
2112  (ASM_CASES_TAC `~(v = &0)`);
2113  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2114    EXISTS_TAC `v2:real^3`);
2115  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));
2116  (STRIP_TAC);
2117  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2118  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2119  (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);
2120  (EXISTS_TAC `k1 / (k2 * v)`);
2121  (EXISTS_TAC `(--k2 * u) / (k2 * v)`);
2122  (STRIP_TAC);
2123  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2124  (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);
2125  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2126  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);
2127  (MATCH_MP_TAC REAL_DIV_REFL);
2128  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2129
2130  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2131                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2132  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2133  (REWRITE_WITH
2134   `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = m:real^3  <=> 
2135    ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % m`);
2136  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2137  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2138  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2139  (ASM_REWRITE_TAC[VECTOR_ARITH 
2140   `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % m <=> 
2141     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2142
2143  (NEW_GOAL `~(u = &0)`);
2144  (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN  
2145    REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
2146  (REAL_ARITH_TAC);
2147
2148  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2149    EXISTS_TAC `m:real^3`);
2150  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));
2151  (STRIP_TAC);
2152  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2153  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2154
2155  (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);
2156  (EXISTS_TAC `k1 / (k2 * u)`);
2157  (EXISTS_TAC `(--k2 * v) / (k2 * u)`);
2158  (STRIP_TAC);
2159  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2160  (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);
2161  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2162  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);
2163  (MATCH_MP_TAC REAL_DIV_REFL);
2164  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2165
2166  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2167                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2168  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2169  (REWRITE_WITH
2170   `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = v2:real^3  <=> 
2171    ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = (k2 * u) % v2`);
2172  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2173  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2174  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2175  (ASM_REWRITE_TAC[VECTOR_ARITH 
2176   `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=> 
2177     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2178
2179  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2180
2181 (* ========================================================================== *)
2182
2183  (ABBREV_TAC `f4 = 
2184   (\ul. (((smallest_angle_line (EL 2 ul)  (EL 3 ul) u0 u1) - u0)
2185    dot (u1 - u0)) / 
2186    (norm ((smallest_angle_line (EL 2 ul)  (EL 3 ul) u0 u1) - u0)
2187    * norm (u1 - u0)))`);
2188
2189  (ABBREV_TAC `P4 = {(f4:(real^3)list->real) ul |ul | barV V 3 ul /\
2190                                  ~NULLSET (mcell 4 V ul INTER C) /\
2191                                   truncate_simplex 1 ul = [u0; u1]}`);
2192
2193  (NEW_GOAL `~(P4 = {}) ==> (?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
2194  (STRIP_TAC);
2195  (MATCH_MP_TAC SUP_FINITE_LEMMA);
2196  (ASM_REWRITE_TAC[]);
2197  (EXPAND_TAC "P4");
2198  (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
2199  (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
2200  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
2201  (MATCH_MP_TAC FINITE_SUBSET);
2202  (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
2203                       v0 IN (V INTER ball (u0:real^3, &4)) /\
2204                       v1 IN (V INTER ball (u0, &4)) /\
2205                       u2 IN (V INTER ball (u0, &4)) /\
2206                       u3 IN (V INTER ball (u0, &4)) /\
2207                       y = [v0; v1; u2; u3]}`);
2208  (STRIP_TAC);
2209  (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
2210  (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
2211  (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
2212  (REPEAT STRIP_TAC);
2213  (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
2214  (MATCH_MP_TAC BARV_3_EXPLICIT);
2215  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2216  (UP_ASM_TAC THEN STRIP_TAC);
2217  (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
2218    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
2219  (ASM_REWRITE_TAC[]);
2220  (NEW_GOAL `v0 = u0:real^3`);
2221  (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
2222  (ASM_REWRITE_TAC[HD]);
2223  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
2224  (ASM_REWRITE_TAC[HD]);
2225  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2226  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2227  (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
2228  (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2229  (EXISTS_TAC `V:real^3->bool`);
2230  (ASM_REWRITE_TAC[set_of_list]);
2231  (SET_TAC[]);
2232  (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
2233  (MATCH_MP_TAC Packing3.BARV_SUBSET);
2234  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2235  (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
2236  (SET_TAC[]);
2237
2238  (ABBREV_TAC `d2 = (if (P4 = {}:real->bool) then c 
2239                     else (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b)))`);
2240  (NEW_GOAL `d2 < &1`);
2241  (EXPAND_TAC "d2");
2242  (COND_CASES_TAC);
2243  (ASM_REWRITE_TAC[]);
2244  (NEW_GOAL `?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b)`);
2245  (ASM_SIMP_TAC[]);
2246  (UP_ASM_TAC THEN STRIP_TAC);
2247  (ABBREV_TAC `P  = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
2248  (ABBREV_TAC `zz = (@) (P:real->bool)`);
2249  (NEW_GOAL `(P:real->bool) zz`);
2250  (EXPAND_TAC "zz");
2251  (MATCH_MP_TAC SELECT_AX);
2252  (EXISTS_TAC `b':real`);
2253  (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
2254  (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
2255  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
2256  (REPEAT STRIP_TAC);
2257  (ASM_REWRITE_TAC[]);
2258  (EXPAND_TAC "f4");
2259
2260  (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (EL 3 ul) u0 u1`);
2261  (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
2262  (STRIP_TAC);
2263  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
2264  (STRIP_TAC);
2265  (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
2266  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2267  (ASM_REWRITE_TAC[]);
2268  (EXPAND_TAC "xx");
2269  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN 
2270    REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2271  (STRIP_TAC);
2272  (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, EL 3 ul} /\
2273            (!y. y IN convex hull {EL 2 ul, EL 3 ul}
2274                 ==> ((y - u0) dot (u1 - u0)) /
2275                     (norm (y - u0) * norm (u1 - u0)) <=
2276                     ((x - u0) dot (u1 - u0)) /
2277                     (norm (x - u0) * norm (u1 - u0))))`);
2278  (NEW_GOAL `(Q:real^3->bool) u0`);
2279  (ONCE_ASM_REWRITE_TAC[]);
2280  (MATCH_MP_TAC SELECT_AX);
2281  (EXPAND_TAC "Q");
2282
2283  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
2284  (STRIP_TAC);
2285  (ASM_REWRITE_TAC[]);
2286
2287  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2288  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2289  (MATCH_MP_TAC BARV_3_EXPLICIT);
2290  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2291  (UP_ASM_TAC THEN STRIP_TAC);
2292  (EXISTS_TAC `v1:real^3` THEN     
2293    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2294  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2295
2296  (NEW_GOAL `v0 = u0:real^3`);
2297  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2298  (ASM_REWRITE_TAC[HD]);
2299  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2300  (ASM_REWRITE_TAC[HD]);
2301  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2302  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2303  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2304  (UP_ASM_TAC THEN STRIP_TAC);
2305  (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);
2306  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
2307  (STRIP_TAC);
2308
2309  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
2310  (REWRITE_TAC[]);
2311  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2312  (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);
2313  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`; 
2314    ASSUME `ul = [u0; v1; v2; v3:real^3]`]);
2315  (COND_CASES_TAC);
2316
2317  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2318  (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);
2319  (STRIP_TAC);
2320  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2321  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2322  (REWRITE_TAC[coplanar]);
2323  (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);
2324  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2325  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2326    EXISTS_TAC `v3:real^3`);
2327  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2328  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2329  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2330  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2331  (STRIP_TAC);
2332  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2333  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2334  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2335  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2336  (SET_TAC[]);
2337
2338  (UP_ASM_TAC THEN EXPAND_TAC "Q");
2339  (STRIP_TAC);
2340  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);
2341  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2342  (EXISTS_TAC `mcell 4 V ul`);
2343  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2344  (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
2345  (COND_CASES_TAC);
2346  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2347  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2348  (MATCH_MP_TAC BARV_3_EXPLICIT);
2349  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2350  (UP_ASM_TAC THEN STRIP_TAC);
2351  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2352  (ASM_REWRITE_TAC[]);
2353
2354  (REWRITE_WITH `v0 = u0:real^3`);
2355  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2356  (ASM_REWRITE_TAC[HD]);
2357  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2358  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2359    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2360  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2361
2362  (REWRITE_WITH `v1 = u1:real^3`);
2363  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2364  (ASM_REWRITE_TAC[HD; TL]);
2365  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2366  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2367    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2368  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2369  (ASM_REWRITE_TAC[]);
2370  (UP_ASM_TAC THEN STRIP_TAC);
2371
2372  (ASM_REWRITE_TAC[set_of_list]);
2373  (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);
2374  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2375  (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
2376  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2377  (REWRITE_WITH `affine hull {u0, u1, v2, v3} = 
2378                  affine hull {u1, v2, v3:real^3}`);
2379  (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2380
2381  (NEW_GOAL `convex hull {EL 2 ul, (EL 3 ul):real^3} SUBSET 
2382              affine hull {EL 2 ul, EL 3 ul}`);
2383  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2384  (NEW_GOAL `affine hull {EL 2 ul, (EL 3 ul):real^3} SUBSET 
2385              affine hull {u1, v2, v3}`);
2386  (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
2387  (ASM_REWRITE_TAC[EL; HD; TL; 
2388    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
2389  (SET_TAC[]);
2390  (UP_ASM_TAC THEN UP_ASM_TAC THEN 
2391    UNDISCH_TAC `u0 IN convex hull {EL 2 ul, (EL 3 ul):real^3}` THEN SET_TAC[]);
2392  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2393  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2394
2395  (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));
2396  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);
2397  (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(EL 3 ul):real^3}`);
2398  (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2399  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2400  (ASM_REWRITE_TAC[]);
2401
2402  (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2403  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2404  (MATCH_MP_TAC BARV_3_EXPLICIT);
2405  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2406  (UP_ASM_TAC THEN STRIP_TAC);
2407  (EXISTS_TAC `v1:real^3` THEN     
2408    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2409  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2410
2411  (NEW_GOAL `v0 = u0:real^3`);
2412  (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2413  (ASM_REWRITE_TAC[HD]);
2414  (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2415  (ASM_REWRITE_TAC[HD]);
2416  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2417  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2418  (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2419  (UP_ASM_TAC THEN STRIP_TAC);
2420  (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);
2421  (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
2422  (STRIP_TAC);
2423
2424  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
2425  (REWRITE_TAC[]);
2426  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2427  (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);
2428  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`; 
2429    ASSUME `ul = [u0; v1; v2; v3:real^3]`]);
2430  (COND_CASES_TAC);
2431
2432  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2433  (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);
2434  (STRIP_TAC);
2435  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2436  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2437  (REWRITE_TAC[coplanar]);
2438  (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);
2439  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2440  (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2441    EXISTS_TAC `v3:real^3`);
2442  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2443  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2444  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2445  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2446  (STRIP_TAC);
2447  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2448  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2449  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2450  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2451  (SET_TAC[]);
2452
2453  (STRIP_TAC);
2454
2455  (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);
2456  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2457  (EXISTS_TAC `mcell 4 V ul`);
2458  (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2459  (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
2460  (COND_CASES_TAC);
2461  (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2462  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2463  (MATCH_MP_TAC BARV_3_EXPLICIT);
2464  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2465  (UP_ASM_TAC THEN STRIP_TAC);
2466  (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2467  (ASM_REWRITE_TAC[]);
2468
2469  (REWRITE_WITH `v0 = u0:real^3`);
2470  (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2471  (ASM_REWRITE_TAC[HD]);
2472  (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2473  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2474    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2475  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2476
2477  (REWRITE_WITH `v1 = u1:real^3`);
2478  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2479  (ASM_REWRITE_TAC[HD; TL]);
2480  (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2481  (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2482    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2483  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2484  (UP_ASM_TAC THEN STRIP_TAC);
2485  (ASM_REWRITE_TAC[set_of_list]);
2486
2487  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2488  (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
2489  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2490  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2491  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2492  (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);
2493  (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);
2494  (UNDISCH_TAC `xx IN convex hull {EL 2 ul,(EL 3 ul):real^3}`);
2495  (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1/\ 1 = SUC 0`; 
2496    CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2497  (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);
2498  (ASM_REWRITE_TAC[]);
2499
2500  (STRIP_TAC); 
2501
2502  (REWRITE_TAC[coplanar]);
2503  (NEW_GOAL `~(k2 = &0)`);
2504  (EXPAND_TAC "k2");
2505  (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2506  (ASM_REWRITE_TAC[]);
2507
2508  (ASM_CASES_TAC `~(v = &0)`);
2509  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2510    EXISTS_TAC `v2:real^3`);
2511  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));
2512  (STRIP_TAC);
2513  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2514  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2515  (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);
2516  (EXISTS_TAC `k1 / (k2 * v)`);
2517  (EXISTS_TAC `(--k2 * u) / (k2 * v)`);
2518  (STRIP_TAC);
2519  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2520  (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);
2521  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2522  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);
2523  (MATCH_MP_TAC REAL_DIV_REFL);
2524  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2525
2526  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2527                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2528  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2529  (REWRITE_WITH
2530   `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = v3:real^3  <=> 
2531    ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % v3`);
2532  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2533  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2534  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2535  (ASM_REWRITE_TAC[VECTOR_ARITH 
2536   `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % v3 <=> 
2537     k1 % (u1 - u0) = k2 % ((u % v2 + v % v3) - u0)`]);
2538
2539  (NEW_GOAL `~(u = &0)`);
2540  (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN  
2541    REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
2542  (REAL_ARITH_TAC);
2543
2544  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2545    EXISTS_TAC `v3:real^3`);
2546  (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));
2547  (STRIP_TAC);
2548  (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2549  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2550
2551  (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);
2552  (EXISTS_TAC `k1 / (k2 * u)`);
2553  (EXISTS_TAC `(--k2 * v) / (k2 * u)`);
2554  (STRIP_TAC);
2555  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2556  (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);
2557  (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2558  (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);
2559  (MATCH_MP_TAC REAL_DIV_REFL);
2560  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2561
2562  (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2563                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2564  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2565  (REWRITE_WITH
2566   `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = v2:real^3  <=> 
2567    ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = (k2 * u) % v2`);
2568  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2569  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2570  (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2571  (ASM_REWRITE_TAC[VECTOR_ARITH 
2572   `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=> 
2573     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2574  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2575
2576 (* ========================================================================== *)
2577
2578  (ABBREV_TAC `d = max c (max d1 d2)`);
2579  (NEW_GOAL `d < &1`);
2580  (UNDISCH_TAC `d2 < &1` THEN UNDISCH_TAC `d1 < &1` THEN 
2581    UNDISCH_TAC `&0 < c /\ c < &1`);
2582  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2583
2584 (* ========================================================================== *)
2585
2586  (ABBREV_TAC `D = ball (u0:real^3,r) INTER rcone_gt u0 u1 d`);
2587  (NEW_GOAL `D SUBSET C:real^3->bool`);
2588  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
2589  (MATCH_MP_TAC (SET_RULE 
2590   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
2591  (STRIP_TAC);
2592  (MATCH_MP_TAC SUBSET_BALL);
2593  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2594  (MATCH_MP_TAC RCONE_GT_SUBSET);
2595  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2596
2597  (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D)
2598           ==> (?k vl.
2599                    2 <= k /\
2600                    barV V 3 vl /\
2601                    X = mcell k V vl /\
2602                    truncate_simplex 1 vl = [u0; u1])`);
2603  (REPEAT STRIP_TAC);
2604  (FIRST_ASSUM MATCH_MP_TAC);
2605  (ASM_REWRITE_TAC[]);
2606  (STRIP_TAC);
2607  (UNDISCH_TAC `~NULLSET (X INTER D)`);
2608  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2609  (EXISTS_TAC `X INTER C:real^3->bool`);
2610  (ASM_REWRITE_TAC[] THEN UNDISCH_TAC `D SUBSET C:real^3->bool`);
2611  (SET_TAC[]);
2612
2613 (* ========================================================================= *)
2614
2615  (NEW_GOAL `D = conic_cap (u0:real^3) u1 r d`);
2616  (EXPAND_TAC "D" THEN REWRITE_TAC[conic_cap; NORMBALL_BALL]);
2617
2618  (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D) ==>
2619    vol (X INTER D) = vol (D) * (dihX V X (u0,u1)) / (&2 * pi)`);
2620  (REPEAT STRIP_TAC);
2621  (NEW_GOAL `?k vl.
2622                    2 <= k /\
2623                    barV V 3 vl /\
2624                    X = mcell k V vl /\
2625                    truncate_simplex 1 vl = [u0; u1]`);
2626  (FIRST_ASSUM MATCH_MP_TAC);
2627  (ASM_REWRITE_TAC[]);
2628  (UP_ASM_TAC THEN REPEAT STRIP_TAC);
2629
2630 (* ========================================================================= *)
2631 (*  Case k = 2                                                               *)
2632 (* ========================================================================= *)
2633
2634  (ASM_CASES_TAC `k = 2`);
2635  (ABBREV_TAC `m = mxi V vl`);
2636  (ABBREV_TAC `s3 = omega_list_n V vl 3`);
2637  (ABBREV_TAC `L = aff_ge{u0, u1} {m, s3:real^3}`);
2638
2639  (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
2640  (AP_TERM_TAC);
2641  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
2642  (LET_TAC);
2643  (COND_CASES_TAC);
2644  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
2645  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
2646  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2647  (UP_ASM_TAC THEN STRIP_TAC);
2648
2649  (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);
2650  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
2651  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2652  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2653  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2654  (ASM_REWRITE_TAC[HD; TL]);
2655  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
2656  (ASM_REWRITE_TAC[HD; TL]);
2657  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
2658  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
2659    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2660  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2661
2662  (EXPAND_TAC "L");
2663  (REWRITE_TAC [SET_RULE `(A INTER B INTER C) INTER D = C INTER D 
2664                        <=> (!x. x IN C INTER D ==> x IN A /\ x IN B)`]);
2665
2666  (REPEAT GEN_TAC THEN STRIP_TAC);
2667  (NEW_GOAL `x:real^3 IN D`);
2668  (UP_ASM_TAC THEN UNDISCH_TAC `D = conic_cap (u0:real^3) u1 r d`);
2669  (SET_TAC[]);
2670  (UP_ASM_TAC THEN EXPAND_TAC "D" THEN STRIP_TAC);
2671  (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a'`);
2672  (NEW_GOAL `rcone_gt (u0:real^3) u1 d SUBSET rcone_gt u0 u1 c`);
2673  (MATCH_MP_TAC RCONE_GT_SUBSET);
2674  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2675  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
2676    `rcone_gt (u0:real^3) u1 c SUBSET W INTER rcone_gt u0 u1 a'`);
2677  (SET_TAC[]);
2678  (STRIP_TAC);
2679  (UP_ASM_TAC THEN SET_TAC[RCONE_GT_SUBSET_RCONE_GE]);
2680
2681 (* ========================================================================== *)
2682  (UP_ASM_TAC THEN REWRITE_TAC[rcone_ge; rconesgn; rcone_gt; IN; IN_ELIM_THM]);
2683  (STRIP_TAC);
2684
2685  (ABBREV_TAC `y = u0 + proj_point (u1 - u0:real^3) (x - u0)`);
2686  (NEW_GOAL `orthogonal (x - y) (u1 - u0:real^3)`);
2687  (REWRITE_WITH `x - y = (x - u0) - proj_point (u1 - u0) (x - u0:real^3)`);
2688  (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2689  (REWRITE_TAC[GSYM Marchal_cells_2_new.projection_proj_point]);
2690  (REWRITE_TAC[orthogonal; Packing3.PROJECTION_ORTHOGONAL]);
2691
2692  (NEW_GOAL `norm (x - u0) pow 2 = norm (y - u0) pow 2 + norm (x - y:real^3) pow 2`);
2693  (MATCH_MP_TAC PYTHAGORAS);
2694  (REWRITE_TAC[orthogonal]);
2695  (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = --(c dot (b - a))`]);
2696  (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);
2697  (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);
2698  (REWRITE_TAC[PRO_EXP; DOT_RMUL]);
2699  (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);
2700  (ASM_REWRITE_TAC[]);
2701  (REAL_ARITH_TAC);
2702
2703  (NEW_GOAL `norm (x - u1) pow 2 = norm (y - u1) pow 2 + norm (x - y:real^3) pow 2`);
2704  (MATCH_MP_TAC PYTHAGORAS);
2705  (REWRITE_TAC[orthogonal]);
2706  (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = c dot (a - b)`]);
2707  (REWRITE_WITH `u1 - y = (u1 - u0) - proj_point (u1 - u0) (x - u0:real^3)`);
2708  (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2709  (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x - a % x = (&1 - a) % x`]);
2710  (REWRITE_TAC[DOT_RMUL] THEN DEL_TAC);
2711  (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);
2712  (ASM_REWRITE_TAC[]);
2713  (REAL_ARITH_TAC);
2714
2715  (MP_TAC (ASSUME `(x - u0:real^3) dot (u1 - u0) > 
2716                 dist (x,u0) * dist (u1,u0) * a'`));
2717  (REWRITE_WITH `(x - u0) dot (u1 - u0) = 
2718                  (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);
2719  (VECTOR_ARITH_TAC);
2720  (REWRITE_WITH `(x - u1) dot (u0 - u1) = 
2721                  (x - y) dot (u0 - u1) + (y - u1) dot (u0 - u1:real^3)`);
2722  (VECTOR_ARITH_TAC);
2723  (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);
2724  (ASM_REWRITE_TAC[GSYM orthogonal]);
2725  (REWRITE_WITH `(x - y) dot (u0 - u1:real^3) = &0`);
2726  (ONCE_REWRITE_TAC[VECTOR_ARITH `a dot (u0 - u1) = --(a dot (u1 - u0))`]);
2727  (REWRITE_TAC[REAL_ARITH `--a = &0 <=> a = &0`]);
2728  (ASM_REWRITE_TAC[GSYM orthogonal]);
2729  (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
2730
2731  (STRIP_TAC);
2732  (NEW_GOAL `(y - u0) dot (u1 - u0) = norm (y - u0) * norm (u1 - u0:real^3)`);
2733  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
2734  (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);
2735  (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);
2736  (REWRITE_TAC[PRO_EXP; NORM_MUL; VECTOR_MUL_ASSOC]);
2737  (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));
2738  (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);
2739  (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));
2740  (REWRITE_TAC[REAL_ABS_REFL]);
2741  (MATCH_MP_TAC REAL_LE_DIV);
2742  (REWRITE_TAC[DOT_POS_LE]);
2743
2744  (REWRITE_WITH `(x - u0) dot (u1 - u0) = 
2745                  (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);
2746  (VECTOR_ARITH_TAC);
2747  (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);
2748  (ASM_REWRITE_TAC[GSYM orthogonal]);
2749  (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
2750
2751  (NEW_GOAL `y IN convex hull {u0, u1:real^3}`);
2752  (NEW_GOAL `y IN affine hull {u0, u1:real^3}`);
2753  (REWRITE_TAC[AFFINE_HULL_2; IN; IN_ELIM_THM]);
2754  (EXPAND_TAC "y" THEN REWRITE_TAC[PRO_EXP]);
2755  (ABBREV_TAC `rtemp = ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - 
2756                 u0:real^3))`);
2757  (EXISTS_TAC `&1 - rtemp` THEN EXISTS_TAC `rtemp:real`);
2758  (STRIP_TAC);
2759  (REAL_ARITH_TAC);
2760  (VECTOR_ARITH_TAC);
2761  (UP_ASM_TAC THEN REWRITE_TAC[IN; AFFINE_HULL_2; CONVEX_HULL_2; IN_ELIM_THM]);
2762  (REPEAT STRIP_TAC);
2763  (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2764  (ASM_REWRITE_TAC[]);
2765
2766  (NEW_GOAL `y - u0 = v % (u1 - u0:real^3)`);
2767  (NEW_GOAL `y - u0 = y - (u + v) % u0:real^3`);
2768  (REWRITE_TAC[ASSUME `u + v = &1`; VECTOR_MUL_LID]);
2769  (UP_ASM_TAC THEN REWRITE_WITH `y - (u + v) % u0 = v % (u1 - u0:real^3)`);
2770  (REWRITE_TAC[ASSUME `y = u % u0 + v % u1:real^3`] THEN VECTOR_ARITH_TAC);
2771
2772  (ASM_CASES_TAC `u < &0`);
2773  (NEW_GOAL `F`);
2774  (NEW_GOAL `norm (y - u0) <= norm (x - u0:real^3)`);
2775  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
2776  (REWRITE_TAC[NORM_POS_LE; ASSUME 
2777   `norm (x - u0:real^3) pow 2 = norm (y - u0) pow 2 + norm (x - y) pow 2`; 
2778    REAL_ARITH `a <= a + b <=> &0 <= b`; REAL_LE_POW_2]);
2779  (NEW_GOAL `norm (x - u0:real^3) < &1`);
2780  (REWRITE_TAC[GSYM dist] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN 
2781    REWRITE_TAC[GSYM IN_BALL]);
2782  (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
2783  (MATCH_MP_TAC SUBSET_BALL);
2784  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2785  (UP_ASM_TAC THEN UNDISCH_TAC 
2786   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
2787
2788  (NEW_GOAL `norm (y - u0) = v * norm (u1:real^3 - u0)`);
2789  (ASM_REWRITE_TAC[NORM_MUL]);
2790
2791  (REWRITE_WITH `abs v = v`);
2792  (REWRITE_TAC[REAL_ABS_REFL]);
2793  (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);
2794  (NEW_GOAL `&2 <= norm (u1 - u0:real^3)`);
2795  (REWRITE_TAC[GSYM dist]);
2796  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
2797  (REPEAT STRIP_TAC);
2798  (FIRST_ASSUM MATCH_MP_TAC);
2799  (ASM_REWRITE_TAC[]);
2800  (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);
2801  (ASM_REWRITE_TAC[]);
2802
2803  (NEW_GOAL `v * &2 <= v * norm (u1 - u0:real^3)`);
2804  (REWRITE_TAC[REAL_ARITH `a * b <= a * c <=> &0 <= a * (c - b)`]);
2805  (MATCH_MP_TAC REAL_LE_MUL);
2806  (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN UP_ASM_TAC);
2807  (REAL_ARITH_TAC);
2808
2809  (NEW_GOAL `&1 < v`);
2810  (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);
2811  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
2812    UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2813  (UP_ASM_TAC THEN MESON_TAC[]);
2814
2815  (ASM_CASES_TAC `v < &0`);
2816  (NEW_GOAL `F`);
2817  (NEW_GOAL `(y - u0) dot (u1 - u0:real^3) <= &0`);
2818  (ASM_REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
2819  (MATCH_MP_TAC REAL_LE_MUL);
2820  (REWRITE_TAC[DOT_POS_LE]);
2821  (UP_ASM_TAC THEN REAL_ARITH_TAC);
2822
2823  (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);
2824  (MATCH_MP_TAC REAL_LE_MUL);
2825  (REWRITE_TAC[DIST_POS_LE]);
2826  (MATCH_MP_TAC REAL_LE_MUL);
2827  (REWRITE_TAC[DIST_POS_LE]);
2828  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2829  (STRIP_TAC);
2830  (REWRITE_TAC[HL_2]);
2831  (MATCH_MP_TAC REAL_LE_MUL);
2832  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
2833  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
2834  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
2835  `(y - u0:real^3) dot (u1 - u0) > dist (x,u0) * dist (u1,u0) * a'`);
2836  (REAL_ARITH_TAC);
2837  (UP_ASM_TAC THEN MESON_TAC[]);
2838  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2839
2840  (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);
2841  (MATCH_MP_TAC REAL_LE_MUL);
2842  (REWRITE_TAC[DIST_POS_LE]);
2843  (MATCH_MP_TAC REAL_LE_MUL);
2844  (REWRITE_TAC[DIST_POS_LE]);
2845  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2846  (STRIP_TAC);
2847  (REWRITE_TAC[HL_2]);
2848  (MATCH_MP_TAC REAL_LE_MUL);
2849  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
2850  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
2851  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2852
2853  (NEW_GOAL `(y - u1) dot (u0 - u1) = norm (y - u1) * norm (u0 - u1:real^3)`);
2854  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
2855  (REWRITE_WITH `y - u1 = proj_point (u1 - u0) (x - u0:real^3) - (u1 - u0)`);
2856  (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2857  (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x % a - a = (x - &1) % a`; NORM_MUL;
2858                VECTOR_MUL_ASSOC]);
2859  (REWRITE_WITH ` 
2860    (norm (u0 - u1) *
2861    (((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) - &1)) % (u1 - u0) =  
2862    (norm (u0 - u1:real^3) *
2863    (&1 - ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)))) % (u0 - u1)`);
2864  (VECTOR_ARITH_TAC);
2865  (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));
2866  (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);
2867  (REWRITE_TAC[NORM_ARITH `norm (a - b) = norm (b - a)`]);
2868  (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));
2869  (REWRITE_TAC[REAL_ARITH `abs (x - &1) = abs (&1 - x)`]);
2870  (REWRITE_TAC[REAL_ABS_REFL; REAL_ARITH `&0 <= a - b <=> b <= a`]);
2871  (REWRITE_WITH `((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) <= &1
2872   <=> ((x - u0) dot (u1 - u0)) <= &1 * ((u1 - u0) dot (u1 - u0:real^3))`);
2873  (MATCH_MP_TAC REAL_LE_LDIV_EQ);
2874  (REWRITE_TAC[DOT_POS_LT; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2875  (ASM_REWRITE_TAC[]);
2876  (NEW_GOAL `(x - u0) dot (u1 - u0) <= norm (x - u0) * norm (u1 - u0:real^3)`);
2877  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
2878
2879  (NEW_GOAL `norm (x - u0) * norm (u1 - u0) <= &1 * norm (u1 - u0:real^3)`);
2880  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
2881  (MATCH_MP_TAC REAL_LE_MUL);
2882  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);
2883  (MATCH_MP_TAC (REAL_ARITH `a < x ==> a <= x`));
2884  (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
2885  (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
2886  (MATCH_MP_TAC SUBSET_BALL);
2887  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2888  (UP_ASM_TAC THEN UNDISCH_TAC 
2889   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
2890  (REWRITE_TAC[GSYM NORM_POW_2; REAL_ARITH `&1 * a pow 2 = a * a`]);
2891  (NEW_GOAL `&1 * norm (u1 - u0) <= norm (u1 - u0) * norm (u1 - u0:real^3)`);
2892  (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
2893  (MATCH_MP_TAC REAL_LE_MUL);
2894  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);
2895  (MATCH_MP_TAC (REAL_ARITH `&2 <= x ==> &1 <= x`));
2896  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
2897  (STRIP_TAC);
2898  (FIRST_ASSUM MATCH_MP_TAC);
2899  (ASM_REWRITE_TAC[]);
2900  (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);
2901  (ASM_REWRITE_TAC[]);
2902  (UNDISCH_TAC `(x - u0:real^3) dot (u1 - u0) <= 
2903                 norm (x - u0) * norm (u1 - u0)` THEN 
2904    UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2905  (ASM_REWRITE_TAC[dist]);
2906  (REWRITE_TAC[REAL_ARITH `a * b >= x * b * c <=> &0 <= b * (a - x * c)`]);
2907  (MATCH_MP_TAC REAL_LE_MUL);
2908  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
2909  (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
2910  (STRIP_TAC);
2911
2912  (MATCH_MP_TAC REAL_LE_MUL);
2913  (REWRITE_TAC[NORM_POS_LE]);
2914  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2915  (STRIP_TAC);
2916  (REWRITE_TAC[HL_2]);
2917  (MATCH_MP_TAC REAL_LE_MUL);
2918  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
2919  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
2920  (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);
2921  (ASM_REWRITE_TAC[]);
2922  (REWRITE_TAC[REAL_ARITH `(a + b) * x <= a <=> b * x <= (&1 - x) * a`]);
2923
2924  (UNDISCH_TAC `(y - u0) dot (u1 - u0) > dist (x,u0) * dist (u1,u0:real^3) * a'`);
2925  (ASM_REWRITE_TAC[dist]);
2926  (REWRITE_TAC[REAL_ARITH `a * b > x * b * c <=> &0 < b * (a - x * c)`]);
2927  (REWRITE_TAC[REAL_MUL_POS_LT]);
2928  (REWRITE_WITH `~(norm (u1 - u0:real^3) < &0 /\ 
2929                    norm (y - u0) - norm (x - u0) * a' < &0)`);
2930  (NEW_GOAL `&0 <= norm (u1 - u0:real^3)`);
2931  (REWRITE_TAC[NORM_POS_LE]);
2932  (UP_ASM_TAC THEN REAL_ARITH_TAC);
2933  (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);
2934  (REWRITE_WITH `norm (x - u0) * a' < norm (y - u0:real^3) <=> 
2935                 (norm (x - u0) * a') pow 2 < norm (y - u0) pow 2`);
2936  (MATCH_MP_TAC Pack1.bp_bdt);
2937  (STRIP_TAC);
2938  (MATCH_MP_TAC REAL_LE_MUL);
2939  (REWRITE_TAC[NORM_POS_LE]);
2940  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2941  (STRIP_TAC);
2942  (REWRITE_TAC[HL_2]);
2943  (MATCH_MP_TAC REAL_LE_MUL);
2944  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
2945  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
2946  (REWRITE_TAC[NORM_POS_LE]);
2947
2948  (ASM_REWRITE_TAC[REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);
2949  (REWRITE_TAC[REAL_ARITH `(a + b) * x < a <=> b * x < (&1 - x) * a`]);
2950  (STRIP_TAC);
2951  
2952  (NEW_GOAL `(&1 - a' pow 2) * norm (y - u0) pow 2 <= 
2953              (&1 - a' pow 2) * norm (y - u1:real^3) pow 2`);
2954  (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= a * (y - x)`]);
2955  (MATCH_MP_TAC REAL_LE_MUL);
2956  (STRIP_TAC);
2957  (REWRITE_TAC[REAL_ARITH `&0 <= &1 - b <=> b <= &1 pow 2`]);
2958  (REWRITE_WITH `a' pow 2 <= &1 pow 2 <=> a' <= &1`);
2959  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2960  (MATCH_MP_TAC Collect_geom.POW2_COND);
2961  (REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
2962  (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
2963  (STRIP_TAC);
2964  (REWRITE_TAC[HL_2]);
2965  (MATCH_MP_TAC REAL_LE_MUL);
2966  (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
2967  (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
2968
2969  (EXPAND_TAC "a'");
2970  (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);
2971  (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
2972  (UNDISCH_TAC `hl [u0; u1:real^3] < sqrt (&2)` THEN REAL_ARITH_TAC);
2973  (NEW_GOAL `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2`);
2974  (REWRITE_WITH `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2 <=>
2975                  norm (x - u0)  <= norm (x - u1:real^3)`);
2976  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2977  (MATCH_MP_TAC Collect_geom.POW2_COND);
2978  (REWRITE_TAC[NORM_POS_LE]);
2979  (MATCH_MP_TAC (REAL_ARITH `&2 * x <= x + y ==> x <= y`));
2980  (REWRITE_TAC[GSYM dist]);
2981
2982  (NEW_GOAL `dist (x, u0:real^3) < &1`);
2983  (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
2984  (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
2985  (MATCH_MP_TAC SUBSET_BALL);
2986  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2987  (UP_ASM_TAC THEN UNDISCH_TAC 
2988   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
2989  (NEW_GOAL `&2 * dist (x, u0:real^3) < &2`);
2990  (UP_ASM_TAC THEN REAL_ARITH_TAC);
2991  (NEW_GOAL `&2 <= dist (x, u0) + dist (x, u1:real^3)`);
2992  (NEW_GOAL `&2 <= dist (u0, u1:real^3)`);
2993  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
2994  (STRIP_TAC);
2995  (FIRST_ASSUM MATCH_MP_TAC);
2996  (ASM_REWRITE_TAC[]);
2997  (ONCE_REWRITE_TAC[MESON[IN] `V a <=> a:real^3 IN V`]);
2998  (ASM_REWRITE_TAC[]);
2999
3000  (NEW_GOAL `dist (u0, u1:real^3) <= dist (u0, x) + dist (x, u1)`);
3001  (REWRITE_TAC[DIST_TRIANGLE]);
3002  (UP_ASM_TAC THEN REWRITE_TAC[DIST_SYM]);
3003  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3004  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3005  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3006  (REAL_ARITH_TAC);
3007  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3008
3009  (NEW_GOAL `F`);
3010  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3011  (REWRITE_TAC[]);
3012  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3013  (EXISTS_TAC `X INTER C:real^3->bool`);
3014  (ASM_SIMP_TAC [SET_RULE `A SUBSET B ==> X INTER A SUBSET X INTER B`]);
3015  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; SET_RULE `{} INTER s = {}`]);
3016  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
3017  (UP_ASM_TAC THEN MESON_TAC[]);
3018
3019  (NEW_GOAL `~coplanar {u0, u1:real^3, m, s3}`);
3020  (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3021  (STRIP_TAC);
3022  (NEW_GOAL `NULLSET X`);
3023  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3024  (EXISTS_TAC `affine hull {u0, u1, m, s3:real^3}`);
3025  (STRIP_TAC);
3026  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
3027  (UP_ASM_TAC THEN MESON_TAC[]);
3028  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
3029  (COND_CASES_TAC);
3030  (LET_TAC);
3031  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> M INTER N INTER A SUBSET B`));
3032
3033  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3034  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3035  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3036  (UP_ASM_TAC THEN STRIP_TAC);
3037  (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);
3038  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3039  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3040  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3041  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3042  (ASM_REWRITE_TAC[HD; TL]);
3043  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
3044  (ASM_REWRITE_TAC[HD; TL]);
3045  (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
3046  (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
3047    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3048  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3049  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1} UNION {m:real^3, s3}`);
3050  (SET_TAC[]);
3051  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3052  (SET_TAC[]);
3053  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3054  (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3055  (EXISTS_TAC `X:real^3->bool`);
3056  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3057
3058 (* ========================================================================= *)
3059  (ASM_CASES_TAC `azim u0 u1 m (s3:real^3) < pi`);
3060  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m s3)`);
3061  (ASM_SIMP_TAC[WEDGE_LUNE]);
3062  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
3063                  conic_cap u0 u1 r d INTER L`);
3064  (SET_TAC[]);
3065  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3066  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
3067    aff_gt {u0, u1} {m, s3} DIFF conic_cap u0 u1 r d INTER L = {}`);
3068  (EXPAND_TAC "L");
3069  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
3070  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3071  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
3072  (EXPAND_TAC "L");
3073
3074  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3075                  aff_gt {u0, u1} {m, s3} UNION 
3076    UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN  {m, s3}}`);
3077  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3078  (REWRITE_TAC[Geomdetail.FINITE6]);
3079  (REWRITE_TAC[DISJOINT]);
3080
3081  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3082  (NEW_GOAL `F`);
3083  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3084  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);
3085  (UP_ASM_TAC THEN SET_TAC[]);
3086  (REWRITE_TAC[COPLANAR_3]);
3087  (UP_ASM_TAC THEN MESON_TAC[]);
3088
3089  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3090  (NEW_GOAL `F`);
3091  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3092  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);
3093  (UP_ASM_TAC THEN SET_TAC[]);
3094  (REWRITE_TAC[COPLANAR_3]);
3095  (UP_ASM_TAC THEN MESON_TAC[]);
3096  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3097
3098  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3099  (EXISTS_TAC 
3100   `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3101  (STRIP_TAC);
3102  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3103  (EXISTS_TAC 
3104   `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);
3105  (STRIP_TAC);
3106  (MATCH_MP_TAC NEGLIGIBLE_UNION);
3107  (STRIP_TAC);
3108
3109  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3110  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
3111  (STRIP_TAC);
3112  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3113  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
3114  (SET_TAC[]);
3115  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3116  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3117  (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);
3118  (STRIP_TAC);
3119  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3120  (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);
3121  (SET_TAC[]);
3122  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3123  (REWRITE_TAC[SET_RULE 
3124   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
3125          aff_ge {u0, u1} ({m, s3} DELETE s3) 
3126    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3127  (MATCH_MP_TAC (SET_RULE 
3128   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3129  (STRIP_TAC);
3130  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3131  (STRIP_TAC);
3132  (SET_TAC[]);
3133
3134  (REWRITE_TAC[DISJOINT]);
3135  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3136  (NEW_GOAL `F`);
3137  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3138  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);
3139  (UP_ASM_TAC THEN SET_TAC[]);
3140  (REWRITE_TAC[COPLANAR_3]);
3141  (UP_ASM_TAC THEN MESON_TAC[]);
3142  (UP_ASM_TAC THEN SET_TAC[]);
3143
3144  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3145  (STRIP_TAC);
3146  (SET_TAC[]);
3147  (REWRITE_TAC[DISJOINT]);
3148  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3149  (NEW_GOAL `F`);
3150  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3151  (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);
3152  (UP_ASM_TAC THEN SET_TAC[]);
3153  (REWRITE_TAC[COPLANAR_3]);
3154  (UP_ASM_TAC THEN MESON_TAC[]);
3155  (UP_ASM_TAC THEN SET_TAC[]);
3156
3157  (SET_TAC[]);
3158
3159  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
3160  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m s3) =
3161              (if &1 < d \/ r < &0
3162               then &0
3163               else azim u0 u1 m s3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
3164  (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);
3165  (STRIP_TAC);
3166  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3167  (EXISTS_TAC `s3:real^3`);
3168  (ASM_REWRITE_TAC[]);
3169  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3170  (EXISTS_TAC `m:real^3`);
3171  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3172  (ASM_REWRITE_TAC[]);
3173
3174  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
3175  (COND_CASES_TAC);
3176  (NEW_GOAL `F`);
3177  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
3178    UP_ASM_TAC THEN REAL_ARITH_TAC);
3179  (UP_ASM_TAC THEN MESON_TAC[]);
3180
3181  (REWRITE_WITH `azim (u0:real^3) u1 m s3 = dihV u0 u1 m s3`);
3182  (MATCH_MP_TAC AZIM_DIHV_SAME);
3183  (ASM_REWRITE_TAC[]);
3184  (STRIP_TAC);
3185  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3186  (EXISTS_TAC `s3:real^3`);
3187  (ASM_REWRITE_TAC[]);
3188  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3189  (EXISTS_TAC `m:real^3`);
3190  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3191  (ASM_REWRITE_TAC[]);
3192
3193  (REWRITE_TAC[dihX]);
3194  (COND_CASES_TAC);
3195  (NEW_GOAL `F`);
3196  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3197  (REWRITE_TAC[]);
3198  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3199  (EXISTS_TAC `X:real^3->bool`);
3200  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3201  (UP_ASM_TAC THEN MESON_TAC[]);
3202
3203  (LET_TAC);
3204
3205  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
3206  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3207            ul IN barV V 3 /\
3208            X = mcell k V ul /\
3209            initial_sublist [u0; u1] ul)`);
3210  (STRIP_TAC);
3211  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
3212  (MATCH_MP_TAC SELECT_AX);
3213  (EXISTS_TAC `(2, vl:(real^3)list)`);
3214  (EXPAND_TAC "P");
3215  (REWRITE_TAC[BETA_THM]);
3216  (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);
3217  (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);
3218  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3219  (ASM_REWRITE_TAC[]);
3220
3221  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3222  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3223  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3224  (UP_ASM_TAC THEN STRIP_TAC);
3225  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3226  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3227  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
3228
3229  (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);
3230  (MATCH_MP_TAC Ajripqn.AJRIPQN);
3231  (ASM_REWRITE_TAC[]);
3232  (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);
3233  (SET_TAC[ASSUME `X = mcell k' V ul`; 
3234                ASSUME `X = mcell k V vl`; ASSUME `k = 2`]);
3235  (REPEAT STRIP_TAC);
3236  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
3237    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
3238  (SET_TAC[]);
3239  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
3240
3241  (COND_CASES_TAC);
3242  (REWRITE_TAC[dihu2]);
3243
3244  (REWRITE_WITH `omega_list_n V ul 3 = s3`);
3245  (EXPAND_TAC "s3");
3246  (NEW_GOAL `2  = 2 /\
3247              (!k. 2 - 1 <= k /\ k <= 3
3248                   ==> omega_list_n V ul k = omega_list_n V vl k)`);
3249  (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
3250  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);
3251  (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);
3252  (ASM_REWRITE_TAC[]);
3253  (UP_ASM_TAC THEN STRIP_TAC);
3254
3255  (FIRST_ASSUM MATCH_MP_TAC);
3256  (ARITH_TAC);
3257
3258  (REWRITE_WITH `mxi V ul = m`);
3259  (EXPAND_TAC "m");
3260  (MATCH_MP_TAC MCELL_ID_MXI);
3261  (EXISTS_TAC `2` THEN EXISTS_TAC `2`);
3262  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);
3263  (STRIP_TAC);
3264
3265  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3266  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3267  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3268  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
3269                  CARD (set_of_list vl) = 3 + 1`);
3270  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3271  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3272  (ARITH_TAC);
3273  (ASM_REWRITE_TAC[HD]);
3274
3275  (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);
3276  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3277  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3278  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3279                  CARD (set_of_list ul) = 3 + 1`);
3280  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3281  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3282  (ARITH_TAC);
3283
3284  (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3285  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3286  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3287  (REWRITE_TAC[HD]);
3288  (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);
3289  (ASM_REWRITE_TAC[]);
3290
3291  (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);
3292  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3293  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3294  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3295  (ASM_REWRITE_TAC[]);
3296
3297  (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
3298  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3299  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3300  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3301                  CARD (set_of_list ul) = 3 + 1`);
3302  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3303  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3304  (ARITH_TAC);
3305
3306  (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
3307  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3308  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3309  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3310                  CARD (set_of_list ul) = 3 + 1`);
3311  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3312  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3313  (ARITH_TAC);
3314  (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);
3315  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
3316  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
3317  (AP_THM_TAC THEN AP_TERM_TAC);
3318
3319  (REWRITE_WITH 
3320   `measurable (conic_cap u0 u1 r d) /\
3321              vol (conic_cap u0 u1 r d) =
3322              (if u1 = u0 \/ &1 <= d \/ r < &0
3323               then &0
3324               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
3325  (MATCH_MP_TAC VOLUME_CONIC_CAP);
3326  (EXPAND_TAC "d");
3327  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3328  (COND_CASES_TAC);
3329  (NEW_GOAL `F`);
3330  (UP_ASM_TAC THEN STRIP_TAC);
3331  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
3332  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3333  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3334  (UP_ASM_TAC THEN MESON_TAC[]);
3335  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
3336
3337
3338  (REWRITE_WITH `max d (--(&1)) = d`);
3339  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
3340  (REWRITE_TAC[REAL_NEG_LT0]);
3341  (STRIP_TAC);
3342  (EXPAND_TAC "d");
3343  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3344  (REAL_ARITH_TAC);
3345
3346  (REWRITE_WITH `
3347   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
3348   ((&2 * pi) / (&2 * pi))`);
3349  (REAL_ARITH_TAC);
3350  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
3351  (MATCH_MP_TAC REAL_DIV_REFL);
3352  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
3353  (REAL_ARITH_TAC);
3354  (NEW_GOAL `F`);
3355  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3356  (UP_ASM_TAC THEN MESON_TAC[]);
3357
3358 (* ========================================================================= *)
3359 (* OK here *)
3360
3361  (ASM_CASES_TAC `azim u0 u1 s3 (m:real^3) < pi`);
3362  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3363  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3364  (STRIP_TAC);
3365  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 s3 m)`);
3366  (ASM_SIMP_TAC[WEDGE_LUNE]);
3367  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
3368                  conic_cap u0 u1 r d INTER L`);
3369  (SET_TAC[]);
3370  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3371
3372  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
3373    aff_gt {u0, u1} {s3, m} DIFF conic_cap u0 u1 r d INTER L = {}`);
3374  (EXPAND_TAC "L");
3375  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
3376  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
3377  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3378  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
3379  (EXPAND_TAC "L");
3380  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
3381
3382  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3383                  aff_gt {u0, u1} {m, s3} UNION 
3384    UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN  {m, s3}}`);
3385  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3386  (REWRITE_TAC[Geomdetail.FINITE6]);
3387  (REWRITE_TAC[DISJOINT]);
3388
3389  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3390  (NEW_GOAL `F`);
3391  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3392  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);
3393  (UP_ASM_TAC THEN SET_TAC[]);
3394  (REWRITE_TAC[COPLANAR_3]);
3395  (UP_ASM_TAC THEN MESON_TAC[]);
3396
3397  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3398  (NEW_GOAL `F`);
3399  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3400  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);
3401  (UP_ASM_TAC THEN SET_TAC[]);
3402  (REWRITE_TAC[COPLANAR_3]);
3403  (UP_ASM_TAC THEN MESON_TAC[]);
3404  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3405
3406  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3407  (EXISTS_TAC 
3408   `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3409  (STRIP_TAC);
3410  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3411  (EXISTS_TAC 
3412   `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);
3413  (STRIP_TAC);
3414  (MATCH_MP_TAC NEGLIGIBLE_UNION);
3415  (STRIP_TAC);
3416
3417  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3418  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
3419  (STRIP_TAC);
3420  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3421  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
3422  (SET_TAC[]);
3423  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3424  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3425  (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);
3426  (STRIP_TAC);
3427  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3428  (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);
3429  (SET_TAC[]);
3430  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3431  (REWRITE_TAC[SET_RULE 
3432   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
3433          aff_ge {u0, u1} ({m, s3} DELETE s3) 
3434    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3435  (MATCH_MP_TAC (SET_RULE 
3436   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3437  (STRIP_TAC);
3438  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3439  (STRIP_TAC);
3440  (SET_TAC[]);
3441
3442  (REWRITE_TAC[DISJOINT]);
3443  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3444  (NEW_GOAL `F`);
3445  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3446  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);
3447  (UP_ASM_TAC THEN SET_TAC[]);
3448  (REWRITE_TAC[COPLANAR_3]);
3449  (UP_ASM_TAC THEN MESON_TAC[]);
3450  (UP_ASM_TAC THEN SET_TAC[]);
3451
3452  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3453  (STRIP_TAC);
3454  (SET_TAC[]);
3455  (REWRITE_TAC[DISJOINT]);
3456  (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3457  (NEW_GOAL `F`);
3458  (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3459  (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);
3460  (UP_ASM_TAC THEN SET_TAC[]);
3461  (REWRITE_TAC[COPLANAR_3]);
3462  (UP_ASM_TAC THEN MESON_TAC[]);
3463  (UP_ASM_TAC THEN SET_TAC[]);
3464
3465  (SET_TAC[]);
3466
3467  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
3468  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 s3 m) =
3469              (if &1 < d \/ r < &0
3470               then &0
3471               else azim u0 u1 s3 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);
3472  (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);
3473  (STRIP_TAC);
3474  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3475  (EXISTS_TAC `s3:real^3`);
3476  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3477  (ASM_REWRITE_TAC[]);
3478  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3479  (EXISTS_TAC `m:real^3`);
3480  (ASM_REWRITE_TAC[]);
3481
3482  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
3483  (COND_CASES_TAC);
3484  (NEW_GOAL `F`);
3485
3486  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
3487    UP_ASM_TAC THEN REAL_ARITH_TAC);
3488  (UP_ASM_TAC THEN MESON_TAC[]);
3489
3490  (REWRITE_WITH `azim (u0:real^3) u1 s3 m = dihV u0 u1 s3 m`);
3491  (MATCH_MP_TAC AZIM_DIHV_SAME);
3492  (ASM_REWRITE_TAC[]);
3493  (STRIP_TAC);
3494
3495  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3496  (EXISTS_TAC `m:real^3`);
3497  (ASM_REWRITE_TAC[]);
3498  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3499  (EXISTS_TAC `s3:real^3`);
3500  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3501  (ASM_REWRITE_TAC[]);
3502
3503  (REWRITE_TAC[dihX]);
3504  (COND_CASES_TAC);
3505  (NEW_GOAL `F`);
3506  (UNDISCH_TAC `~NULLSET (X INTER D)`);
3507  (REWRITE_TAC[]);
3508  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3509  (EXISTS_TAC `X:real^3->bool`);
3510  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3511  (UP_ASM_TAC THEN MESON_TAC[]);
3512
3513  (LET_TAC);
3514
3515  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
3516  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3517            ul IN barV V 3 /\
3518            X = mcell k V ul /\
3519            initial_sublist [u0; u1] ul)`);
3520  (STRIP_TAC);
3521  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
3522  (MATCH_MP_TAC SELECT_AX);
3523  (EXISTS_TAC `(2, vl:(real^3)list)`);
3524  (EXPAND_TAC "P");
3525  (REWRITE_TAC[BETA_THM]);
3526  (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);
3527  (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);
3528  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3529  (ASM_REWRITE_TAC[]);
3530
3531  (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3532  (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3533  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3534  (UP_ASM_TAC THEN STRIP_TAC);
3535  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3536  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3537  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
3538
3539  (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);
3540  (MATCH_MP_TAC Ajripqn.AJRIPQN);
3541  (ASM_REWRITE_TAC[]);
3542  (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);
3543  (REWRITE_TAC[ASSUME `X = mcell k V vl`; GSYM (ASSUME `X = mcell k' V ul`);
3544    ASSUME `k = 2`]);
3545  (SET_TAC[]);
3546  (REPEAT STRIP_TAC);
3547  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
3548    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
3549  (SET_TAC[]);
3550  (UNDISCH_TAC `~NULLSET X` THEN UP_ASM_TAC THEN MESON_TAC[]);
3551
3552  (COND_CASES_TAC);
3553  (REWRITE_TAC[dihu2]);
3554  (REWRITE_WITH `omega_list_n V ul 3 = s3`);
3555  (EXPAND_TAC "s3");
3556  (NEW_GOAL `2  = 2 /\
3557              (!k. 2 - 1 <= k /\ k <= 3
3558                   ==> omega_list_n V ul k = omega_list_n V vl k)`);
3559  (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
3560  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);
3561  (STRIP_TAC);
3562  (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3563    ASSUME `k = 2`; ASSUME `k' = 2`]);
3564  (REWRITE_WITH `mcell 2 V ul = X`);
3565  (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);
3566  (ASM_REWRITE_TAC[]);
3567  (UP_ASM_TAC THEN STRIP_TAC);
3568  (FIRST_ASSUM MATCH_MP_TAC);
3569  (ARITH_TAC);
3570
3571  (REWRITE_WITH `mxi V ul = m`);
3572  (EXPAND_TAC "m");
3573  (MATCH_MP_TAC MCELL_ID_MXI);
3574  (EXISTS_TAC `2` THEN EXISTS_TAC `2`);
3575  (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);
3576  (STRIP_TAC);
3577
3578  (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3579  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3580  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3581  (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
3582                  CARD (set_of_list vl) = 3 + 1`);
3583  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3584  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3585  (ARITH_TAC);
3586  (ASM_REWRITE_TAC[HD]);
3587
3588  (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);
3589  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3590  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3591  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3592                  CARD (set_of_list ul) = 3 + 1`);
3593  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3594  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3595  (ARITH_TAC);
3596
3597  (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3598  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3599  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3600  (REWRITE_TAC[HD]);
3601
3602  (STRIP_TAC);
3603  (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3604    ASSUME `k = 2`; ASSUME `k' = 2`]);
3605  (REWRITE_WITH `mcell 2 V ul = X`);
3606  (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);
3607  (ASM_REWRITE_TAC[]);
3608
3609  (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);
3610  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3611  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3612  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3613  (ASM_REWRITE_TAC[]);
3614
3615  (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
3616  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3617  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3618  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3619                  CARD (set_of_list ul) = 3 + 1`);
3620  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3621  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3622  (ARITH_TAC);
3623
3624  (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
3625  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3626  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3627  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3628                  CARD (set_of_list ul) = 3 + 1`);
3629  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3630  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3631  (ARITH_TAC);
3632  (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);
3633  (REWRITE_TAC[DIHV_SYM_2]);
3634  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
3635
3636  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
3637  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
3638  (AP_THM_TAC THEN AP_TERM_TAC);
3639  (REWRITE_WITH 
3640   `measurable (conic_cap u0 u1 r d) /\
3641              vol (conic_cap u0 u1 r d) =
3642              (if u1 = u0 \/ &1 <= d \/ r < &0
3643               then &0
3644               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
3645  (MATCH_MP_TAC VOLUME_CONIC_CAP);
3646  (EXPAND_TAC "d");
3647  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3648  (COND_CASES_TAC);
3649  (NEW_GOAL `F`);
3650  (UP_ASM_TAC THEN STRIP_TAC);
3651  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3652
3653  (UP_ASM_TAC THEN UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);
3654  (UP_ASM_TAC THEN UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);
3655  (UP_ASM_TAC THEN MESON_TAC[]);
3656
3657  (REWRITE_WITH `max d (--(&1)) = d`);
3658  (MATCH_MP_TAC (REAL_ARITH `&0 < d ==> max d (--(&1)) = d`));
3659  (EXPAND_TAC "d");
3660  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3661  (REWRITE_WITH `
3662   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
3663   ((&2 * pi) / (&2 * pi))`);
3664  (REAL_ARITH_TAC);
3665  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
3666  (MATCH_MP_TAC REAL_DIV_REFL);
3667  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
3668  (REAL_ARITH_TAC);
3669  (NEW_GOAL `F`);
3670  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3671  (UP_ASM_TAC THEN MESON_TAC[]);
3672
3673 (* ========================================================================== *)
3674
3675  (NEW_GOAL `F`);
3676  (NEW_GOAL `azim (u0:real^3) u1 s3 m = 
3677   (if azim u0 u1 m s3 = &0 then &0 else &2 * pi - azim u0 u1 m s3)`);
3678  (MATCH_MP_TAC AZIM_COMPL);
3679  (STRIP_TAC);
3680
3681  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3682  (EXISTS_TAC `s3:real^3`);
3683  (ASM_REWRITE_TAC[]);
3684  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3685  (EXISTS_TAC `m:real^3`);
3686  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
3687  (ASM_REWRITE_TAC[]);
3688  (UP_ASM_TAC THEN COND_CASES_TAC);
3689  (NEW_GOAL `F`);
3690  (NEW_GOAL `(&0 < pi)`);
3691  (REWRITE_TAC[PI_POS]);
3692  (UNDISCH_TAC `~(azim (u0:real^3) u1 m s3 < pi)`);
3693  (ASM_REWRITE_TAC[]);
3694  (UP_ASM_TAC THEN MESON_TAC[]);
3695  (STRIP_TAC);
3696
3697  (NEW_GOAL `azim (u0:real^3) u1 m s3 = pi`);
3698  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3699  (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3700  (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
3701  (ASM_REWRITE_TAC[]);
3702  (UP_ASM_TAC THEN MESON_TAC[]);
3703
3704
3705 (* ========================================================================= *)
3706 (*  Case k >= 4                                                              *)
3707 (* ========================================================================= *)
3708
3709  (ASM_CASES_TAC `k >= 4`);
3710  (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);
3711  (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);
3712  (MATCH_MP_TAC BARV_3_EXPLICIT);
3713  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3714  (UP_ASM_TAC THEN STRIP_TAC);
3715  (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
3716
3717  (REWRITE_WITH `u0 = v0:real^3`);
3718  (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);
3719  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
3720    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
3721  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
3722
3723  (REWRITE_WITH `u1 = v1:real^3`);
3724  (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);
3725  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
3726    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3727  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3728  (ASM_REWRITE_TAC[]);
3729  (UP_ASM_TAC THEN STRIP_TAC);
3730
3731  (ABBREV_TAC `L = aff_ge{u0, u1} {u2, u3:real^3}`);
3732
3733  (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
3734  (AP_TERM_TAC);
3735  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`;set_of_list]);
3736  (COND_CASES_TAC);
3737
3738  (EXPAND_TAC "L");
3739  (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
3740  (STRIP_TAC);
3741  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));
3742  (REWRITE_TAC[Marchal_cells_2.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
3743  (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
3744                             A INTER B SUBSET C INTER B`));
3745  (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, u3}`);
3746  (REWRITE_TAC[DISJOINT]);
3747  (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));
3748  (STRIP_TAC);
3749  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3750  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3751  (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);
3752  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list]);
3753  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3754  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
3755  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3756  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
3757  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
3758  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
3759  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
3760  (UP_ASM_TAC THEN SET_TAC[]);
3761  (REWRITE_TAC[COPLANAR_3]);
3762  (NEW_GOAL `u3 IN {u0, u1:real^3}`);
3763  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3764  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
3765  (UP_ASM_TAC THEN SET_TAC[]);
3766  (REWRITE_TAC[COPLANAR_3]);
3767
3768  (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, u3:real^3}`; AFF_GE_2_2]);
3769  (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);
3770  (REPEAT STRIP_TAC);
3771  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
3772    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
3773  (ASM_REWRITE_TAC[]);
3774  (STRIP_TAC);
3775
3776  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
3777  (STRIP_TAC);
3778  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
3779  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
3780    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
3781  (EXPAND_TAC "D");
3782  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
3783  (DISJ1_TAC);
3784  (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
3785
3786  (NEW_GOAL `(?b1:real. b1 IN P2 /\ (!x. x IN P2 ==> b1 <= x))`);
3787  (FIRST_ASSUM MATCH_MP_TAC);
3788  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
3789  (EXISTS_TAC `(f2:(real^3)list -> real) vl`);
3790  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3791  (EXISTS_TAC `vl:(real^3)list`);
3792  (ASM_REWRITE_TAC[]);
3793  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3794  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3795  (STRIP_TAC);
3796  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3797  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3798  (EXISTS_TAC `X INTER (C:real^3->bool)`);
3799  (STRIP_TAC);
3800  (ASM_REWRITE_TAC[]);
3801  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
3802  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
3803  (MATCH_MP_TAC (SET_RULE 
3804   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
3805  (STRIP_TAC);
3806  (MATCH_MP_TAC SUBSET_BALL);
3807  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3808  (MATCH_MP_TAC RCONE_GT_SUBSET);
3809  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
3810  (FIRST_X_ASSUM CHOOSE_TAC);
3811
3812  (NEW_GOAL `r2 = (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x:real))`);
3813  (EXPAND_TAC "r2");
3814  (COND_CASES_TAC);
3815  (NEW_GOAL `F`);
3816  (UP_ASM_TAC THEN REWRITE_TAC[]);
3817  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
3818  (EXISTS_TAC `(f2:(real^3)list -> real) vl`);
3819  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3820  (EXISTS_TAC `vl:(real^3)list`);
3821  (ASM_REWRITE_TAC[]);
3822  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3823  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3824  (STRIP_TAC);
3825  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3826  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3827  (EXISTS_TAC `X INTER (C:real^3->bool)`);
3828  (STRIP_TAC);
3829  (ASM_REWRITE_TAC[]);
3830  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
3831  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
3832  (MATCH_MP_TAC (SET_RULE 
3833   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
3834  (STRIP_TAC);
3835  (MATCH_MP_TAC SUBSET_BALL);
3836  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3837  (MATCH_MP_TAC RCONE_GT_SUBSET);
3838  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
3839  (UP_ASM_TAC THEN MESON_TAC[]);
3840  (REWRITE_TAC[]);
3841
3842  (ABBREV_TAC `Q1 = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
3843  (NEW_GOAL `(Q1:real->bool) r2`);
3844  (ASM_REWRITE_TAC[]);
3845  (MATCH_MP_TAC SELECT_AX);
3846  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
3847  (ASM_REWRITE_TAC[]);
3848  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
3849  (NEW_GOAL `r2 <= f2 (vl:(real^3)list)`);
3850  (FIRST_ASSUM MATCH_MP_TAC);
3851  (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3852  (EXISTS_TAC `vl:(real^3)list`);
3853  (ASM_REWRITE_TAC[]);
3854  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3855  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3856  (STRIP_TAC);
3857  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3858  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3859  (EXISTS_TAC `X INTER (C:real^3->bool)`);
3860  (STRIP_TAC);
3861  (ASM_REWRITE_TAC[]);
3862  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
3863  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
3864  (MATCH_MP_TAC (SET_RULE 
3865   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
3866  (STRIP_TAC);
3867  (MATCH_MP_TAC SUBSET_BALL);
3868  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3869  (MATCH_MP_TAC RCONE_GT_SUBSET);
3870  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
3871
3872  (UP_ASM_TAC THEN EXPAND_TAC "f2" THEN REWRITE_TAC[EL; HD; TL; 
3873    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
3874    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
3875  (NEW_GOAL `!v. v IN affine hull {u1, u2, u3:real^3} ==> r2 <= dist (u0, v)`);
3876  (REPEAT STRIP_TAC);
3877  (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, u3}) u0) <= 
3878              dist (u0, v:real^3)`);
3879  (MATCH_MP_TAC CLOSEST_POINT_LE);
3880  (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
3881  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3882
3883  (NEW_GOAL `r <= dist (u0:real^3, x)`);
3884  (REWRITE_TAC[dist]);
3885  (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);
3886  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3887  (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);
3888  (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
3889   (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) = 
3890   (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);
3891  (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 + 
3892                           t3 /(t2 + t3 + t4) % u2 + 
3893                           t4 /(t2 + t3 + t4) % u3`);
3894  (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % u3) = (t2 + t3 + t4) % (y:real^3)`);
3895  (EXPAND_TAC "y");
3896  (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 +  t3 / x % u2 + t4 / x % u3) = 
3897    (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);
3898  (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
3899  (MATCH_MP_TAC REAL_DIV_REFL);
3900  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
3901  (REAL_ARITH_TAC);
3902  (VECTOR_ARITH_TAC);
3903  (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);
3904
3905  (NEW_GOAL `&1 < t2 + t3 + t4`);
3906  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
3907  (REAL_ARITH_TAC);
3908  (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`); 
3909  (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3910  (REWRITE_TAC[GSYM dist]);
3911  (NEW_GOAL `r2 <= dist (u0, y:real^3)`);
3912  (FIRST_ASSUM MATCH_MP_TAC);
3913  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3914  (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
3915    EXISTS_TAC `t4 / (t2 + t3 + t4)`);
3916  (STRIP_TAC);
3917  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
3918  (MATCH_MP_TAC REAL_DIV_REFL);
3919  (UP_ASM_TAC THEN REAL_ARITH_TAC);
3920  (ASM_REWRITE_TAC[]);
3921
3922  (NEW_GOAL `r2 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
3923  (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
3924  (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
3925  (MATCH_MP_TAC REAL_LE_MUL);
3926  (REWRITE_TAC[DIST_POS_LE]);
3927  (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3928  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3929  (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3930  (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3931
3932 (* ========================================================================== *)
3933
3934
3935  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
3936  (STRIP_TAC);
3937  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
3938  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
3939    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
3940  (EXPAND_TAC "D");
3941  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
3942  (DISJ2_TAC);
3943  (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);
3944
3945  (NEW_GOAL `(?b1:real. b1 IN P4 /\ (!x. x IN P4 ==> x <= b1))`);
3946  (FIRST_ASSUM MATCH_MP_TAC);
3947  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
3948  (EXISTS_TAC `(f4:(real^3)list -> real) vl`);
3949  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3950  (EXISTS_TAC `vl:(real^3)list`);
3951  (ASM_REWRITE_TAC[]);
3952  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3953  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3954  (STRIP_TAC);
3955  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3956  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3957  (EXISTS_TAC `X INTER (C:real^3->bool)`);
3958  (STRIP_TAC);
3959  (ASM_REWRITE_TAC[]);
3960  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
3961  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
3962  (MATCH_MP_TAC (SET_RULE 
3963   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
3964  (STRIP_TAC);
3965  (MATCH_MP_TAC SUBSET_BALL);
3966  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3967  (MATCH_MP_TAC RCONE_GT_SUBSET);
3968  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
3969  (FIRST_X_ASSUM CHOOSE_TAC);
3970
3971  (NEW_GOAL `d2 = (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b:real))`);
3972  (EXPAND_TAC "d2");
3973  (COND_CASES_TAC);
3974  (NEW_GOAL `F`);
3975  (UP_ASM_TAC THEN REWRITE_TAC[]);
3976  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
3977  (EXISTS_TAC `(f4:(real^3)list -> real) vl`);
3978  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3979  (EXISTS_TAC `vl:(real^3)list`);
3980  (ASM_REWRITE_TAC[]);
3981  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3982  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
3983  (STRIP_TAC);
3984  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3985  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3986  (EXISTS_TAC `X INTER (C:real^3->bool)`);
3987  (STRIP_TAC);
3988  (ASM_REWRITE_TAC[]);
3989  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
3990  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
3991  (MATCH_MP_TAC (SET_RULE 
3992   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
3993  (STRIP_TAC);
3994  (MATCH_MP_TAC SUBSET_BALL);
3995  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3996  (MATCH_MP_TAC RCONE_GT_SUBSET);
3997  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
3998  (UP_ASM_TAC THEN MESON_TAC[]);
3999  (REWRITE_TAC[]);
4000
4001  (ABBREV_TAC `Q1 = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
4002  (NEW_GOAL `(Q1:real->bool) d2`);
4003  (ASM_REWRITE_TAC[]);
4004  (MATCH_MP_TAC SELECT_AX);
4005  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
4006  (ASM_REWRITE_TAC[]);
4007  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
4008
4009  (NEW_GOAL `f4 (vl:(real^3)list) <= d2`);
4010  (FIRST_ASSUM MATCH_MP_TAC);
4011  (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4012  (EXISTS_TAC `vl:(real^3)list`);
4013  (ASM_REWRITE_TAC[]);
4014  (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4015  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4016  (STRIP_TAC);
4017  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4018  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4019  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4020  (STRIP_TAC);
4021  (ASM_REWRITE_TAC[]);
4022  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4023  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4024  (MATCH_MP_TAC (SET_RULE 
4025   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4026  (STRIP_TAC);
4027  (MATCH_MP_TAC SUBSET_BALL);
4028  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4029  (MATCH_MP_TAC RCONE_GT_SUBSET);
4030  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4031
4032  (UP_ASM_TAC THEN EXPAND_TAC "f4");
4033  (REWRITE_TAC[EL; HD; TL; 
4034    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
4035    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
4036  (ABBREV_TAC `xx = smallest_angle_line u2 u3 u0 u1`);
4037
4038  (MP_TAC (ASSUME `smallest_angle_line u2 u3 u0 u1 = xx`));
4039  (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
4040  (ABBREV_TAC `Q2 = 
4041  (\x:real^3. x IN convex hull {u2, u3} /\
4042              (!y. y IN convex hull {u2, u3}
4043                   ==> ((y - u0) dot (u1 - u0)) /
4044                       (norm (y - u0) * norm (u1 - u0)) <=
4045                       ((x - u0) dot (u1 - u0)) /
4046                       (norm (x - u0) * norm (u1 - u0))))`);
4047  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);
4048  (NEW_GOAL `(Q2:real^3->bool) xx`);
4049  (ONCE_ASM_REWRITE_TAC[]);
4050  (MATCH_MP_TAC SELECT_AX);
4051  (EXPAND_TAC "Q2");
4052
4053  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
4054  (STRIP_TAC);
4055  (ASM_REWRITE_TAC[]);
4056  (STRIP_TAC);
4057
4058  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4059  (REWRITE_TAC[]);
4060  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4061  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4062  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`]);
4063  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4064
4065  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4066  (STRIP_TAC);
4067  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4068  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4069  (REWRITE_TAC[coplanar]);
4070  (UNDISCH_TAC `u0 IN convex hull {u2, u3:real^3}`);
4071  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
4072  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4073    EXISTS_TAC `u3:real^3`);
4074  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
4075  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4076  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4077  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
4078  (STRIP_TAC);
4079  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
4080  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
4081  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4082  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4083  (SET_TAC[]);
4084
4085  (UP_ASM_TAC THEN EXPAND_TAC "Q2");
4086  (STRIP_TAC);
4087  (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) / 
4088                                (norm (y - u0) * norm (u1 - u0)))`);
4089
4090  (NEW_GOAL `d < (g:real^3->real) x`);
4091  (EXPAND_TAC "g");
4092  (REWRITE_WITH 
4093   `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
4094    d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);
4095  (MATCH_MP_TAC REAL_LT_RDIV_EQ);
4096  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
4097  (STRIP_TAC);
4098  (MATCH_MP_TAC REAL_LE_MUL);
4099  (ASM_REWRITE_TAC[NORM_POS_LE]);
4100  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);
4101  (ASM_REWRITE_TAC[]);
4102  (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = u0:real^3 <=>
4103   t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = (t1 + t2 + t3 + t4) % u0`);
4104  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4105  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);
4106  (STRIP_TAC);
4107
4108  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
4109  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4110  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4111  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);
4112  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4113  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4114  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4115  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4116  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4117  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
4118  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
4119  (REWRITE_TAC[affine_dependent]);
4120  (EXISTS_TAC `u1:real^3`);
4121  (STRIP_TAC);
4122  (SET_TAC[]);
4123
4124  (NEW_GOAL `~(u1 IN {u0, u2, u3:real^3})`);
4125  (STRIP_TAC);
4126  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
4127  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4128  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4129  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);
4130  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4131  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4132  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4133  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4134  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4135  (REWRITE_WITH `{u0, u1, u2, u3} = {u0:real^3,u2, u3}`);
4136  (UP_ASM_TAC THEN SET_TAC[]);
4137  (REWRITE_TAC[COPLANAR_3]);
4138  (SET_TAC[]);
4139  (REWRITE_WITH `{u0, u1, u2, u3} DELETE u1 = {u0, u2, u3:real^3}`);
4140  (UP_ASM_TAC THEN SET_TAC[]);
4141  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4142  (EXISTS_TAC `(t2 + t3 + t4) / t2`);
4143  (EXISTS_TAC `(-- t3) / t2`);
4144  (EXISTS_TAC `(-- t4) / t2`);
4145
4146  (STRIP_TAC);
4147  (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);
4148  (REAL_ARITH_TAC);
4149  (MATCH_MP_TAC REAL_DIV_REFL);
4150  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4151  (REWRITE_WITH 
4152   `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3:real^3 <=> 
4153    u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % u3)`);
4154  (VECTOR_ARITH_TAC);
4155  (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % u3 = 
4156                              (t2 + t3 + t4) % u0:real^3`)]);
4157  (REWRITE_TAC[VECTOR_ARITH 
4158   `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);
4159  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
4160  (REWRITE_WITH `&1 / t2 * t2 = &1`);
4161  (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);
4162  (MATCH_MP_TAC REAL_DIV_REFL);
4163  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4164  (VECTOR_ARITH_TAC);
4165  (SET_TAC[]);
4166  (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);
4167  (ASM_REWRITE_TAC[]);
4168
4169  (NEW_GOAL `g x <= (g:real^3->real) xx`);
4170  (NEW_GOAL `!y. y IN convex hull {u2 , u3:real^3} ==> g y <= g xx`);
4171  (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);
4172  (NEW_GOAL `&0 < (t3 + t4)`);
4173  (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0)  ==> &0 < x`));
4174  (STRIP_TAC);
4175  (MATCH_MP_TAC REAL_LE_ADD);
4176  (ASM_REWRITE_TAC[]);
4177  (STRIP_TAC);
4178  (NEW_GOAL `t3 = &0 /\ t4 = &0`);
4179  (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN 
4180    UP_ASM_TAC THEN REAL_ARITH_TAC);
4181  (UP_ASM_TAC THEN STRIP_TAC);
4182
4183  (NEW_GOAL `F`);
4184  (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);
4185  (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);
4186  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4187  (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));
4188  (STRIP_TAC);
4189  (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) - 
4190                  (t1 + t2 + t3 + t4) % u0:real^3`);
4191  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4192  (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH 
4193   `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; 
4194    DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
4195  (MATCH_MP_TAC REAL_LE_MUL);
4196  (REWRITE_TAC[DOT_POS_LE]);
4197  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4198  (MATCH_MP_TAC REAL_LE_MUL);
4199  (REWRITE_TAC[DIST_POS_LE]);
4200  (MATCH_MP_TAC REAL_LE_MUL);
4201  (REWRITE_TAC[DIST_POS_LE]);
4202  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);
4203  (REAL_ARITH_TAC);
4204  (UP_ASM_TAC THEN MESON_TAC[]);
4205
4206  (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3:real^3`);
4207  (NEW_GOAL `(g:real^3->real) y <= g xx`);
4208  (FIRST_ASSUM MATCH_MP_TAC);
4209  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
4210  (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
4211  (REPEAT STRIP_TAC);
4212  (MATCH_MP_TAC REAL_LE_DIV);
4213  (ASM_SIMP_TAC[REAL_LE_ADD]);
4214  (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);
4215  (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
4216  (MATCH_MP_TAC REAL_DIV_REFL);
4217  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4218  (ASM_REWRITE_TAC[]);
4219
4220  (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 + 
4221                    t4 / (t1 + t3 + t4) % u3:real^3`);
4222  (NEW_GOAL `(g:real^3->real) y = g w`);
4223  (EXPAND_TAC "g");
4224
4225  (REWRITE_WITH `y:real^3 - u0 = 
4226                 &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);
4227  (EXPAND_TAC "y");
4228  (REWRITE_TAC[VECTOR_ARITH 
4229   `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
4230    &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
4231    (t3 + t4) / (t3 + t4) % u0 = u0`]);
4232  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4233  (MATCH_MP_TAC REAL_DIV_REFL);
4234  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4235  (VECTOR_ARITH_TAC);
4236  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
4237
4238  (REWRITE_WITH `w:real^3 - u0 = 
4239                 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);
4240  (EXPAND_TAC "w");
4241  (REWRITE_TAC[VECTOR_ARITH 
4242    `(t1 / (t1 + t3 + t4) % u0 +
4243     t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
4244     &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
4245     (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
4246  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4247  (MATCH_MP_TAC REAL_DIV_REFL);
4248  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
4249    THEN REAL_ARITH_TAC);
4250  (VECTOR_ARITH_TAC);
4251  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
4252  (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
4253  (REWRITE_TAC[REAL_ABS_REFL]);
4254  (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
4255  (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
4256  (REWRITE_TAC[REAL_ABS_REFL]);
4257  (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
4258  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
4259    THEN REAL_ARITH_TAC);
4260  (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) = 
4261                            (a * x) / (a * (y * z))`]);
4262  (ABBREV_TAC 
4263   `a1 = norm (t3 % u2 + t4 % u3 - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
4264  (NEW_GOAL `~(a1 = &0)`);
4265  (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; 
4266    VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
4267  (STRIP_TAC);
4268
4269  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4270  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4271  (EXISTS_TAC `(X:real^3->bool)`);
4272  (STRIP_TAC);
4273  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4274  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4275  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4276  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4277  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4278  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4279  (REWRITE_TAC[coplanar]);
4280  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4281    EXISTS_TAC `u3:real^3`);
4282  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4283  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4284  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4285  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
4286    THEN EXISTS_TAC `t4 / (t3 + t4)`);
4287  (REPEAT STRIP_TAC);
4288  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
4289                           (t3 + t4) / (t3 + t4)`]);
4290  (MATCH_MP_TAC REAL_DIV_REFL);
4291  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4292  (ASM_REWRITE_TAC[VECTOR_ARITH 
4293    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
4294     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
4295  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4296  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4297  (MATCH_MP_TAC REAL_DIV_REFL);
4298  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4299  (VECTOR_ARITH_TAC);
4300  (SET_TAC[]);
4301
4302  (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
4303  (NEW_GOAL `&0 < &1 / (t3 + t4)`);
4304  (MATCH_MP_TAC REAL_LT_DIV);
4305  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
4306  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4307
4308  (REWRITE_WITH 
4309  `(&1 / (t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4310   (&1 / (t3 + t4) * a1) = 
4311   ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
4312  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
4313
4314  (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
4315  (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);
4316  (MATCH_MP_TAC REAL_LT_DIV);
4317  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
4318  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4319    REAL_ARITH_TAC);
4320  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4321
4322  (REWRITE_WITH 
4323  `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4324   (&1 / (t1 + t3 + t4) * a1) = 
4325   ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
4326  (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
4327    MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
4328
4329  (NEW_GOAL `(g:real^3->real) x <= g w`);
4330  (EXPAND_TAC "g");
4331
4332  (REWRITE_WITH 
4333   `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
4334   ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
4335   ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <= 
4336   ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
4337  (MATCH_MP_TAC RAT_LEMMA4);
4338  (STRIP_TAC);
4339  (MATCH_MP_TAC REAL_LT_MUL);
4340  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
4341  (STRIP_TAC);
4342  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4343  (REWRITE_TAC[]);
4344
4345  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4346  (EXISTS_TAC `(X:real^3->bool)`);
4347  (STRIP_TAC);
4348  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4349  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4350  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4351  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4352  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4353  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4354  (REWRITE_TAC[coplanar]);
4355  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4356    EXISTS_TAC `u3:real^3`);
4357  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
4358  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4359  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4360  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4361  (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
4362    THEN EXISTS_TAC `(--t4) / t2`);
4363  (REPEAT STRIP_TAC);
4364  (REWRITE_TAC[REAL_ARITH 
4365    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
4366  (MATCH_MP_TAC REAL_DIV_REFL);
4367  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4368  (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
4369  (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4370  (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % u3:real^3 = t2 % u1`);
4371  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
4372  (ASM_REWRITE_TAC[VECTOR_ARITH 
4373    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
4374     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
4375  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4376  (REWRITE_WITH `t2 / t2 = &1`);
4377  (MATCH_MP_TAC REAL_DIV_REFL);
4378  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4379  (VECTOR_ARITH_TAC);
4380  (SET_TAC[]);
4381
4382  (MATCH_MP_TAC REAL_LT_MUL);
4383  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
4384  (EXPAND_TAC "w" THEN STRIP_TAC);
4385  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4386  (REWRITE_TAC[]);
4387
4388  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4389  (EXISTS_TAC `(X:real^3->bool)`);
4390  (STRIP_TAC);
4391  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4392  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4393  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4394  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4395  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4396  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4397  (REWRITE_TAC[coplanar]);
4398  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4399    EXISTS_TAC `u3:real^3`);
4400  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4401  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4402  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4403
4404  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
4405    THEN EXISTS_TAC `t4 / (t3 + t4)`);
4406  (REPEAT STRIP_TAC);
4407  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
4408                           (t3 + t4) / (t3 + t4)`]);
4409  (MATCH_MP_TAC REAL_DIV_REFL);
4410  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4411  (ASM_REWRITE_TAC[VECTOR_ARITH 
4412    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
4413     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
4414  (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH 
4415    `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 = 
4416     (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4417  (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % u3) = u0 <=> 
4418                  t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0:real^3`);
4419  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4420  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
4421  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN 
4422    REAL_ARITH_TAC);
4423
4424  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
4425    <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
4426  (STRIP_TAC THEN ASM_REWRITE_TAC[]);
4427  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4428  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4429  (MATCH_MP_TAC REAL_DIV_REFL);
4430  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4431  (VECTOR_ARITH_TAC);
4432  (SET_TAC[]);
4433
4434  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
4435  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
4436  (REWRITE_TAC[VECTOR_ARITH 
4437   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
4438    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4439  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4440  (MATCH_MP_TAC REAL_DIV_REFL);
4441  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4442    REAL_ARITH_TAC);
4443  (VECTOR_ARITH_TAC);
4444  (ABBREV_TAC `t = t1 + t3 + t4`);
4445  (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 = 
4446                 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
4447  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4448  (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
4449  (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
4450  (REWRITE_TAC[VECTOR_ARITH 
4451   `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
4452  (ABBREV_TAC `x1 = u1 - u0:real^3`);
4453  (ABBREV_TAC `x2 = w - u0:real^3`);
4454
4455  (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 = 
4456    t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
4457  (REWRITE_TAC[NORM_POW_2]);
4458  (VECTOR_ARITH_TAC);
4459
4460  (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <= 
4461              t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
4462  (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
4463    t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
4464  (MATCH_MP_TAC REAL_LE_MUL);
4465  (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
4466  (MATCH_MP_TAC REAL_LE_MUL);
4467  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
4468  (STRIP_TAC);
4469  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4470  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
4471
4472  (NEW_GOAL 
4473  `t2 * (x2 dot x1) * norm x1 * norm x1 + t * (x2 dot x1) * norm x2 * norm x1 <= 
4474   (x2 dot x1) * norm (t2 % x1 + t % x2) * norm (x1:real^3)`);
4475
4476  (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
4477  x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
4478  (MATCH_MP_TAC REAL_LE_MUL);
4479  (STRIP_TAC);
4480  (MATCH_MP_TAC REAL_LE_MUL);
4481  (REWRITE_TAC[NORM_POS_LE]);
4482  (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
4483  (NEW_GOAL `F`);
4484  (NEW_GOAL `(g:real^3->real) x <= &0`);
4485  (EXPAND_TAC "g");
4486  (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
4487  (MATCH_MP_TAC REAL_LE_DIV);
4488  (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
4489
4490  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
4491  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
4492  (REWRITE_TAC[VECTOR_ARITH 
4493   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
4494    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4495  (EXPAND_TAC "t");
4496  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4497  (MATCH_MP_TAC REAL_DIV_REFL);
4498  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4499    REAL_ARITH_TAC);
4500  (VECTOR_ARITH_TAC);
4501
4502  (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
4503  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 = 
4504                  (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
4505  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4506  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 = 
4507    t2 % x1 + t % x2:real^3`);
4508  (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
4509    THEN VECTOR_ARITH_TAC);
4510  (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
4511  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
4512  (MATCH_MP_TAC REAL_LE_MUL);
4513  (STRIP_TAC);
4514  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4515    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4516  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4517  (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
4518  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
4519  (MATCH_MP_TAC REAL_LE_MUL);
4520  (STRIP_TAC);
4521  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4522    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4523  (REWRITE_TAC[DOT_POS_LE]);
4524  (REWRITE_TAC[DOT_LADD]);
4525  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4526  (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);
4527  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);
4528  (REAL_ARITH_TAC);
4529  (UP_ASM_TAC THEN MESON_TAC[]);
4530  (UP_ASM_TAC THEN REAL_ARITH_TAC);
4531
4532  (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
4533  (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
4534  (AP_THM_TAC THEN AP_TERM_TAC);
4535  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4536  (REWRITE_TAC[REAL_ABS_REFL]);
4537  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4538    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4539  (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
4540  (AP_THM_TAC THEN AP_TERM_TAC);
4541  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4542  (REWRITE_TAC[REAL_ABS_REFL]);
4543  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4544  (REWRITE_TAC[GSYM NORM_MUL]);
4545  (REWRITE_WITH 
4546   `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
4547  (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
4548  (REWRITE_TAC[NORM_TRIANGLE]);
4549  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4550  (UNDISCH_TAC `(g:real^3->real) y <= g xx`);
4551  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4552
4553  (NEW_GOAL `(g:real^3->real) xx <= d2`);
4554  (FIRST_ASSUM MATCH_MP_TAC);
4555  (EXPAND_TAC "P4");
4556  (EXPAND_TAC "g" THEN EXPAND_TAC "f4");
4557  (REWRITE_TAC[IN_ELIM_THM; IN]);
4558  (EXISTS_TAC `vl:(real^3)list`);
4559  (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`; 
4560                TRUNCATE_SIMPLEX_EXPLICIT_1]);
4561  (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
4562  (EXPAND_TAC "xx");
4563  (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4564  (REWRITE_WITH `mcell 4 V vl = mcell k V vl`);
4565  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4566  (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);
4567  (STRIP_TAC);
4568
4569  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4570  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4571  (EXISTS_TAC `X INTER (C:real^3->bool)`);
4572  (STRIP_TAC);
4573  (ASM_REWRITE_TAC[]);
4574  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4575  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4576  (MATCH_MP_TAC (SET_RULE 
4577   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4578  (STRIP_TAC);
4579  (MATCH_MP_TAC SUBSET_BALL);
4580  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4581  (MATCH_MP_TAC RCONE_GT_SUBSET);
4582  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4583
4584  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");
4585  (REAL_ARITH_TAC);
4586
4587  (NEW_GOAL `F`);
4588  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4589  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4590  (EXISTS_TAC `(X:real^3->bool)`);
4591  (STRIP_TAC);
4592  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4593  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4594  (SET_TAC[]);
4595  (UP_ASM_TAC THEN MESON_TAC[]);
4596
4597
4598 (* ========================================================================= *)
4599
4600  (NEW_GOAL `~coplanar {u0, u1, u2, u3:real^3}`);
4601  (STRIP_TAC);
4602  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4603  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4604  (EXISTS_TAC `X:real^3->bool`);
4605  (STRIP_TAC);
4606  (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4607  (COND_CASES_TAC);
4608  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4609  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4610  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4611  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4612  (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4613  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4614  (SET_TAC[]);
4615
4616  (ASM_CASES_TAC `azim u0 u1 u2 (u3:real^3) < pi`);
4617  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 u3)`);
4618  (ASM_SIMP_TAC[WEDGE_LUNE]);
4619  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
4620                  conic_cap u0 u1 r d INTER L`);
4621  (SET_TAC[]);
4622  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
4623  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
4624    aff_gt {u0, u1} {u2, u3} DIFF conic_cap u0 u1 r d INTER L = {}`);
4625  (EXPAND_TAC "L");
4626  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
4627  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
4628  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
4629  (EXPAND_TAC "L");
4630
4631  (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
4632                  aff_gt {u0, u1} {u2, u3} UNION 
4633    UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN  {u2, u3}}`);
4634  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
4635  (REWRITE_TAC[Geomdetail.FINITE6]);
4636  (REWRITE_TAC[DISJOINT]);
4637
4638  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
4639  (NEW_GOAL `F`);
4640  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4641  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
4642  (UP_ASM_TAC THEN SET_TAC[]);
4643  (REWRITE_TAC[COPLANAR_3]);
4644  (UP_ASM_TAC THEN MESON_TAC[]);
4645
4646  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
4647  (NEW_GOAL `F`);
4648  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4649  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
4650  (UP_ASM_TAC THEN SET_TAC[]); 
4651  (REWRITE_TAC[COPLANAR_3]);
4652  (UP_ASM_TAC THEN MESON_TAC[]);
4653  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4654
4655  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4656  (EXISTS_TAC 
4657   `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
4658  (STRIP_TAC);
4659  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4660  (EXISTS_TAC 
4661   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);
4662  (STRIP_TAC);
4663  (MATCH_MP_TAC NEGLIGIBLE_UNION);
4664  (STRIP_TAC);
4665
4666  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4667  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
4668  (STRIP_TAC);
4669  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
4670  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
4671  (SET_TAC[]);
4672  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
4673  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4674  (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);
4675  (STRIP_TAC);
4676  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
4677  (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);
4678  (SET_TAC[]);
4679  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
4680  (REWRITE_TAC[SET_RULE 
4681   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
4682          aff_ge {u0, u1} ({m, s3} DELETE s3) 
4683    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
4684  (MATCH_MP_TAC (SET_RULE 
4685   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
4686  (STRIP_TAC);
4687  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
4688  (STRIP_TAC);
4689  (SET_TAC[]);
4690
4691  (REWRITE_TAC[DISJOINT]);
4692  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
4693  (NEW_GOAL `F`);
4694  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4695  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
4696  (UP_ASM_TAC THEN SET_TAC[]);
4697  (REWRITE_TAC[COPLANAR_3]);
4698  (UP_ASM_TAC THEN MESON_TAC[]);
4699  (UP_ASM_TAC THEN SET_TAC[]);
4700
4701  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
4702  (STRIP_TAC);
4703  (SET_TAC[]);
4704  (REWRITE_TAC[DISJOINT]);
4705  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
4706  (NEW_GOAL `F`);
4707  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4708  (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
4709  (UP_ASM_TAC THEN SET_TAC[]);
4710  (REWRITE_TAC[COPLANAR_3]);
4711  (UP_ASM_TAC THEN MESON_TAC[]);
4712  (UP_ASM_TAC THEN SET_TAC[]);
4713
4714  (SET_TAC[]);
4715
4716 (* begin the computation *)
4717
4718  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
4719  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 u3) =
4720              (if &1 < d \/ r < &0
4721               then &0
4722               else azim u0 u1 u2 u3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
4723  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);
4724  (STRIP_TAC);
4725  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4726  (EXISTS_TAC `u3:real^3`);
4727  (ASM_REWRITE_TAC[]);
4728  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4729  (EXISTS_TAC `u2:real^3`);
4730  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
4731  (ASM_REWRITE_TAC[]);
4732
4733  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
4734  (COND_CASES_TAC);
4735  (NEW_GOAL `F`);
4736  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
4737    UP_ASM_TAC THEN REAL_ARITH_TAC);
4738  (UP_ASM_TAC THEN MESON_TAC[]);
4739
4740  (REWRITE_WITH `azim (u0:real^3) u1 u2 u3 = dihV u0 u1 u2 u3`);
4741  (MATCH_MP_TAC AZIM_DIHV_SAME);
4742  (ASM_REWRITE_TAC[]);
4743  (STRIP_TAC);
4744  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4745  (EXISTS_TAC `u3:real^3`);
4746  (ASM_REWRITE_TAC[]);
4747  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4748  (EXISTS_TAC `u2:real^3`);
4749  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
4750  (ASM_REWRITE_TAC[]);
4751
4752  (REWRITE_TAC[dihX]);
4753  (COND_CASES_TAC);
4754  (NEW_GOAL `F`);
4755  (UNDISCH_TAC `~NULLSET (X INTER D)`);
4756  (REWRITE_TAC[]);
4757  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4758  (EXISTS_TAC `X:real^3->bool`);
4759  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
4760  (UP_ASM_TAC THEN MESON_TAC[]);
4761
4762  (LET_TAC);
4763
4764  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
4765  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
4766            ul IN barV V 3 /\
4767            X = mcell k V ul /\
4768            initial_sublist [u0; u1] ul)`);
4769  (STRIP_TAC);
4770  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
4771  (MATCH_MP_TAC SELECT_AX);
4772  (EXISTS_TAC `(4, vl:(real^3)list)`);
4773  (EXPAND_TAC "P");
4774  (REWRITE_TAC[BETA_THM]);
4775  (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);
4776  (STRIP_TAC);
4777  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4778
4779  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
4780                  LENGTH [u0;u1] = 1 + 1`);
4781  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
4782  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4783  (ASM_REWRITE_TAC[]);
4784  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
4785  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4786  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
4787
4788  (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);
4789  (MATCH_MP_TAC Ajripqn.AJRIPQN);
4790  (ASM_REWRITE_TAC[]);
4791  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4792  (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);
4793  (REWRITE_WITH `mcell 4 V vl = X`);
4794  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4795  (SET_TAC[ASSUME `X = mcell k' V ul`]);
4796
4797  (REPEAT STRIP_TAC);
4798  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
4799    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
4800  (SET_TAC[]);
4801  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
4802
4803  (COND_CASES_TAC);
4804  (NEW_GOAL `F`);
4805  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
4806  (UP_ASM_TAC THEN MESON_TAC[]);
4807  (COND_CASES_TAC);
4808  (NEW_GOAL `F`);
4809  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
4810  (UP_ASM_TAC THEN MESON_TAC[]);
4811  (COND_CASES_TAC);
4812
4813  (REWRITE_TAC[dihu4]);
4814
4815  (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) = 
4816    dihV u0 u1 u2 (u3:real^3)`);
4817
4818  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
4819  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
4820  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
4821
4822  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
4823  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4824  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
4825  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4826                  CARD (set_of_list ul) = 3 + 1`);
4827  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4828  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4829  (ARITH_TAC);
4830
4831  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
4832  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4833  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
4834  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4835                  CARD (set_of_list ul) = 3 + 1`);
4836  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4837  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4838  (ARITH_TAC);
4839
4840  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);
4841  (REWRITE_WITH `
4842     {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
4843     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = 
4844     convex hull {u0, u1,u2,u3:real^3}`);
4845  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4846  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
4847  (REPEAT STRIP_TAC);
4848
4849  (UNDISCH_TAC `~NULLSET X`);
4850  (REWRITE_TAC[]);
4851  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
4852    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
4853  (COND_CASES_TAC);
4854  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
4855  (MATCH_MP_TAC BARV_3_EXPLICIT);
4856  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4857  (UP_ASM_TAC THEN STRIP_TAC);
4858  (ASM_REWRITE_TAC[set_of_list]);
4859  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4860  (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
4861  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4862  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4863  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4864  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
4865  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
4866  (UNDISCH_TAC 
4867    `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);
4868  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
4869                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
4870
4871  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4872
4873  (UNDISCH_TAC `~NULLSET X`);
4874  (REWRITE_TAC[]);
4875  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
4876  (COND_CASES_TAC);
4877  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4878  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4879  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4880  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4881  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4882  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
4883  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
4884  (ASM_REWRITE_TAC[]);
4885  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4886
4887  (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);
4888  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
4889  (COND_CASES_TAC);
4890  (MESON_TAC[]);
4891  (NEW_GOAL `F`);
4892  (UNDISCH_TAC `~NULLSET X`);
4893  (REWRITE_TAC[]);
4894  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
4895  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4896  (UP_ASM_TAC THEN MESON_TAC[]);
4897
4898  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
4899    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
4900  (COND_CASES_TAC);
4901  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
4902  (MATCH_MP_TAC BARV_3_EXPLICIT);
4903  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4904  (UP_ASM_TAC THEN STRIP_TAC);
4905  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
4906  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
4907  (NEW_GOAL `F`);
4908  (UNDISCH_TAC `~NULLSET X`);
4909  (REWRITE_TAC[]);
4910  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
4911    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
4912  (COND_CASES_TAC);
4913  (NEW_GOAL `F`);
4914  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);
4915  (UP_ASM_TAC THEN MESON_TAC[]);
4916  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4917  (UP_ASM_TAC THEN MESON_TAC[]);
4918
4919  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
4920  (STRIP_TAC);
4921
4922  (ASM_CASES_TAC `EL 2 ul = u2:real^3`);
4923  (NEW_GOAL `EL 3 ul = u3:real^3`);
4924  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
4925  (STRIP_TAC);
4926  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);
4927  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4928  (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
4929    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
4930    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);
4931  (ASM_REWRITE_TAC[]);
4932
4933  (NEW_GOAL `EL 2 ul = u3:real^3`);
4934  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
4935  (STRIP_TAC); 
4936  (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);
4937  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4938  (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
4939    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
4940    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);
4941
4942  (NEW_GOAL `EL 3 ul = u2:real^3`);
4943  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
4944  (STRIP_TAC);
4945  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);
4946  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4947  (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
4948    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
4949    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);
4950  (ASM_REWRITE_TAC[]);
4951  (REWRITE_TAC[DIHV_SYM_2]);
4952
4953  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
4954  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
4955  (AP_THM_TAC THEN AP_TERM_TAC);
4956
4957  (REWRITE_WITH 
4958   `measurable (conic_cap u0 u1 r d) /\
4959              vol (conic_cap u0 u1 r d) =
4960              (if u1 = u0 \/ &1 <= d \/ r < &0
4961               then &0
4962               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
4963  (MATCH_MP_TAC VOLUME_CONIC_CAP);
4964  (EXPAND_TAC "d");
4965  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
4966  (COND_CASES_TAC);
4967  (NEW_GOAL `F`);
4968  (UP_ASM_TAC THEN STRIP_TAC);
4969  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
4970  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4971  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4972  (UP_ASM_TAC THEN MESON_TAC[]);
4973  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
4974
4975  (REWRITE_WITH `max d (--(&1)) = d`);
4976  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
4977  (REWRITE_TAC[REAL_NEG_LT0]);
4978  (STRIP_TAC);
4979  (EXPAND_TAC "d");
4980  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
4981  (REAL_ARITH_TAC);
4982
4983  (REWRITE_WITH `
4984   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
4985   ((&2 * pi) / (&2 * pi))`);
4986  (REAL_ARITH_TAC);
4987  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
4988  (MATCH_MP_TAC REAL_DIV_REFL);
4989  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
4990  (REAL_ARITH_TAC);
4991  (NEW_GOAL `F`);
4992  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
4993    THEN MESON_TAC[]);
4994  (UP_ASM_TAC THEN MESON_TAC[]);
4995
4996 (* ========================================================================= *)
4997 (* OK here *)
4998
4999  (ASM_CASES_TAC `azim u0 u1 u3 (u2:real^3) < pi`);
5000  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
5001  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5002  (STRIP_TAC);
5003  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u3 u2)`);
5004  (ASM_SIMP_TAC[WEDGE_LUNE]);
5005  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
5006                  conic_cap u0 u1 r d INTER L`);
5007  (SET_TAC[]);
5008  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
5009
5010  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
5011    aff_gt {u0, u1} {u3, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);
5012  (EXPAND_TAC "L");
5013  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
5014  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
5015  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
5016  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
5017  (EXPAND_TAC "L");
5018  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
5019
5020  (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
5021                  aff_gt {u0, u1} {u2, u3} UNION 
5022    UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN  {u2, u3}}`);
5023  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
5024  (REWRITE_TAC[Geomdetail.FINITE6]);
5025  (REWRITE_TAC[DISJOINT]);
5026
5027  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5028  (NEW_GOAL `F`);
5029  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5030  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);
5031  (UP_ASM_TAC THEN SET_TAC[]);
5032  (REWRITE_TAC[COPLANAR_3]);
5033  (UP_ASM_TAC THEN MESON_TAC[]);
5034
5035  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
5036  (NEW_GOAL `F`);
5037  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5038  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);
5039  (UP_ASM_TAC THEN SET_TAC[]);
5040  (REWRITE_TAC[COPLANAR_3]);
5041  (UP_ASM_TAC THEN MESON_TAC[]);
5042  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5043
5044  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5045  (EXISTS_TAC 
5046   `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
5047  (STRIP_TAC);
5048  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5049  (EXISTS_TAC 
5050   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);
5051  (STRIP_TAC);
5052  (MATCH_MP_TAC NEGLIGIBLE_UNION);
5053  (STRIP_TAC);
5054
5055  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5056  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
5057  (STRIP_TAC);
5058  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
5059  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
5060  (SET_TAC[]);
5061  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
5062  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5063  (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);
5064  (STRIP_TAC);
5065  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
5066  (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);
5067  (SET_TAC[]);
5068  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
5069  (REWRITE_TAC[SET_RULE 
5070   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
5071          aff_ge {u0, u1} ({m, s3} DELETE s3) 
5072    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
5073  (MATCH_MP_TAC (SET_RULE 
5074   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
5075  (STRIP_TAC);
5076  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
5077  (STRIP_TAC);
5078  (SET_TAC[]);
5079
5080  (REWRITE_TAC[DISJOINT]);
5081  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5082  (NEW_GOAL `F`);
5083  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5084  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);
5085  (UP_ASM_TAC THEN SET_TAC[]);
5086  (REWRITE_TAC[COPLANAR_3]);
5087  (UP_ASM_TAC THEN MESON_TAC[]);
5088  (UP_ASM_TAC THEN SET_TAC[]);
5089
5090  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
5091  (STRIP_TAC);
5092  (SET_TAC[]);
5093  (REWRITE_TAC[DISJOINT]);
5094  (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
5095  (NEW_GOAL `F`);
5096  (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5097  (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);
5098  (UP_ASM_TAC THEN SET_TAC[]);
5099  (REWRITE_TAC[COPLANAR_3]);
5100  (UP_ASM_TAC THEN MESON_TAC[]);
5101  (UP_ASM_TAC THEN SET_TAC[]);
5102
5103  (SET_TAC[]);
5104
5105  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
5106  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u3 u2) =
5107              (if &1 < d \/ r < &0
5108               then &0
5109               else azim u0 u1 u3 u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
5110  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);
5111  (STRIP_TAC);
5112  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5113  (EXISTS_TAC `u3:real^3`);
5114  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5115  (ASM_REWRITE_TAC[]);
5116  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5117  (EXISTS_TAC `u2:real^3`);
5118  (ASM_REWRITE_TAC[]);
5119
5120  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
5121  (COND_CASES_TAC);
5122  (NEW_GOAL `F`);
5123
5124  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
5125    UP_ASM_TAC THEN REAL_ARITH_TAC);
5126  (UP_ASM_TAC THEN MESON_TAC[]);
5127
5128  (REWRITE_WITH `azim (u0:real^3) u1 u3 u2 = dihV u0 u1 u3 u2`);
5129  (MATCH_MP_TAC AZIM_DIHV_SAME);
5130  (ASM_REWRITE_TAC[]);
5131  (STRIP_TAC);
5132
5133  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5134  (EXISTS_TAC `u2:real^3`);
5135  (ASM_REWRITE_TAC[]);
5136  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5137  (EXISTS_TAC `u3:real^3`);
5138  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5139  (ASM_REWRITE_TAC[]);
5140
5141  (REWRITE_TAC[dihX]);
5142  (COND_CASES_TAC);
5143  (NEW_GOAL `F`);
5144  (UNDISCH_TAC `~NULLSET (X INTER D)`);
5145  (REWRITE_TAC[]);
5146  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5147  (EXISTS_TAC `X:real^3->bool`);
5148  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
5149  (UP_ASM_TAC THEN MESON_TAC[]);
5150
5151  (LET_TAC);
5152
5153  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
5154  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
5155            ul IN barV V 3 /\
5156            X = mcell k V ul /\
5157            initial_sublist [u0; u1] ul)`);
5158  (STRIP_TAC);
5159  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
5160  (MATCH_MP_TAC SELECT_AX);
5161  (EXISTS_TAC `(4, vl:(real^3)list)`);
5162  (EXPAND_TAC "P");
5163  (REWRITE_TAC[BETA_THM]);
5164  (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);
5165  (STRIP_TAC);
5166  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5167
5168  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
5169                  LENGTH [u0;u1] = 1 + 1`);
5170  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5171  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
5172  (ASM_REWRITE_TAC[]);
5173  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5174  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5175  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
5176
5177  (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);
5178  (MATCH_MP_TAC Ajripqn.AJRIPQN);
5179  (ASM_REWRITE_TAC[]);
5180  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
5181  (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);
5182  (REWRITE_WITH `mcell 4 V vl = X`);
5183  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5184  (SET_TAC[ASSUME `X = mcell k' V ul`]);
5185
5186  (REPEAT STRIP_TAC);
5187  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
5188    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
5189  (SET_TAC[]);
5190  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
5191
5192  (COND_CASES_TAC);
5193  (NEW_GOAL `F`);
5194  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5195  (UP_ASM_TAC THEN MESON_TAC[]);
5196  (COND_CASES_TAC);
5197  (NEW_GOAL `F`);
5198  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5199  (UP_ASM_TAC THEN MESON_TAC[]);
5200  (COND_CASES_TAC);
5201
5202  (REWRITE_TAC[dihu4]);
5203
5204  (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) = 
5205    dihV u0 u1 u2 (u3:real^3)`);
5206
5207  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
5208  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5209  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5210
5211  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
5212  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5213  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5214  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5215                  CARD (set_of_list ul) = 3 + 1`);
5216  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5217  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5218  (ARITH_TAC);
5219
5220  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
5221  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5222  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5223  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5224                  CARD (set_of_list ul) = 3 + 1`);
5225  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5226  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5227  (ARITH_TAC);
5228
5229  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);
5230  (REWRITE_WITH `
5231     {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
5232     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = 
5233     convex hull {u0, u1,u2,u3:real^3}`);
5234  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5235  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
5236  (REPEAT STRIP_TAC);
5237
5238  (UNDISCH_TAC `~NULLSET X`);
5239  (REWRITE_TAC[]);
5240  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5241    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5242  (COND_CASES_TAC);
5243  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5244  (MATCH_MP_TAC BARV_3_EXPLICIT);
5245  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5246  (UP_ASM_TAC THEN STRIP_TAC);
5247  (ASM_REWRITE_TAC[set_of_list]);
5248  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5249  (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
5250  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5251  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5252  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5253  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5254  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5255  (UNDISCH_TAC 
5256    `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);
5257  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
5258                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5259
5260  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5261
5262  (UNDISCH_TAC `~NULLSET X`);
5263  (REWRITE_TAC[]);
5264  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5265  (COND_CASES_TAC);
5266  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5267  (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
5268  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5269  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5270  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5271  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5272  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5273  (ASM_REWRITE_TAC[]);
5274  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5275
5276  (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);
5277  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5278  (COND_CASES_TAC);
5279  (MESON_TAC[]);
5280  (NEW_GOAL `F`);
5281  (UNDISCH_TAC `~NULLSET X`);
5282  (REWRITE_TAC[]);
5283  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5284  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5285  (UP_ASM_TAC THEN MESON_TAC[]);
5286
5287  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5288    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5289  (COND_CASES_TAC);
5290  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5291  (MATCH_MP_TAC BARV_3_EXPLICIT);
5292  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5293  (UP_ASM_TAC THEN STRIP_TAC);
5294  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5295  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5296  (NEW_GOAL `F`);
5297  (UNDISCH_TAC `~NULLSET X`);
5298  (REWRITE_TAC[]);
5299  (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5300    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5301  (COND_CASES_TAC);
5302  (NEW_GOAL `F`);
5303  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);
5304  (UP_ASM_TAC THEN MESON_TAC[]);
5305  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5306  (UP_ASM_TAC THEN MESON_TAC[]);
5307
5308  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
5309  (STRIP_TAC);
5310
5311  (ASM_CASES_TAC `EL 2 ul = u2:real^3`);
5312  (NEW_GOAL `EL 3 ul = u3:real^3`);
5313  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5314  (STRIP_TAC);
5315  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);
5316  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5317  (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5318  (REWRITE_TAC[]);
5319  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5320  (REWRITE_TAC[
5321    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5322    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);
5323  (ASM_REWRITE_TAC[]);
5324
5325  (NEW_GOAL `EL 2 ul = u3:real^3`);
5326  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5327  (STRIP_TAC); 
5328  (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);
5329  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5330  (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5331  (REWRITE_TAC[]);
5332  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5333
5334
5335  (REWRITE_TAC[
5336    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5337    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);
5338  (NEW_GOAL `EL 3 ul = u2:real^3`);
5339  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5340  (STRIP_TAC);
5341  (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);
5342  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5343  (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5344  (REWRITE_TAC[]);
5345  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5346
5347  (REWRITE_TAC[
5348    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5349    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);
5350  (ASM_REWRITE_TAC[]);
5351  (REWRITE_TAC[DIHV_SYM_2]);
5352
5353  (REWRITE_TAC[DIHV_SYM_2]);
5354  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
5355  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
5356  (AP_THM_TAC THEN AP_TERM_TAC);
5357
5358  (REWRITE_WITH 
5359   `measurable (conic_cap u0 u1 r d) /\
5360              vol (conic_cap u0 u1 r d) =
5361              (if u1 = u0 \/ &1 <= d \/ r < &0
5362               then &0
5363               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
5364  (MATCH_MP_TAC VOLUME_CONIC_CAP);
5365  (EXPAND_TAC "d");
5366  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5367  (COND_CASES_TAC);
5368  (NEW_GOAL `F`);
5369  (UP_ASM_TAC THEN STRIP_TAC);
5370  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
5371  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5372  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5373  (UP_ASM_TAC THEN MESON_TAC[]);
5374
5375  (REWRITE_WITH `max d (--(&1)) = d`);
5376  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
5377  (REWRITE_TAC[REAL_NEG_LT0]);
5378  (STRIP_TAC);
5379  (EXPAND_TAC "d");
5380  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5381  (REAL_ARITH_TAC);
5382
5383  (REWRITE_WITH `
5384   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
5385   ((&2 * pi) / (&2 * pi))`);
5386  (REAL_ARITH_TAC);
5387  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
5388  (MATCH_MP_TAC REAL_DIV_REFL);
5389  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
5390  (REAL_ARITH_TAC);
5391  (NEW_GOAL `F`);
5392  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
5393    THEN MESON_TAC[]);
5394  (UP_ASM_TAC THEN MESON_TAC[]);
5395
5396 (* ========================================================================== *)
5397
5398  (NEW_GOAL `F`);
5399  (NEW_GOAL `azim (u0:real^3) u1 u3 u2 = 
5400   (if azim u0 u1 u2 u3 = &0 then &0 else &2 * pi - azim u0 u1 u2 u3)`);
5401  (MATCH_MP_TAC AZIM_COMPL);
5402  (STRIP_TAC);
5403
5404  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5405  (EXISTS_TAC `u3:real^3`);
5406  (ASM_REWRITE_TAC[]);
5407  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5408  (EXISTS_TAC `u2:real^3`);
5409  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
5410  (ASM_REWRITE_TAC[]);
5411  (UP_ASM_TAC THEN COND_CASES_TAC);
5412  (NEW_GOAL `F`);
5413  (NEW_GOAL `(&0 < pi)`);
5414  (REWRITE_TAC[PI_POS]);
5415  (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 u3 < pi)`);
5416  (ASM_REWRITE_TAC[]);
5417  (UP_ASM_TAC THEN MESON_TAC[]);
5418  (STRIP_TAC);
5419
5420  (NEW_GOAL `azim (u0:real^3) u1 u2 u3 = pi`);
5421  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5422  (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
5423  (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
5424  (ASM_REWRITE_TAC[]);
5425  (UP_ASM_TAC THEN MESON_TAC[]);
5426
5427 (* ========================================================================= *)
5428 (*  Case k = 3                                                               *)
5429 (* ========================================================================= *)
5430
5431  (NEW_GOAL `k = 3`);
5432  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
5433  (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);
5434  (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);
5435  (MATCH_MP_TAC BARV_3_EXPLICIT);
5436  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5437  (UP_ASM_TAC THEN STRIP_TAC);
5438  (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
5439
5440  (REWRITE_WITH `u0 = v0:real^3`);
5441  (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);
5442  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
5443    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
5444  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
5445
5446  (REWRITE_WITH `u1 = v1:real^3`);
5447  (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);
5448  (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
5449    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
5450  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
5451  (ASM_REWRITE_TAC[]);
5452  (UP_ASM_TAC THEN STRIP_TAC);
5453
5454  (ABBREV_TAC `L = aff_ge{u0, u1} {u2, mxi V vl}`);
5455
5456  (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
5457  (AP_TERM_TAC);
5458  (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
5459    mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5460  (COND_CASES_TAC);
5461  (ABBREV_TAC `m = mxi V vl`);
5462  (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);
5463  (EXPAND_TAC "m" THEN DEL_TAC THEN ASM_REWRITE_TAC[]);
5464
5465  (EXPAND_TAC "L");
5466  (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
5467  (STRIP_TAC);
5468  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));
5469  (REWRITE_TAC[Marchal_cells_2.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
5470  (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
5471                             A INTER B SUBSET C INTER B`));
5472  (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, m}`);
5473  (REWRITE_TAC[DISJOINT]);
5474  (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));
5475  (STRIP_TAC);
5476  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5477  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5478  (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);
5479
5480
5481  (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
5482    mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5483  (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);
5484  (EXPAND_TAC "m" THEN REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5485  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5486  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5487  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5488  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5489  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5490
5491  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5492  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
5493  (UP_ASM_TAC THEN SET_TAC[]);
5494  (REWRITE_TAC[COPLANAR_3]);
5495  (NEW_GOAL `m IN {u0, u1:real^3}`);
5496  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5497  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
5498  (UP_ASM_TAC THEN SET_TAC[]);
5499  (REWRITE_TAC[COPLANAR_3]);
5500
5501  (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, m:real^3}`; AFF_GE_2_2]);
5502  (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);
5503  (REPEAT STRIP_TAC);
5504  (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
5505    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
5506  (ASM_REWRITE_TAC[]);
5507  (STRIP_TAC);
5508
5509  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
5510  (STRIP_TAC);
5511  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
5512  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5513    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
5514  (EXPAND_TAC "D");
5515  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
5516  (DISJ1_TAC);
5517  (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
5518
5519  (NEW_GOAL `(?b1:real. b1 IN P1 /\ (!x. x IN P1 ==> b1 <= x))`);
5520  (FIRST_ASSUM MATCH_MP_TAC);
5521  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5522  (EXISTS_TAC `(f1:(real^3)list -> real) vl`);
5523  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5524  (EXISTS_TAC `vl:(real^3)list`);
5525  (ASM_REWRITE_TAC[]);
5526  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5527  (ASM_REWRITE_TAC[]);
5528  (STRIP_TAC);
5529  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5530  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5531  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5532  (STRIP_TAC);
5533  (ASM_REWRITE_TAC[]);
5534  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5535  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5536  (MATCH_MP_TAC (SET_RULE 
5537   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5538  (STRIP_TAC);
5539  (MATCH_MP_TAC SUBSET_BALL);
5540  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5541  (MATCH_MP_TAC RCONE_GT_SUBSET);
5542  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5543  (FIRST_X_ASSUM CHOOSE_TAC);
5544
5545  (NEW_GOAL `r1 = (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x:real))`);
5546  (EXPAND_TAC "r1");
5547  (COND_CASES_TAC);
5548  (NEW_GOAL `F`);
5549  (UP_ASM_TAC THEN REWRITE_TAC[]);
5550  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5551  (EXISTS_TAC `(f1:(real^3)list -> real) vl`);
5552  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5553  (EXISTS_TAC `vl:(real^3)list`);
5554  (ASM_REWRITE_TAC[]);
5555  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5556  (ASM_SIMP_TAC[]);
5557  (STRIP_TAC);
5558  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5559  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5560  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5561  (STRIP_TAC);
5562  (ASM_REWRITE_TAC[]);
5563  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5564  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5565  (MATCH_MP_TAC (SET_RULE 
5566   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5567  (STRIP_TAC);
5568  (MATCH_MP_TAC SUBSET_BALL);
5569  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5570  (MATCH_MP_TAC RCONE_GT_SUBSET);
5571  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5572  (UP_ASM_TAC THEN MESON_TAC[]);
5573  (REWRITE_TAC[]);
5574
5575  (ABBREV_TAC `Q1 = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
5576  (NEW_GOAL `(Q1:real->bool) r1`);
5577  (ASM_REWRITE_TAC[]);
5578  (MATCH_MP_TAC SELECT_AX);
5579  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
5580  (ASM_REWRITE_TAC[]);
5581  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
5582  (NEW_GOAL `r1 <= f1 (vl:(real^3)list)`);
5583  (FIRST_ASSUM MATCH_MP_TAC);
5584  (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5585  (EXISTS_TAC `vl:(real^3)list`);
5586  (ASM_REWRITE_TAC[]);
5587  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5588  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5589  (STRIP_TAC);
5590  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5591  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5592  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5593  (STRIP_TAC);
5594  (ASM_REWRITE_TAC[]);
5595  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5596  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5597  (MATCH_MP_TAC (SET_RULE 
5598   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5599  (STRIP_TAC);
5600  (MATCH_MP_TAC SUBSET_BALL);
5601  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5602  (MATCH_MP_TAC RCONE_GT_SUBSET);
5603  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5604
5605  (UP_ASM_TAC THEN EXPAND_TAC "f1" THEN REWRITE_TAC[EL; HD; TL; 
5606    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
5607    ASSUME `vl= [u0; u1; u2; u3:real^3]`]);
5608  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5609  (EXPAND_TAC "m");
5610  (REWRITE_TAC[ASSUME `vl = [u0;u1;u2;u3:real^3]`]);
5611  (STRIP_TAC);
5612
5613  (NEW_GOAL `!v. v IN affine hull {u1, u2, m:real^3} ==> r1 <= dist (u0, v)`);
5614  (REPEAT STRIP_TAC);
5615  (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, m}) u0) <= 
5616              dist (u0, v:real^3)`);
5617  (MATCH_MP_TAC CLOSEST_POINT_LE);
5618  (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
5619  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5620
5621  (NEW_GOAL `r <= dist (u0:real^3, x)`);
5622  (REWRITE_TAC[dist]);
5623  (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);
5624  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5625  (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);
5626  (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
5627   (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) = 
5628   (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);
5629  (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 + 
5630                           t3 /(t2 + t3 + t4) % u2 + 
5631                           t4 /(t2 + t3 + t4) % m`);
5632  (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % m) = (t2 + t3 + t4) % (y:real^3)`);
5633  (EXPAND_TAC "y");
5634  (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 +  t3 / x % u2 + t4 / x % u3) = 
5635    (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);
5636  (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
5637  (MATCH_MP_TAC REAL_DIV_REFL);
5638  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
5639  (REAL_ARITH_TAC);
5640  (VECTOR_ARITH_TAC);
5641  (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);
5642
5643  (NEW_GOAL `&1 < t2 + t3 + t4`);
5644  (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
5645  (REAL_ARITH_TAC);
5646  (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`); 
5647  (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5648  (REWRITE_TAC[GSYM dist]);
5649  (NEW_GOAL `r1 <= dist (u0, y:real^3)`);
5650  (FIRST_ASSUM MATCH_MP_TAC);
5651  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
5652  (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
5653    EXISTS_TAC `t4 / (t2 + t3 + t4)`);
5654  (STRIP_TAC);
5655  (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
5656  (MATCH_MP_TAC REAL_DIV_REFL);
5657  (UP_ASM_TAC THEN REAL_ARITH_TAC);
5658  (ASM_REWRITE_TAC[]);
5659
5660  (NEW_GOAL `r1 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
5661  (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
5662  (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
5663  (MATCH_MP_TAC REAL_LE_MUL);
5664  (REWRITE_TAC[DIST_POS_LE]);
5665  (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5666  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5667  (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5668  (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5669
5670 (* ========================================================================== *)
5671
5672  (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
5673  (STRIP_TAC);
5674  (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
5675  (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5676    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
5677  (EXPAND_TAC "D");
5678  (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
5679  (DISJ2_TAC);
5680  (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);
5681
5682  (NEW_GOAL `(?b1:real. b1 IN P3 /\ (!x. x IN P3 ==> x <= b1))`);
5683  (FIRST_ASSUM MATCH_MP_TAC);
5684  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5685  (EXISTS_TAC `(f3:(real^3)list -> real) vl`);
5686  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5687  (EXISTS_TAC `vl:(real^3)list`);
5688  (ASM_REWRITE_TAC[]);
5689  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5690  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5691  (STRIP_TAC);
5692  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5693  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5694  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5695  (STRIP_TAC);
5696  (ASM_REWRITE_TAC[]);
5697  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5698  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5699  (MATCH_MP_TAC (SET_RULE 
5700   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5701  (STRIP_TAC);
5702  (MATCH_MP_TAC SUBSET_BALL);
5703  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5704  (MATCH_MP_TAC RCONE_GT_SUBSET);
5705  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5706  (FIRST_X_ASSUM CHOOSE_TAC);
5707
5708  (NEW_GOAL `d1 = (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b:real))`);
5709  (EXPAND_TAC "d1");
5710  (COND_CASES_TAC);
5711  (NEW_GOAL `F`);
5712  (UP_ASM_TAC THEN REWRITE_TAC[]);
5713  (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5714  (EXISTS_TAC `(f3:(real^3)list -> real) vl`);
5715  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5716  (EXISTS_TAC `vl:(real^3)list`);
5717  (ASM_REWRITE_TAC[]);
5718  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5719  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5720  (STRIP_TAC);
5721  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5722  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5723  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5724  (STRIP_TAC);
5725  (ASM_REWRITE_TAC[]);
5726  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5727  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5728  (MATCH_MP_TAC (SET_RULE 
5729   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5730  (STRIP_TAC);
5731  (MATCH_MP_TAC SUBSET_BALL);
5732  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5733  (MATCH_MP_TAC RCONE_GT_SUBSET);
5734  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5735  (UP_ASM_TAC THEN MESON_TAC[]);
5736  (REWRITE_TAC[]);
5737
5738  (ABBREV_TAC `Q1 = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
5739  (NEW_GOAL `(Q1:real->bool) d1`);
5740  (ASM_REWRITE_TAC[]);
5741  (MATCH_MP_TAC SELECT_AX);
5742  (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
5743  (ASM_REWRITE_TAC[]);
5744  (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
5745
5746  (NEW_GOAL `f3 (vl:(real^3)list) <= d1`);
5747  (FIRST_ASSUM MATCH_MP_TAC);
5748  (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5749  (EXISTS_TAC `vl:(real^3)list`);
5750  (ASM_REWRITE_TAC[]);
5751  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5752  (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5753  (STRIP_TAC);
5754  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5755  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5756  (EXISTS_TAC `X INTER (C:real^3->bool)`);
5757  (STRIP_TAC);
5758  (ASM_REWRITE_TAC[]);
5759  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5760  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5761  (MATCH_MP_TAC (SET_RULE 
5762   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5763  (STRIP_TAC);
5764  (MATCH_MP_TAC SUBSET_BALL);
5765  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5766  (MATCH_MP_TAC RCONE_GT_SUBSET);
5767  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5768
5769  (UP_ASM_TAC THEN EXPAND_TAC "f3");
5770  (REWRITE_TAC[EL; HD; TL; 
5771    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; ASSUME `mxi V vl = m`; 
5772    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
5773
5774  (ABBREV_TAC `xx = smallest_angle_line u2 m u0 u1`);
5775
5776  (MP_TAC (ASSUME `smallest_angle_line u2 m u0 u1 = xx`));
5777  (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
5778  (ABBREV_TAC `Q2 = 
5779  (\x:real^3. x IN convex hull {u2, m} /\
5780              (!y. y IN convex hull {u2, m}
5781                   ==> ((y - u0) dot (u1 - u0)) /
5782                       (norm (y - u0) * norm (u1 - u0)) <=
5783                       ((x - u0) dot (u1 - u0)) /
5784                       (norm (x - u0) * norm (u1 - u0))))`);
5785  (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);
5786  (NEW_GOAL `(Q2:real^3->bool) xx`);
5787  (ONCE_ASM_REWRITE_TAC[]);
5788  (MATCH_MP_TAC SELECT_AX);
5789  (EXPAND_TAC "Q2");
5790
5791  (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
5792  (STRIP_TAC);
5793  (ASM_REWRITE_TAC[]);
5794  (STRIP_TAC);
5795
5796  (UNDISCH_TAC `~NULLSET (X INTER D)`);
5797  (REWRITE_TAC[]);
5798  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5799  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
5800  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;TRUNCATE_SIMPLEX_EXPLICIT_2;
5801     SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5802  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5803  (EXPAND_TAC "m");
5804  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5805
5806  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5807
5808  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5809  (STRIP_TAC);
5810  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5811  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5812  (REWRITE_TAC[coplanar]);
5813  (UNDISCH_TAC `u0 IN convex hull {u2, m:real^3}`);
5814  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
5815  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
5816    EXISTS_TAC `m:real^3`);
5817  (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
5818  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
5819  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
5820  (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
5821  (STRIP_TAC);
5822  (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
5823  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
5824  (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5825  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5826  (SET_TAC[]);
5827
5828  (UP_ASM_TAC THEN EXPAND_TAC "Q2");
5829  (STRIP_TAC);
5830  (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) / 
5831                                (norm (y - u0) * norm (u1 - u0)))`);
5832
5833  (NEW_GOAL `d < (g:real^3->real) x`);
5834  (EXPAND_TAC "g");
5835  (REWRITE_WITH 
5836   `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
5837    d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);
5838  (MATCH_MP_TAC REAL_LT_RDIV_EQ);
5839  (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
5840  (STRIP_TAC);
5841  (MATCH_MP_TAC REAL_LE_MUL);
5842  (ASM_REWRITE_TAC[NORM_POS_LE]);
5843  (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);
5844  (ASM_REWRITE_TAC[]);
5845  (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = u0:real^3 <=>
5846   t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = (t1 + t2 + t3 + t4) % u0`);
5847  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5848  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);
5849  (STRIP_TAC);
5850
5851  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
5852  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5853  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
5854  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list; 
5855    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5856  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5857  (EXPAND_TAC "m");
5858  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5859  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5860
5861  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5862  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5863  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5864  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5865  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5866  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5867  (REWRITE_TAC[affine_dependent]);
5868  (EXISTS_TAC `u1:real^3`);
5869  (STRIP_TAC);
5870  (SET_TAC[]);
5871
5872  (NEW_GOAL `~(u1 IN {u0, u2, m:real^3})`);
5873  (STRIP_TAC);
5874  (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
5875  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5876  (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
5877  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list; 
5878    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5879  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5880  (EXPAND_TAC "m");
5881  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5882  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5883  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5884  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5885  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5886  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5887  (REWRITE_WITH `{u0, u1, u2, m} = {u0:real^3,u2, m}`);
5888  (UP_ASM_TAC THEN SET_TAC[]);
5889  (REWRITE_TAC[COPLANAR_3]);
5890  (SET_TAC[]);
5891  (REWRITE_WITH `{u0, u1, u2, m} DELETE u1 = {u0, u2, m:real^3}`);
5892  (UP_ASM_TAC THEN SET_TAC[]);
5893  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
5894  (EXISTS_TAC `(t2 + t3 + t4) / t2`);
5895  (EXISTS_TAC `(-- t3) / t2`);
5896  (EXISTS_TAC `(-- t4) / t2`);
5897
5898  (STRIP_TAC);
5899  (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);
5900  (REAL_ARITH_TAC);
5901  (MATCH_MP_TAC REAL_DIV_REFL);
5902  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
5903  (REWRITE_WITH 
5904   `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % m:real^3 <=> 
5905    u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % m)`);
5906  (VECTOR_ARITH_TAC);
5907  (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % m = 
5908                              (t2 + t3 + t4) % u0:real^3`)]);
5909  (REWRITE_TAC[VECTOR_ARITH 
5910   `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);
5911  (REWRITE_TAC[VECTOR_MUL_ASSOC]);
5912  (REWRITE_WITH `&1 / t2 * t2 = &1`);
5913  (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);
5914  (MATCH_MP_TAC REAL_DIV_REFL);
5915  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
5916  (VECTOR_ARITH_TAC);
5917  (SET_TAC[]);
5918  (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);
5919  (ASM_REWRITE_TAC[]);
5920
5921  (NEW_GOAL `g x <= (g:real^3->real) xx`);
5922  (NEW_GOAL `!y. y IN convex hull {u2 , m:real^3} ==> g y <= g xx`);
5923  (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);
5924  (NEW_GOAL `&0 < (t3 + t4)`);
5925  (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0)  ==> &0 < x`));
5926  (STRIP_TAC);
5927  (MATCH_MP_TAC REAL_LE_ADD);
5928  (ASM_REWRITE_TAC[]);
5929  (STRIP_TAC);
5930  (NEW_GOAL `t3 = &0 /\ t4 = &0`);
5931  (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN 
5932    UP_ASM_TAC THEN REAL_ARITH_TAC);
5933  (UP_ASM_TAC THEN STRIP_TAC);
5934
5935  (NEW_GOAL `F`);
5936  (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);
5937  (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);
5938  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5939  (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));
5940  (STRIP_TAC);
5941  (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) - 
5942                  (t1 + t2 + t3 + t4) % u0:real^3`);
5943  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5944  (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH 
5945   `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; 
5946    DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
5947  (MATCH_MP_TAC REAL_LE_MUL);
5948  (REWRITE_TAC[DOT_POS_LE]);
5949  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
5950  (MATCH_MP_TAC REAL_LE_MUL);
5951  (REWRITE_TAC[DIST_POS_LE]);
5952  (MATCH_MP_TAC REAL_LE_MUL);
5953  (REWRITE_TAC[DIST_POS_LE]);
5954  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);
5955  (REAL_ARITH_TAC);
5956  (UP_ASM_TAC THEN MESON_TAC[]);
5957
5958  (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % m:real^3`);
5959  (NEW_GOAL `(g:real^3->real) y <= g xx`);
5960  (FIRST_ASSUM MATCH_MP_TAC);
5961  (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
5962  (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
5963  (REPEAT STRIP_TAC);
5964  (MATCH_MP_TAC REAL_LE_DIV);
5965  (ASM_SIMP_TAC[REAL_LE_ADD]);
5966  (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);
5967  (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
5968  (MATCH_MP_TAC REAL_DIV_REFL);
5969  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
5970  (ASM_REWRITE_TAC[]);
5971
5972  (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 + 
5973                    t4 / (t1 + t3 + t4) % m:real^3`);
5974  (NEW_GOAL `(g:real^3->real) y = g w`);
5975  (EXPAND_TAC "g");
5976
5977  (REWRITE_WITH `y:real^3 - u0 = 
5978                 &1 / (t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);
5979  (EXPAND_TAC "y");
5980  (REWRITE_TAC[VECTOR_ARITH 
5981   `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
5982    &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
5983    (t3 + t4) / (t3 + t4) % u0 = u0`]);
5984  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
5985  (MATCH_MP_TAC REAL_DIV_REFL);
5986  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
5987  (VECTOR_ARITH_TAC);
5988  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
5989
5990  (REWRITE_WITH `w:real^3 - u0 = 
5991                 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);
5992  (EXPAND_TAC "w");
5993  (REWRITE_TAC[VECTOR_ARITH 
5994    `(t1 / (t1 + t3 + t4) % u0 +
5995     t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
5996     &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
5997     (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
5998  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
5999  (MATCH_MP_TAC REAL_DIV_REFL);
6000  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
6001    THEN REAL_ARITH_TAC);
6002  (VECTOR_ARITH_TAC);
6003  (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
6004  (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
6005  (REWRITE_TAC[REAL_ABS_REFL]);
6006  (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
6007  (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
6008  (REWRITE_TAC[REAL_ABS_REFL]);
6009  (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
6010  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
6011    THEN REAL_ARITH_TAC);
6012  (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) = 
6013                            (a * x) / (a * (y * z))`]);
6014  (ABBREV_TAC 
6015   `a1 = norm (t3 % u2 + t4 % m - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
6016  (NEW_GOAL `~(a1 = &0)`);
6017  (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; 
6018    VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
6019  (STRIP_TAC);
6020
6021  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6022  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6023  (EXISTS_TAC `(X:real^3->bool)`);
6024  (STRIP_TAC);
6025
6026  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6027                 set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6028  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6029  (EXPAND_TAC "m");
6030  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6031
6032  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6033  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6034  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6035  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6036  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6037  (REWRITE_TAC[coplanar]);
6038  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6039    EXISTS_TAC `m:real^3`);
6040  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6041  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6042  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6043  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
6044    THEN EXISTS_TAC `t4 / (t3 + t4)`);
6045  (REPEAT STRIP_TAC);
6046  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
6047                           (t3 + t4) / (t3 + t4)`]);
6048  (MATCH_MP_TAC REAL_DIV_REFL);
6049  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6050  (ASM_REWRITE_TAC[VECTOR_ARITH 
6051    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
6052     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
6053  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6054  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6055  (MATCH_MP_TAC REAL_DIV_REFL);
6056  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6057  (VECTOR_ARITH_TAC);
6058  (SET_TAC[]);
6059
6060  (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
6061  (NEW_GOAL `&0 < &1 / (t3 + t4)`);
6062  (MATCH_MP_TAC REAL_LT_DIV);
6063  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
6064  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6065
6066  (REWRITE_WITH 
6067  `(&1 / (t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6068   (&1 / (t3 + t4) * a1) = 
6069   ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
6070  (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
6071
6072  (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
6073  (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);
6074  (MATCH_MP_TAC REAL_LT_DIV);
6075  (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
6076  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6077    REAL_ARITH_TAC);
6078  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6079
6080  (REWRITE_WITH 
6081  `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6082   (&1 / (t1 + t3 + t4) * a1) = 
6083   ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
6084  (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
6085    MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
6086
6087  (NEW_GOAL `(g:real^3->real) x <= g w`);
6088  (EXPAND_TAC "g");
6089
6090  (REWRITE_WITH 
6091   `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
6092   ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
6093   ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <= 
6094   ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
6095  (MATCH_MP_TAC RAT_LEMMA4);
6096  (STRIP_TAC);
6097  (MATCH_MP_TAC REAL_LT_MUL);
6098  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
6099  (STRIP_TAC);
6100  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6101  (REWRITE_TAC[]);
6102
6103  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6104  (EXISTS_TAC `(X:real^3->bool)`);
6105  (STRIP_TAC);
6106  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6107    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6108  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6109  (EXPAND_TAC "m");
6110  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6111  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6112  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6113  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6114  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6115  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6116  (REWRITE_TAC[coplanar]);
6117  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6118    EXISTS_TAC `m:real^3`);
6119  (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
6120  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6121  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6122  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6123  (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
6124    THEN EXISTS_TAC `(--t4) / t2`);
6125  (REPEAT STRIP_TAC);
6126  (REWRITE_TAC[REAL_ARITH 
6127    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
6128  (MATCH_MP_TAC REAL_DIV_REFL);
6129  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6130  (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
6131  (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6132  (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % m:real^3 = t2 % u1`);
6133  (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
6134  (ASM_REWRITE_TAC[VECTOR_ARITH 
6135    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
6136     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
6137  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6138  (REWRITE_WITH `t2 / t2 = &1`);
6139  (MATCH_MP_TAC REAL_DIV_REFL);
6140  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6141  (VECTOR_ARITH_TAC);
6142  (SET_TAC[]);
6143
6144  (MATCH_MP_TAC REAL_LT_MUL);
6145  (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
6146  (EXPAND_TAC "w" THEN STRIP_TAC);
6147  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6148  (REWRITE_TAC[]);
6149
6150  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6151  (EXISTS_TAC `(X:real^3->bool)`);
6152  (STRIP_TAC);
6153  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6154    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6155  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6156  (EXPAND_TAC "m");
6157  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6158  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6159  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6160  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6161  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6162  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6163  (REWRITE_TAC[coplanar]);
6164  (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6165    EXISTS_TAC `m:real^3`);
6166  (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6167  (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6168  (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6169
6170  (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
6171    THEN EXISTS_TAC `t4 / (t3 + t4)`);
6172  (REPEAT STRIP_TAC);
6173  (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
6174                           (t3 + t4) / (t3 + t4)`]);
6175  (MATCH_MP_TAC REAL_DIV_REFL);
6176  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6177  (ASM_REWRITE_TAC[VECTOR_ARITH 
6178    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
6179     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
6180  (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH 
6181    `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 = 
6182     (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6183  (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % m) = u0 <=> 
6184                  t1 % u0 + t3 % u2 + t4 % m = (t1 + t3 + t4) % u0:real^3`);
6185  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6186  (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
6187  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN 
6188    REAL_ARITH_TAC);
6189
6190  (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
6191    <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
6192  (STRIP_TAC THEN ASM_REWRITE_TAC[]);
6193  (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6194  (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6195  (MATCH_MP_TAC REAL_DIV_REFL);
6196  (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6197  (VECTOR_ARITH_TAC);
6198  (SET_TAC[]);
6199
6200  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
6201  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
6202  (REWRITE_TAC[VECTOR_ARITH 
6203   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
6204    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6205  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6206  (MATCH_MP_TAC REAL_DIV_REFL);
6207  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6208    REAL_ARITH_TAC);
6209  (VECTOR_ARITH_TAC);
6210  (ABBREV_TAC `t = t1 + t3 + t4`);
6211  (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 = 
6212                 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
6213  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6214  (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
6215  (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
6216  (REWRITE_TAC[VECTOR_ARITH 
6217   `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
6218  (ABBREV_TAC `x1 = u1 - u0:real^3`);
6219  (ABBREV_TAC `x2 = w - u0:real^3`);
6220
6221  (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 = 
6222    t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
6223  (REWRITE_TAC[NORM_POW_2]);
6224  (VECTOR_ARITH_TAC);
6225
6226  (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <= 
6227              t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
6228  (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
6229    t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
6230  (MATCH_MP_TAC REAL_LE_MUL);
6231  (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
6232  (MATCH_MP_TAC REAL_LE_MUL);
6233  (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
6234  (STRIP_TAC);
6235  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6236  (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
6237
6238  (NEW_GOAL 
6239  `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)`);
6240
6241  (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
6242  x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
6243  (MATCH_MP_TAC REAL_LE_MUL);
6244  (STRIP_TAC);
6245  (MATCH_MP_TAC REAL_LE_MUL);
6246  (REWRITE_TAC[NORM_POS_LE]);
6247  (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
6248  (NEW_GOAL `F`);
6249  (NEW_GOAL `(g:real^3->real) x <= &0`);
6250  (EXPAND_TAC "g");
6251  (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
6252  (MATCH_MP_TAC REAL_LE_DIV);
6253  (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
6254
6255  (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
6256  (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
6257  (REWRITE_TAC[VECTOR_ARITH 
6258   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
6259    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6260  (EXPAND_TAC "t");
6261  (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6262  (MATCH_MP_TAC REAL_DIV_REFL);
6263  (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6264    REAL_ARITH_TAC);
6265  (VECTOR_ARITH_TAC);
6266
6267  (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
6268  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 = 
6269                  (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
6270  (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6271  (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 = 
6272    t2 % x1 + t % x2:real^3`);
6273  (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
6274    THEN VECTOR_ARITH_TAC);
6275  (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
6276  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
6277  (MATCH_MP_TAC REAL_LE_MUL);
6278  (STRIP_TAC);
6279  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6280    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6281  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6282  (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
6283  (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
6284  (MATCH_MP_TAC REAL_LE_MUL);
6285  (STRIP_TAC);
6286  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6287    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6288  (REWRITE_TAC[DOT_POS_LE]);
6289  (REWRITE_TAC[DOT_LADD]);
6290  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6291  (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);
6292  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);
6293  (REAL_ARITH_TAC);
6294  (UP_ASM_TAC THEN MESON_TAC[]);
6295  (UP_ASM_TAC THEN REAL_ARITH_TAC);
6296
6297  (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
6298  (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
6299  (AP_THM_TAC THEN AP_TERM_TAC);
6300  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6301  (REWRITE_TAC[REAL_ABS_REFL]);
6302  (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6303    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6304  (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
6305  (AP_THM_TAC THEN AP_TERM_TAC);
6306  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6307  (REWRITE_TAC[REAL_ABS_REFL]);
6308  (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6309  (REWRITE_TAC[GSYM NORM_MUL]);
6310  (REWRITE_WITH 
6311   `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
6312  (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
6313  (REWRITE_TAC[NORM_TRIANGLE]);
6314  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6315  (UNDISCH_TAC `(g:real^3->real) y <= g xx`);
6316  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6317
6318  (NEW_GOAL `(g:real^3->real) xx <= d1`);
6319  (FIRST_ASSUM MATCH_MP_TAC);
6320  (EXPAND_TAC "P3");
6321  (EXPAND_TAC "g" THEN EXPAND_TAC "f3");
6322  (REWRITE_TAC[IN_ELIM_THM; IN]);
6323  (EXISTS_TAC `vl:(real^3)list`);
6324  (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`; 
6325                TRUNCATE_SIMPLEX_EXPLICIT_1]);
6326  (STRIP_TAC);
6327  (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6328  (REWRITE_WITH `mcell 3 V vl = mcell k V vl`);
6329  (ASM_SIMP_TAC[]);
6330  (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);
6331  (STRIP_TAC);
6332
6333  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6334  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6335  (EXISTS_TAC `X INTER (C:real^3->bool)`);
6336  (STRIP_TAC);
6337  (ASM_REWRITE_TAC[]);
6338  (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
6339  (EXPAND_TAC "D" THEN EXPAND_TAC "C");
6340  (MATCH_MP_TAC (SET_RULE 
6341   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
6342  (STRIP_TAC);
6343  (MATCH_MP_TAC SUBSET_BALL);
6344  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
6345  (MATCH_MP_TAC RCONE_GT_SUBSET);
6346  (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
6347
6348
6349  (EXPAND_TAC "xx");
6350  (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
6351  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6352  (EXPAND_TAC "m");
6353  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6354
6355  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");
6356  (REAL_ARITH_TAC);
6357
6358  (NEW_GOAL `F`);
6359  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6360  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6361  (EXISTS_TAC `(X:real^3->bool)`);
6362  (STRIP_TAC);
6363  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6364                set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6365  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6366  (SET_TAC[]);
6367  (UP_ASM_TAC THEN MESON_TAC[]);
6368
6369 (* ========================================================================= *)
6370
6371  (ABBREV_TAC `m = mxi V vl`);
6372  (NEW_GOAL `~coplanar {u0, u1, u2, m:real^3}`);
6373  (STRIP_TAC);
6374  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6375  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6376  (EXISTS_TAC `X:real^3->bool`);
6377  (STRIP_TAC);
6378  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6379  (COND_CASES_TAC);
6380  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6381    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6382  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6383  (EXPAND_TAC "m");
6384  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6385
6386  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6387  (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6388  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6389  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6390  (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6391  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6392  (SET_TAC[]);
6393
6394  (ASM_CASES_TAC `azim u0 u1 u2 (m:real^3) < pi`);
6395  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 m)`);
6396  (ASM_SIMP_TAC[WEDGE_LUNE]);
6397  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
6398                  conic_cap u0 u1 r d INTER L`);
6399  (SET_TAC[]);
6400  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
6401  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
6402    aff_gt {u0, u1} {u2, m} DIFF conic_cap u0 u1 r d INTER L = {}`);
6403  (EXPAND_TAC "L");
6404  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
6405  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
6406  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
6407  (EXPAND_TAC "L");
6408
6409  (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, m} =
6410                  aff_gt {u0, u1} {u2, m} UNION 
6411    UNIONS {aff_ge {u0, u1} ({u2, m} DELETE a) | a | a IN  {u2, m}}`);
6412  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
6413  (REWRITE_TAC[Geomdetail.FINITE6]);
6414  (REWRITE_TAC[DISJOINT]);
6415
6416  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6417  (NEW_GOAL `F`);
6418  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6419  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
6420  (UP_ASM_TAC THEN SET_TAC[]);
6421  (REWRITE_TAC[COPLANAR_3]);
6422  (UP_ASM_TAC THEN MESON_TAC[]);
6423
6424  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6425  (NEW_GOAL `F`);
6426  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6427  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
6428  (UP_ASM_TAC THEN SET_TAC[]); 
6429  (REWRITE_TAC[COPLANAR_3]);
6430  (UP_ASM_TAC THEN MESON_TAC[]);
6431  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6432
6433  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6434  (EXISTS_TAC 
6435   `UNIONS {aff_ge {u0, u1:real^3} ({u2, m} DELETE a) | a | a IN {u2, m}}`);
6436  (STRIP_TAC);
6437  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6438  (EXISTS_TAC 
6439   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);
6440  (STRIP_TAC);
6441  (MATCH_MP_TAC NEGLIGIBLE_UNION);
6442  (STRIP_TAC);
6443
6444  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6445  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
6446  (STRIP_TAC);
6447  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6448  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
6449  (SET_TAC[]);
6450  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6451  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6452  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
6453  (STRIP_TAC);
6454  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6455  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
6456  (SET_TAC[]);
6457  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6458  (REWRITE_TAC[SET_RULE 
6459   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
6460          aff_ge {u0, u1} ({m, s3} DELETE s3) 
6461    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
6462  (MATCH_MP_TAC (SET_RULE 
6463   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
6464  (STRIP_TAC);
6465  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6466  (STRIP_TAC);
6467  (SET_TAC[]);
6468
6469  (REWRITE_TAC[DISJOINT]);
6470  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6471  (NEW_GOAL `F`);
6472  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6473  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
6474  (UP_ASM_TAC THEN SET_TAC[]);
6475  (REWRITE_TAC[COPLANAR_3]);
6476  (UP_ASM_TAC THEN MESON_TAC[]);
6477  (UP_ASM_TAC THEN SET_TAC[]);
6478
6479  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6480  (STRIP_TAC);
6481  (SET_TAC[]);
6482  (REWRITE_TAC[DISJOINT]);
6483  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6484  (NEW_GOAL `F`);
6485  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6486  (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
6487  (UP_ASM_TAC THEN SET_TAC[]);
6488  (REWRITE_TAC[COPLANAR_3]);
6489  (UP_ASM_TAC THEN MESON_TAC[]);
6490  (UP_ASM_TAC THEN SET_TAC[]);
6491
6492  (SET_TAC[]);
6493
6494 (* begin the computation *)
6495
6496  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
6497  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 m) =
6498              (if &1 < d \/ r < &0
6499               then &0
6500               else azim u0 u1 u2 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);
6501  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);
6502  (STRIP_TAC);
6503  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6504  (EXISTS_TAC `m:real^3`);
6505  (ASM_REWRITE_TAC[]);
6506  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6507  (EXISTS_TAC `u2:real^3`);
6508  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6509  (ASM_REWRITE_TAC[]);
6510  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
6511
6512  (COND_CASES_TAC);
6513  (NEW_GOAL `F`);
6514  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
6515    UP_ASM_TAC THEN REAL_ARITH_TAC);
6516  (UP_ASM_TAC THEN MESON_TAC[]);
6517
6518  (REWRITE_WITH `azim (u0:real^3) u1 u2 m = dihV u0 u1 u2 m`);
6519  (MATCH_MP_TAC AZIM_DIHV_SAME);
6520  (ASM_REWRITE_TAC[]);
6521  (STRIP_TAC);
6522  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6523  (EXISTS_TAC `m:real^3`);
6524  (ASM_REWRITE_TAC[]);
6525  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6526  (EXISTS_TAC `u2:real^3`);
6527  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6528  (ASM_REWRITE_TAC[]);
6529
6530  (REWRITE_TAC[dihX]);
6531  (COND_CASES_TAC);
6532  (NEW_GOAL `F`);
6533  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6534  (REWRITE_TAC[]);
6535  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6536  (EXISTS_TAC `X:real^3->bool`);
6537  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
6538  (UP_ASM_TAC THEN MESON_TAC[]);
6539
6540  (LET_TAC);
6541
6542  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
6543  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
6544            ul IN barV V 3 /\
6545            X = mcell k V ul /\
6546            initial_sublist [u0; u1] ul)`);
6547  (STRIP_TAC);
6548  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
6549  (MATCH_MP_TAC SELECT_AX);
6550  (EXISTS_TAC `(3, vl:(real^3)list)`);
6551  (EXPAND_TAC "P");
6552  (REWRITE_TAC[BETA_THM]);
6553  (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);
6554  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
6555                  LENGTH [u0;u1] = 1 + 1`);
6556  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6557  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6558  (ASM_REWRITE_TAC[]);
6559  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6560  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
6561  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
6562
6563  (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);
6564  (MATCH_MP_TAC Ajripqn.AJRIPQN);
6565  (ASM_REWRITE_TAC[]);
6566  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6567  (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);
6568  (REWRITE_WITH `mcell 3 V vl = X`);
6569  (ASM_SIMP_TAC[]);
6570  (SET_TAC[ASSUME `X = mcell k' V ul`]);
6571
6572  (REPEAT STRIP_TAC);
6573  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
6574    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
6575  (SET_TAC[]);
6576  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
6577
6578  (COND_CASES_TAC);
6579  (NEW_GOAL `F`);
6580  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
6581  (UP_ASM_TAC THEN MESON_TAC[]);
6582  (COND_CASES_TAC);
6583
6584  (REWRITE_TAC[dihu3]);
6585
6586  (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) = 
6587    dihV u0 u1 u2 (m:real^3)`);
6588
6589  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
6590  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6591  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6592
6593  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
6594  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6595  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6596  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6597                  CARD (set_of_list ul) = 3 + 1`);
6598  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6599  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6600  (ARITH_TAC);
6601
6602  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
6603  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6604  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6605  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6606                  CARD (set_of_list ul) = 3 + 1`);
6607  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6608  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6609  (ARITH_TAC);
6610
6611  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);
6612  (REWRITE_WITH `
6613     {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
6614     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = 
6615     convex hull {u0, u1,u2,m:real^3}`);
6616  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6617  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
6618  (REPEAT STRIP_TAC);
6619
6620  (UNDISCH_TAC `~NULLSET X`);
6621  (REWRITE_TAC[]);
6622  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6623  (COND_CASES_TAC);
6624  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
6625  (MATCH_MP_TAC BARV_3_EXPLICIT);
6626  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6627  (UP_ASM_TAC THEN STRIP_TAC);
6628  (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6629                    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6630  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6631  (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
6632  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6633  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6634  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6635  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6636  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6637  (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);
6638  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
6639                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
6640
6641  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6642
6643  (UNDISCH_TAC `~NULLSET X`);
6644  (REWRITE_TAC[]);
6645  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
6646    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6647  (COND_CASES_TAC);
6648  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6649  (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);
6650  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6651  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6652  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6653  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6654  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6655  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6656  (EXPAND_TAC "m");
6657  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6658  (ASM_REWRITE_TAC[]);
6659
6660  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6661
6662  (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);
6663  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6664  (COND_CASES_TAC);
6665  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6666    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6667  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6668  (EXPAND_TAC "m");
6669  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6670
6671  (NEW_GOAL `F`);
6672  (UNDISCH_TAC `~NULLSET X`);
6673  (REWRITE_TAC[]);
6674  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6675  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6676  (UP_ASM_TAC THEN MESON_TAC[]);
6677
6678  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6679  (COND_CASES_TAC);
6680  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
6681  (MATCH_MP_TAC BARV_3_EXPLICIT);
6682  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6683  (UP_ASM_TAC THEN STRIP_TAC);
6684  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
6685                TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6686                SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6687  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
6688  (NEW_GOAL `F`);
6689  (UNDISCH_TAC `~NULLSET X`);
6690  (REWRITE_TAC[]);
6691  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6692  (ASM_REWRITE_TAC[]);
6693  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6694  (UP_ASM_TAC THEN MESON_TAC[]);
6695
6696  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
6697
6698  (NEW_GOAL `mxi V ul = m`);
6699  (EXPAND_TAC "m");
6700  (MATCH_MP_TAC MCELL_ID_MXI);
6701  (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
6702  (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);
6703  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
6704  (ASM_REWRITE_TAC[]);
6705  (ASM_REWRITE_TAC[HD]);
6706  (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);
6707  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6708  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
6709  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6710                  CARD (set_of_list ul) = 3 + 1`);
6711  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6712  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6713  (ARITH_TAC);
6714  (ASM_REWRITE_TAC[HD]);
6715  (ASM_REWRITE_TAC[]);
6716
6717  (STRIP_TAC);
6718  (NEW_GOAL `EL 2 ul = u2:real^3`);
6719  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
6720  (STRIP_TAC);
6721  (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);
6722  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6723  (UNDISCH_TAC `~coplanar {u0,u1,u2,m:real^3}` THEN REWRITE_TAC[
6724    GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
6725    ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);
6726  (ASM_REWRITE_TAC[]);
6727
6728  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
6729  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
6730  (AP_THM_TAC THEN AP_TERM_TAC);
6731
6732  (REWRITE_WITH 
6733   `measurable (conic_cap u0 u1 r d) /\
6734              vol (conic_cap u0 u1 r d) =
6735              (if u1 = u0 \/ &1 <= d \/ r < &0
6736               then &0
6737               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
6738  (MATCH_MP_TAC VOLUME_CONIC_CAP);
6739  (EXPAND_TAC "d");
6740  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
6741  (COND_CASES_TAC);
6742  (NEW_GOAL `F`);
6743  (UP_ASM_TAC THEN STRIP_TAC);
6744  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
6745  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6746  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6747  (UP_ASM_TAC THEN MESON_TAC[]);
6748  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
6749
6750  (REWRITE_WITH `max d (--(&1)) = d`);
6751  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
6752  (REWRITE_TAC[REAL_NEG_LT0]);
6753  (STRIP_TAC);
6754  (EXPAND_TAC "d");
6755  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
6756  (REAL_ARITH_TAC);
6757
6758  (REWRITE_WITH `
6759   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
6760   ((&2 * pi) / (&2 * pi))`);
6761  (REAL_ARITH_TAC);
6762  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
6763  (MATCH_MP_TAC REAL_DIV_REFL);
6764  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
6765  (REAL_ARITH_TAC);
6766  (NEW_GOAL `F`);
6767  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
6768    THEN MESON_TAC[]);
6769  (UP_ASM_TAC THEN MESON_TAC[]);
6770
6771 (* ========================================================================= *)
6772
6773  (ASM_CASES_TAC `azim u0 u1 m (u2:real^3) < pi`);
6774  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6775  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6776  (STRIP_TAC);
6777  (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m u2)`);
6778  (ASM_SIMP_TAC[WEDGE_LUNE]);
6779  (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
6780                  conic_cap u0 u1 r d INTER L`);
6781  (SET_TAC[]);
6782  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
6783
6784  (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
6785    aff_gt {u0, u1} {m, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);
6786  (EXPAND_TAC "L");
6787  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
6788  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
6789  (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
6790  (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
6791  (EXPAND_TAC "L");
6792  (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
6793
6794  (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, u2} =
6795                  aff_gt {u0, u1} {m, u2} UNION 
6796    UNIONS {aff_ge {u0, u1} ({m, u2} DELETE a) | a | a IN  {m, u2}}`);
6797  (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
6798  (REWRITE_TAC[Geomdetail.FINITE6]);
6799  (REWRITE_TAC[DISJOINT]);
6800
6801  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6802  (NEW_GOAL `F`);
6803  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
6804  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);
6805  (UP_ASM_TAC THEN SET_TAC[]);
6806  (REWRITE_TAC[COPLANAR_3]);
6807  (UP_ASM_TAC THEN MESON_TAC[]);
6808
6809  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6810  (NEW_GOAL `F`);
6811  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
6812  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);
6813  (UP_ASM_TAC THEN SET_TAC[]);
6814  (REWRITE_TAC[COPLANAR_3]);
6815  (UP_ASM_TAC THEN MESON_TAC[]);
6816  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6817
6818  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6819  (EXISTS_TAC 
6820   `UNIONS {aff_ge {u0, u1:real^3} ({m, u2} DELETE a) | a | a IN {m, u2}}`);
6821  (STRIP_TAC);
6822  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6823  (EXISTS_TAC 
6824   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);
6825  (STRIP_TAC);
6826  (MATCH_MP_TAC NEGLIGIBLE_UNION);
6827  (STRIP_TAC);
6828
6829  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6830  (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
6831  (STRIP_TAC);
6832  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6833  (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
6834  (SET_TAC[]);
6835  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6836  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6837  (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
6838  (STRIP_TAC);
6839  (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6840  (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
6841  (SET_TAC[]);
6842  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6843  (REWRITE_TAC[SET_RULE 
6844   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
6845          aff_ge {u0, u1} ({m, s3} DELETE s3) 
6846    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
6847  (MATCH_MP_TAC (SET_RULE 
6848   `A SUBSET D /\ C SUBSET B ==> A UNION C SUBSET B UNION D`));
6849  (STRIP_TAC);
6850  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6851  (STRIP_TAC);
6852  (SET_TAC[]);
6853
6854  (REWRITE_TAC[DISJOINT]);
6855  (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6856  (NEW_GOAL `F`);
6857  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
6858  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);
6859  (UP_ASM_TAC THEN SET_TAC[]);
6860  (REWRITE_TAC[COPLANAR_3]);
6861  (UP_ASM_TAC THEN MESON_TAC[]);
6862  (UP_ASM_TAC THEN SET_TAC[]);
6863
6864  (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6865  (STRIP_TAC);
6866  (SET_TAC[]);
6867  (REWRITE_TAC[DISJOINT]);
6868  (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6869  (NEW_GOAL `F`);
6870  (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
6871  (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);
6872  (UP_ASM_TAC THEN SET_TAC[]);
6873  (REWRITE_TAC[COPLANAR_3]);
6874  (UP_ASM_TAC THEN MESON_TAC[]);
6875  (UP_ASM_TAC THEN SET_TAC[]);
6876
6877  (SET_TAC[]);
6878
6879  (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
6880  (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m u2) =
6881              (if &1 < d \/ r < &0
6882               then &0
6883               else azim u0 u1 m u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
6884  (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);
6885  (STRIP_TAC);
6886  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6887  (EXISTS_TAC `m:real^3`);
6888  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6889  (ASM_REWRITE_TAC[]);
6890  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6891  (EXISTS_TAC `u2:real^3`);
6892  (ASM_REWRITE_TAC[]);
6893
6894  (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
6895  (COND_CASES_TAC);
6896  (NEW_GOAL `F`);
6897
6898  (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
6899    UP_ASM_TAC THEN REAL_ARITH_TAC);
6900  (UP_ASM_TAC THEN MESON_TAC[]);
6901
6902  (REWRITE_WITH `azim (u0:real^3) u1 m u2 = dihV u0 u1 m u2`);
6903  (MATCH_MP_TAC AZIM_DIHV_SAME);
6904  (ASM_REWRITE_TAC[]);
6905  (STRIP_TAC);
6906
6907  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6908  (EXISTS_TAC `u2:real^3`);
6909  (ASM_REWRITE_TAC[]);
6910  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6911  (EXISTS_TAC `m:real^3`);
6912  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6913  (ASM_REWRITE_TAC[]);
6914
6915  (REWRITE_TAC[dihX]);
6916  (COND_CASES_TAC);
6917  (NEW_GOAL `F`);
6918  (UNDISCH_TAC `~NULLSET (X INTER D)`);
6919  (REWRITE_TAC[]);
6920  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6921  (EXISTS_TAC `X:real^3->bool`);
6922  (ASM_REWRITE_TAC[] THEN SET_TAC[]);
6923  (UP_ASM_TAC THEN MESON_TAC[]);
6924
6925  (LET_TAC);
6926
6927  (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
6928  (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
6929            ul IN barV V 3 /\
6930            X = mcell k V ul /\
6931            initial_sublist [u0; u1] ul)`);
6932  (STRIP_TAC);
6933  (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
6934  (MATCH_MP_TAC SELECT_AX);
6935  (EXISTS_TAC `(3, vl:(real^3)list)`);
6936  (EXPAND_TAC "P");
6937  (REWRITE_TAC[BETA_THM]);
6938  (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);
6939
6940  (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
6941                  LENGTH [u0;u1] = 1 + 1`);
6942  (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6943  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6944  (ASM_REWRITE_TAC[]);
6945  (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6946  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
6947  (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
6948
6949  (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);
6950  (MATCH_MP_TAC Ajripqn.AJRIPQN);
6951  (ASM_REWRITE_TAC[]);
6952  (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6953  (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);
6954  (REWRITE_WITH `mcell 3 V vl = X`);
6955  (ASM_SIMP_TAC[]);
6956  (SET_TAC[ASSUME `X = mcell k' V ul`]);
6957
6958  (REPEAT STRIP_TAC);
6959  (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
6960    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
6961  (SET_TAC[]);
6962  (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
6963
6964  (COND_CASES_TAC);
6965  (NEW_GOAL `F`);
6966  (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
6967  (UP_ASM_TAC THEN MESON_TAC[]);
6968  (COND_CASES_TAC);
6969
6970  (REWRITE_TAC[dihu3]);
6971
6972  (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) = 
6973    dihV u0 u1 u2 (m:real^3)`);
6974
6975  (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
6976  (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6977  (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6978
6979  (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
6980  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6981  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6982  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6983                  CARD (set_of_list ul) = 3 + 1`);
6984  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6985  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6986  (ARITH_TAC);
6987
6988  (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
6989  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6990  (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6991  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6992                  CARD (set_of_list ul) = 3 + 1`);
6993  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6994  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6995  (ARITH_TAC);
6996
6997  (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);
6998  (REWRITE_WITH `
6999     {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
7000     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = 
7001     convex hull {u0, u1,u2,m:real^3}`);
7002  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7003  (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
7004  (REPEAT STRIP_TAC);
7005
7006  (UNDISCH_TAC `~NULLSET X`);
7007  (REWRITE_TAC[]);
7008  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7009  (COND_CASES_TAC);
7010  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
7011  (MATCH_MP_TAC BARV_3_EXPLICIT);
7012  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7013  (UP_ASM_TAC THEN STRIP_TAC);
7014  (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2; 
7015                    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7016  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7017  (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
7018  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7019  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7020  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7021  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
7022  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
7023  (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);
7024  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
7025                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
7026
7027  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7028
7029  (UNDISCH_TAC `~NULLSET X`);
7030  (REWRITE_TAC[]);
7031  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7032    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7033  (COND_CASES_TAC);
7034  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7035  (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);
7036  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7037  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7038  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7039  (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
7040  (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
7041  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
7042  (EXPAND_TAC "m");
7043  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
7044  (ASM_REWRITE_TAC[]);
7045
7046  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7047
7048  (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);
7049  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
7050  (COND_CASES_TAC);
7051  (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7052    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7053  (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
7054  (EXPAND_TAC "m");
7055  (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
7056
7057  (NEW_GOAL `F`);
7058  (UNDISCH_TAC `~NULLSET X`);
7059  (REWRITE_TAC[]);
7060  (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
7061  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7062  (UP_ASM_TAC THEN MESON_TAC[]);
7063
7064  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7065  (COND_CASES_TAC);
7066  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
7067  (MATCH_MP_TAC BARV_3_EXPLICIT);
7068  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7069  (UP_ASM_TAC THEN STRIP_TAC);
7070  (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
7071                TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7072                SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7073  (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
7074  (NEW_GOAL `F`);
7075  (UNDISCH_TAC `~NULLSET X`);
7076  (REWRITE_TAC[]);
7077  (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7078  (ASM_REWRITE_TAC[]);
7079  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7080  (UP_ASM_TAC THEN MESON_TAC[]);
7081
7082  (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
7083
7084  (NEW_GOAL `mxi V ul = m`);
7085  (EXPAND_TAC "m");
7086  (MATCH_MP_TAC MCELL_ID_MXI);
7087  (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
7088  (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);
7089  (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
7090  (ASM_REWRITE_TAC[]);
7091  (ASM_REWRITE_TAC[HD]);
7092  (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);
7093  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7094  (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
7095  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7096                  CARD (set_of_list ul) = 3 + 1`);
7097  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7098  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7099  (ARITH_TAC);
7100  (ASM_REWRITE_TAC[HD]);
7101  (ASM_REWRITE_TAC[]);
7102
7103  (STRIP_TAC);
7104  (NEW_GOAL `EL 2 ul = u2:real^3`);
7105  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
7106  (STRIP_TAC);
7107  (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);
7108  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7109  (UNDISCH_TAC `~coplanar {u0,u1,m,u2:real^3}`);
7110  (REWRITE_TAC[]);
7111  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
7112  (REWRITE_TAC[GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
7113               ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);
7114  (ASM_REWRITE_TAC[]);
7115  (REWRITE_TAC[DIHV_SYM_2]);
7116
7117  (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
7118  (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
7119  (AP_THM_TAC THEN AP_TERM_TAC);
7120
7121  (REWRITE_WITH 
7122   `measurable (conic_cap u0 u1 r d) /\
7123              vol (conic_cap u0 u1 r d) =
7124              (if u1 = u0 \/ &1 <= d \/ r < &0
7125               then &0
7126               else &2 / &3 * pi * (&1 - d) * r pow 3)`);
7127  (MATCH_MP_TAC VOLUME_CONIC_CAP);
7128  (EXPAND_TAC "d");
7129  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7130  (COND_CASES_TAC);
7131  (NEW_GOAL `F`);
7132  (UP_ASM_TAC THEN STRIP_TAC);
7133  (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
7134  (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7135  (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7136  (UP_ASM_TAC THEN MESON_TAC[]);
7137  (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
7138
7139  (REWRITE_WITH `max d (--(&1)) = d`);
7140  (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
7141  (REWRITE_TAC[REAL_NEG_LT0]);
7142  (STRIP_TAC);
7143  (EXPAND_TAC "d");
7144  (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7145  (REAL_ARITH_TAC);
7146
7147  (REWRITE_WITH `
7148   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
7149   ((&2 * pi) / (&2 * pi))`);
7150  (REAL_ARITH_TAC);
7151  (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
7152  (MATCH_MP_TAC REAL_DIV_REFL);
7153  (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
7154  (REAL_ARITH_TAC);
7155  (NEW_GOAL `F`);
7156  (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
7157    THEN MESON_TAC[]);
7158  (UP_ASM_TAC THEN MESON_TAC[]);
7159
7160 (* ========================================================================= *)
7161
7162  (NEW_GOAL `F`);
7163  (NEW_GOAL `azim (u0:real^3) u1 m u2 = 
7164   (if azim u0 u1 u2 m = &0 then &0 else &2 * pi - azim u0 u1 u2 m)`);
7165  (MATCH_MP_TAC AZIM_COMPL);
7166  (STRIP_TAC);
7167
7168  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7169  (EXISTS_TAC `m:real^3`);
7170  (ASM_REWRITE_TAC[]);
7171  (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7172  (EXISTS_TAC `u2:real^3`);
7173  (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
7174  (ASM_REWRITE_TAC[]);
7175  (UP_ASM_TAC THEN COND_CASES_TAC);
7176  (NEW_GOAL `F`);
7177  (NEW_GOAL `(&0 < pi)`);
7178  (REWRITE_TAC[PI_POS]);
7179  (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 m < pi)`);
7180  (ASM_REWRITE_TAC[]);
7181  (UP_ASM_TAC THEN MESON_TAC[]);
7182  (STRIP_TAC);
7183
7184  (NEW_GOAL `azim (u0:real^3) u1 u2 m = pi`);
7185  (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7186  (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
7187  (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
7188  (ASM_REWRITE_TAC[]);
7189  (UP_ASM_TAC THEN MESON_TAC[]);
7190
7191 (* ========================================================================= *)
7192 (* ========================================================================= *)
7193  (ABBREV_TAC `s = {X | mcell_set V X /\ edgeX V X e}`);
7194  (NEW_GOAL `sum s (\t. vol (t INTER D)) = vol (D)`);
7195  (ABBREV_TAC `f = (\t:real^3->bool. t INTER D)`);
7196  (REWRITE_WITH `(\t. vol (t INTER D)) = (\x:real^3->bool. vol (f x))`);
7197  (EXPAND_TAC "f");
7198  (REWRITE_TAC[]);
7199  (REWRITE_WITH `sum s (\x:real^3->bool. vol (f x)) = vol (UNIONS (IMAGE f s))`);
7200  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7201  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE);
7202  (REPEAT STRIP_TAC); 
7203
7204  (EXPAND_TAC "s");
7205  (MATCH_MP_TAC FINITE_EDGE_X2);
7206  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7207  (ASM_REWRITE_TAC[]);
7208
7209  (EXPAND_TAC "f");
7210  (MATCH_MP_TAC MEASURABLE_INTER);
7211  (STRIP_TAC);
7212  (UP_ASM_TAC THEN EXPAND_TAC "s");
7213  (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7214  (REPEAT STRIP_TAC);
7215  (ASM_SIMP_TAC[MEASURABLE_MCELL]);
7216  (ASM_REWRITE_TAC[MEASURABLE_CONIC_CAP]);
7217
7218  (EXPAND_TAC "f");
7219  (UNDISCH_TAC `(x:real^3->bool) IN s` THEN 
7220    UNDISCH_TAC `(y:real^3->bool) IN s` THEN EXPAND_TAC "s");
7221  (REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
7222  (REPEAT STRIP_TAC);
7223  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7224  (EXISTS_TAC `x INTER (y:real^3->bool)`);
7225  (ASM_REWRITE_TAC[SET_RULE `(x INTER D) INTER y INTER D SUBSET x INTER y`]);
7226  (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
7227  (STRIP_TAC);
7228
7229  (NEW_GOAL `i' = i /\ mcell i' V ul' = mcell i V ul`);
7230  (MATCH_MP_TAC Ajripqn.AJRIPQN);
7231  (ASM_REWRITE_TAC[SET_RULE `i IN {0, 1, 2, 3, 4} <=>
7232                              i = 0 \/ i = 1 \/ i = 2 \/ i = 3 \/ i = 4`]);
7233  (UNDISCH_TAC `i <= 4` THEN UNDISCH_TAC `i' <= 4` THEN ARITH_TAC);
7234  (UNDISCH_TAC `~(x = y:real^3->bool)` THEN ASM_REWRITE_TAC[]);
7235
7236
7237  (EXPAND_TAC "s");
7238  (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
7239
7240 (* OK here *)
7241
7242
7243
7244  (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
7245  (REWRITE_WITH 
7246    `UNIONS {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}
7247     DIFF D = {}`);
7248  (REWRITE_TAC[SET_RULE `A DIFF B = {} <=> A SUBSET B`]);
7249  (REWRITE_TAC[UNIONS_SUBSET; IN; IN_ELIM_THM]);
7250  (SET_TAC[]);
7251  (REWRITE_TAC[SET_RULE `{} UNION A = A`]);
7252
7253  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7254  (EXISTS_TAC `UNIONS {y | ?x. x IN {X | mcell_set V X /\ NULLSET (X INTER D) /\ 
7255             ~(X INTER D = {})} /\  y = x INTER D}`);
7256  (STRIP_TAC);
7257  (MATCH_MP_TAC NEGLIGIBLE_UNIONS);
7258  (STRIP_TAC);
7259  (REWRITE_WITH 
7260   `{y | ?x. x IN {X | mcell_set V X /\ NULLSET (X INTER D) /\ 
7261                 ~(X INTER D = {})} /\ 
7262             y = x INTER D} = 
7263    {y | ?x. x IN {X | mcell_set V X /\ NULLSET (X INTER D) /\ 
7264                 ~(X INTER D = {})} /\ 
7265             y = f x }`);
7266  (EXPAND_TAC "f" THEN REWRITE_TAC[]);
7267  (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
7268
7269 (* ========================================================================= *)
7270 (* ========================================================================= *)
7271 (* ========================================================================= *)
7272
7273  (MATCH_MP_TAC FINITE_SUBSET);
7274  (EXISTS_TAC `{X | X SUBSET ball (u0, &10) /\ mcell_set V X}`);
7275  (STRIP_TAC);
7276  (ASM_SIMP_TAC[FINITE_MCELL_SET_LEMMA_2]);
7277  (REWRITE_TAC[SUBSET; IN_BALL; IN; IN_ELIM_THM; mcell_set] THEN 
7278    REPEAT STRIP_TAC);
7279
7280  (NEW_GOAL `?v1:real^3. v1 IN x /\ v1 IN D`);
7281  (REWRITE_TAC[GSYM IN_INTER]);
7282  (UNDISCH_TAC `~(x:real^3->bool INTER D = {})` THEN SET_TAC[]);
7283  (UP_ASM_TAC THEN STRIP_TAC);
7284  (NEW_GOAL `dist (u0, x') <= dist (u0, v1:real^3) + dist (v1, x')`);
7285  (NORM_ARITH_TAC);
7286  (NEW_GOAL `dist (u0, v1:real^3) < &1`);
7287  (REWRITE_TAC[GSYM IN_BALL]);
7288  (NEW_GOAL `D SUBSET ball (u0:real^3, &1)`);
7289  (EXPAND_TAC "D");
7290  (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);
7291  (MATCH_MP_TAC SUBSET_BALL);
7292  (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
7293  (UP_ASM_TAC THEN SET_TAC[]);
7294  (UP_ASM_TAC THEN UNDISCH_TAC `v1:real^3 IN D` THEN SET_TAC[]);
7295  (NEW_GOAL `dist (v1,x':real^3) < &8`);
7296  (REWRITE_TAC[GSYM IN_BALL]);
7297
7298  (NEW_GOAL `x SUBSET ball (v1:real^3, &8)`);
7299  (ASM_REWRITE_TAC[]);
7300  (MATCH_MP_TAC MCELL_SUBSET_BALL8);
7301  (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN ASM_REWRITE_TAC[]);
7302  (UNDISCH_TAC `(x:real^3->bool) x'` THEN UP_ASM_TAC THEN SET_TAC[]);
7303  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7304  (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list`);
7305  (ASM_REWRITE_TAC[]);
7306
7307 (* ========================================================================= *)
7308
7309  (REWRITE_TAC[IN; IN_ELIM_THM]);
7310  (REPEAT STRIP_TAC);
7311  (REWRITE_TAC[ASSUME `t:real^3->bool = x INTER D`]);
7312  (ASM_REWRITE_TAC[]);
7313
7314  (REWRITE_TAC[SUBSET; IN_UNIONS]);
7315  (REPEAT STRIP_TAC);
7316
7317  (NEW_GOAL `?v:real^3. v IN V /\ x IN voronoi_closed V v`);
7318  (ASM_SIMP_TAC[TIWWFYQ]);
7319  (UP_ASM_TAC THEN STRIP_TAC);
7320  (UP_ASM_TAC THEN REWRITE_WITH 
7321    `x IN voronoi_closed V v <=>  (?vl. vl IN barV V 3 /\ x IN rogers V vl /\
7322                                        truncate_simplex 0 vl = [v])`);
7323  (ASM_SIMP_TAC[GLTVHUM]);
7324  (REWRITE_TAC[IN] THEN STRIP_TAC);
7325  (NEW_GOAL `?i. i <= 4 /\ x IN mcell i V vl`);
7326  (ASM_SIMP_TAC[IN;SLTSTLO1]);
7327  (UP_ASM_TAC THEN STRIP_TAC);
7328
7329  (ABBREV_TAC `X = mcell i V vl`);
7330  (NEW_GOAL `~NULLSET (X INTER D) ==> F`);
7331  (STRIP_TAC);
7332
7333  (NEW_GOAL `?k ul.
7334                    2 <= k /\
7335                    barV V 3 ul /\
7336                    X = mcell k V ul /\
7337                    truncate_simplex 1 ul = [u0; u1]`);
7338  (FIRST_ASSUM MATCH_MP_TAC);
7339  (STRIP_TAC);
7340  (REWRITE_TAC[mcell_set; IN_ELIM_THM; IN]);
7341  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7342  (ASM_REWRITE_TAC[]);
7343  (ASM_REWRITE_TAC[]);
7344  (UP_ASM_TAC THEN STRIP_TAC);
7345
7346  (MP_TAC (ASSUME `x IN
7347       D DIFF
7348       UNIONS
7349       {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}`));
7350  (REWRITE_TAC[IN_DIFF; MESON[] `~(A /\ ~B) <=> ~A \/ B`]);
7351  (DISJ2_TAC);
7352  (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);
7353  (EXISTS_TAC `X INTER (D:real^3->bool)`);
7354  (STRIP_TAC);
7355
7356  (EXISTS_TAC `(X:real^3->bool)`);
7357  (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM] THEN STRIP_TAC);
7358  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7359  (ASM_REWRITE_TAC[]);
7360
7361  (REWRITE_TAC[edgeX; IN_ELIM_THM]);
7362  (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7363  (STRIP_TAC);
7364
7365  (NEW_GOAL `VX V X = V INTER X`);
7366  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7367  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `(if k < 4 then k else 4)`);
7368  (ASM_REWRITE_TAC[]);
7369  (STRIP_TAC);
7370  (COND_CASES_TAC);
7371  (MESON_TAC[]);
7372  (NEW_GOAL `k >= 4`);
7373  (UP_ASM_TAC THEN ARITH_TAC);
7374  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7375  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN ASM_REWRITE_TAC[]);
7376  (MESON_TAC[NEGLIGIBLE_SUBSET; SET_RULE `A INTER B SUBSET A`]);
7377
7378  (NEW_GOAL `(V:real^3->bool) INTER X = 
7379             set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7380  (REWRITE_WITH `X = mcell (if k < 4 then k else 4) V ul`);
7381  (ASM_REWRITE_TAC[]);
7382  (COND_CASES_TAC);
7383  (REFL_TAC);
7384  (NEW_GOAL `k >= 4`);
7385  (UP_ASM_TAC THEN ARITH_TAC);
7386  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7387
7388  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7389  (ASM_REWRITE_TAC[]);
7390  (STRIP_TAC);
7391  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7392  (STRIP_TAC);
7393  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7394  (REWRITE_WITH `mcell (if k < 4 then k else 4) V ul = X`);
7395  (ASM_REWRITE_TAC[]);
7396  (COND_CASES_TAC);
7397  (REFL_TAC);
7398  (NEW_GOAL `k >= 4`);
7399  (UP_ASM_TAC THEN ARITH_TAC);
7400  (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7401  (STRIP_TAC);
7402  (UNDISCH_TAC `~NULLSET (X INTER D)` THEN 
7403    REWRITE_TAC[ASSUME `X = {}:real^3->bool`; SET_RULE `{} INTER x = {}`;
7404    NEGLIGIBLE_EMPTY]);
7405  (ASM_REWRITE_TAC[]);
7406  (NEW_GOAL `set_of_list (truncate_simplex 1 (ul:(real^3)list)) SUBSET 
7407            set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7408  (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
7409  (REWRITE_WITH `LENGTH ul = 3 + 1 /\ 
7410                  CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
7411  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7412  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7413  (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7414  (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`]);
7415
7416  (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `truncate_simplex 1 ul = [u0; u1:real^3]`;
7417     set_of_list]);
7418  (SET_TAC[]);
7419  (ASM_REWRITE_TAC[]);
7420  (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`; IN_INTER]);
7421  (STRIP_TAC);
7422  (ASM_REWRITE_TAC[]);
7423  (UNDISCH_TAC `x IN
7424       D DIFF
7425       UNIONS
7426       {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}`);
7427  (SET_TAC[]);
7428  (UP_ASM_TAC THEN REWRITE_TAC[] THEN STRIP_TAC);
7429  (EXISTS_TAC `X INTER (D:real^3 ->bool)`);
7430  (STRIP_TAC);
7431  (REWRITE_TAC[IN_ELIM_THM]);
7432  (EXISTS_TAC `(X:real^3 ->bool)`);
7433  (STRIP_TAC);
7434  (STRIP_TAC);
7435
7436  (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7437  (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7438  (ASM_REWRITE_TAC[]);
7439  (STRIP_TAC);
7440  (ASM_REWRITE_TAC[]);
7441
7442  (REWRITE_TAC[SET_RULE `~(a = {}) <=> (?x. x IN a)`]);
7443  (EXISTS_TAC `x:real^3`);
7444
7445  (REWRITE_TAC[IN_INTER]);
7446  (STRIP_TAC);
7447  (ASM_REWRITE_TAC[]);
7448  (UNDISCH_TAC `x IN
7449       D DIFF
7450       UNIONS
7451       {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}`);
7452  (SET_TAC[]);
7453  (REWRITE_TAC[]);
7454
7455  (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`; IN_INTER]);
7456  (STRIP_TAC);
7457  (ASM_REWRITE_TAC[]);
7458  (UNDISCH_TAC `x IN
7459       D DIFF
7460       UNIONS
7461       {y | ?x. x IN {X | mcell_set V X /\ edgeX V X e} /\ y = x INTER D}`);
7462  (SET_TAC[]);
7463
7464 (* ========================================================================= *)
7465 (* ========================================================================= *)
7466 (* ========================================================================= *)
7467
7468  (UP_ASM_TAC);
7469  (ABBREV_TAC `t ={X | mcell_set V X /\ edgeX V X e /\ ~NULLSET (X INTER D)}`);
7470
7471  (REWRITE_WITH `sum s (\t. vol (t INTER D)) = 
7472                  sum t (\t. vol (t INTER D))`);
7473  (MATCH_MP_TAC SUM_SUPERSET);
7474  (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);
7475  (SET_TAC[]);
7476  (MATCH_MP_TAC MEASURE_EQ_0);
7477  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );
7478  (MESON_TAC[]);
7479
7480
7481  (REWRITE_WITH `sum s (\t. dihX V t (u0,u1)) = 
7482                  sum t (\t. dihX V t (u0,u1))`);
7483  (MATCH_MP_TAC SUM_SUPERSET);
7484  (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);
7485  (SET_TAC[]);
7486
7487  (NEW_GOAL `NULLSET (x INTER D)`);
7488  (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );
7489  (MESON_TAC[]);
7490
7491  (NEW_GOAL `mcell_set V x /\ edgeX V x e`);
7492  (UNDISCH_TAC `x IN {X | mcell_set V X /\ edgeX V X e}`);
7493  (REWRITE_TAC[IN; IN_ELIM_THM]);
7494  (UP_ASM_TAC THEN REWRITE_TAC[mcell_set_2; IN_ELIM_THM;IN] THEN STRIP_TAC);
7495
7496  (NEW_GOAL `~NULLSET x`);
7497  (UP_ASM_TAC THEN REWRITE_TAC[edgeX; VX; IN_ELIM_THM]);
7498  (COND_CASES_TAC THEN REPEAT STRIP_TAC);
7499  (UNDISCH_TAC `{} (u:real^3)` THEN REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
7500  (SET_TAC[]);
7501
7502  (NEW_GOAL `VX V x = V INTER (x:real^3->bool)`);
7503  (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7504  (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7505  (ASM_REWRITE_TAC[]);
7506
7507  (NEW_GOAL `V INTER (x:real^3->bool) = 
7508              set_of_list (truncate_simplex (i - 1) ul)`);
7509  (ASM_REWRITE_TAC[]);
7510  (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7511  (ASM_REWRITE_TAC[]);
7512  (STRIP_TAC);
7513  (ASM_CASES_TAC `i = 0`);
7514  (NEW_GOAL `V INTER (x:real^3->bool) = {}`);
7515  (ASM_REWRITE_TAC[]);
7516  (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7517  (ASM_REWRITE_TAC[]);
7518  (NEW_GOAL `F`);
7519  (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM]);
7520  (STRIP_TAC);
7521  (UNDISCH_TAC `VX V x u` THEN ASM_REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
7522  (SET_TAC[]);
7523  (UP_ASM_TAC THEN MESON_TAC[]);
7524  (UP_ASM_TAC THEN ARITH_TAC);
7525  (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN STRIP_TAC);
7526  (UNDISCH_TAC `~NULLSET x` THEN REWRITE_TAC[ASSUME `x:real^3->bool = {}`;
7527    NEGLIGIBLE_EMPTY]);
7528
7529  (NEW_GOAL `(u0:real^3) IN VX V x /\ u1 IN VX V x`);
7530  (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM; 
7531    ASSUME `e = {u0, u1:real^3}`]);
7532  (STRIP_TAC);
7533  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7534
7535 (* ========================================================================== *)
7536  (NEW_GOAL `F`);
7537
7538  (ASM_CASES_TAC `i <= 1`);
7539  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7540  (MATCH_MP_TAC BARV_3_EXPLICIT);
7541  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7542  (UP_ASM_TAC THEN STRIP_TAC);
7543  (NEW_GOAL `i - 1 = 0`);
7544  (UNDISCH_TAC `i <= 1` THEN ARITH_TAC);
7545  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7546  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0; set_of_list]);
7547  (UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7548
7549  (ASM_CASES_TAC `i = 3`);
7550  (NEW_GOAL `vol (x INTER D) > &0`);
7551  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7552  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7553  (MATCH_MP_TAC BARV_3_EXPLICIT);
7554  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7555  (UP_ASM_TAC THEN STRIP_TAC);
7556  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; TRUNCATE_SIMPLEX_EXPLICIT_2; 
7557    set_of_list; SET_RULE `{a,c,d} UNION {x} = {a,c,d,x}`]);
7558  (COND_CASES_TAC);
7559  (NEW_GOAL `i - 1 = 2`);
7560  (UNDISCH_TAC `i = 3` THEN ARITH_TAC);
7561  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7562  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
7563  (STRIP_TAC);
7564  (NEW_GOAL `?v:real^3. {u0, u1, v} = {v0, v1, v2}`);
7565  (NEW_GOAL `?v:real^3. v IN {v0, v1, v2} DIFF {u0, u1}`);
7566  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7567  (REWRITE_WITH `{v0, v1, v2} DIFF {u0, u1:real^3} = {} <=> 
7568                   CARD ({v0, v1, v2} DIFF {u0, u1}) = 0`);
7569  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7570  (MATCH_MP_TAC CARD_EQ_0);
7571  (MATCH_MP_TAC FINITE_SUBSET);
7572  (EXISTS_TAC `{v0, v1, v2:real^3}`);
7573  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7574  (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7575
7576  (NEW_GOAL `CARD {v0, v1, v2} = CARD ({v0, v1, v2} DIFF {u0, u1:real^3}) +
7577                                  CARD {u0, u1}`);
7578  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
7579  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7580  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2:real^3}) = 3`);
7581  (REWRITE_WITH `{v0, v1, v2:real^3} = set_of_list (truncate_simplex 2 ul)`);
7582  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
7583  (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
7584  (REWRITE_WITH `LENGTH (xl:(real^3)list) = 2 + 1 /\ 
7585                  CARD (set_of_list xl) = 2 + 1`);
7586  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7587  (EXISTS_TAC `V:real^3->bool` THEN STRIP_TAC);
7588  (ASM_REWRITE_TAC[]);
7589  (EXPAND_TAC "xl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
7590  (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
7591  (ARITH_TAC);
7592
7593  (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);
7594  (REWRITE_TAC[Geomdetail.CARD2]);
7595  (UP_ASM_TAC THEN ARITH_TAC);
7596  (UP_ASM_TAC THEN STRIP_TAC);
7597  (EXISTS_TAC `v:real^3`);
7598  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
7599    UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7600  (UP_ASM_TAC THEN STRIP_TAC);
7601  (NEW_GOAL `{v0, v1, v2, mxi V [v0; v1; v2; v3]} = 
7602              {u0, u1, v, mxi V [v0; v1; v2; v3]}`);
7603  (UP_ASM_TAC THEN SET_TAC[]);
7604  (ASM_REWRITE_TAC[]);
7605  (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
7606  (ASM_REWRITE_TAC[]);
7607  (STRIP_TAC);
7608  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7609  (REWRITE_TAC[GSYM (ASSUME `{v0, v1, v2, mxi V [v0; v1; v2; v3]} =
7610                {u0, u1, v, mxi V [v0; v1; v2; v3]}`)] THEN STRIP_TAC);
7611  (UNDISCH_TAC `~NULLSET x`);
7612  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7613    TRUNCATE_SIMPLEX_EXPLICIT_2]);
7614  (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7615  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7616  (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
7617  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7618  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7619  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7620  (ASM_REWRITE_TAC[]);
7621
7622  (NEW_GOAL `F`);
7623  (UNDISCH_TAC `~NULLSET x`);
7624  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7625    TRUNCATE_SIMPLEX_EXPLICIT_2]);
7626  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7627  (UP_ASM_TAC THEN MESON_TAC[]);
7628
7629  (NEW_GOAL `vol (x INTER D) = &0`);
7630  (MATCH_MP_TAC MEASURE_EQ_0);
7631  (ASM_REWRITE_TAC[]);
7632  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7633
7634
7635 (* ========================================== *)
7636
7637  (ASM_CASES_TAC `i = 4`);
7638  (NEW_GOAL `vol (x INTER D) > &0`);
7639  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7640  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7641  (MATCH_MP_TAC BARV_3_EXPLICIT);
7642  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7643  (UP_ASM_TAC THEN STRIP_TAC);
7644  (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`; 
7645    set_of_list]);
7646  (COND_CASES_TAC);
7647  (NEW_GOAL `i - 1 = 3`);
7648  (UNDISCH_TAC `i = 4` THEN ARITH_TAC);
7649  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7650  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; set_of_list]);
7651  (STRIP_TAC);
7652
7653  (NEW_GOAL `?v w:real^3. {u0, u1, v, w} = {v0, v1, v2, v3}`);
7654
7655  (NEW_GOAL `?v:real^3. v IN {v0, v1, v2, v3} DIFF {u0, u1}`);
7656  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7657  (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1:real^3} = {} <=> 
7658                   CARD ({v0, v1, v2, v3} DIFF {u0, u1}) = 0`);
7659  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7660  (MATCH_MP_TAC CARD_EQ_0);
7661  (MATCH_MP_TAC FINITE_SUBSET);
7662  (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);
7663  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7664  (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7665
7666  (NEW_GOAL `CARD {v0, v1, v2, v3} = 
7667              CARD ({v0, v1, v2, v3} DIFF {u0, u1:real^3}) + CARD {u0, u1}`);
7668  (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
7669  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7670
7671  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);
7672  (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);
7673  (ASM_REWRITE_TAC[set_of_list]);
7674  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7675                  CARD (set_of_list ul) = 3 + 1`);
7676  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7677  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7678  (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);
7679  (REWRITE_TAC[Geomdetail.CARD2]);
7680  (UP_ASM_TAC THEN ARITH_TAC);
7681  (UP_ASM_TAC THEN STRIP_TAC);
7682
7683  (NEW_GOAL `?w:real^3. w IN {v0, v1, v2, v3} DIFF {u0, u1, v}`);
7684  (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7685  (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1, v:real^3} = {} <=> 
7686                   CARD ({v0, v1, v2, v3} DIFF {u0, u1, v}) = 0`);
7687  (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7688  (MATCH_MP_TAC CARD_EQ_0);
7689  (MATCH_MP_TAC FINITE_SUBSET);
7690  (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);
7691  (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7692  (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7693
7694  (NEW_GOAL `CARD ({v0, v1, v2, v3} DIFF {u0, u1,v:real^3}) = 
7695              CARD {v0, v1, v2, v3} - CARD {u0,u1,v}`);
7696  (MATCH_MP_TAC CARD_DIFF);
7697  (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7698  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7699  (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);
7700  (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);
7701  (ASM_REWRITE_TAC[set_of_list]);
7702  (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7703                  CARD (set_of_list ul) = 3 + 1`);
7704  (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7705  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7706  (NEW_GOAL `CARD {u0, u1, v:real^3} <= 3`);
7707  (REWRITE_TAC[Geomdetail.CARD3]);
7708  (UP_ASM_TAC THEN ARITH_TAC);
7709  (UP_ASM_TAC THEN STRIP_TAC);
7710
7711  (EXISTS_TAC `v:real^3` THEN EXISTS_TAC `w:real^3`);
7712  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
7713    UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7714  (UP_ASM_TAC THEN STRIP_TAC);
7715  (REWRITE_TAC[GSYM (ASSUME `{u0:real^3, u1, v, w} = {v0, v1, v2, v3}`)]);
7716  (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
7717  (ASM_REWRITE_TAC[]);
7718  (STRIP_TAC);
7719  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7720  (STRIP_TAC);
7721  (UNDISCH_TAC `~NULLSET x`);
7722  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`; 
7723    ASSUME `x  = mcell i V ul`; ASSUME `i = 4`; 
7724    ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
7725  (COND_CASES_TAC);
7726  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7727  (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
7728  (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7729  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7730  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7731  (ASM_REWRITE_TAC[]);
7732  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7733
7734  (NEW_GOAL `F`);
7735  (UNDISCH_TAC `~NULLSET x`);
7736  (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`; 
7737    ASSUME `x  = mcell i V ul`; ASSUME `i = 4`; 
7738    ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
7739  (COND_CASES_TAC);
7740  (NEW_GOAL `F`);
7741  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7742  (UP_ASM_TAC THEN MESON_TAC[]);
7743  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7744  (UP_ASM_TAC THEN MESON_TAC[]);
7745
7746  (NEW_GOAL `vol (x INTER D) = &0`);
7747  (MATCH_MP_TAC MEASURE_EQ_0);
7748  (ASM_REWRITE_TAC[]);
7749  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7750
7751 (* ========================================== *)
7752
7753  (NEW_GOAL `i = 2`);
7754  (UNDISCH_TAC `i <= 4` THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC 
7755    THEN ARITH_TAC);
7756
7757
7758  (NEW_GOAL `vol (x INTER D) > &0`);
7759  (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7760  (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7761  (MATCH_MP_TAC BARV_3_EXPLICIT);
7762  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7763  (UP_ASM_TAC THEN STRIP_TAC);
7764  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; TRUNCATE_SIMPLEX_EXPLICIT_1; 
7765    set_of_list; HD; TL]);
7766  (LET_TAC);
7767  (COND_CASES_TAC);
7768
7769  (NEW_GOAL `i - 1 = 1`);
7770  (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
7771  (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7772  (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list]);
7773  (STRIP_TAC);
7774  (NEW_GOAL `{u0, u1} = {v0, v1:real^3}`);
7775  (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN
7776    SET_TAC[]);
7777  (REWRITE_TAC[SET_RULE `A INTER B INTER C INTER D = 
7778                         (A INTER (B INTER C)) INTER D`]);
7779  (REWRITE_WITH `rcone_ge v0 v1 a' INTER rcone_ge v1 v0 a' = 
7780                  rcone_ge u0 u1 a' INTER rcone_ge u1 (u0:real^3) a'`);
7781  (ASM_CASES_TAC `u0:real^3 = v0`);
7782  (NEW_GOAL `u1 = v1:real^3`);
7783  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7784  (ASM_REWRITE_TAC[]);
7785  (NEW_GOAL `u0 = v1:real^3`);
7786  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7787  (NEW_GOAL `u1 = v0:real^3`);
7788  (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7789  (ASM_REWRITE_TAC[]);
7790  (SET_TAC[]);
7791
7792  (REWRITE_WITH 
7793   `conic_cap u0 u1 r d INTER rcone_ge u0 u1 a' INTER rcone_ge u1 u0 a' =
7794    conic_cap (u0:real^3) u1 r d`);
7795  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER B = A`));
7796
7797  (NEW_GOAL `conic_cap (u0:real^3) u1 r d SUBSET rcone_ge u0 u1 a'`);
7798  (REWRITE_TAC[conic_cap]);
7799  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET B`));
7800  (NEW_GOAL `rcone_gt u0 u1 d SUBSET rcone_gt (u0:real^3) u1 a'`);
7801  (MATCH_MP_TAC RCONE_GT_SUBSET);
7802  (EXPAND_TAC "d" THEN EXPAND_TAC "c");
7803  (MATCH_MP_TAC (REAL_ARITH `a = x ==> a <= max (max y x) (max z t)`));
7804  (EXPAND_TAC "a'" THEN REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);
7805  (NEW_GOAL `rcone_gt u0 u1 a' SUBSET rcone_ge (u0:real^3) u1 a'`);
7806  (REWRITE_TAC[RCONE_GT_SUBSET_RCONE_GE]);
7807  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7808  (REWRITE_TAC[SUBSET_INTER] THEN STRIP_TAC);
7809  (ASM_REWRITE_TAC[]);
7810
7811  (REWRITE_TAC[SUBSET]);
7812  (REPEAT STRIP_TAC);
7813  (MATCH_MP_TAC Marchal_cells_2_new.RCONEGE_INTER_VORONOI_CLOSED_IMP_RCONEGE);
7814  (EXISTS_TAC `V:real^3->bool`);
7815  (ASM_REWRITE_TAC[]);
7816  (REPEAT STRIP_TAC);
7817
7818  (REWRITE_WITH `a' = hl [u0; u1:real^3] / sqrt (&2)`);
7819  (EXPAND_TAC "a'");
7820  (REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);
7821  (MATCH_MP_TAC REAL_LT_DIV);
7822  (REWRITE_TAC[HL_2]);
7823  (STRIP_TAC);
7824  (MATCH_MP_TAC REAL_LT_MUL);
7825  (REWRITE_TAC[REAL_ARITH `&0 < inv (&2)`]);
7826  (MATCH_MP_TAC DIST_POS_LT);
7827  (ASM_REWRITE_TAC[]);
7828  (MATCH_MP_TAC SQRT_POS_LT);
7829  (REAL_ARITH_TAC);
7830  (EXPAND_TAC "a'");
7831  (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);
7832  (STRIP_TAC);
7833  (MATCH_MP_TAC SQRT_POS_LT);
7834  (REAL_ARITH_TAC);
7835  (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));
7836  (ASM_REWRITE_TAC[]);
7837
7838  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7839  (NEW_GOAL `x':real^3 IN ball (u0, (&1))`);
7840  (UP_ASM_TAC THEN REWRITE_TAC[conic_cap;NORMBALL_BALL] THEN STRIP_TAC);
7841  (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);
7842  (MATCH_MP_TAC SUBSET_BALL);
7843  (EXPAND_TAC "r");
7844  (REAL_ARITH_TAC);
7845  (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7846  (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL] THEN ONCE_REWRITE_TAC[DIST_SYM] 
7847    THEN STRIP_TAC);
7848  (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
7849  (REPEAT STRIP_TAC);
7850  (ASM_CASES_TAC `u0 = w:real^3`);
7851  (ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
7852  (NEW_GOAL `&2 <= dist (u0, w:real^3)`);
7853  (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
7854  (STRIP_TAC);
7855  (FIRST_ASSUM MATCH_MP_TAC);
7856  (ASM_REWRITE_TAC[]);
7857  (UNDISCH_TAC `u0:real^3 IN V` THEN REWRITE_TAC[IN]);
7858  (NEW_GOAL `dist (x', u0) >= dist (u0, w) - dist (x', w:real^3)`);
7859  (NORM_ARITH_TAC);
7860  (UP_ASM_TAC THEN UP_ASM_TAC THEN DEL_TAC THEN DEL_TAC THEN UP_ASM_TAC
7861    THEN REAL_ARITH_TAC);
7862  (ABBREV_TAC `M = mxi V [v0; v1; v2; v3]`);
7863  (ABBREV_TAC `R = omega_list_n V [v0; v1; v2; v3] 3`);
7864
7865  (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0:real^3,v1,M,R}) 
7866          <=  vol (conic_cap u0 u1 r d INTER aff_ge {v0, v1} {M, R})`);
7867  (MATCH_MP_TAC MEASURE_SUBSET);
7868  (REPEAT STRIP_TAC);
7869  (MATCH_MP_TAC MEASURABLE_INTER);
7870  (REWRITE_TAC[MEASURABLE_CONIC_CAP]);
7871  (MATCH_MP_TAC MEASURABLE_CONVEX_HULL);
7872  (MATCH_MP_TAC FINITE_IMP_BOUNDED);
7873  (REWRITE_TAC[Geomdetail.FINITE6]);
7874
7875  (REWRITE_TAC[conic_cap; NORMBALL_BALL]);
7876  (ONCE_REWRITE_TAC[SET_RULE `(a INTER b) INTER c = 
7877                               (a INTER b) INTER (a INTER c)`]);
7878  (MATCH_MP_TAC MEASURABLE_INTER);
7879  (REWRITE_TAC[MEASURABLE_BALL_AFF_GE]);
7880  (REWRITE_TAC[GSYM conic_cap; GSYM NORMBALL_BALL; MEASURABLE_CONIC_CAP]);
7881
7882  (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET C INTER B`));
7883  (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
7884
7885
7886
7887  (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0, v1, M, R}) > &0`);
7888  (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);
7889  (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);
7890  (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
7891  (ASM_REWRITE_TAC[]);
7892  (REPEAT STRIP_TAC);
7893  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7894
7895  (UNDISCH_TAC `~NULLSET x`);
7896  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
7897    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
7898  (LET_TAC);
7899  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7900  (EXISTS_TAC `aff_ge {v0, v1} {M, R:real^3}`);
7901  (REWRITE_TAC[SET_RULE `a INTER B INTER c SUBSET c`]);
7902  (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7903  (EXISTS_TAC `affine hull ({v0, v1} UNION {M, R:real^3})`);
7904  (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL; SET_RULE 
7905   `{a, b} UNION {c, d} = {a,b,c,d}`]);
7906  (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7907  (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7908  (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);
7909  (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);
7910  (ASM_REWRITE_TAC[]);
7911  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7912
7913  (NEW_GOAL `F`);
7914  (UNDISCH_TAC `~NULLSET x`);
7915  (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
7916    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
7917  (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7918  (UP_ASM_TAC THEN MESON_TAC[]);
7919
7920  (NEW_GOAL `vol (x INTER D) = &0`);
7921  (MATCH_MP_TAC MEASURE_EQ_0);
7922  (ASM_REWRITE_TAC[]);
7923  (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7924  (UP_ASM_TAC THEN MESON_TAC[]);
7925
7926 (* ========================================== *)
7927
7928  (REWRITE_WITH `sum t (\t. vol (t INTER D)) = 
7929                  sum t (\t. vol D * dihX V t (u0,u1) / (&2 * pi))`);
7930  (MATCH_MP_TAC SUM_EQ);
7931  (EXPAND_TAC "t" THEN REWRITE_TAC[IN_ELIM_THM; IN] THEN REPEAT STRIP_TAC);
7932  (ASM_SIMP_TAC[]);
7933  (REWRITE_TAC[REAL_ARITH `a * b / c = (a / c) * b`]);
7934  (REWRITE_TAC[SUM_LMUL]);
7935  (ABBREV_TAC `R = sum t (\t. dihX V t (u0,u1))`);
7936  (REWRITE_TAC[REAL_ARITH `a / b * c = (a * c) / b`]);
7937  (REWRITE_WITH `(vol D * R) / (&2 * pi) = vol D <=> 
7938                  (vol D * R) = vol D * (&2 * pi)`);
7939  (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
7940  (MATCH_MP_TAC REAL_LT_MUL);
7941  (REWRITE_TAC[PI_POS]);
7942  (REAL_ARITH_TAC);
7943  (REWRITE_TAC[REAL_ARITH `a * b = a * c <=> a * (b - c) = &0`]);
7944  (REWRITE_TAC[REAL_ENTIRE]);
7945  (STRIP_TAC);
7946  (NEW_GOAL `F`);
7947  (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
7948
7949  (NEW_GOAL `&0 < d`);
7950  (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7951  (ASM_SIMP_TAC[VOLUME_CONIC_CAP]);
7952  (COND_CASES_TAC);
7953  (REWRITE_TAC[]);
7954  (UNDISCH_TAC `d < &1` THEN UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC 
7955    THEN REAL_ARITH_TAC);
7956  (REWRITE_TAC[REAL_ARITH `&2 / &3 * a = &0 <=> a = &0`]);
7957  (REWRITE_TAC[REAL_ENTIRE]);
7958  (NEW_GOAL `~(pi = &0)`);
7959  (MP_TAC PI_POS THEN REAL_ARITH_TAC);
7960  (NEW_GOAL `~(&1 - d = &0)`);
7961  (UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);
7962  (NEW_GOAL `~(r pow 3 = &0)`);
7963  (MATCH_MP_TAC REAL_POW_NZ);
7964  (UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);
7965  (ASM_REWRITE_TAC[]);
7966  (UP_ASM_TAC THEN MESON_TAC[]);
7967  (UP_ASM_TAC THEN REAL_ARITH_TAC)]);;
7968
7969
7970