Update from HH
[Flyspeck/.git] / legacy / oldpacking / packing / development / REUHADY.hl
1 open Sphere;;
2 open Euler_main_theorem;;
3 open Pack_defs;;
4 open Pack_concl;; 
5 open Pack1;;
6 open Pack2;;
7 open Packing3;;
8 open Rogers;; 
9 open Vukhacky_tactics;;
10 open Marchal_cells;;
11 open Emnwuus;;
12 open Marchal_cells_2;;
13 open Marchal_cells_2_new;;
14 open Urrphbz1;;
15 open Lepjbdj;;
16 open Hdtfnfz;;
17 open Rvfxzbu;;
18 open Sltstlo;;
19 open Urrphbz2;;
20 open Urrphbz3;;
21 open Ynhyjit;;
22 open Njiutiu;;
23 open Tezffsk;;
24 open Qzksykg;;
25 open Ddzuphj;;
26 open Ajripqn;;
27 open Qzyzmjc;;
28 open Upfzbzm_support_lemmas;;
29 open Marchal_cells_3;;
30 open Grutoti;;
31 open Sum_beta_bump;;
32 open Kizhltl;;
33 open Sum_gammax_lmfun_estimate;; 
34 open Upfzbzm;;
35 open Rdwkarc;;
36 open Ineq;;
37 open Merge_ineq;;
38 open Hales_tactic;;
39
40
41 let wedge_ge = new_definition `wedge_ge  v0 v1 w1 w2 = { z |
42 &0 <= azim v0 v1 w1 z /\ azim v0 v1 w1 z <= azim v0 v1 w1 w2 }`;;
43
44 let BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST = prove_by_refinement (
45  `!V ul. packing V /\ barV V 2 ul ==> 
46            ~collinear (set_of_list ul)`,
47 [(REWRITE_TAC[COLLINEAR_AFF_DIM]);
48  (REPEAT STRIP_TAC);
49  (NEW_GOAL `aff_dim (set_of_list (ul:(real^3)list)) = &2`);
50  (MATCH_MP_TAC MHFTTZN1);
51  (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
52  (ASM_ARITH_TAC)]);;
53
54 (* ======================================================================== *)
55 (*     Some axioms    *)
56
57 let KY_CHEAT_TAC = MP_TAC (mk_fthm([],`F`)) THEN MESON_TAC[];;
58
59 let INTER_2_WEDGE_GE_SUBSET_UNION_2_AFF_GE_LEMMA = 
60  prove (`!u0 u1 w1 w2. ~(azim u0 u1 v1 v2 = &0) ==>
61                         wedge_ge u0 u1 v1 v2 INTER wedge_ge u0 u1 v2 v1 SUBSET
62                         aff_ge {u0,u1} {v1} UNION aff_ge {u0,u1} {v2:real^3}`,
63  KY_CHEAT_TAC);;
64
65 let MEASURABLE_CONIC_CAP_WEDGE_GE = prove
66   (`!v0 v1 w1 w2 r a.
67            measurable (conic_cap v0 v1 r a INTER wedge_ge v0 v1 w1 w2)`, 
68   KY_CHEAT_TAC);;
69
70 let VOLUME_CONIC_CAP_WEDGE_GE_VS_CONIC_CAP = prove (
71   `!v0 v1 w1 w2 r a.
72            &0 < a /\ a < &1 /\
73            &0 < r /\ r <= &1 /\
74            ~collinear {v0, v1, w1} /\ 
75            ~collinear {v0, v1, w2}
76            ==> vol (conic_cap v0 v1 r a INTER wedge_ge v0 v1 w1 w2) = 
77                vol (conic_cap v0 v1 r a) * (azim v0 v1 w w2) / (&2 * pi)`,
78     KY_CHEAT_TAC);;
79
80 let BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST = prove 
81   (`!V ul. packing V /\ saturated V /\ barV V 2 ul ==> 
82            ~collinear (set_of_list ul)`,
83    KY_CHEAT_TAC);;
84
85 (* ======================================================================== *)
86
87 let REUHADY_concl1 = 
88   `!V u0 u1 vl1 vl2 v1 v2 e.
89        saturated V /\
90        packing V /\
91        u0 IN V /\
92        u1 IN V /\
93        ~(u0 = u1) /\
94        hl [u0; u1] < sqrt (&2) /\
95        e = {u0, u1} /\
96        ~(azim u0 u1 n1 n2 = &0) /\
97        ~(vl1 = vl2) /\
98        hl vl1 < sqrt2 /\
99        hl vl2 < sqrt2 /\
100        vl1 IN barV V 2 /\
101        vl2 IN barV V 2 /\
102        set_of_list (truncate_simplex 1 vl1) = e /\
103        set_of_list (truncate_simplex 1 vl2) = e /\
104        n1 = EL 2 vl1 /\
105        n2 = EL 2 vl2 /\
106        (!X. X IN mcell_set V /\ e IN edgeX V X
107             ==> X SUBSET wedge_ge u0 u1 n1 n2 \/
108                 X SUBSET wedge_ge u0 u1 n2 n1)
109        ==> sum
110           {X | mcell_set V X /\ e IN edgeX V X /\ X SUBSET wedge_ge u0 u1 n1 n2}
111            (\t. dihX V t (u0,u1)) = 
112            azim u0 u1 n1 n2`;;
113
114
115 g REUHADY_concl1;;
116 e (REPEAT STRIP_TAC);;
117 e (NEW_GOAL `barV V 1 [u0;u1:real^3]`);;
118 e (MATCH_MP_TAC HL_LE_SQRT2_IMP_BARV_1);;
119 e (ASM_REWRITE_TAC[]);;
120 e (NEW_GOAL 
121   `{k | k IN 1..3 /\
122         voronoi_list V [u0;u1:real^3] =
123         UNIONS
124           {convex hull
125           ({omega_list_n V vl i | i IN 1..k - 1} UNION
126             voronoi_list V vl) | vl | barV V k vl /\
127                                       truncate_simplex 1 vl = [u0;u1]}} =
128              1..3`);;
129 e (MATCH_MP_TAC Rogers.GLTVHUM_lemma1);;
130 e (ASM_REWRITE_TAC[] THEN ARITH_TAC);;
131 e (NEW_GOAL 
132  `3 IN {k | k IN 1..3 /\
133           voronoi_list V [u0; u1] =
134           UNIONS
135           {convex hull
136          ({omega_list_n V vl i | i IN 1..k - 1} UNION voronoi_list V vl) | vl | 
137           barV V k vl /\
138           truncate_simplex 1 vl = [u0; u1]}}`);;
139 e (ASM_REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC);;
140 e (UP_ASM_TAC THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);;
141 e (REWRITE_WITH 
142    `UNIONS
143    {convex hull ({omega_list_n V vl i | i IN 1..3 - 1} UNION voronoi_list V vl)      | vl | barV V 3 vl /\
144            truncate_simplex 1 vl = [u0; u1]} = 
145    UNIONS {convex hull {omega_list_n V vl 1, omega_list_n V vl 2, 
146            omega_list_n V vl 3} | vl | barV V 3 vl /\
147                                        truncate_simplex 1 vl = [u0; u1]}`);;
148 e (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);;
149 e (REWRITE_TAC[IN_UNIONS] THEN ONCE_REWRITE_TAC[IN] THEN 
150    REWRITE_TAC[IN_ELIM_THM]);;
151 e (REPEAT STRIP_TAC);;
152 e (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);;
153 e (EXISTS_TAC `vl:(real^3)list`);;
154 e (ASM_REWRITE_TAC[]);;
155 e (NEW_GOAL `?a. voronoi_list V vl = {a} /\
156                     a = circumcenter (set_of_list vl) /\
157                     hl vl = dist (HD vl,a)`);;
158 e (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);;
159 e (ASM_REWRITE_TAC[]);;
160 e (UP_ASM_TAC THEN STRIP_TAC);;
161
162 e (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);;
163 e (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);;
164 e (REWRITE_TAC[OMEGA_LIST]);;
165 e (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
166                  CARD (set_of_list vl) = 3 + 1`);;
167 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
168 e (EXISTS_TAC `V:real^3->bool`);;
169 e (ASM_REWRITE_TAC[]);;
170 e (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);;
171 e (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);;
172 e (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);;
173 e (NEW_GOAL `omega_list_n V vl 3 = a`);;
174 e (ASM_SET_TAC[]);;
175 e (ASM_REWRITE_TAC[]);;
176 e (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG; 
177    ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);;
178 e (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} = 
179                  {omega_list_n V vl 1,omega_list_n V vl 2}`);;
180 e (SET_TAC[]);;
181 e (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
182    {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2,      circumcenter (set_of_list vl)}`);;
183 e (SET_TAC[]);;
184
185 e (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);;
186 e (EXISTS_TAC `vl:(real^3)list`);;
187 e (ASM_REWRITE_TAC[]);;
188 e (NEW_GOAL `?a. voronoi_list V vl = {a} /\
189                     a = circumcenter (set_of_list vl) /\
190                     hl vl = dist (HD vl,a)`);;
191 e (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);;
192 e (ASM_REWRITE_TAC[]);;
193 e (UP_ASM_TAC THEN STRIP_TAC);;
194
195
196 e (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);;
197 e (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);;
198 e (REWRITE_TAC[OMEGA_LIST]);;
199 e (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
200                  CARD (set_of_list vl) = 3 + 1`);;
201 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
202 e (EXISTS_TAC `V:real^3->bool`);;
203 e (ASM_REWRITE_TAC[]);;
204 e (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);;
205 e (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);;
206 e (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);;
207 e (NEW_GOAL `omega_list_n V vl 3 = a`);;
208 e (ASM_SET_TAC[]);;
209 e (ASM_REWRITE_TAC[]);;
210 e (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG; 
211    ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);;
212 e (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} = 
213                  {omega_list_n V vl 1,omega_list_n V vl 2}`);;
214 e (SET_TAC[]);;
215 e (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
216    {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2,
217     circumcenter (set_of_list vl)}`);;
218 e (SET_TAC[]);;
219 e (STRIP_TAC);;
220
221 (* ======================================================================= *)
222
223 e (ABBREV_TAC `p = circumcenter {u0, u1:real^3}`);;
224 e (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0;u1]) = &3`);;
225 e (REWRITE_TAC[AFF_DIM_INSERT]);;
226 e (COND_CASES_TAC);;
227 e (NEW_GOAL `F`);;
228
229 e (NEW_GOAL `affine hull voronoi_list V [u0; u1] SUBSET 
230    affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);;
231 e (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);;
232 e (REWRITE_TAC[VORONOI_LIST; set_of_list; Packing3.VORONOI_SET_2]);;
233 e (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);;
234 e (ASM_SIMP_TAC[Pack2.INTER_VORONOI_SUBSET_BISECTOR]);;
235 e (NEW_GOAL 
236   `affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2} = 
237    {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);;
238 e (REWRITE_TAC[AFFINE_HULL_EQ]);;
239 e (REWRITE_TAC[AFFINE_HYPERPLANE]);;
240 e (NEW_GOAL 
241  `~(u0 IN {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2})`);;
242 e (REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);;
243 e (ONCE_REWRITE_TAC [REAL_ARITH `a = b <=> a - b = &0`]);;
244 e (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 - (u0 dot u0 - u1 dot u1) = 
245                 (u0 - u1) dot (u0 - u1)`]);;
246 e (REWRITE_TAC[DOT_EQ_0] THEN ASM_NORM_ARITH_TAC);;
247 e (ASM_SET_TAC[]);;
248 e (ASM_MESON_TAC[]);;
249 e (REWRITE_TAC[ARITH_RULE `a + &1 = b:int <=> a = b - &1`]);;
250 e (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);;
251 e (ASM_REWRITE_TAC[]);;
252
253 e (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0; u1]) = &(dimindex (:3))`);;
254 e (ASM_REWRITE_TAC[DIMINDEX_3]);;
255 e (UP_ASM_TAC THEN REWRITE_TAC[AFF_DIM_EQ_FULL]);;
256 e (STRIP_TAC);;
257
258 e (ABBREV_TAC `S = voronoi_list V [u0;u1]`);;
259 e (NEW_GOAL `!x. x IN S ==> (x - u0) dot (u1 - u0) = 
260                             dist (p, u0) * dist (u1, u0:real^3)`);;
261 e (REPEAT STRIP_TAC);;
262 e (NEW_GOAL `p = inv (&2) % (u0 + (u1:real^3))`);;
263 e (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);;
264 e (REWRITE_TAC[dist]);;
265 e (REWRITE_WITH `u1 - u0 = &2 % (p - u0:real^3)`);;
266 e (ASM_REWRITE_TAC[]);;
267 e (VECTOR_ARITH_TAC);;
268 e (REWRITE_TAC[NORM_MUL; REAL_ARITH `abs (&2) = &2`;
269    REAL_ARITH `a * b * a = b * a pow 2`; NORM_POW_2; DOT_RMUL]);;
270 e (REWRITE_WITH `(x - u0) dot (p - u0:real^3) = 
271                  (p - u0) dot (p - u0) - (x - p) dot (u0 - p)`);;
272 e (VECTOR_ARITH_TAC);;
273 e (REWRITE_WITH `(x - p) dot (u0 - p:real^3) = &0`);;
274 e (EXPAND_TAC "p");;
275 e (REWRITE_WITH `{u0, u1} = set_of_list [u0; u1:real^3]`);;
276 e (REWRITE_TAC[set_of_list]);;
277 e (MATCH_MP_TAC Rogers.MHFTTZN4);;
278 e (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);;
279 e (REPEAT STRIP_TAC);;
280 e (ASM_REWRITE_TAC[]);;
281 e (ASM_REWRITE_TAC[]);;
282 e (NEW_GOAL `S SUBSET affine hull voronoi_list V [u0; u1]`);;
283 e (EXPAND_TAC "S");;
284 e (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
285 e (ASM_SET_TAC[]);;
286 e (REWRITE_TAC[set_of_list]);;
287 e (NEW_GOAL `{u0,u1} SUBSET affine hull {u0,u1:real^3}`);;
288 e (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
289 e (ASM_SET_TAC[]);;
290 e (REAL_ARITH_TAC);;
291
292 (* ========================================================================= *)
293
294 e (ABBREV_TAC `S1 = {x:real^3 | &2 % (u0 - u1) dot x = 
295                                 norm u0 pow 2 - norm u1 pow 2}`);;
296 e (ABBREV_TAC `S2:real^3->bool = (S1 DIFF (relative_interior S))`);;
297 e (NEW_GOAL `closed_in (subtopology euclidean (S1:real^3->bool)) S2`);;
298 e (EXPAND_TAC "S2");;
299 e (MATCH_MP_TAC CLOSED_IN_DIFF);;
300 e (STRIP_TAC);;
301 e (NEW_GOAL `closed (S1:real^3->bool)`);;
302 e (EXPAND_TAC "S1" THEN REWRITE_TAC[CLOSED_HYPERPLANE]);;
303 e (MATCH_MP_TAC CLOSED_SUBSET);;
304 e (ASM_REWRITE_TAC[] THEN SET_TAC[]);;
305
306 e (REWRITE_WITH `S1 = affine hull (S:real^3->bool)`);;
307 e (EXPAND_TAC "S");;
308 e (NEW_GOAL `affine hull S1 = S1:real^3->bool`);;
309 e (REWRITE_TAC[AFFINE_HULL_EQ]);;
310 e (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);;
311 e (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);;
312 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
313 e (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);;
314 e (STRIP_TAC);;
315 e (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
316    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);;
317 e (DEL_TAC THEN EXPAND_TAC "S1");;
318 e (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);;
319 e (ASM_REWRITE_TAC[]);;
320 e (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);;
321 e (DEL_TAC THEN EXPAND_TAC "S1");;
322 e (MATCH_MP_TAC AFF_DIM_HYPERPLANE);;
323 e (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);;
324 e (ASM_REWRITE_TAC[]);;
325 e (REWRITE_TAC[DIMINDEX_3]);;
326 e (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);;
327 e (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);;
328 e (ASM_REWRITE_TAC[]);;
329 e (ARITH_TAC);;
330
331 e (REWRITE_TAC[OPEN_IN_RELATIVE_INTERIOR]);;
332
333 e (NEW_GOAL `closed (S2:real^3->bool)`);;
334 e (MATCH_MP_TAC CLOSED_IN_CLOSED_TRANS);;
335 e (EXISTS_TAC `S1:real^3->bool`);;
336 e (ASM_REWRITE_TAC[]);;
337 e (EXPAND_TAC "S1");;
338 e (REWRITE_TAC[CLOSED_HYPERPLANE]);;
339
340
341 e (NEW_GOAL `~(S2:real^3->bool = {})`);;
342 e (EXPAND_TAC "S2");;
343 e (REWRITE_TAC [SET_RULE `A DIFF B = {} <=> A SUBSET B`]);;
344 e (REPEAT STRIP_TAC);;
345 e (NEW_GOAL `S1 SUBSET S:real^3->bool`);;
346 e (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);;
347 e (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);;
348 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
349
350 e (NEW_GOAL `S1 = S:real^3->bool`);;
351 e (NEW_GOAL `S SUBSET S1:real^3->bool`);;
352 e (EXPAND_TAC "S");;
353 e (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
354    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);;
355 e (EXPAND_TAC "S1");;
356 e (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);;
357 e (ASM_REWRITE_TAC[]);;
358 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
359
360 e (NEW_GOAL `bounded (S1:real^3->bool)`);;
361 e (REWRITE_TAC[ASSUME `S1 = S:real^3->bool`]);;
362 e (DEL_TAC THEN EXPAND_TAC "S");;
363 e (MATCH_MP_TAC Packing3.BOUNDED_VORONOI_LIST);;
364 e (EXISTS_TAC `1`);;
365 e (ASM_REWRITE_TAC[]);;
366  
367 e (NEW_GOAL `~bounded (S1:real^3->bool)`);;
368 e (EXPAND_TAC "S1");;
369 e (MATCH_MP_TAC UNBOUNDED_HYPERPLANE);;
370 e (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) = vec 0 <=> u0 = u1`]);;
371 e (ASM_REWRITE_TAC[]);;
372 e (ASM_MESON_TAC[]);;
373
374 e (NEW_GOAL `?z:real^3. z IN S2 /\ 
375                 (!w. w IN S2 ==> dist (u0,z) <= dist (u0,w))`);;
376 e (MATCH_MP_TAC DISTANCE_ATTAINS_INF);;
377 e (ASM_REWRITE_TAC[]);;
378 e (UP_ASM_TAC THEN STRIP_TAC);;
379
380 (* ======================================================================== *)
381
382 e (ABBREV_TAC `a = dist (p, u0:real^3) / dist (z, u0)`);;
383 e (NEW_GOAL `&0 < a /\ a < &1`);;
384 e (EXPAND_TAC "a");;
385 e (NEW_GOAL `~(u0:real^3 IN S1)`);;
386 e (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);;
387 e (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);;
388 e (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 = 
389   (u0 - u1) dot (u0 - u1)`]);;
390 e (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);;
391 e (ASM_REWRITE_TAC[]);;
392 e (NEW_GOAL `&0 < dist (p,u0:real^3)`);;
393 e (MATCH_MP_TAC DIST_POS_LT);;
394 e (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);;
395 e (REWRITE_TAC[VECTOR_ARITH `inv (&2) % (u0 + u1) = u0 <=> u0 = u1`]);;
396 e (ASM_REWRITE_TAC[]);;
397 e (NEW_GOAL `&0 < dist (z,u0:real^3)`);;
398 e (MATCH_MP_TAC DIST_POS_LT);;
399 e (STRIP_TAC);;
400 e (NEW_GOAL `z:real^3 IN S1`);;
401 e (ASM_SET_TAC[]);;
402 e (ASM_MESON_TAC[]);;
403 e (STRIP_TAC);;
404 e (MATCH_MP_TAC REAL_LT_DIV);;
405 e (ASM_REWRITE_TAC[]);;
406 e (REWRITE_WITH 
407   `dist (p,u0) / dist (z,u0:real^3) < &1 <=> dist (p,u0) < &1 * dist (z,u0)`);;
408 e (ASM_SIMP_TAC[REAL_LT_LDIV_EQ]);;
409 e (REWRITE_TAC[REAL_MUL_LID]);;
410 e (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LT);;
411 e (REPEAT STRIP_TAC);;
412 e (ASM_REAL_ARITH_TAC);;
413 e (ASM_REAL_ARITH_TAC);;
414 e (REWRITE_TAC[dist]);;
415 e (REWRITE_WITH `norm (z - u0:real^3) pow 2 = 
416                  norm (p - u0) pow 2 + norm (z - p) pow 2`);;
417 e (MATCH_MP_TAC PYTHAGORAS);;
418 e (REWRITE_TAC[orthogonal]);;
419 e (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);;
420 e (ASM_REWRITE_TAC[set_of_list]);;
421 e (ONCE_REWRITE_TAC[DOT_SYM]);;
422 e (MATCH_MP_TAC Rogers.MHFTTZN4);;
423 e (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);;
424 e (REPEAT STRIP_TAC);;
425 e (ASM_REWRITE_TAC[]);;
426 e (ASM_REWRITE_TAC[]);;
427
428 e (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);;
429 e (REWRITE_WITH `affine hull (S:real^3->bool) = S1`);;
430 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
431 e (EXPAND_TAC "S");;
432 e (NEW_GOAL `affine hull S1 = S1:real^3->bool`);;
433 e (REWRITE_TAC[AFFINE_HULL_EQ]);;
434 e (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);;
435 e (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);;
436 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
437 e (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);;
438 e (STRIP_TAC);;
439 e (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
440    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);;
441 e (DEL_TAC THEN EXPAND_TAC "S1");;
442 e (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);;
443 e (ASM_REWRITE_TAC[]);;
444 e (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);;
445 e (DEL_TAC THEN EXPAND_TAC "S1");;
446 e (MATCH_MP_TAC AFF_DIM_HYPERPLANE);;
447 e (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);;
448 e (ASM_REWRITE_TAC[]);;
449 e (REWRITE_TAC[DIMINDEX_3]);;
450 e (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);;
451 e (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);;
452 e (ASM_REWRITE_TAC[]);;
453 e (ARITH_TAC);;
454 e (ASM_SET_TAC[]);;
455 e (REWRITE_TAC[set_of_list]);;
456 e (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);;
457 e (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
458 e (ASM_SET_TAC[]);;
459 e (REWRITE_TAC[REAL_ARITH `a < a + b <=> &0 < b`; NORM_POW_2; DOT_POS_LT]);;
460 e (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`]);;
461 e (STRIP_TAC);;
462 e (NEW_GOAL `~(z:real^3 IN S2)`);;
463 e (REWRITE_TAC[ASSUME `z = p:real^3`]);;
464 e (EXPAND_TAC "S2");;
465 e (NEW_GOAL `p:real^3 IN relative_interior S`);;
466
467
468
469 e (ABBREV_TAC `B = V INTER ball (p:real^3, &8)`);;
470 e (ABBREV_TAC `A = B DIFF {u0, u1:real^3}`);;
471 e (NEW_GOAL `FINITE (A:real^3->bool)`);;
472 e (EXPAND_TAC "A");;
473 e (MATCH_MP_TAC FINITE_DIFF);;
474 e (EXPAND_TAC "B");;
475 e (MATCH_MP_TAC Packing3.KIUMVTC THEN ASM_REWRITE_TAC[]);;
476 e (NEW_GOAL `?y. dist (p,y:real^3) = &4`);;
477 e (MATCH_MP_TAC VECTOR_CHOOSE_DIST);;
478 e (REAL_ARITH_TAC);;
479 e (UP_ASM_TAC THEN STRIP_TAC);;
480 e (UNDISCH_TAC `saturated (V:real^3->bool)`);;
481 e (REWRITE_TAC[saturated] THEN STRIP_TAC);;
482 e (NEW_GOAL `?z. z IN V /\ dist (y:real^3, z) < &2`);;
483 e (ASM_REWRITE_TAC[]);;
484 e (UP_ASM_TAC THEN STRIP_TAC);;
485
486 e (NEW_GOAL `z':real^3 IN A`);;
487 e (EXPAND_TAC "A" THEN EXPAND_TAC "B");;
488 e (REWRITE_TAC[IN_DIFF; IN_INTER; IN_BALL]);;
489 e (REPEAT STRIP_TAC);;
490 e (ASM_REWRITE_TAC[]);;
491
492 e (NEW_GOAL `dist (p,z') <= dist (p, y) + dist (y, z':real^3)`);;
493 e (REWRITE_TAC[DIST_TRIANGLE]);;
494 e (ASM_REAL_ARITH_TAC);;
495 e (NEW_GOAL `dist (p, y) <= dist (p, z') + dist (z', y:real^3)`);;
496 e (REWRITE_TAC[DIST_TRIANGLE]);;
497 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);;
498 e (STRIP_TAC);;
499 e (NEW_GOAL `&2 < dist (z', p:real^3)`);;
500 e (ASM_REAL_ARITH_TAC);;
501 e (UP_ASM_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);;
502 e (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);;
503 e (ASM_MESON_TAC[set_of_list]);;
504 e (NEW_GOAL `(!w. w IN set_of_list [u0;u1:real^3]
505                ==> dist (circumcenter (set_of_list [u0;u1]),w) = hl [u0;u1])`);;
506 e (MATCH_MP_TAC Rogers.HL_PROPERTIES);;
507 e (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);;
508 e (ASM_REWRITE_TAC[]);;
509
510 e (REWRITE_WITH `dist (circumcenter (set_of_list [u0; u1:real^3]),z') = 
511    hl [u0; u1]`);;
512 e (FIRST_ASSUM MATCH_MP_TAC);;
513 e (ASM_REWRITE_TAC[set_of_list]);;
514 e (NEW_GOAL `sqrt (&2) <= &2`);;
515 e (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);;
516 e (SIMP_TAC[REAL_ARITH `&0 <= &2`; SQRT_POS_LE; SQRT_POW_2]);;
517 e (REAL_ARITH_TAC);;
518 e (ASM_REAL_ARITH_TAC);;
519
520 e (NEW_GOAL `?a:real^3. a IN A /\ (!x. x IN A ==> dist (p,a) <= dist (p,x))`);;
521 e (MATCH_MP_TAC Packing3.REAL_FINITE_ARGMIN);;
522 e (ASM_REWRITE_TAC[]);;
523 e (UP_ASM_TAC THEN SET_TAC[]);;
524 e (UP_ASM_TAC THEN STRIP_TAC);;
525
526 e (ABBREV_TAC `d = inv (&4) * (dist (p, a') - dist (p, u0:real^3))`);;
527 e (NEW_GOAL `&0 < d`);;
528 e (EXPAND_TAC "d");;
529 e (MATCH_MP_TAC REAL_LT_MUL);;
530 e (STRIP_TAC);;
531 e (REAL_ARITH_TAC);;
532 e (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> a > b`]);;
533 e (ONCE_REWRITE_TAC[DIST_SYM]);;
534 e (NEW_GOAL `!u v. u IN {u0,u1} /\ v IN V DIFF {u0,u1} ==> 
535                    dist (v,p) > dist (u,p:real^3)`);;
536 e (MATCH_MP_TAC Rogers.XYOFCGX);;
537 e (REPEAT STRIP_TAC);;
538 e (ASM_REWRITE_TAC[]);;
539 e (ASM_SET_TAC[]);;
540 e (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_INDEPENDENT_2]);;
541 e (ASM_MESON_TAC[set_of_list]);;
542 e (REWRITE_WITH `radV {u0, u1:real^3} = hl [u0;u1]`);;
543 e (REWRITE_TAC[HL;set_of_list]);;
544 e (ASM_REWRITE_TAC[]);;
545 e (FIRST_ASSUM MATCH_MP_TAC);;
546 e (ASM_SET_TAC[]);;
547
548 e (REWRITE_TAC[relative_interior; IN; IN_ELIM_THM]);;
549 e (ABBREV_TAC `St = S INTER ball (p:real^3, d)`);;
550 e (EXISTS_TAC `St:real^3->bool`);;
551 e (REPEAT STRIP_TAC);;
552
553 e (REWRITE_TAC[open_in]);;
554 e (REPEAT STRIP_TAC);;
555 e (NEW_GOAL `S SUBSET affine hull (S:real^3->bool)`);;
556 e (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
557 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
558 e (EXISTS_TAC `d - dist (p:real^3, x)`);;
559 e (REPEAT STRIP_TAC);;
560 e (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);;
561 e (REWRITE_TAC[GSYM IN_BALL]);;
562 e (ASM_SET_TAC[]);;
563 e (EXPAND_TAC "St");;
564 e (REWRITE_TAC[IN_INTER]);;
565 e (STRIP_TAC);;
566
567 e (NEW_GOAL `dist (x',x:real^3) < d`);;
568 e (NEW_GOAL `&0 <= dist (p,x:real^3)`);;
569 e (REWRITE_TAC[DIST_POS_LE]);;
570 e (ASM_REAL_ARITH_TAC);;
571
572 e (NEW_GOAL `x' IN voronoi_closed V (u0:real^3)`);;
573 e (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);;
574 e (REPEAT STRIP_TAC);;
575
576 e (ASM_CASES_TAC `w IN {u0, u1:real^3}`);;
577 e (ASM_CASES_TAC `w = u0:real^3`);;
578 e (REWRITE_TAC[ASSUME `w = u0:real^3`]);;
579 e (REAL_ARITH_TAC);;
580 e (NEW_GOAL `w = u1:real^3`);;
581 e (ASM_SET_TAC[]);;
582 e (REWRITE_TAC[ASSUME `w = u1:real^3`]);;
583 e (MATCH_MP_TAC (REAL_ARITH `a = b ==> a <= b`));;
584
585 e (NEW_GOAL `x':real^3 IN S1`);;
586 e (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);;
587 e (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);;
588 e (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM 
589   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
590   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);;
591 e (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);;
592 e (ASM_REWRITE_TAC[]);;
593 e (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);;
594 e (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);;
595 e (REWRITE_TAC[AFFINE_HULL_EQ]);;
596 e (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);;
597 e (ASM_SET_TAC[]);;
598
599 e (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);;
600 e (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);;
601 e (REWRITE_TAC[
602    VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) = 
603                 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);;
604 e (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);;
605 e (STRIP_TAC);;
606 e (REWRITE_TAC[DIST_EQ]);;
607 e (ONCE_REWRITE_TAC[DIST_SYM]);;
608 e (ASM_REWRITE_TAC[]);;
609
610 e (NEW_GOAL `dist (x', u0:real^3) <= dist (x', x) + dist (x, u0)`);;
611 e (REWRITE_TAC[DIST_TRIANGLE]);;
612 e (NEW_GOAL `dist (x, u0:real^3) <= dist (x, p:real^3) + dist (p, u0)`);;
613 e (REWRITE_TAC[DIST_TRIANGLE]);;
614 e (NEW_GOAL `dist (x,p:real^3) < d`);;
615 e (NEW_GOAL `x IN ball (p:real^3, d)`);;
616 e (ASM_SET_TAC[]);;
617 e (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);;
618 e (REWRITE_TAC[DIST_SYM]);;
619 e (NEW_GOAL `dist (x',u0) < &2 * d + dist (p:real^3,u0)`);;
620 e (ASM_REAL_ARITH_TAC);;
621
622 e (NEW_GOAL `dist (p, w:real^3)- &2 * d <= dist (x',w)`);;
623 e (NEW_GOAL `dist (x, w:real^3) <= dist (x, x') + dist (x', w)`);;
624 e (REWRITE_TAC[DIST_TRIANGLE]);;
625 e (NEW_GOAL `dist (p, w:real^3) <= dist (p, x) + dist (x, w)`);;
626 e (REWRITE_TAC[DIST_TRIANGLE]);;
627 e (NEW_GOAL `dist (x, x':real^3) < d /\ dist (p, x:real^3) < d`);;
628 e (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);;
629 e (ASM_REAL_ARITH_TAC);;
630 e (NEW_GOAL `dist (p, u0) + &4 * d <= dist (p, w:real^3)`);;
631 e (EXPAND_TAC "d");;
632 e (REWRITE_TAC[REAL_ARITH `&4 * inv (&4) * a = a`]);;
633 e (REWRITE_TAC[REAL_ARITH `a + b - a = b`]);;
634
635 e (ASM_CASES_TAC `w:real^3 IN B`);;
636 e (FIRST_ASSUM MATCH_MP_TAC);;
637 e (ASM_SET_TAC[]);;
638 e (NEW_GOAL `~(dist (p,w:real^3) < &8)`);;
639 e (REWRITE_TAC[GSYM IN_BALL]);;
640 e (ASM_SET_TAC[]);;
641 e (NEW_GOAL `dist (p,a':real^3) < &8`);;
642 e (REWRITE_TAC[GSYM IN_BALL]);;
643 e (ASM_SET_TAC[]);;
644 e (ASM_REAL_ARITH_TAC);;
645 e (ASM_REAL_ARITH_TAC);;
646
647 e (NEW_GOAL `x' IN voronoi_closed V (u1:real^3)`);;
648 e (NEW_GOAL `x':real^3 IN S1`);;
649 e (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);;
650 e (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);;
651 e (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM 
652   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
653   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);;
654 e (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);;
655 e (ASM_REWRITE_TAC[]);;
656 e (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);;
657 e (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);;
658 e (REWRITE_TAC[AFFINE_HULL_EQ]);;
659 e (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);;
660 e (ASM_SET_TAC[]);;
661
662 e (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);;
663 e (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);;
664 e (REWRITE_TAC[
665    VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) = 
666                 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);;
667 e (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);;
668 e (STRIP_TAC);;
669 e (UNDISCH_TAC `x' IN voronoi_closed V (u0:real^3)`);;
670 e (REWRITE_TAC[voronoi_closed; IN_ELIM_THM; IN]);;
671 e (REPEAT STRIP_TAC);;
672 e (REWRITE_WITH `dist (x', u1)= dist (x', u0:real^3)`);;
673 e (ONCE_REWRITE_TAC[DIST_SYM]);;
674 e (ASM_REWRITE_TAC[DIST_EQ]);;
675 e (ASM_SIMP_TAC[]);;
676
677 e (REWRITE_TAC[GSYM 
678   (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET; 
679   set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);;
680 e (ASM_REWRITE_TAC[IN_INTER]);;
681
682 e (REWRITE_TAC[IN_BALL]);;
683 e (NEW_GOAL `dist (p,x':real^3) <= dist (p,x) + dist (x, x':real^3)`);;
684 e (REWRITE_TAC[DIST_TRIANGLE]);;
685 e (NEW_GOAL `dist (x,x':real^3) = dist (x',x)`);;
686 e (REWRITE_TAC[DIST_SYM]);;
687 e (ASM_REAL_ARITH_TAC);;
688 e (REWRITE_WITH `St p <=> p:real^3 IN St`);;
689 e (REWRITE_TAC[IN]);;
690 e (EXPAND_TAC "St" THEN REWRITE_TAC[IN_INTER; IN_BALL; DIST_REFL]);;
691 e (STRIP_TAC);;
692 e (REWRITE_WITH `p = omega_list V [u0; u1]`);;
693 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
694 e (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);;
695 e (ASM_MESON_TAC[set_of_list]);;
696 e (MATCH_MP_TAC Rogers.XNHPWAB1);;
697 e (EXISTS_TAC `1`);;
698 e (ASM_REWRITE_TAC[IN]);;
699 e (REWRITE_TAC[GSYM (ASSUME `voronoi_list V [u0;u1] = S`)]);;
700 e (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);;
701 e (EXISTS_TAC `1` THEN ASM_REWRITE_TAC[]);;
702 e (ASM_REWRITE_TAC[]);;
703 e (UP_ASM_TAC THEN SET_TAC[]);;
704 e (UP_ASM_TAC THEN SET_TAC[]);;
705 e (ASM_MESON_TAC[]);;
706
707 (* ======================================================================== *)
708
709 e (NEW_GOAL `?b. &0 < b /\ b < &1 /\ 
710                   rcone_gt u0 u1 b SUBSET aff_ge_alt {u0:real^3} S`);;
711
712 e (EXISTS_TAC `a:real`);;
713 e (REPEAT STRIP_TAC);;
714 e (ASM_REWRITE_TAC[]);;
715 e (ASM_REWRITE_TAC[]);;
716 e (REWRITE_TAC[SET_RULE `A SUBSET B <=> (!x. ~(x IN B) ==> ~(x IN A))`]);;
717 e (REPEAT STRIP_TAC);;
718 e (NEW_GOAL `x:real^3 IN affine hull (u0 INSERT S)`);;
719 e (ASM_SET_TAC[]);;
720 e (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);;
721 e (REPEAT STRIP_TAC);;
722
723 e (ABBREV_TAC `h = sum (s DELETE u0:real^3) u`);;
724 e (NEW_GOAL `(x - u0) dot (u1 - u0:real^3) = 
725               h * dist (p, u0) * dist (u1, u0:real^3)`);;
726 e (EXPAND_TAC "x");;
727 e (NEW_GOAL `u0 = vsum s (\v:real^3. (u:real^3->real) v % (u0:real^3))`);;
728 e (ASM_SIMP_TAC[VSUM_RMUL]);;
729 e (VECTOR_ARITH_TAC);;
730 e (REWRITE_WITH `vsum (s:real^3->bool) (\v. u v % v) - u0:real^3 = 
731                  vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0)`);;
732 e (ASM_REWRITE_TAC[]);;
733 e (UP_ASM_TAC THEN MESON_TAC[]);;
734 e (REWRITE_WITH `vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0:real^3) = 
735                  vsum s (\x. (\v. u v % v) x - (\v. u v % u0) x)`);;
736 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
737 e (MATCH_MP_TAC VSUM_SUB);;
738 e (ASM_REWRITE_TAC[]);;
739 e (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`]);;
740 e (REWRITE_WITH `vsum s (\x:real^3. u x % (x - u0)) dot (u1 - u0) = 
741                  sum s (\x. (\x. u x % (x - u0)) x dot (u1 - u0:real^3))`);;
742 e (ASM_SIMP_TAC[DOT_LSUM]);;
743 e (REWRITE_TAC[DOT_LMUL]);;
744 e (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) = 
745    sum (s DELETE u0) (\x. u x * (dist (p,u0) * dist (u1,u0)))`);;
746 e (ASM_CASES_TAC `u0:real^3 IN s`);;
747 e (NEW_GOAL `s = u0 INSERT (s DELETE u0:real^3)`);;
748 e (ASM_SET_TAC[]);;
749 e (NEW_GOAL `FINITE (s DELETE u0:real^3)`);;
750 e (MATCH_MP_TAC FINITE_SUBSET);;
751 e (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);;
752
753 e (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) = 
754    sum (u0 INSERT (s DELETE u0))  (\x. u x * ((x - u0) dot (u1 - u0)))`);;
755 e (ASM_MESON_TAC[]);;
756 e (ABBREV_TAC `f = (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3)))`);;
757 e (REWRITE_WITH `sum (u0:real^3 INSERT (s DELETE u0)) f = 
758          (if u0 IN (s DELETE u0) then sum (s DELETE u0) f 
759           else f u0 + sum (s DELETE u0) f)`);;
760 e (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);;
761 e (ASM_REWRITE_TAC[]);;
762 e (COND_CASES_TAC);;
763 e (NEW_GOAL `F`);;
764 e (ASM_SET_TAC[]);;
765 e (ASM_MESON_TAC[]);;
766 e (REWRITE_WITH `f (u0:real^3) = &0`);;
767 e (EXPAND_TAC "f");;
768 e (REWRITE_TAC[VECTOR_ARITH `(u0 - u0) dot (u1 - u0) = &0`]);;
769 e (REAL_ARITH_TAC);;
770 e (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);;
771 e (MATCH_MP_TAC SUM_EQ);;
772 e (EXPAND_TAC "f");;
773 e (REPEAT STRIP_TAC);;
774 e (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);;
775 e (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);;
776 e (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);;
777 e (FIRST_ASSUM MATCH_MP_TAC);;
778 e (ASM_SET_TAC[]);;
779 e (ASM_REWRITE_TAC[]);;
780 e (REAL_ARITH_TAC);;
781 e (REWRITE_WITH `s DELETE u0:real^3 = s`);;
782 e (ASM_SET_TAC[]);;
783 e (MATCH_MP_TAC SUM_EQ);;
784 e (REPEAT STRIP_TAC);;
785 e (REWRITE_TAC[]);;
786 e (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);;
787 e (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);;
788 e (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);;
789 e (FIRST_ASSUM MATCH_MP_TAC);;
790 e (ASM_SET_TAC[]);;
791 e (ASM_REWRITE_TAC[]);;
792 e (REAL_ARITH_TAC);;
793 e (NEW_GOAL `FINITE (s DELETE u0:real^3)`);;
794 e (MATCH_MP_TAC FINITE_SUBSET);;
795 e (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);;
796 e (ASM_SIMP_TAC[SUM_RMUL]);;
797
798 e (ASM_CASES_TAC `h <= &0`);;
799 e (NEW_GOAL `~(x IN rcone_gt u0 (u1:real^3) a)`);;
800 e (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);;
801 e (ASM_REWRITE_TAC[]);;
802 e (MATCH_MP_TAC (REAL_ARITH `&0 <= x /\ y <= &0 ==> ~(y > x)`));;
803 e (STRIP_TAC);;
804 e (MATCH_MP_TAC REAL_LE_MUL);;
805 e (REWRITE_TAC[DIST_POS_LE]);;
806 e (MATCH_MP_TAC REAL_LE_MUL);;
807 e (REWRITE_TAC[DIST_POS_LE]);;
808 e (ASM_REAL_ARITH_TAC);;
809
810 e (REWRITE_TAC[REAL_ARITH `a * b * c <= &0 <=> &0 <= b * c * (--a)`]);;
811 e (MATCH_MP_TAC REAL_LE_MUL);;
812 e (REWRITE_TAC[DIST_POS_LE]);;
813 e (MATCH_MP_TAC REAL_LE_MUL);;
814 e (REWRITE_TAC[DIST_POS_LE]);;
815 e (ASM_REAL_ARITH_TAC);;
816 e (NEW_GOAL `F`);;
817 e (ASM_MESON_TAC[]);;
818 e (ASM_MESON_TAC[]);;
819
820 e (ABBREV_TAC `y = inv (h) % vsum (s DELETE u0) (\v:real^3. u v % v)`);;
821 e (NEW_GOAL `?t. t + h = &1 /\ x = t % u0 + h % (y:real^3)`);;
822 e (EXISTS_TAC `&1 - h`);;
823 e (STRIP_TAC);;
824 e (REAL_ARITH_TAC);;
825 e (ASM_CASES_TAC `u0:real^3 IN s`);;
826 e (REWRITE_TAC[GSYM (ASSUME `sum s (u:real^3->real) = &1`)]);;
827
828 e (EXPAND_TAC "h");;
829 e (REWRITE_WITH `sum s u = sum (u0 INSERT (s DELETE u0)) (u:real^3->real)`);;
830 e (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);;
831 e (ASM_SET_TAC[]);;
832 e (NEW_GOAL `FINITE (s DELETE u0:real^3)`);;
833 e (MATCH_MP_TAC FINITE_SUBSET);;
834 e (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);;
835
836 e (SIMP_TAC[Marchal_cells_2_new.SUM_CLAUSES_alt; 
837    ASSUME `FINITE (s DELETE u0:real^3)`]);;
838 e (COND_CASES_TAC);;
839 e (NEW_GOAL `F`);;
840 e (UP_ASM_TAC THEN SET_TAC[]);;
841 e (ASM_MESON_TAC[]);;
842 e (REWRITE_TAC[REAL_ARITH `(a + b:real) - b = a`]);;
843 e (ASM_REWRITE_TAC[]);;
844 e (EXPAND_TAC "y");;
845 e (REWRITE_TAC[VECTOR_MUL_ASSOC]);;
846 e (REWRITE_WITH `h * inv h = &1`);;
847 e (NEW_GOAL `~(h = &0)`);;
848 e (ASM_REAL_ARITH_TAC);;
849 e (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV]);;
850 e (REWRITE_TAC[VECTOR_MUL_LID]);;
851 e (EXPAND_TAC "x");;
852
853 e (REWRITE_WITH `vsum s (\v. u v % v) = 
854    vsum (u0 INSERT (s DELETE u0)) (\v:real^3. u v % v)`);;
855 e (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);;
856 e (ASM_SET_TAC[]);;
857 e (SIMP_TAC[Marchal_cells_2_new.VSUM_CLAUSES_alt; 
858    ASSUME `FINITE (s DELETE u0:real^3)`]);;
859 e (COND_CASES_TAC);;
860 e (NEW_GOAL `F`);;
861 e (UP_ASM_TAC THEN SET_TAC[]);;
862 e (ASM_MESON_TAC[]);;
863 e (REFL_TAC);;
864
865 e (NEW_GOAL `h = &1`);;
866 e (EXPAND_TAC "h" THEN REWRITE_WITH `s DELETE u0:real^3 = s`);;
867 e (ASM_SET_TAC[]);;
868 e (ASM_REWRITE_TAC[]);;
869 e (EXPAND_TAC "y" THEN REWRITE_TAC[ASSUME `h = &1`]);;
870 e (REWRITE_WITH `s DELETE u0:real^3 = s`);;
871 e (ASM_SET_TAC[]);;
872 e (ASM_REWRITE_TAC[REAL_ARITH `inv (&1) = &1 /\ &1 - &1 = &0`]);;
873 e (VECTOR_ARITH_TAC);;
874 e (UP_ASM_TAC THEN STRIP_TAC);;
875
876 e (NEW_GOAL `~(y:real^3 IN S)`);;
877 e (STRIP_TAC);;
878 e (NEW_GOAL `x IN aff_ge_alt {u0:real^3} S`);;
879 e (REWRITE_TAC[IN; aff_ge_alt; lin_combo]);;
880
881 e (ABBREV_TAC `f = (\v:real^3. if v = u0 then t 
882                                 else if v = y then h else &0)`);;
883 e (EXISTS_TAC `f:real^3->real`);;
884 e (EXISTS_TAC `{y:real^3}`);;
885
886 e (REPEAT STRIP_TAC);;
887 e (REWRITE_TAC[FINITE_SING]);;
888 e (ASM_SET_TAC[]);;
889
890 e (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a, b}`]);;
891 e (REWRITE_WITH `vsum {u0:real^3, y} (\v. f v % v) = 
892                 (\v. f v % v) u0 + (\v. f v % v) y`);;
893 e (MATCH_MP_TAC Geomdetail.VSUM_DIS2);;
894 e (STRIP_TAC);;
895 e (NEW_GOAL `~(u0:real^3 IN S)`);;
896 e (EXPAND_TAC "S");;
897 e (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
898    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);;
899 e (STRIP_TAC);;
900 e (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);;
901 e (ASM_SET_TAC[]);;
902 e (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);;
903 e (REPEAT STRIP_TAC);;
904 e (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);;
905 e (FIRST_ASSUM MATCH_MP_TAC);;
906 e (ASM_SET_TAC[]);;
907 e (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);;
908 e (MATCH_MP_TAC DIST_POS_LT);;
909 e (ASM_REWRITE_TAC[]);;
910 e (ASM_MESON_TAC[]);;
911
912 e (REWRITE_WITH `(f:real^3->real) u0 = t`);;
913 e (EXPAND_TAC "f");;
914 e (COND_CASES_TAC);;
915 e (REFL_TAC);;
916 e (NEW_GOAL `F`);;
917 e (ASM_MESON_TAC[]);;
918 e (ASM_MESON_TAC[]);;
919
920 e (REWRITE_WITH `(f:real^3->real) y = h`);;
921 e (EXPAND_TAC "f");;
922 e (COND_CASES_TAC);;
923 e (NEW_GOAL `F`);;
924 e (NEW_GOAL `~(u0:real^3 IN S)`);;
925 e (EXPAND_TAC "S");;
926 e (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
927    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);;
928 e (STRIP_TAC);;
929 e (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);;
930 e (ASM_SET_TAC[]);;
931 e (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);;
932 e (REPEAT STRIP_TAC);;
933 e (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);;
934 e (FIRST_ASSUM MATCH_MP_TAC);;
935 e (ASM_SET_TAC[]);;
936 e (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);;
937 e (MATCH_MP_TAC DIST_POS_LT);;
938 e (ASM_REWRITE_TAC[]);;
939 e (ASM_MESON_TAC[]);;
940 e (ASM_MESON_TAC[]);;
941 e (COND_CASES_TAC);;
942 e (REFL_TAC);;
943 e (NEW_GOAL `F`);;
944 e (ASM_MESON_TAC[]);;
945 e (ASM_MESON_TAC[]);;
946 e (ASM_REWRITE_TAC[]);;
947
948 e (EXPAND_TAC "f");;
949 e (COND_CASES_TAC);;
950 e (NEW_GOAL `F`);;
951 e (NEW_GOAL `~({y:real^3} u0)`);;
952 e (REWRITE_WITH `~({y} u0) <=> ~(u0:real^3 IN {y})`);;
953 e (MESON_TAC[IN]);;
954 e (REWRITE_TAC[IN_SING]);;
955 e (STRIP_TAC);;
956
957 e (NEW_GOAL `~(u0:real^3 IN S)`);;
958 e (EXPAND_TAC "S");;
959 e (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
960    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);;
961 e (STRIP_TAC);;
962
963 e (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);;
964 e (ASM_SET_TAC[]);;
965 e (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);;
966 e (REPEAT STRIP_TAC);;
967 e (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);;
968 e (FIRST_ASSUM MATCH_MP_TAC);;
969 e (ASM_SET_TAC[]);;
970 e (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);;
971 e (MATCH_MP_TAC DIST_POS_LT);;
972 e (ASM_REWRITE_TAC[]);;
973 e (ASM_MESON_TAC[]);;
974 e (ASM_MESON_TAC[]);;
975 e (ASM_MESON_TAC[]);;
976
977 e (COND_CASES_TAC);;
978 e (ASM_REAL_ARITH_TAC);;
979 e (REAL_ARITH_TAC);;
980
981 e (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a,b}`]);;
982 e (REWRITE_WITH `sum {u0:real^3, y} f = f u0 + f y`);;
983 e (MATCH_MP_TAC Geomdetail.SUM_DIS2);;
984 e (STRIP_TAC);;
985 e (NEW_GOAL `~(u0:real^3 IN S)`);;
986 e (EXPAND_TAC "S");;
987 e (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
988    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);;
989 e (STRIP_TAC);;
990 e (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);;
991 e (ASM_SET_TAC[]);;
992 e (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);;
993 e (REPEAT STRIP_TAC);;
994 e (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);;
995 e (FIRST_ASSUM MATCH_MP_TAC);;
996 e (ASM_SET_TAC[]);;
997 e (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);;
998 e (MATCH_MP_TAC DIST_POS_LT);;
999 e (ASM_REWRITE_TAC[]);;
1000 e (ASM_MESON_TAC[]);;
1001
1002 e (REWRITE_WITH `(f:real^3->real) u0 = t`);;
1003 e (EXPAND_TAC "f");;
1004 e (COND_CASES_TAC);;
1005 e (REFL_TAC);;
1006 e (NEW_GOAL `F`);;
1007 e (ASM_MESON_TAC[]);;
1008 e (ASM_MESON_TAC[]);;
1009
1010 e (REWRITE_WITH `(f:real^3->real) y = h`);;
1011 e (EXPAND_TAC "f");;
1012 e (COND_CASES_TAC);;
1013 e (NEW_GOAL `F`);;
1014 e (NEW_GOAL `~(u0:real^3 IN S)`);;
1015 e (EXPAND_TAC "S");;
1016 e (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
1017    SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);;
1018 e (STRIP_TAC);;
1019 e (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);;
1020 e (ASM_SET_TAC[]);;
1021 e (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);;
1022 e (REPEAT STRIP_TAC);;
1023 e (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);;
1024 e (FIRST_ASSUM MATCH_MP_TAC);;
1025 e (ASM_SET_TAC[]);;
1026 e (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);;
1027 e (MATCH_MP_TAC DIST_POS_LT);;
1028 e (ASM_REWRITE_TAC[]);;
1029 e (ASM_MESON_TAC[]);;
1030 e (ASM_MESON_TAC[]);;
1031
1032 e (COND_CASES_TAC);;
1033 e (REFL_TAC);;
1034 e (NEW_GOAL `F`);;
1035 e (ASM_MESON_TAC[]);;
1036 e (ASM_MESON_TAC[]);;
1037 e (ASM_REWRITE_TAC[]);;
1038 e (ASM_MESON_TAC[]);;
1039
1040 e (NEW_GOAL `y:real^3 IN S2`);;
1041 e (EXPAND_TAC "S2");;
1042 e (NEW_GOAL `y:real^3 IN S1`);;
1043 e (NEW_GOAL `y:real^3 IN affine hull S`);;
1044 e (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT]);;
1045 e (REWRITE_TAC[IN; IN_ELIM_THM]);;
1046 e (EXISTS_TAC `s DELETE u0:real^3`);;
1047 e (EXISTS_TAC `(\v:real^3. inv h * u v)`);;
1048 e (REPEAT STRIP_TAC);;
1049 e (ASM_REWRITE_TAC[FINITE_DELETE]);;
1050 e (ASM_SET_TAC[]);;
1051 e (REWRITE_TAC[SUM_LMUL]);;
1052 e (ASM_REWRITE_TAC[]);;
1053 e (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV; 
1054    REAL_ARITH `~(h <= &0) ==> ~(h = &0)`]);;
1055 e (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);;
1056 e (ASM_SIMP_TAC[VSUM_LMUL; FINITE_DELETE]);;
1057 e (NEW_GOAL `affine hull S1 = S1:real^3->bool`);;
1058 e (REWRITE_TAC[AFFINE_HULL_EQ]);;
1059 e (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);;
1060
1061 e (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);;
1062 e (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);;
1063 e (EXPAND_TAC "S");;
1064 e (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list; 
1065    SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);;
1066 e (DEL_TAC THEN EXPAND_TAC "S1");;
1067 e (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);;
1068 e (ASM_REWRITE_TAC[]);;
1069 e (ASM_SET_TAC[]);;
1070
1071 e (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);;
1072 e (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);;
1073 e (ASM_SET_TAC[]);;
1074
1075 e (NEW_GOAL `dist (z,u0) <= dist (y,u0:real^3)`);;
1076 e (ONCE_REWRITE_TAC[DIST_SYM]);;
1077 e (ASM_SIMP_TAC[]);;
1078 e (UNDISCH_TAC `x:real^3 IN rcone_gt u0 u1 a`);;
1079 e (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);;
1080 e (ASM_REWRITE_TAC[]);;
1081 e (REWRITE_WITH `dist (t % u0 + h % y,u0) = h * dist (y, u0:real^3)`);;
1082 e (REWRITE_TAC[dist]);;
1083 e (REWRITE_WITH `(t % u0 + h % y:real^3) - u0 = (t % u0 + h % y) - (t + h) % u0`);;
1084 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
1085 e (REWRITE_TAC[VECTOR_ARITH `(t % u0 + h % y) - (t + h) % u0 = h % (y - u0)`]);;
1086 e (REWRITE_TAC[NORM_MUL]);;
1087 e (REWRITE_WITH `abs h = h`);;
1088 e (REWRITE_TAC[REAL_ABS_REFL]);;
1089 e (ASM_REAL_ARITH_TAC);;
1090
1091 e (REWRITE_TAC[REAL_ARITH `~(a > b) <=> a <= b`]);;
1092 e (REWRITE_WITH `h * dist (p,u0:real^3) * dist (u1,u0) = 
1093             (h * dist (z,u0)) * dist (u1,u0) * a`);;
1094 e (EXPAND_TAC "a");;
1095 e (REWRITE_TAC[REAL_ARITH `(a * b) * c * d / b = (a * d * c) * (b / b)`]);;
1096 e (REWRITE_WITH `dist (z,u0) / dist (z,u0:real^3) = &1`);;
1097 e (MATCH_MP_TAC REAL_DIV_REFL);;
1098 e (REWRITE_TAC[DIST_EQ_0]);;
1099 e (STRIP_TAC);;
1100
1101 e (NEW_GOAL `~(u0:real^3 IN S1)`);;
1102 e (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);;
1103 e (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);;
1104 e (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 = 
1105   (u0 - u1) dot (u0 - u1)`]);;
1106 e (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);;
1107 e (ASM_REWRITE_TAC[]);;
1108 e (NEW_GOAL `z:real^3 IN S1`);;
1109 e (ASM_SET_TAC[]);;
1110 e (ASM_MESON_TAC[]);;
1111
1112 e (REAL_ARITH_TAC);;
1113 e (REWRITE_TAC[REAL_ARITH 
1114   `(a * x) * b * c <= (a * y) * b * c <=> &0 <= a * b * c *(y - x)`]);;
1115 e (MATCH_MP_TAC REAL_LE_MUL);;
1116 e (STRIP_TAC);;
1117 e (ASM_REAL_ARITH_TAC);;
1118 e (MATCH_MP_TAC REAL_LE_MUL);;
1119 e (REWRITE_TAC[DIST_POS_LE]);;
1120 e (MATCH_MP_TAC REAL_LE_MUL);;
1121 e (STRIP_TAC);;
1122 e (ASM_REAL_ARITH_TAC);;
1123 e (ASM_REAL_ARITH_TAC);;
1124
1125 e (UP_ASM_TAC THEN STRIP_TAC);;
1126
1127 (* OK until here *)
1128 (* ========================================================================= *)
1129
1130 e (ABBREV_TAC `W = aff_ge_alt {u0:real^3} S`);;
1131 e (ABBREV_TAC `c = max b (hl[u0;u1:real^3] / sqrt (&2))`);;
1132 e (NEW_GOAL `&0 < c /\ c < &1`);;
1133 e (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_LT_MAX]);;
1134 e (ASM_REWRITE_TAC[]);;
1135 e (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_MAX_LT]);;
1136 e (STRIP_TAC);;
1137 e (ASM_REWRITE_TAC[]);;
1138 e (REWRITE_WITH `hl [u0; u1:real^3] / sqrt (&2) < &1 <=> 
1139                  hl [u0; u1] < &1 * sqrt (&2)`);;
1140 e (MATCH_MP_TAC REAL_LT_LDIV_EQ);;
1141 e (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);;
1142 e (ASM_REAL_ARITH_TAC);;
1143
1144 e (NEW_GOAL `rcone_gt u0 u1 c SUBSET 
1145              W INTER (rcone_gt u0 u1 (hl [u0; u1:real^3] / sqrt (&2)))`);;
1146 e (REWRITE_TAC[SUBSET_INTER]);;
1147 e (STRIP_TAC);;
1148 e (NEW_GOAL `rcone_gt (u0:real^3) u1 c SUBSET rcone_gt u0 u1 b`);;
1149 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
1150 e (EXPAND_TAC "c" THEN REAL_ARITH_TAC);;
1151 e (ASM_SET_TAC[]);;
1152 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
1153 e (EXPAND_TAC "c" THEN REAL_ARITH_TAC);;
1154
1155 e (ABBREV_TAC `C = ball (u0:real^3,&1) INTER rcone_gt u0 u1 c`);;
1156 e (NEW_GOAL `C SUBSET 
1157       UNIONS
1158       {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);;
1159 e (REWRITE_TAC[SUBSET]);;
1160 e (REPEAT STRIP_TAC);;
1161 e (NEW_GOAL `x IN ball (u0:real^3,&1)  /\ x IN aff_ge_alt {u0} S`);;
1162 e (ASM_SET_TAC[]);;
1163 e (UP_ASM_TAC THEN STRIP_TAC);;
1164
1165 e (NEW_GOAL `(x:real^3) IN convex hull (u0 INSERT S)`);;
1166 e (REWRITE_TAC[CONVEX_HULL_EXPLICIT; IN; IN_ELIM_THM]);;
1167
1168 e (UP_ASM_TAC THEN REWRITE_TAC[IN; aff_ge_alt; lin_combo]);;
1169 e (REPEAT STRIP_TAC);;
1170 e (EXISTS_TAC `{u0:real^3} UNION q`);;
1171 e (EXISTS_TAC `f:real^3->real`);;
1172 e (REPEAT STRIP_TAC);;
1173 e (REWRITE_TAC[SET_RULE `{a} UNION b = a INSERT b`; FINITE_INSERT]);;
1174 e (ASM_REWRITE_TAC[]);;
1175 e (ASM_SET_TAC[]);;
1176 e (ASM_CASES_TAC `x':real^3 IN q`);;
1177 e (FIRST_ASSUM MATCH_MP_TAC);;
1178 e (UP_ASM_TAC THEN MESON_TAC[IN]);;
1179 e (REWRITE_WITH `x' = u0:real^3`);;
1180 e (NEW_GOAL `x' IN ({u0:real^3} UNION q)`);;
1181 e (ASM_REWRITE_TAC[IN]);;
1182 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
1183 e (REWRITE_TAC[REAL_ARITH `&0 <= x <=> ~(x < &0)`]);;
1184 e (STRIP_TAC);;
1185 e (UNDISCH_TAC `x IN ball (u0:real^3,&1)`);;
1186 e (ASM_REWRITE_TAC[IN_BALL; SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);;
1187 e (REWRITE_WITH `vsum (u0 INSERT (q DELETE u0:real^3)) (\v. f v % v) = 
1188   (if u0 IN (q DELETE u0) then vsum (q DELETE u0) (\v. f v % v)
1189    else (\v. f v % v) u0 + vsum (q DELETE u0) (\v. f v % v))`);;
1190 e (MATCH_MP_TAC Marchal_cells_2_new.VSUM_CLAUSES_alt);;
1191 e (ASM_REWRITE_TAC[FINITE_DELETE]);;
1192 e (COND_CASES_TAC);;
1193 e (NEW_GOAL `F`);;
1194 e (UP_ASM_TAC THEN SET_TAC[]);;
1195 e (ASM_MESON_TAC[]);;
1196 e (ONCE_REWRITE_TAC[DIST_SYM]);;
1197 e (REWRITE_TAC[dist]);;
1198 e (REWRITE_WITH `!a. a - u0 = a - (sum ({u0:real^3} UNION q) f) % u0`);;
1199 e (ASM_REWRITE_TAC[]);;
1200 e (VECTOR_ARITH_TAC);;
1201
1202 e (NEW_GOAL `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`);;
1203 e (REWRITE_TAC[SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);;
1204 e (REWRITE_WITH `sum (u0 INSERT (q DELETE u0:real^3)) f = 
1205   (if u0 IN (q DELETE u0) then sum (q DELETE u0) f
1206    else f u0 + sum (q DELETE u0) f)`);;
1207 e (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);;
1208 e (ASM_REWRITE_TAC[FINITE_DELETE]);;
1209 e (COND_CASES_TAC);;
1210 e (NEW_GOAL `F`);;
1211 e (UP_ASM_TAC THEN SET_TAC[]);;
1212 e (ASM_MESON_TAC[]);;
1213 e (ASM_REWRITE_TAC[]);;
1214 e (REWRITE_TAC[VECTOR_ADD_RDISTRIB;
1215    VECTOR_ARITH `(a + b) - (a + c:real^3) = b - c`;
1216    ASSUME `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`; ]);;
1217 e (ABBREV_TAC `h = sum (q DELETE u0:real^3) f`);;
1218 e (ABBREV_TAC `y = inv (h) % vsum (q DELETE u0) (\v:real^3. f v % v)`);;
1219 e (NEW_GOAL `h > &1`);;
1220 e (ASM_REAL_ARITH_TAC);;
1221 e (REWRITE_WITH `vsum (q DELETE u0) (\v. f v % v) = h % y:real^3`);;
1222 e (EXPAND_TAC "y");;
1223 e (REWRITE_TAC[VECTOR_MUL_ASSOC]);;
1224 e (REWRITE_WITH `h * inv h = &1`);;
1225 e (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);;
1226 e (VECTOR_ARITH_TAC);;
1227 e (REWRITE_TAC[VECTOR_ARITH `h % a - h % b = h % (a - b)`; NORM_MUL]);;
1228 e (REWRITE_TAC[REAL_ARITH `~(a < b) <=> b <= a`]);;
1229
1230 e (NEW_GOAL `norm (p - u0) <= norm (y - u0:real^3)`);;
1231 e (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);;
1232 e (REWRITE_TAC[NORM_POS_LE]);;
1233 e (REWRITE_WITH 
1234   `norm (y - u0) pow 2 = norm (p - u0) pow 2 + norm (y - p:real^3) pow 2`);;
1235 e (MATCH_MP_TAC PYTHAGORAS);;
1236 e (REWRITE_TAC[orthogonal]);;
1237 e (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);;
1238 e (ASM_REWRITE_TAC[set_of_list]);;
1239 e (ONCE_REWRITE_TAC[DOT_SYM]);;
1240 e (MATCH_MP_TAC Rogers.MHFTTZN4);;
1241 e (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);;
1242 e (REPEAT STRIP_TAC);;
1243 e (ASM_REWRITE_TAC[]);;
1244 e (ASM_REWRITE_TAC[]);;
1245
1246 e (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);;
1247 e (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);;
1248 e (EXISTS_TAC `q DELETE u0:real^3`);;
1249 e (EXISTS_TAC `(\v:real^3. inv h * f v)`);;
1250 e (REPEAT STRIP_TAC);;
1251 e (ASM_REWRITE_TAC[FINITE_DELETE]);;
1252 e (ASM_SET_TAC[]);;
1253 e (ASM_REWRITE_TAC[SUM_LMUL]);;
1254 e (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);;
1255 e (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);;
1256 e (ASM_REWRITE_TAC[VSUM_LMUL]);;
1257
1258 e (REWRITE_TAC[set_of_list]);;
1259 e (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);;
1260 e (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
1261 e (ASM_SET_TAC[]);;
1262 e (REWRITE_TAC[REAL_ARITH `a <= a + b <=> &0 <= b`; NORM_POW_2; DOT_POS_LE]);;
1263
1264 e (NEW_GOAL `&1 <= norm (p - u0:real^3)`);;
1265 e (EXPAND_TAC "p");;
1266 e (REWRITE_TAC[CIRCUMCENTER_2; midpoint; 
1267    VECTOR_ARITH `inv (&2) % (u0 + u1) - u0 = inv (&2) % (u1 - u0)`; 
1268    NORM_MUL; REAL_ARITH `abs (inv(&2)) = inv (&2)`]);;
1269 e (REWRITE_TAC[GSYM dist]);;
1270 e (REWRITE_WITH `&1 = inv (&2) * &2`);;
1271 e (REAL_ARITH_TAC);;
1272 e (REWRITE_TAC[REAL_ARITH `inv (&2) * &2 <= inv (&2) * a <=> &2 <= a`]);;
1273 e (MP_TAC (ASSUME `packing (V:real^3->bool)`));;
1274 e (REWRITE_TAC[packing] THEN STRIP_TAC);;
1275 e (FIRST_ASSUM MATCH_MP_TAC);;
1276 e (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);;
1277 e (REWRITE_WITH `abs h = h`);;
1278 e (ASM_REAL_ARITH_TAC);;
1279
1280 e (NEW_GOAL `h <= h * norm (y - u0:real^3)`);;
1281 e (REWRITE_TAC[REAL_ARITH `h <= h * a <=> &0 <= h * (a - &1)`]);;
1282 e (MATCH_MP_TAC REAL_LE_MUL);;
1283 e (ASM_REAL_ARITH_TAC);;
1284 e (ASM_REAL_ARITH_TAC);;
1285
1286 e (ASM_REWRITE_TAC[]);;
1287 e (ASM_REWRITE_TAC[]);;
1288
1289 e (NEW_GOAL `~(S:real^3->bool = {})`);;
1290 e (STRIP_TAC);;
1291 e (NEW_GOAL `~(aff_dim (u0:real^3 INSERT S) = &3)`);;
1292 e (REWRITE_TAC[ASSUME `S:real^3->bool = {}`; AFF_DIM_SING]);;
1293 e (ARITH_TAC);;
1294 e (ASM_MESON_TAC[]);;
1295 e (SWITCH_TAC);;
1296 e (UP_ASM_TAC THEN SIMP_TAC[CONVEX_HULL_INSERT; 
1297    ASSUME `~(S:real^3->bool = {})`]);;
1298 e (REWRITE_WITH `convex hull S = S:real^3->bool`);;
1299 e (REWRITE_TAC[CONVEX_HULL_EQ]);;
1300 e (EXPAND_TAC "S" THEN REWRITE_TAC[Packing3.CONVEX_VORONOI_LIST]);;
1301 e (ASM_REWRITE_TAC[]);;
1302 e (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);;
1303 e (REPEAT STRIP_TAC);;
1304
1305 e (EXISTS_TAC `rogers V vl`);;
1306 e (REPEAT STRIP_TAC);;
1307 e (EXISTS_TAC `vl:(real^3)list`);;
1308 e (ASM_REWRITE_TAC[]);;
1309
1310 e (ASM_SIMP_TAC[Marchal_cells_2.ROGERS_EXPLICIT]);;
1311 e (REWRITE_TAC[CONVEX_HULL_4; IN_ELIM_THM]);;
1312
1313 e (UNDISCH_TAC `(t:real^3->bool) b'`);;
1314 e (ASM_REWRITE_TAC[CONVEX_HULL_3; IN_ELIM_THM]);;
1315 e (REPEAT STRIP_TAC);;
1316
1317 e (EXISTS_TAC `u:real`);;
1318 e (EXISTS_TAC `v * u'`);;
1319 e (EXISTS_TAC `v * v'`);;
1320 e (EXISTS_TAC `v * w`);;
1321 e (ASM_SIMP_TAC[REAL_LE_MUL]);;
1322 e (STRIP_TAC);;
1323
1324 e (REWRITE_TAC[REAL_ARITH `u + v * u' + v * v' + v * w = u + v * (u' + v' +w)`]);;
1325 e (ASM_REWRITE_TAC[]);;
1326 e (ASM_REAL_ARITH_TAC);;
1327
1328 e (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);;
1329 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
1330 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
1331 e (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);;
1332 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
1333 e (EXISTS_TAC `V:real^3->bool`);;
1334 e (ASM_REWRITE_TAC[]);;
1335 e (ARITH_TAC);;
1336
1337 e (ASM_REWRITE_TAC[HD]);;
1338 e (VECTOR_ARITH_TAC);;
1339
1340 (* ========================================================================== *)
1341
1342 e (NEW_GOAL 
1343  `!X. mcell_set V X /\ ~NULLSET (X INTER C)
1344      ==> (?k vl.
1345               2 <= k /\
1346               barV V 3 vl /\
1347               X = mcell k V vl /\
1348               truncate_simplex 1 vl = [u0; u1])`);;
1349
1350 e (REWRITE_TAC[mcell_set_2; IN_ELIM_THM]);;
1351 e (REPEAT STRIP_TAC);;
1352
1353 e (NEW_GOAL `~NULLSET (X INTER UNIONS
1354       {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]})`);;
1355 e (STRIP_TAC);;
1356 e (UNDISCH_TAC `~NULLSET (X INTER C)`);;
1357 e (REWRITE_TAC[]);;
1358 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
1359 e (EXISTS_TAC `X INTER
1360        UNIONS
1361        {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);;
1362 e (STRIP_TAC);;
1363 e (ASM_REWRITE_TAC[]);;
1364 e (ASM_SET_TAC[]);;
1365 e (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);;
1366 e (STRIP_TAC);;
1367
1368 e (NEW_GOAL 
1369   `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);;
1370 e (MESON_TAC[NEGLIGIBLE_UNIONS]);;
1371 e (ABBREV_TAC `St = {X INTER x | x IN
1372                     {rogers V vl | vl | barV V 3 vl /\
1373                                         truncate_simplex 1 vl = [u0; u1]}}`);;
1374 e (NEW_GOAL `?t. t IN St /\ ~NULLSET t`);;
1375 e (FIRST_ASSUM MATCH_MP_TAC);;
1376 e (ASM_REWRITE_TAC[]);;
1377 e (EXPAND_TAC "St");;
1378 e (ABBREV_TAC `Sr = {rogers V vl | vl | barV V 3 vl /\
1379                                   truncate_simplex 1 vl = [u0; u1]}`);;
1380 e (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);;
1381 e (MATCH_MP_TAC FINITE_SUBSET);;
1382 e (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sr /\ y = f x }`);;
1383 e (STRIP_TAC);;
1384
1385 e (MATCH_MP_TAC FINITE_IMAGE_EXPAND);;
1386 e (ABBREV_TAC `Ss = {vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);;
1387 e (MATCH_MP_TAC FINITE_SUBSET);;
1388 e (EXISTS_TAC `{y | ?vl. vl IN Ss /\ y = rogers V vl}`);;
1389 e (STRIP_TAC);;
1390 e (MATCH_MP_TAC FINITE_IMAGE_EXPAND);;
1391 e (ABBREV_TAC `Sx = V INTER ball (u0:real^3, &4)`);;
1392 e (MATCH_MP_TAC FINITE_SUBSET);;
1393 e (EXISTS_TAC `{y | ?u0 u1 u2 u3:real^3.
1394                       u0 IN Sx /\
1395                       u1 IN Sx /\
1396                       u2 IN Sx /\
1397                       u3 IN Sx /\
1398                       y = [u0; u1; u2; u3]}`);;
1399 e (STRIP_TAC);;
1400 e (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA);;
1401 e (EXPAND_TAC "Sx");;
1402 e (MATCH_MP_TAC Pack2.KIUMVTC);;
1403 e (ASM_REWRITE_TAC[]);;
1404 e (EXPAND_TAC "Ss");;
1405 e (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);;
1406 e (REPEAT STRIP_TAC);;
1407
1408 e (NEW_GOAL `?v0 v1 v2 v3. x = [v0;v1;v2;v3:real^3]`);;
1409 e (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);;
1410 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
1411 e (UP_ASM_TAC THEN STRIP_TAC);;
1412 e (EXISTS_TAC `v0:real^3`);;
1413 e (EXISTS_TAC `v1:real^3`);;
1414 e (EXISTS_TAC `v2:real^3`);;
1415 e (EXISTS_TAC `v3:real^3`);;
1416 e (ASM_REWRITE_TAC[]);;
1417
1418 e (NEW_GOAL `{v0, v1, v2, v3:real^3} SUBSET Sx`);;
1419 e (EXPAND_TAC "Sx");;
1420 e (REWRITE_TAC[SUBSET_INTER]);;
1421 e (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list x`);;
1422 e (ASM_REWRITE_TAC[set_of_list]);;
1423 e (STRIP_TAC);;
1424 e (MATCH_MP_TAC Packing3.BARV_SUBSET);;
1425 e (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);;
1426 e (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);;
1427 e (EXISTS_TAC `V:real^3->bool`);;
1428 e (ASM_REWRITE_TAC[]);;
1429 e (NEW_GOAL `HD (truncate_simplex 1 x) = u0:real^3`);;
1430 e (ASM_REWRITE_TAC[HD]);;
1431 e (NEW_GOAL `HD (truncate_simplex 1 x) = v0:real^3`);;
1432 e (REWRITE_TAC[ASSUME `x = [v0; v1; v2; v3:real^3]`;  
1433    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
1434
1435 e (REWRITE_WITH `u0 = v0:real^3`);;
1436 e (ASM_MESON_TAC[]);;
1437 e (REWRITE_TAC[set_of_list] THEN SET_TAC[]);;
1438 e (UP_ASM_TAC THEN SET_TAC[]);;
1439
1440 e (EXPAND_TAC "Sr" THEN EXPAND_TAC "Ss");;
1441 e (SET_TAC[]);;
1442 e (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sr} = {f x | x IN Sr}`);;
1443 e (EXPAND_TAC "f");;
1444 e (REFL_TAC);;
1445 e (SET_TAC[]);;
1446 e (UP_ASM_TAC THEN EXPAND_TAC "St" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
1447 e (REPEAT STRIP_TAC);;
1448
1449 e (NEW_GOAL `x SUBSET UNIONS {mcell i V vl | i <= 4}`);;
1450 e (ASM_REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM]);;
1451 e (REPEAT STRIP_TAC);;
1452 e (NEW_GOAL `?i. i <= 4 /\ x' IN mcell i V vl`);;
1453 e (MATCH_MP_TAC Sltstlo.SLTSTLO1);;
1454 e (ASM_REWRITE_TAC[IN]);;
1455 e (UP_ASM_TAC THEN STRIP_TAC);;
1456 e (EXISTS_TAC `mcell i' V vl`);;
1457 e (STRIP_TAC);;
1458 e (EXISTS_TAC `i':num` THEN ASM_REWRITE_TAC[]);;
1459 e (UP_ASM_TAC THEN REWRITE_TAC[IN]);;
1460
1461 e (NEW_GOAL `~NULLSET (X INTER UNIONS {mcell i V vl | i <= 4})`);;
1462 e (STRIP_TAC);;
1463 e (UNDISCH_TAC `~NULLSET (t)`);;
1464 e (REWRITE_TAC[ASSUME `t:real^3->bool = X INTER x`]);;
1465 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
1466 e (EXISTS_TAC `X INTER UNIONS {mcell i V vl | i <= 4}`);;
1467 e (STRIP_TAC);;
1468 e (ASM_REWRITE_TAC[]);;
1469 e (ASM_SET_TAC[]);;
1470 e (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);;
1471 e (STRIP_TAC);;
1472
1473 e (NEW_GOAL 
1474   `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);;
1475 e (MESON_TAC[NEGLIGIBLE_UNIONS]);;
1476 e (ABBREV_TAC `Sx = {X INTER x | x IN {mcell i V vl | i <= 4}}`);;
1477 e (NEW_GOAL `?t. t IN Sx /\ ~NULLSET t`);;
1478 e (FIRST_ASSUM MATCH_MP_TAC);;
1479 e (ASM_REWRITE_TAC[]);;
1480 e (EXPAND_TAC "Sx");;
1481 e (ABBREV_TAC `Sy = {mcell i V vl | i <= 4}`);;
1482 e (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);;
1483 e (MATCH_MP_TAC FINITE_SUBSET);;
1484 e (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sy /\ y = f x }`);;
1485 e (STRIP_TAC);;
1486 e (MATCH_MP_TAC FINITE_IMAGE_EXPAND);;
1487 e (EXPAND_TAC "Sy");;
1488 e (REWRITE_TAC[GSYM IN_NUMSEG_0]);;
1489 e (ABBREV_TAC `g = (\i:num. mcell i V vl)`);;
1490 e (REWRITE_WITH `{mcell i V vl | i IN 0..4} = {g i | i IN 0..4}`);;
1491 e (EXPAND_TAC "g" THEN REWRITE_TAC[]);;
1492 e (MATCH_MP_TAC FINITE_SUBSET);;
1493 e (EXISTS_TAC `{y:real^3->bool | ?i. i IN 0..4 /\ y = g i}`);;
1494 e (STRIP_TAC);;
1495 e (MATCH_MP_TAC FINITE_IMAGE_EXPAND);;
1496 e (REWRITE_TAC[FINITE_NUMSEG]);;
1497 e (SET_TAC[]);;
1498 e (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sy} = {f x | x IN Sy}`);;
1499 e (EXPAND_TAC "f" THEN REWRITE_TAC[]);;
1500 e (SET_TAC[]);;
1501 e (UP_ASM_TAC THEN EXPAND_TAC "Sx" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
1502 e (REPEAT STRIP_TAC);;
1503
1504 (* ========================================================================= *)
1505
1506 e (NEW_GOAL `i = i' /\ mcell i V ul = mcell i' V vl`);;
1507 e (MATCH_MP_TAC Ajripqn.AJRIPQN);;
1508 e (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);;
1509 e (REPEAT STRIP_TAC);;
1510 e (UNDISCH_TAC `ul IN barV V 3` THEN REWRITE_TAC[IN]);;
1511 e (UNDISCH_TAC `~NULLSET t'`);;
1512 e (ASM_REWRITE_TAC[]);;
1513 e (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);;
1514 e (ASM_REWRITE_TAC[]);;
1515
1516 (* ========================================================================= *)
1517
1518 e (ASM_CASES_TAC `i' = 0`);;
1519 e (NEW_GOAL `F`);;
1520 e (UNDISCH_TAC `~NULLSET (X INTER C)`);;
1521 e (REWRITE_TAC[]);;
1522 e (REWRITE_WITH `X INTER C = {}:real^3->bool`);;
1523 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);;
1524 e (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);;
1525 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
1526 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
1527 e (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);;
1528 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
1529 e (EXISTS_TAC `V:real^3->bool`);;
1530 e (ASM_REWRITE_TAC[]);;
1531 e (ARITH_TAC);;
1532 e (ASM_REWRITE_TAC[HD]);;
1533 e (NEW_GOAL `C SUBSET ball (u0:real^3, sqrt (&2))`);;
1534 e (NEW_GOAL `ball (u0:real^3, &1) SUBSET ball (u0, sqrt (&2))`);;
1535 e (MATCH_MP_TAC SUBSET_BALL);;
1536 e (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));;
1537 e (REWRITE_TAC[Marchal_cells_2_new.ZERO_LT_SQRT_2]);;
1538 e (ASM_SET_TAC[]);;
1539 e (UP_ASM_TAC THEN SET_TAC[]);;
1540 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
1541 e (ASM_MESON_TAC[]);;
1542
1543 e (ASM_CASES_TAC `i' = 1`);;
1544 e (NEW_GOAL `F`);;
1545 e (UNDISCH_TAC `~NULLSET (X INTER C)`);;
1546 e (REWRITE_TAC[]);;
1547 e (REWRITE_WITH `X INTER C = {}:real^3->bool`);;
1548 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell1]);;
1549 e (COND_CASES_TAC);;
1550 e (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);;
1551 e (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);;
1552 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
1553 e (UP_ASM_TAC THEN STRIP_TAC);;
1554 e (ASM_REWRITE_TAC[HD; TL]);;
1555
1556 e (REWRITE_WITH `v0 = u0:real^3`);;
1557 e (NEW_GOAL `HD (truncate_simplex 1 vl) = u0:real^3`);;
1558 e (ASM_REWRITE_TAC[HD]);;
1559 e (NEW_GOAL `HD (truncate_simplex 1 vl) = v0:real^3`);;
1560 e (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
1561    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
1562 e (ASM_MESON_TAC[]);;
1563
1564 e (REWRITE_WITH `v1 = u1:real^3`);;
1565 e (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);;
1566 e (ASM_REWRITE_TAC[HD; TL]);;
1567 e (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);;
1568 e (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
1569    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
1570 e (ASM_MESON_TAC[]);;
1571
1572 e (NEW_GOAL `C SUBSET (rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2)))`);;
1573 e (EXPAND_TAC "C");;
1574 e (SET_TAC[ASSUME `rcone_gt u0 u1 c SUBSET
1575                    W INTER rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2))`]);;
1576 e (UP_ASM_TAC THEN SET_TAC[]);;
1577 e (SET_TAC[]);;
1578 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
1579 e (UP_ASM_TAC THEN MESON_TAC[]);;
1580 e (ASM_ARITH_TAC);;
1581
1582 (* ========================================================================= *)
1583
1584 e (ABBREV_TAC `f1 = 
1585   (\ul. dist (u0:real^3, 
1586               closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0))`);;
1587
1588 e (ABBREV_TAC `P1 = { (f1:(real^3)list->real) ul |ul | barV V 3 ul /\
1589                                  ~NULLSET (mcell 3 V ul INTER C) /\
1590                                   truncate_simplex 1 ul = [u0; u1]}`);;
1591
1592 e (NEW_GOAL `~(P1 = {}) ==> (?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);;
1593 e (STRIP_TAC);;
1594 e (MATCH_MP_TAC INF_FINITE_LEMMA);;
1595 e (ASM_REWRITE_TAC[]);;
1596 e (EXPAND_TAC "P1");;
1597 e (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);;
1598 e (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);;
1599 e (MATCH_MP_TAC FINITE_IMAGE_EXPAND);;
1600 e (MATCH_MP_TAC FINITE_SUBSET);;
1601 e (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1602                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1603                       v1 IN (V INTER ball (u0, &4)) /\
1604                       u2 IN (V INTER ball (u0, &4)) /\
1605                       u3 IN (V INTER ball (u0, &4)) /\
1606                       y = [v0; v1; u2; u3]}`);;
1607 e (STRIP_TAC);;
1608 e (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);;
1609 e (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);;
1610 e (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);;
1611 e (REPEAT STRIP_TAC);;
1612 e (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);;
1613 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
1614 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
1615 e (UP_ASM_TAC THEN STRIP_TAC);;
1616 e (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1617    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);;
1618 e (ASM_REWRITE_TAC[]);;
1619 e (NEW_GOAL `v0 = u0:real^3`);;
1620 e (REWRITE_WITH `v0 = HD (x:(real^3)list)`);;
1621 e (ASM_REWRITE_TAC[HD]);;
1622 e (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);;
1623 e (ASM_REWRITE_TAC[HD]);;
1624 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
1625 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
1626 e (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);;
1627 e (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);;
1628 e (EXISTS_TAC `V:real^3->bool`);;
1629 e (ASM_REWRITE_TAC[set_of_list]);;
1630 e (SET_TAC[]);;
1631 e (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);;
1632 e (MATCH_MP_TAC Packing3.BARV_SUBSET);;
1633 e (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);;
1634 e (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);;
1635 e (SET_TAC[]);;
1636
1637 e (ABBREV_TAC `r1 = (if (P1 = {}:real->bool) then &1 
1638                     else (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x)))`);;
1639 e (NEW_GOAL `&0 < r1`);;
1640 e (EXPAND_TAC "r1");;
1641 e (COND_CASES_TAC);;
1642 e (REAL_ARITH_TAC);;
1643 e (NEW_GOAL `?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x)`);;
1644 e (ASM_SIMP_TAC[]);;
1645 e (UP_ASM_TAC THEN STRIP_TAC);;
1646 e (ABBREV_TAC `P  = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);;
1647 e (ABBREV_TAC `zz = (@) (P:real->bool)`);;
1648 e (NEW_GOAL `(P:real->bool) zz`);;
1649 e (EXPAND_TAC "zz");;
1650 e (MATCH_MP_TAC SELECT_AX);;
1651 e (EXISTS_TAC `b':real`);;
1652 e (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);;
1653 e (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);;
1654 e (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
1655 e (REPEAT STRIP_TAC);;
1656 e (ASM_REWRITE_TAC[]);;
1657 e (EXPAND_TAC "f1");;
1658 e (MATCH_MP_TAC DIST_POS_LT);;
1659 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
1660 e (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0 = u0
1661   <=> u0 IN (affine hull {u1:real^3, EL 2 ul, mxi V ul})`);;
1662 e (MATCH_MP_TAC CLOSEST_POINT_REFL);;
1663 e (REWRITE_TAC[CLOSED_AFFINE_HULL]);;
1664 e (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);;
1665 e (STRIP_TAC);;
1666 e (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);;
1667 e (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
1668 e (EXISTS_TAC `mcell 3 V ul`);;
1669 e (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);;
1670 e (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);;
1671 e (COND_CASES_TAC);;
1672
1673 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);;
1674 e (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);;
1675 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
1676 e (UP_ASM_TAC THEN STRIP_TAC);;
1677 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);;
1678
1679 e (REWRITE_WITH `v0 = u0:real^3`);;
1680 e (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);;
1681 e (ASM_REWRITE_TAC[HD]);;
1682 e (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);;
1683 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1684    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
1685 e (ASM_MESON_TAC[]);;
1686
1687 e (REWRITE_WITH `v1 = u1:real^3`);;
1688 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);;
1689 e (ASM_REWRITE_TAC[HD; TL]);;
1690 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);;
1691 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1692    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
1693 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
1694 e (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
1695
1696 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
1697 e (EXISTS_TAC `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]}`);;
1698 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
1699 e (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} = 
1700                  affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);;
1701 e (MATCH_MP_TAC AFFINE_HULL_3_INSERT);;
1702 e (REWRITE_WITH `affine hull {u1, v2, mxi V [u0; u1; v2; v3]} = 
1703                  affine hull {u1, EL 2 ul, mxi V ul}`);;
1704 e (ASM_REWRITE_TAC[EL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);;
1705
1706 e (REWRITE_WITH `v0 = u0:real^3`);;
1707 e (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);;
1708 e (ASM_REWRITE_TAC[HD]);;
1709 e (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);;
1710 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1711    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
1712 e (ASM_MESON_TAC[]);;
1713
1714 e (REWRITE_WITH `v1 = u1:real^3`);;
1715 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);;
1716 e (ASM_REWRITE_TAC[HD; TL]);;
1717 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);;
1718 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1719    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
1720 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
1721 e (ASM_REWRITE_TAC[]);;
1722 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
1723 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
1724
1725 (* ========================================================================= *)
1726
1727 e (ABBREV_TAC `f2 = 
1728   (\ul. dist (u0:real^3, 
1729               closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0))`);;
1730
1731 e (ABBREV_TAC `P2 = { (f2:(real^3)list->real) ul |ul | barV V 3 ul /\
1732                                  ~NULLSET (mcell 4 V ul INTER C) /\
1733                                   truncate_simplex 1 ul = [u0; u1]}`);;
1734
1735 e (NEW_GOAL `~(P2 = {}) ==> (?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);;
1736 e (STRIP_TAC);;
1737 e (MATCH_MP_TAC INF_FINITE_LEMMA);;
1738 e (ASM_REWRITE_TAC[]);;
1739 e (EXPAND_TAC "P2");;
1740 e (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);;
1741 e (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);;
1742 e (MATCH_MP_TAC FINITE_IMAGE_EXPAND);;
1743 e (MATCH_MP_TAC FINITE_SUBSET);;
1744 e (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1745                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1746                       v1 IN (V INTER ball (u0, &4)) /\
1747                       u2 IN (V INTER ball (u0, &4)) /\
1748                       u3 IN (V INTER ball (u0, &4)) /\
1749                       y = [v0; v1; u2; u3]}`);;
1750 e (STRIP_TAC);;
1751 e (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);;
1752 e (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);;
1753 e (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);;
1754 e (REPEAT STRIP_TAC);;
1755 e (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);;
1756 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
1757 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
1758 e (UP_ASM_TAC THEN STRIP_TAC);;
1759 e (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1760    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);;
1761 e (ASM_REWRITE_TAC[]);;
1762 e (NEW_GOAL `v0 = u0:real^3`);;
1763 e (REWRITE_WITH `v0 = HD (x:(real^3)list)`);;
1764 e (ASM_REWRITE_TAC[HD]);;
1765 e (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);;
1766 e (ASM_REWRITE_TAC[HD]);;
1767 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
1768 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
1769 e (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);;
1770 e (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);;
1771 e (EXISTS_TAC `V:real^3->bool`);;
1772 e (ASM_REWRITE_TAC[set_of_list]);;
1773 e (SET_TAC[]);;
1774 e (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);;
1775 e (MATCH_MP_TAC Packing3.BARV_SUBSET);;
1776 e (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);;
1777 e (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);;
1778 e (SET_TAC[]);;
1779
1780 e (ABBREV_TAC `r2 = (if (P2 = {}:real->bool) then &1 
1781                     else (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x)))`);;
1782
1783 e (NEW_GOAL `&0 < r2`);;
1784 e (EXPAND_TAC "r2");;
1785 e (COND_CASES_TAC);;
1786 e (REAL_ARITH_TAC);;
1787 e (NEW_GOAL `?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x)`);;
1788 e (ASM_SIMP_TAC[]);;
1789 e (UP_ASM_TAC THEN STRIP_TAC);;
1790 e (ABBREV_TAC `P  = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);;
1791 e (ABBREV_TAC `zz = (@) (P:real->bool)`);;
1792 e (NEW_GOAL `(P:real->bool) zz`);;
1793 e (EXPAND_TAC "zz");;
1794 e (MATCH_MP_TAC SELECT_AX);;
1795 e (EXISTS_TAC `b':real`);;
1796 e (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);;
1797 e (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);;
1798 e (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
1799 e (REPEAT STRIP_TAC);;
1800 e (ASM_REWRITE_TAC[]);;
1801 e (EXPAND_TAC "f2");;
1802 e (MATCH_MP_TAC DIST_POS_LT);;
1803 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
1804 e (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0 = u0
1805   <=> u0 IN (affine hull {u1:real^3, EL 2 ul, EL 3 ul})`);;
1806 e (MATCH_MP_TAC CLOSEST_POINT_REFL);;
1807 e (REWRITE_TAC[CLOSED_AFFINE_HULL]);;
1808 e (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);;
1809 e (STRIP_TAC);;
1810 e (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);;
1811 e (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
1812 e (EXISTS_TAC `mcell 4 V ul`);;
1813 e (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);;
1814 e (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4]);;
1815 e (COND_CASES_TAC);;
1816
1817 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);;
1818 e (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);;
1819 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
1820 e (UP_ASM_TAC THEN STRIP_TAC);;
1821 e (ASM_REWRITE_TAC[set_of_list]);;
1822
1823 e (REWRITE_WITH `v0 = u0:real^3`);;
1824 e (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);;
1825 e (ASM_REWRITE_TAC[HD]);;
1826 e (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);;
1827 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1828    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
1829 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
1830
1831 e (REWRITE_WITH `v1 = u1:real^3`);;
1832 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);;
1833 e (ASM_REWRITE_TAC[HD; TL]);;
1834 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);;
1835 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
1836    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
1837 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
1838
1839 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
1840 e (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);;
1841 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
1842 e (REWRITE_WITH `affine hull {u0, u1, v2, v3:real^3} = 
1843                  affine hull {u1, v2, v3}`);;
1844 e (MATCH_MP_TAC AFFINE_HULL_3_INSERT);;
1845 e (REWRITE_WITH `affine hull {u1, v2, v3:real^3} = 
1846                  affine hull {u1, EL 2 ul, EL 3 ul}`);;
1847 e (ASM_REWRITE_TAC[EL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);;
1848 e (ASM_REWRITE_TAC[]);;
1849
1850 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
1851 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
1852
1853 (* ========================================================================= *)
1854
1855 e (ABBREV_TAC `r = min (&1) (min r1 r2)`);;
1856 e (NEW_GOAL `&0 < r`);;
1857 e (EXPAND_TAC "r");;
1858 e (UNDISCH_TAC `&0 < r1` THEN UNDISCH_TAC `&0  < r2` THEN REAL_ARITH_TAC);;
1859
1860 (* ========================================================================= *)
1861
1862 e (ABBREV_TAC `f3 = 
1863   (\ul. (((smallest_angle_line (EL 2 ul)  (mxi V ul) u0 u1) - u0)
1864    dot (u1 - u0)) / 
1865    (norm ((smallest_angle_line (EL 2 ul)  (mxi V ul) u0 u1) - u0)
1866    * norm (u1 - u0)))`);;
1867
1868 e (ABBREV_TAC `P3 = {(f3:(real^3)list->real) ul |ul | barV V 3 ul /\
1869                                  ~NULLSET (mcell 3 V ul INTER C) /\
1870                                   truncate_simplex 1 ul = [u0; u1]}`);;
1871
1872 e (NEW_GOAL `~(P3 = {}) ==> (?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);;
1873 e (STRIP_TAC);;
1874 e (MATCH_MP_TAC SUP_FINITE_LEMMA);;
1875 e (ASM_REWRITE_TAC[]);;
1876 e (EXPAND_TAC "P3");;
1877 e (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);;
1878 e (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);;
1879 e (MATCH_MP_TAC FINITE_IMAGE_EXPAND);;
1880 e (MATCH_MP_TAC FINITE_SUBSET);;
1881 e (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1882                       v0 IN (V INTER ball (u0:real^3, &4)) /\
1883                       v1 IN (V INTER ball (u0, &4)) /\
1884                       u2 IN (V INTER ball (u0, &4)) /\
1885                       u3 IN (V INTER ball (u0, &4)) /\
1886                       y = [v0; v1; u2; u3]}`);;
1887 e (STRIP_TAC);;
1888 e (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);;
1889 e (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);;
1890 e (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);;
1891 e (REPEAT STRIP_TAC);;
1892 e (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);;
1893 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
1894 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
1895 e (UP_ASM_TAC THEN STRIP_TAC);;
1896 e (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
1897    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);;
1898 e (ASM_REWRITE_TAC[]);;
1899 e (NEW_GOAL `v0 = u0:real^3`);;
1900 e (REWRITE_WITH `v0 = HD (x:(real^3)list)`);;
1901 e (ASM_REWRITE_TAC[HD]);;
1902 e (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);;
1903 e (ASM_REWRITE_TAC[HD]);;
1904 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
1905 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
1906 e (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);;
1907 e (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);;
1908 e (EXISTS_TAC `V:real^3->bool`);;
1909 e (ASM_REWRITE_TAC[set_of_list]);;
1910 e (SET_TAC[]);;
1911 e (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);;
1912 e (MATCH_MP_TAC Packing3.BARV_SUBSET);;
1913 e (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);;
1914 e (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);;
1915 e (SET_TAC[]);;
1916
1917 e (ABBREV_TAC `d1 = (if (P3 = {}:real->bool) then c 
1918                     else (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b)))`);;
1919
1920 e (NEW_GOAL `d1 < &1`);;
1921 e (EXPAND_TAC "d1");;
1922 e (COND_CASES_TAC);;
1923 e (ASM_REWRITE_TAC[]);;
1924 e (NEW_GOAL `?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b)`);;
1925 e (ASM_SIMP_TAC[]);;
1926 e (UP_ASM_TAC THEN STRIP_TAC);;
1927 e (ABBREV_TAC `P  = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);;
1928 e (ABBREV_TAC `zz = (@) (P:real->bool)`);;
1929 e (NEW_GOAL `(P:real->bool) zz`);;
1930 e (EXPAND_TAC "zz");;
1931 e (MATCH_MP_TAC SELECT_AX);;
1932 e (EXISTS_TAC `b':real`);;
1933 e (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);;
1934 e (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);;
1935 e (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
1936 e (REPEAT STRIP_TAC);;
1937 e (ASM_REWRITE_TAC[]);;
1938 e (EXPAND_TAC "f3");;
1939
1940 e (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (mxi V ul) u0 u1`);;
1941 e (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);;
1942 e (STRIP_TAC);;
1943 e (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));;
1944 e (STRIP_TAC);;
1945 e (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);;
1946 e (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);;
1947 e (ASM_REWRITE_TAC[]);;
1948 e (EXPAND_TAC "xx");;
1949 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN 
1950    REWRITE_TAC[smallest_angle_line; smallest_angle_set]);;
1951 e (STRIP_TAC);;
1952 e (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, mxi V ul} /\
1953            (!y. y IN convex hull {EL 2 ul, mxi V ul}
1954                 ==> ((y - u0) dot (u1 - u0)) /
1955                     (norm (y - u0) * norm (u1 - u0)) <=
1956                     ((x - u0) dot (u1 - u0)) /
1957                     (norm (x - u0) * norm (u1 - u0))))`);;
1958 e (NEW_GOAL `(Q:real^3->bool) u0`);;
1959 e (REWRITE_TAC[ASSUME `u0 = (@) (Q:real^3->bool)`]);;
1960 e (MATCH_MP_TAC SELECT_AX);;
1961 e (EXPAND_TAC "Q");;
1962 e (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);;
1963 e (STRIP_TAC);;
1964 e (ASM_REWRITE_TAC[]);;
1965
1966 e (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);;
1967 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
1968 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
1969 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
1970 e (UP_ASM_TAC THEN STRIP_TAC);;
1971 e (EXISTS_TAC `v1:real^3` THEN     
1972    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);;
1973 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
1974
1975 e (NEW_GOAL `v0 = u0:real^3`);;
1976 e (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);;
1977 e (ASM_REWRITE_TAC[HD]);;
1978 e (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);;
1979 e (ASM_REWRITE_TAC[HD]);;
1980 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
1981 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
1982 e (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);;
1983 e (UP_ASM_TAC THEN STRIP_TAC);;
1984 e (REWRITE_WITH `EL 2 ul = v2:real^3`);;
1985 e (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);;
1986 e (STRIP_TAC);;
1987
1988 e (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);;
1989 e (REWRITE_TAC[]);;
1990 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
1991 e (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);;
1992 e (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
1993    TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
1994    SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);;
1995 e (COND_CASES_TAC);;
1996 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
1997 e (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);;
1998 e (STRIP_TAC);;
1999 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
2000 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
2001 e (REWRITE_TAC[coplanar]);;
2002 e (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);;
2003 e (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);;
2004 e (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2005    EXISTS_TAC `mxi V ul`);;
2006 e (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));;
2007 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
2008 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
2009 e (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);;
2010 e (STRIP_TAC);;
2011 e (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);;
2012 e (UP_ASM_TAC THEN VECTOR_ARITH_TAC);;
2013 e (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2014 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
2015 e (SET_TAC[]);;
2016
2017 e (UP_ASM_TAC THEN EXPAND_TAC "Q");;
2018 e (STRIP_TAC);;
2019 e (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);;
2020 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2021 e (EXISTS_TAC `mcell 3 V ul`);;
2022 e (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);;
2023 e (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);;
2024 e (COND_CASES_TAC);;
2025 e (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);;
2026 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);;
2027 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
2028 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
2029 e (UP_ASM_TAC THEN STRIP_TAC);;
2030 e (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);;
2031 e (REWRITE_TAC[ASSUME `ul = [v0;v1;v2;v3:real^3]`]);;
2032
2033 e (REWRITE_WITH `v0 = u0:real^3`);;
2034 e (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);;
2035 e (ASM_REWRITE_TAC[HD]);;
2036 e (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);;
2037 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2038    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
2039 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
2040
2041 e (REWRITE_WITH `v1 = u1:real^3`);;
2042 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);;
2043 e (ASM_REWRITE_TAC[HD; TL]);;
2044 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);;
2045 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2046    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
2047 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
2048 e (UP_ASM_TAC THEN STRIP_TAC);;
2049 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; 
2050    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
2051 e (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);;
2052
2053 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2054 e (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);;
2055 e (REWRITE_TAC[ASSUME `ul = [u0; u1; v2; v3:real^3]`;   
2056                CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2057 e (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} = 
2058                  affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);;
2059 e (MATCH_MP_TAC AFFINE_HULL_3_INSERT);;
2060
2061 e (NEW_GOAL `convex hull {EL 2 ul, mxi V ul} SUBSET 
2062              affine hull {EL 2 ul, mxi V ul}`);;
2063 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2064 e (NEW_GOAL `affine hull {EL 2 ul, mxi V ul} SUBSET 
2065              affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);;
2066 e (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);;
2067 e (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);;
2068 e (SET_TAC[]);;
2069 e (UP_ASM_TAC THEN UP_ASM_TAC THEN 
2070    UNDISCH_TAC `u0 IN convex hull {EL 2 ul, mxi V ul}` THEN SET_TAC[]);;
2071 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
2072 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
2073
2074 e (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));;
2075 e (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);;
2076 e (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(mxi V ul)}`);;
2077 e (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);;
2078 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);;
2079 e (ASM_REWRITE_TAC[]);;
2080
2081 e (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);;
2082 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
2083 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
2084 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
2085 e (UP_ASM_TAC THEN STRIP_TAC);;
2086 e (EXISTS_TAC `v1:real^3` THEN     
2087    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);;
2088 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
2089
2090 e (NEW_GOAL `v0 = u0:real^3`);;
2091 e (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);;
2092 e (ASM_REWRITE_TAC[HD]);;
2093 e (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);;
2094 e (ASM_REWRITE_TAC[HD]);;
2095 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
2096 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
2097 e (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);;
2098 e (UP_ASM_TAC THEN STRIP_TAC);;
2099 e (REWRITE_WITH `EL 2 ul = v2:real^3`);;
2100 e (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);;
2101 e (STRIP_TAC);;
2102
2103 e (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);;
2104 e (REWRITE_TAC[]);;
2105 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2106 e (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);;
2107 e (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
2108    TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
2109    SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);;
2110 e (COND_CASES_TAC);;
2111 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2112 e (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);;
2113 e (STRIP_TAC);;
2114 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
2115 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
2116 e (REWRITE_TAC[coplanar]);;
2117 e (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);;
2118 e (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);;
2119 e (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2120    EXISTS_TAC `mxi V ul`);;
2121 e (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));;
2122 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
2123 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
2124 e (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);;
2125 e (STRIP_TAC);;
2126 e (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);;
2127 e (UP_ASM_TAC THEN VECTOR_ARITH_TAC);;
2128 e (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2129 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
2130 e (SET_TAC[]);;
2131
2132 e (STRIP_TAC);;
2133
2134 e (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);;
2135 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2136 e (EXISTS_TAC `mcell 3 V ul`);;
2137 e (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);;
2138 e (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);;
2139 e (COND_CASES_TAC);;
2140 e (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);;
2141 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);;
2142 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
2143 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
2144 e (UP_ASM_TAC THEN STRIP_TAC);;
2145 e (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);;
2146 e (ASM_REWRITE_TAC[]);;
2147
2148 e (REWRITE_WITH `v0 = u0:real^3`);;
2149 e (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);;
2150 e (ASM_REWRITE_TAC[HD]);;
2151 e (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);;
2152 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2153    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
2154 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
2155
2156 e (REWRITE_WITH `v1 = u1:real^3`);;
2157 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);;
2158 e (ASM_REWRITE_TAC[HD; TL]);;
2159 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);;
2160 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2161    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
2162 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
2163 e (UP_ASM_TAC THEN STRIP_TAC);;
2164 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list; 
2165    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
2166
2167 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2168 e (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);;
2169 e (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2170 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
2171 e (ABBREV_TAC `m = mxi V ul`);;
2172 e (NEW_GOAL `mxi V [u0; u1;v2;v3] = m`);;
2173 e (EXPAND_TAC "m" THEN AP_TERM_TAC THEN ASM_REWRITE_TAC[]);;
2174 e (ASM_REWRITE_TAC[]);;
2175 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
2176 e (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);;
2177 e (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);;
2178 e (UNDISCH_TAC `xx IN convex hull {EL 2 ul, m:real^3}`);;
2179 e (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1/\ 1 = SUC 0`; 
2180    CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);;
2181 e (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);;
2182 e (ASM_REWRITE_TAC[]);;
2183
2184 e (STRIP_TAC);;
2185
2186 e (REWRITE_TAC[coplanar]);;
2187 e (NEW_GOAL `~(k2 = &0)`);;
2188 e (EXPAND_TAC "k2");;
2189 e (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);;
2190 e (ASM_REWRITE_TAC[]);;
2191
2192
2193 e (ASM_CASES_TAC `~(v = &0)`);;
2194 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2195    EXISTS_TAC `v2:real^3`);;
2196
2197 e (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));;
2198 e (STRIP_TAC);;
2199 e (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
2200 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
2201 e (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);;
2202 e (EXISTS_TAC `k1 / (k2 * v)`);;
2203 e (EXISTS_TAC `(--k2 * u) / (k2 * v)`);;
2204 e (STRIP_TAC);;
2205 e (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);;
2206 e (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);;
2207 e (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);;
2208 e (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);;
2209 e (MATCH_MP_TAC REAL_DIV_REFL);;
2210 e (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);;
2211
2212 e (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2213                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);;
2214 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
2215 e (REWRITE_WITH
2216   `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = m:real^3  <=> 
2217    ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % m`);;
2218 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
2219 e (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);;
2220 e (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);;
2221 e (ASM_REWRITE_TAC[VECTOR_ARITH 
2222   `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % m <=> 
2223     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);;
2224
2225 e (NEW_GOAL `~(u = &0)`);;
2226 e (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN  
2227    REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);;
2228 e (REAL_ARITH_TAC);;
2229
2230 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2231    EXISTS_TAC `m:real^3`);;
2232 e (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));;
2233 e (STRIP_TAC);;
2234 e (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
2235 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
2236
2237 e (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);;
2238 e (EXISTS_TAC `k1 / (k2 * u)`);;
2239 e (EXISTS_TAC `(--k2 * v) / (k2 * u)`);;
2240 e (STRIP_TAC);;
2241 e (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);;
2242 e (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);;
2243 e (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);;
2244 e (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);;
2245 e (MATCH_MP_TAC REAL_DIV_REFL);;
2246 e (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);;
2247
2248 e (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2249                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);;
2250 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
2251 e (REWRITE_WITH
2252   `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = v2:real^3  <=> 
2253    ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = (k2 * u) % v2`);;
2254 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
2255 e (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);;
2256 e (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);;
2257 e (ASM_REWRITE_TAC[VECTOR_ARITH 
2258   `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=> 
2259     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);;
2260
2261 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
2262
2263 (* ========================================================================== *)
2264
2265 e (ABBREV_TAC `f4 = 
2266   (\ul. (((smallest_angle_line (EL 2 ul)  (EL 3 ul) u0 u1) - u0)
2267    dot (u1 - u0)) / 
2268    (norm ((smallest_angle_line (EL 2 ul)  (EL 3 ul) u0 u1) - u0)
2269    * norm (u1 - u0)))`);;
2270
2271 e (ABBREV_TAC `P4 = {(f4:(real^3)list->real) ul |ul | barV V 3 ul /\
2272                                  ~NULLSET (mcell 4 V ul INTER C) /\
2273                                   truncate_simplex 1 ul = [u0; u1]}`);;
2274
2275 e (NEW_GOAL `~(P4 = {}) ==> (?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);;
2276 e (STRIP_TAC);;
2277 e (MATCH_MP_TAC SUP_FINITE_LEMMA);;
2278 e (ASM_REWRITE_TAC[]);;
2279 e (EXPAND_TAC "P4");;
2280 e (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);;
2281 e (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);;
2282 e (MATCH_MP_TAC FINITE_IMAGE_EXPAND);;
2283 e (MATCH_MP_TAC FINITE_SUBSET);;
2284 e (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
2285                       v0 IN (V INTER ball (u0:real^3, &4)) /\
2286                       v1 IN (V INTER ball (u0, &4)) /\
2287                       u2 IN (V INTER ball (u0, &4)) /\
2288                       u3 IN (V INTER ball (u0, &4)) /\
2289                       y = [v0; v1; u2; u3]}`);;
2290 e (STRIP_TAC);;
2291 e (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);;
2292 e (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);;
2293 e (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);;
2294 e (REPEAT STRIP_TAC);;
2295 e (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);;
2296 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
2297 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
2298 e (UP_ASM_TAC THEN STRIP_TAC);;
2299 e (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN     
2300    EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);;
2301 e (ASM_REWRITE_TAC[]);;
2302 e (NEW_GOAL `v0 = u0:real^3`);;
2303 e (REWRITE_WITH `v0 = HD (x:(real^3)list)`);;
2304 e (ASM_REWRITE_TAC[HD]);;
2305 e (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);;
2306 e (ASM_REWRITE_TAC[HD]);;
2307 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
2308 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
2309 e (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);;
2310 e (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);;
2311 e (EXISTS_TAC `V:real^3->bool`);;
2312 e (ASM_REWRITE_TAC[set_of_list]);;
2313 e (SET_TAC[]);;
2314 e (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);;
2315 e (MATCH_MP_TAC Packing3.BARV_SUBSET);;
2316 e (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);;
2317 e (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);;
2318 e (SET_TAC[]);;
2319
2320 e (ABBREV_TAC `d2 = (if (P4 = {}:real->bool) then c 
2321                     else (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b)))`);;
2322 e (NEW_GOAL `d2 < &1`);;
2323 e (EXPAND_TAC "d2");;
2324 e (COND_CASES_TAC);;
2325 e (ASM_REWRITE_TAC[]);;
2326 e (NEW_GOAL `?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b)`);;
2327 e (ASM_SIMP_TAC[]);;
2328 e (UP_ASM_TAC THEN STRIP_TAC);;
2329 e (ABBREV_TAC `P  = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);;
2330 e (ABBREV_TAC `zz = (@) (P:real->bool)`);;
2331 e (NEW_GOAL `(P:real->bool) zz`);;
2332 e (EXPAND_TAC "zz");;
2333 e (MATCH_MP_TAC SELECT_AX);;
2334 e (EXISTS_TAC `b':real`);;
2335 e (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);;
2336 e (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);;
2337 e (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
2338 e (REPEAT STRIP_TAC);;
2339 e (ASM_REWRITE_TAC[]);;
2340 e (EXPAND_TAC "f4");;
2341
2342 e (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (EL 3 ul) u0 u1`);;
2343 e (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);;
2344 e (STRIP_TAC);;
2345 e (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));;
2346 e (STRIP_TAC);;
2347 e (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);;
2348 e (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);;
2349 e (ASM_REWRITE_TAC[]);;
2350 e (EXPAND_TAC "xx");;
2351 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN 
2352    REWRITE_TAC[smallest_angle_line; smallest_angle_set]);;
2353 e (STRIP_TAC);;
2354 e (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, EL 3 ul} /\
2355            (!y. y IN convex hull {EL 2 ul, EL 3 ul}
2356                 ==> ((y - u0) dot (u1 - u0)) /
2357                     (norm (y - u0) * norm (u1 - u0)) <=
2358                     ((x - u0) dot (u1 - u0)) /
2359                     (norm (x - u0) * norm (u1 - u0))))`);;
2360 e (NEW_GOAL `(Q:real^3->bool) u0`);;
2361 e (ONCE_ASM_REWRITE_TAC[]);;
2362 e (MATCH_MP_TAC SELECT_AX);;
2363 e (EXPAND_TAC "Q");;
2364
2365 e (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);;
2366 e (STRIP_TAC);;
2367 e (ASM_REWRITE_TAC[]);;
2368
2369 e (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);;
2370 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
2371 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
2372 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
2373 e (UP_ASM_TAC THEN STRIP_TAC);;
2374 e (EXISTS_TAC `v1:real^3` THEN     
2375    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);;
2376 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
2377
2378 e (NEW_GOAL `v0 = u0:real^3`);;
2379 e (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);;
2380 e (ASM_REWRITE_TAC[HD]);;
2381 e (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);;
2382 e (ASM_REWRITE_TAC[HD]);;
2383 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
2384 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
2385 e (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);;
2386 e (UP_ASM_TAC THEN STRIP_TAC);;
2387 e (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);;
2388 e (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);;
2389 e (STRIP_TAC);;
2390
2391 e (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);;
2392 e (REWRITE_TAC[]);;
2393 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2394 e (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);;
2395 e (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`; 
2396    ASSUME `ul = [u0; v1; v2; v3:real^3]`]);;
2397 e (COND_CASES_TAC);;
2398
2399 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2400 e (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);;
2401 e (STRIP_TAC);;
2402 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
2403 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
2404 e (REWRITE_TAC[coplanar]);;
2405 e (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);;
2406 e (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);;
2407 e (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2408    EXISTS_TAC `v3:real^3`);;
2409 e (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));;
2410 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
2411 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
2412 e (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);;
2413 e (STRIP_TAC);;
2414 e (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);;
2415 e (UP_ASM_TAC THEN VECTOR_ARITH_TAC);;
2416 e (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2417 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
2418 e (SET_TAC[]);;
2419
2420 e (UP_ASM_TAC THEN EXPAND_TAC "Q");;
2421 e (STRIP_TAC);;
2422 e (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);;
2423 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2424 e (EXISTS_TAC `mcell 4 V ul`);;
2425 e (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);;
2426 e (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);;
2427 e (COND_CASES_TAC);;
2428 e (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);;
2429 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);;
2430 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
2431 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
2432 e (UP_ASM_TAC THEN STRIP_TAC);;
2433 e (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);;
2434 e (ASM_REWRITE_TAC[]);;
2435
2436 e (REWRITE_WITH `v0 = u0:real^3`);;
2437 e (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);;
2438 e (ASM_REWRITE_TAC[HD]);;
2439 e (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);;
2440 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2441    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
2442 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
2443
2444 e (REWRITE_WITH `v1 = u1:real^3`);;
2445 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);;
2446 e (ASM_REWRITE_TAC[HD; TL]);;
2447 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);;
2448 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2449    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
2450 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
2451 e (ASM_REWRITE_TAC[]);;
2452 e (UP_ASM_TAC THEN STRIP_TAC);;
2453
2454 e (ASM_REWRITE_TAC[set_of_list]);;
2455 e (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);;
2456 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2457 e (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);;
2458 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2459 e (REWRITE_WITH `affine hull {u0, u1, v2, v3} = 
2460                  affine hull {u1, v2, v3:real^3}`);;
2461 e (MATCH_MP_TAC AFFINE_HULL_3_INSERT);;
2462
2463 e (NEW_GOAL `convex hull {EL 2 ul, (EL 3 ul):real^3} SUBSET 
2464              affine hull {EL 2 ul, EL 3 ul}`);;
2465 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2466 e (NEW_GOAL `affine hull {EL 2 ul, (EL 3 ul):real^3} SUBSET 
2467              affine hull {u1, v2, v3}`);;
2468 e (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);;
2469 e (ASM_REWRITE_TAC[EL; HD; TL; 
2470    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);;
2471 e (SET_TAC[]);;
2472 e (UP_ASM_TAC THEN UP_ASM_TAC THEN 
2473    UNDISCH_TAC `u0 IN convex hull {EL 2 ul, (EL 3 ul):real^3}` THEN SET_TAC[]);;
2474 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
2475 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
2476
2477 e (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));;
2478 e (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);;
2479 e (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(EL 3 ul):real^3}`);;
2480 e (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);;
2481 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);;
2482 e (ASM_REWRITE_TAC[]);;
2483
2484 e (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);;
2485 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
2486 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
2487 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
2488 e (UP_ASM_TAC THEN STRIP_TAC);;
2489 e (EXISTS_TAC `v1:real^3` THEN     
2490    EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);;
2491 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
2492
2493 e (NEW_GOAL `v0 = u0:real^3`);;
2494 e (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);;
2495 e (ASM_REWRITE_TAC[HD]);;
2496 e (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);;
2497 e (ASM_REWRITE_TAC[HD]);;
2498 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
2499 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
2500 e (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);;
2501 e (UP_ASM_TAC THEN STRIP_TAC);;
2502 e (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);;
2503 e (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);;
2504 e (STRIP_TAC);;
2505
2506 e (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);;
2507 e (REWRITE_TAC[]);;
2508 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2509 e (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);;
2510 e (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`; 
2511    ASSUME `ul = [u0; v1; v2; v3:real^3]`]);;
2512 e (COND_CASES_TAC);;
2513
2514 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2515 e (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);;
2516 e (STRIP_TAC);;
2517 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
2518 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
2519 e (REWRITE_TAC[coplanar]);;
2520 e (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);;
2521 e (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);;
2522 e (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN 
2523    EXISTS_TAC `v3:real^3`);;
2524 e (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));;
2525 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
2526 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
2527 e (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);;
2528 e (STRIP_TAC);;
2529 e (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);;
2530 e (UP_ASM_TAC THEN VECTOR_ARITH_TAC);;
2531 e (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2532 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
2533 e (SET_TAC[]);;
2534
2535 e (STRIP_TAC);;
2536
2537 e (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);;
2538 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2539 e (EXISTS_TAC `mcell 4 V ul`);;
2540 e (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);;
2541 e (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);;
2542 e (COND_CASES_TAC);;
2543 e (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);;
2544 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);;
2545 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
2546 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
2547 e (UP_ASM_TAC THEN STRIP_TAC);;
2548 e (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);;
2549 e (ASM_REWRITE_TAC[]);;
2550
2551 e (REWRITE_WITH `v0 = u0:real^3`);;
2552 e (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);;
2553 e (ASM_REWRITE_TAC[HD]);;
2554 e (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);;
2555 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2556    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
2557 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
2558
2559 e (REWRITE_WITH `v1 = u1:real^3`);;
2560 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);;
2561 e (ASM_REWRITE_TAC[HD; TL]);;
2562 e (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);;
2563 e (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;  
2564    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
2565 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
2566 e (UP_ASM_TAC THEN STRIP_TAC);;
2567 e (ASM_REWRITE_TAC[set_of_list]);;
2568
2569 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2570 e (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);;
2571 e (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
2572 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
2573 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
2574 e (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);;
2575 e (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);;
2576 e (UNDISCH_TAC `xx IN convex hull {EL 2 ul,(EL 3 ul):real^3}`);;
2577 e (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1/\ 1 = SUC 0`; 
2578    CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);;
2579 e (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);;
2580 e (ASM_REWRITE_TAC[]);;
2581
2582 e (STRIP_TAC);;
2583
2584 e (REWRITE_TAC[coplanar]);;
2585 e (NEW_GOAL `~(k2 = &0)`);;
2586 e (EXPAND_TAC "k2");;
2587 e (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);;
2588 e (ASM_REWRITE_TAC[]);;
2589
2590 e (ASM_CASES_TAC `~(v = &0)`);;
2591 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2592    EXISTS_TAC `v2:real^3`);;
2593 e (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));;
2594 e (STRIP_TAC);;
2595 e (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
2596 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
2597 e (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);;
2598 e (EXISTS_TAC `k1 / (k2 * v)`);;
2599 e (EXISTS_TAC `(--k2 * u) / (k2 * v)`);;
2600 e (STRIP_TAC);;
2601 e (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);;
2602 e (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);;
2603 e (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);;
2604 e (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);;
2605 e (MATCH_MP_TAC REAL_DIV_REFL);;
2606 e (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);;
2607
2608 e (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2609                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);;
2610 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
2611 e (REWRITE_WITH
2612   `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = v3:real^3  <=> 
2613    ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % v3`);;
2614 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
2615 e (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);;
2616 e (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);;
2617 e (ASM_REWRITE_TAC[VECTOR_ARITH 
2618   `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % v3 <=> 
2619     k1 % (u1 - u0) = k2 % ((u % v2 + v % v3) - u0)`]);;
2620
2621 e (NEW_GOAL `~(u = &0)`);;
2622 e (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN  
2623    REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);;
2624 e (REAL_ARITH_TAC);;
2625
2626 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN 
2627    EXISTS_TAC `v3:real^3`);;
2628 e (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));;
2629 e (STRIP_TAC);;
2630 e (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);;
2631 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
2632
2633 e (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);;
2634 e (EXISTS_TAC `k1 / (k2 * u)`);;
2635 e (EXISTS_TAC `(--k2 * v) / (k2 * u)`);;
2636 e (STRIP_TAC);;
2637 e (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);;
2638 e (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);;
2639 e (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);;
2640 e (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);;
2641 e (MATCH_MP_TAC REAL_DIV_REFL);;
2642 e (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);;
2643
2644 e (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 = 
2645                             (&1 / x) % (a % u0 + b % u1 + d % u2)`]);;
2646 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
2647 e (REWRITE_WITH
2648   `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = v2:real^3  <=> 
2649    ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = (k2 * u) % v2`);;
2650 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
2651 e (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);;
2652 e (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);;
2653 e (ASM_REWRITE_TAC[VECTOR_ARITH 
2654   `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=> 
2655     k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);;
2656 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
2657
2658 (* ========================================================================== *)
2659
2660 e (ABBREV_TAC `d = max c (max d1 d2)`);;
2661 e (NEW_GOAL `d < &1`);;
2662 e (UNDISCH_TAC `d2 < &1` THEN UNDISCH_TAC `d1 < &1` THEN 
2663    UNDISCH_TAC `&0 < c /\ c < &1`);;
2664 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
2665
2666 (* ========================================================================== *)
2667 e (ABBREV_TAC `D = ball (u0:real^3,r) INTER rcone_gt u0 u1 d`);;
2668 e (NEW_GOAL `D SUBSET C:real^3->bool`);;
2669 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
2670 e (MATCH_MP_TAC (SET_RULE 
2671   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
2672 e (STRIP_TAC);;
2673 e (MATCH_MP_TAC SUBSET_BALL);;
2674 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
2675 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
2676 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
2677
2678 e (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D)
2679           ==> (?k vl.
2680                    2 <= k /\
2681                    barV V 3 vl /\
2682                    X = mcell k V vl /\
2683                    truncate_simplex 1 vl = [u0; u1])`);;
2684 e (REPEAT STRIP_TAC);;
2685 e (FIRST_ASSUM MATCH_MP_TAC);;
2686 e (ASM_REWRITE_TAC[]);;
2687 e (STRIP_TAC);;
2688 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
2689 e (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
2690 e (EXISTS_TAC `X INTER C:real^3->bool`);;
2691 e (ASM_REWRITE_TAC[] THEN UNDISCH_TAC `D SUBSET C:real^3->bool`);;
2692 e (SET_TAC[]);;
2693
2694 (* ========================================================================= *)
2695
2696 e (NEW_GOAL `D = conic_cap (u0:real^3) u1 r d`);;
2697 e (EXPAND_TAC "D" THEN REWRITE_TAC[conic_cap; NORMBALL_BALL]);;
2698
2699 e (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D) ==>
2700    vol (X INTER D) = vol (D) * (dihX V X (u0,u1)) / (&2 * pi)`);;
2701 e (REPEAT STRIP_TAC);;
2702 e (NEW_GOAL `?k vl.
2703                    2 <= k /\
2704                    barV V 3 vl /\
2705                    X = mcell k V vl /\
2706                    truncate_simplex 1 vl = [u0; u1]`);;
2707 e (FIRST_ASSUM MATCH_MP_TAC);;
2708 e (ASM_REWRITE_TAC[]);;
2709 e (UP_ASM_TAC THEN REPEAT STRIP_TAC);;
2710
2711 (* ========================================================================= *)
2712 (*  Case k = 2                                                               *)
2713 (* ========================================================================= *)
2714
2715 e (ASM_CASES_TAC `k = 2`);;
2716 e (ABBREV_TAC `m = mxi V vl`);;
2717 e (ABBREV_TAC `s3 = omega_list_n V vl 3`);;
2718 e (ABBREV_TAC `L = aff_ge{u0, u1} {m, s3:real^3}`);;
2719
2720 e (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);;
2721 e (AP_TERM_TAC);;
2722 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);;
2723 e (LET_TAC);;
2724 e (COND_CASES_TAC);;
2725 e (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);;
2726 e (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);;
2727 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
2728 e (UP_ASM_TAC THEN STRIP_TAC);;
2729
2730 e (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);;
2731 e (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);;
2732 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
2733 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
2734 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
2735 e (ASM_REWRITE_TAC[HD; TL]);;
2736 e (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);;
2737 e (ASM_REWRITE_TAC[HD; TL]);;
2738 e (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);;
2739 e (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
2740    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
2741 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
2742
2743 e (EXPAND_TAC "L");;
2744 e (REWRITE_TAC [SET_RULE `(A INTER B INTER C) INTER D = C INTER D 
2745                        <=> (!x. x IN C INTER D ==> x IN A /\ x IN B)`]);;
2746
2747 e (REPEAT GEN_TAC THEN STRIP_TAC);;
2748 e (NEW_GOAL `x:real^3 IN D`);;
2749 e (UP_ASM_TAC THEN UNDISCH_TAC `D = conic_cap (u0:real^3) u1 r d`);;
2750 e (SET_TAC[]);;
2751 e (UP_ASM_TAC THEN EXPAND_TAC "D" THEN STRIP_TAC);;
2752 e (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a'`);;
2753 e (NEW_GOAL `rcone_gt (u0:real^3) u1 d SUBSET rcone_gt u0 u1 c`);;
2754 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
2755 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
2756 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
2757    `rcone_gt (u0:real^3) u1 c SUBSET W INTER rcone_gt u0 u1 a'`);;
2758 e (SET_TAC[]);;
2759 e (STRIP_TAC);;
2760 e (UP_ASM_TAC THEN SET_TAC[RCONE_GT_SUBSET_RCONE_GE]);;
2761
2762 (* ========================================================================== *)
2763 e (UP_ASM_TAC THEN REWRITE_TAC[rcone_ge; rconesgn; rcone_gt; IN; IN_ELIM_THM]);;
2764 e (STRIP_TAC);;
2765
2766 e (ABBREV_TAC `y = u0 + proj_point (u1 - u0:real^3) (x - u0)`);;
2767 e (NEW_GOAL `orthogonal (x - y) (u1 - u0:real^3)`);;
2768 e (REWRITE_WITH `x - y = (x - u0) - proj_point (u1 - u0) (x - u0:real^3)`);;
2769 e (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);;
2770 e (REWRITE_TAC[GSYM Marchal_cells_2_new.projection_proj_point]);;
2771 e (REWRITE_TAC[orthogonal; Packing3.PROJECTION_ORTHOGONAL]);;
2772
2773 e (NEW_GOAL `norm (x - u0) pow 2 = norm (y - u0) pow 2 + norm (x - y:real^3) pow 2`);;
2774 e (MATCH_MP_TAC PYTHAGORAS);;
2775 e (REWRITE_TAC[orthogonal]);;
2776 e (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = --(c dot (b - a))`]);;
2777 e (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);;
2778 e (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);;
2779 e (REWRITE_TAC[PRO_EXP; DOT_RMUL]);;
2780 e (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);;
2781 e (ASM_REWRITE_TAC[]);;
2782 e (REAL_ARITH_TAC);;
2783
2784 e (NEW_GOAL `norm (x - u1) pow 2 = norm (y - u1) pow 2 + norm (x - y:real^3) pow 2`);;
2785 e (MATCH_MP_TAC PYTHAGORAS);;
2786 e (REWRITE_TAC[orthogonal]);;
2787 e (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = c dot (a - b)`]);;
2788 e (REWRITE_WITH `u1 - y = (u1 - u0) - proj_point (u1 - u0) (x - u0:real^3)`);;
2789 e (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);;
2790 e (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x - a % x = (&1 - a) % x`]);;
2791 e (REWRITE_TAC[DOT_RMUL] THEN DEL_TAC);;
2792 e (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);;
2793 e (ASM_REWRITE_TAC[]);;
2794 e (REAL_ARITH_TAC);;
2795
2796 e (MP_TAC (ASSUME `(x - u0:real^3) dot (u1 - u0) > 
2797                 dist (x,u0) * dist (u1,u0) * a'`));;
2798 e (REWRITE_WITH `(x - u0) dot (u1 - u0) = 
2799                  (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);;
2800 e (VECTOR_ARITH_TAC);;
2801 e (REWRITE_WITH `(x - u1) dot (u0 - u1) = 
2802                  (x - y) dot (u0 - u1) + (y - u1) dot (u0 - u1:real^3)`);;
2803 e (VECTOR_ARITH_TAC);;
2804 e (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);;
2805 e (ASM_REWRITE_TAC[GSYM orthogonal]);;
2806 e (REWRITE_WITH `(x - y) dot (u0 - u1:real^3) = &0`);;
2807 e (ONCE_REWRITE_TAC[VECTOR_ARITH `a dot (u0 - u1) = --(a dot (u1 - u0))`]);;
2808 e (REWRITE_TAC[REAL_ARITH `--a = &0 <=> a = &0`]);;
2809 e (ASM_REWRITE_TAC[GSYM orthogonal]);;
2810 e (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);;
2811
2812 e (STRIP_TAC);;
2813 e (NEW_GOAL `(y - u0) dot (u1 - u0) = norm (y - u0) * norm (u1 - u0:real^3)`);;
2814 e (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);;
2815 e (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);;
2816 e (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);;
2817 e (REWRITE_TAC[PRO_EXP; NORM_MUL; VECTOR_MUL_ASSOC]);;
2818 e (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));;
2819 e (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);;
2820 e (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));;
2821 e (REWRITE_TAC[REAL_ABS_REFL]);;
2822 e (MATCH_MP_TAC REAL_LE_DIV);;
2823 e (REWRITE_TAC[DOT_POS_LE]);;
2824
2825 e (REWRITE_WITH `(x - u0) dot (u1 - u0) = 
2826                  (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);;
2827 e (VECTOR_ARITH_TAC);;
2828 e (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);;
2829 e (ASM_REWRITE_TAC[GSYM orthogonal]);;
2830 e (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);;
2831
2832 e (NEW_GOAL `y IN convex hull {u0, u1:real^3}`);;
2833 e (NEW_GOAL `y IN affine hull {u0, u1:real^3}`);;
2834 e (REWRITE_TAC[AFFINE_HULL_2; IN; IN_ELIM_THM]);;
2835 e (EXPAND_TAC "y" THEN REWRITE_TAC[PRO_EXP]);;
2836 e (ABBREV_TAC `rtemp = ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - 
2837                 u0:real^3))`);;
2838 e (EXISTS_TAC `&1 - rtemp` THEN EXISTS_TAC `rtemp:real`);;
2839 e (STRIP_TAC);;
2840 e (REAL_ARITH_TAC);;
2841 e (VECTOR_ARITH_TAC);;
2842 e (UP_ASM_TAC THEN REWRITE_TAC[IN; AFFINE_HULL_2; CONVEX_HULL_2; IN_ELIM_THM]);;
2843 e (REPEAT STRIP_TAC);;
2844 e (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);;
2845 e (ASM_REWRITE_TAC[]);;
2846
2847 e (NEW_GOAL `y - u0 = v % (u1 - u0:real^3)`);;
2848 e (NEW_GOAL `y - u0 = y - (u + v) % u0:real^3`);;
2849 e (REWRITE_TAC[ASSUME `u + v = &1`; VECTOR_MUL_LID]);;
2850 e (UP_ASM_TAC THEN REWRITE_WITH `y - (u + v) % u0 = v % (u1 - u0:real^3)`);;
2851 e (REWRITE_TAC[ASSUME `y = u % u0 + v % u1:real^3`] THEN VECTOR_ARITH_TAC);;
2852
2853 e (ASM_CASES_TAC `u < &0`);;
2854 e (NEW_GOAL `F`);;
2855 e (NEW_GOAL `norm (y - u0) <= norm (x - u0:real^3)`);;
2856 e (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);;
2857 e (REWRITE_TAC[NORM_POS_LE; ASSUME 
2858   `norm (x - u0:real^3) pow 2 = norm (y - u0) pow 2 + norm (x - y) pow 2`; 
2859    REAL_ARITH `a <= a + b <=> &0 <= b`; REAL_LE_POW_2]);;
2860 e (NEW_GOAL `norm (x - u0:real^3) < &1`);;
2861 e (REWRITE_TAC[GSYM dist] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN 
2862    REWRITE_TAC[GSYM IN_BALL]);;
2863 e (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);;
2864 e (MATCH_MP_TAC SUBSET_BALL);;
2865 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
2866 e (UP_ASM_TAC THEN UNDISCH_TAC 
2867   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);;
2868
2869 e (NEW_GOAL `norm (y - u0) = v * norm (u1:real^3 - u0)`);;
2870 e (ASM_REWRITE_TAC[NORM_MUL]);;
2871
2872 e (REWRITE_WITH `abs v = v`);;
2873 e (REWRITE_TAC[REAL_ABS_REFL]);;
2874 e (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);;
2875 e (NEW_GOAL `&2 <= norm (u1 - u0:real^3)`);;
2876 e (REWRITE_TAC[GSYM dist]);;
2877 e (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);;
2878 e (REPEAT STRIP_TAC);;
2879 e (FIRST_ASSUM MATCH_MP_TAC);;
2880 e (ASM_REWRITE_TAC[]);;
2881 e (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);;
2882 e (ASM_REWRITE_TAC[]);;
2883
2884 e (NEW_GOAL `v * &2 <= v * norm (u1 - u0:real^3)`);;
2885 e (REWRITE_TAC[REAL_ARITH `a * b <= a * c <=> &0 <= a * (c - b)`]);;
2886 e (MATCH_MP_TAC REAL_LE_MUL);;
2887 e (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN UP_ASM_TAC);;
2888 e (REAL_ARITH_TAC);;
2889
2890 e (NEW_GOAL `&1 < v`);;
2891 e (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);;
2892 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
2893    UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
2894 e (UP_ASM_TAC THEN MESON_TAC[]);;
2895
2896 e (ASM_CASES_TAC `v < &0`);;
2897 e (NEW_GOAL `F`);;
2898 e (NEW_GOAL `(y - u0) dot (u1 - u0:real^3) <= &0`);;
2899 e (ASM_REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);;
2900 e (MATCH_MP_TAC REAL_LE_MUL);;
2901 e (REWRITE_TAC[DOT_POS_LE]);;
2902 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
2903
2904 e (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);;
2905 e (MATCH_MP_TAC REAL_LE_MUL);;
2906 e (REWRITE_TAC[DIST_POS_LE]);;
2907 e (MATCH_MP_TAC REAL_LE_MUL);;
2908 e (REWRITE_TAC[DIST_POS_LE]);;
2909 e (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);;
2910 e (STRIP_TAC);;
2911 e (REWRITE_TAC[HL_2]);;
2912 e (MATCH_MP_TAC REAL_LE_MUL);;
2913 e (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);;
2914 e (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);;
2915 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC 
2916  `(y - u0:real^3) dot (u1 - u0) > dist (x,u0) * dist (u1,u0) * a'`);;
2917 e (REAL_ARITH_TAC);;
2918 e (UP_ASM_TAC THEN MESON_TAC[]);;
2919 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
2920
2921 e (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);;
2922 e (MATCH_MP_TAC REAL_LE_MUL);;
2923 e (REWRITE_TAC[DIST_POS_LE]);;
2924 e (MATCH_MP_TAC REAL_LE_MUL);;
2925 e (REWRITE_TAC[DIST_POS_LE]);;
2926 e (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);;
2927 e (STRIP_TAC);;
2928 e (REWRITE_TAC[HL_2]);;
2929 e (MATCH_MP_TAC REAL_LE_MUL);;
2930 e (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);;
2931 e (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);;
2932 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
2933
2934 e (NEW_GOAL `(y - u1) dot (u0 - u1) = norm (y - u1) * norm (u0 - u1:real^3)`);;
2935 e (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);;
2936 e (REWRITE_WITH `y - u1 = proj_point (u1 - u0) (x - u0:real^3) - (u1 - u0)`);;
2937 e (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);;
2938 e (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x % a - a = (x - &1) % a`; NORM_MUL;
2939                VECTOR_MUL_ASSOC]);;
2940 e (REWRITE_WITH ` 
2941    (norm (u0 - u1) *
2942    (((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) - &1)) % (u1 - u0) =  
2943    (norm (u0 - u1:real^3) *
2944    (&1 - ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)))) % (u0 - u1)`);;
2945 e (VECTOR_ARITH_TAC);;
2946 e (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));;
2947 e (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);;
2948 e (REWRITE_TAC[NORM_ARITH `norm (a - b) = norm (b - a)`]);;
2949 e (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));;
2950 e (REWRITE_TAC[REAL_ARITH `abs (x - &1) = abs (&1 - x)`]);;
2951 e (REWRITE_TAC[REAL_ABS_REFL; REAL_ARITH `&0 <= a - b <=> b <= a`]);;
2952 e (REWRITE_WITH `((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) <= &1
2953   <=> ((x - u0) dot (u1 - u0)) <= &1 * ((u1 - u0) dot (u1 - u0:real^3))`);;
2954 e (MATCH_MP_TAC REAL_LE_LDIV_EQ);;
2955 e (REWRITE_TAC[DOT_POS_LT; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);;
2956 e (ASM_REWRITE_TAC[]);;
2957 e (NEW_GOAL `(x - u0) dot (u1 - u0) <= norm (x - u0) * norm (u1 - u0:real^3)`);;
2958 e (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);;
2959
2960 e (NEW_GOAL `norm (x - u0) * norm (u1 - u0) <= &1 * norm (u1 - u0:real^3)`);;
2961 e (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);;
2962 e (MATCH_MP_TAC REAL_LE_MUL);;
2963 e (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);;
2964 e (MATCH_MP_TAC (REAL_ARITH `a < x ==> a <= x`));;
2965 e (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);;
2966 e (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);;
2967 e (MATCH_MP_TAC SUBSET_BALL);;
2968 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
2969 e (UP_ASM_TAC THEN UNDISCH_TAC 
2970   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);;
2971 e (REWRITE_TAC[GSYM NORM_POW_2; REAL_ARITH `&1 * a pow 2 = a * a`]);;
2972 e (NEW_GOAL `&1 * norm (u1 - u0) <= norm (u1 - u0) * norm (u1 - u0:real^3)`);;
2973 e (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);;
2974 e (MATCH_MP_TAC REAL_LE_MUL);;
2975 e (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);;
2976 e (MATCH_MP_TAC (REAL_ARITH `&2 <= x ==> &1 <= x`));;
2977 e (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);;
2978 e (STRIP_TAC);;
2979 e (FIRST_ASSUM MATCH_MP_TAC);;
2980 e (ASM_REWRITE_TAC[]);;
2981 e (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);;
2982 e (ASM_REWRITE_TAC[]);;
2983 e (UNDISCH_TAC `(x - u0:real^3) dot (u1 - u0) <= 
2984                 norm (x - u0) * norm (u1 - u0)` THEN 
2985    UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
2986 e (ASM_REWRITE_TAC[dist]);;
2987 e (REWRITE_TAC[REAL_ARITH `a * b >= x * b * c <=> &0 <= b * (a - x * c)`]);;
2988 e (MATCH_MP_TAC REAL_LE_MUL);;
2989 e (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);;
2990 e (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);;
2991 e (STRIP_TAC);;
2992
2993 e (MATCH_MP_TAC REAL_LE_MUL);;
2994 e (REWRITE_TAC[NORM_POS_LE]);;
2995 e (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);;
2996 e (STRIP_TAC);;
2997 e (REWRITE_TAC[HL_2]);;
2998 e (MATCH_MP_TAC REAL_LE_MUL);;
2999 e (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);;
3000 e (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);;
3001 e (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);;
3002 e (ASM_REWRITE_TAC[]);;
3003 e (REWRITE_TAC[REAL_ARITH `(a + b) * x <= a <=> b * x <= (&1 - x) * a`]);;
3004
3005 e (UNDISCH_TAC `(y - u0) dot (u1 - u0) > dist (x,u0) * dist (u1,u0:real^3) * a'`);;
3006 e (ASM_REWRITE_TAC[dist]);;
3007 e (REWRITE_TAC[REAL_ARITH `a * b > x * b * c <=> &0 < b * (a - x * c)`]);;
3008 e (REWRITE_TAC[REAL_MUL_POS_LT]);;
3009 e (REWRITE_WITH `~(norm (u1 - u0:real^3) < &0 /\ 
3010                    norm (y - u0) - norm (x - u0) * a' < &0)`);;
3011 e (NEW_GOAL `&0 <= norm (u1 - u0:real^3)`);;
3012 e (REWRITE_TAC[NORM_POS_LE]);;
3013 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
3014 e (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);;
3015 e (REWRITE_WITH `norm (x - u0) * a' < norm (y - u0:real^3) <=> 
3016                 (norm (x - u0) * a') pow 2 < norm (y - u0) pow 2`);;
3017 e (MATCH_MP_TAC Pack1.bp_bdt);;
3018 e (STRIP_TAC);;
3019 e (MATCH_MP_TAC REAL_LE_MUL);;
3020 e (REWRITE_TAC[NORM_POS_LE]);;
3021 e (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);;
3022 e (STRIP_TAC);;
3023 e (REWRITE_TAC[HL_2]);;
3024 e (MATCH_MP_TAC REAL_LE_MUL);;
3025 e (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);;
3026 e (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);;
3027 e (REWRITE_TAC[NORM_POS_LE]);;
3028
3029 e (ASM_REWRITE_TAC[REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);;
3030 e (REWRITE_TAC[REAL_ARITH `(a + b) * x < a <=> b * x < (&1 - x) * a`]);;
3031 e (STRIP_TAC);;
3032  
3033 e (NEW_GOAL `(&1 - a' pow 2) * norm (y - u0) pow 2 <= 
3034              (&1 - a' pow 2) * norm (y - u1:real^3) pow 2`);;
3035 e (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= a * (y - x)`]);;
3036 e (MATCH_MP_TAC REAL_LE_MUL);;
3037 e (STRIP_TAC);;
3038 e (REWRITE_TAC[REAL_ARITH `&0 <= &1 - b <=> b <= &1 pow 2`]);;
3039 e (REWRITE_WITH `a' pow 2 <= &1 pow 2 <=> a' <= &1`);;
3040 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3041 e (MATCH_MP_TAC Collect_geom.POW2_COND);;
3042 e (REWRITE_TAC[REAL_ARITH `&0 <= &1`]);;
3043 e (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);;
3044 e (STRIP_TAC);;
3045 e (REWRITE_TAC[HL_2]);;
3046 e (MATCH_MP_TAC REAL_LE_MUL);;
3047 e (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);;
3048 e (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);;
3049
3050 e (EXPAND_TAC "a'");;
3051 e (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);;
3052 e (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);;
3053 e (UNDISCH_TAC `hl [u0; u1:real^3] < sqrt (&2)` THEN REAL_ARITH_TAC);;
3054 e (NEW_GOAL `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2`);;
3055 e (REWRITE_WITH `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2 <=>
3056                  norm (x - u0)  <= norm (x - u1:real^3)`);;
3057 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3058 e (MATCH_MP_TAC Collect_geom.POW2_COND);;
3059 e (REWRITE_TAC[NORM_POS_LE]);;
3060 e (MATCH_MP_TAC (REAL_ARITH `&2 * x <= x + y ==> x <= y`));;
3061 e (REWRITE_TAC[GSYM dist]);;
3062
3063 e (NEW_GOAL `dist (x, u0:real^3) < &1`);;
3064 e (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);;
3065 e (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);;
3066 e (MATCH_MP_TAC SUBSET_BALL);;
3067 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
3068 e (UP_ASM_TAC THEN UNDISCH_TAC 
3069   `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);;
3070 e (NEW_GOAL `&2 * dist (x, u0:real^3) < &2`);;
3071 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
3072 e (NEW_GOAL `&2 <= dist (x, u0) + dist (x, u1:real^3)`);;
3073 e (NEW_GOAL `&2 <= dist (u0, u1:real^3)`);;
3074 e (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);;
3075 e (STRIP_TAC);;
3076 e (FIRST_ASSUM MATCH_MP_TAC);;
3077 e (ASM_REWRITE_TAC[]);;
3078 e (ONCE_REWRITE_TAC[MESON[IN] `V a <=> a:real^3 IN V`]);;
3079 e (ASM_REWRITE_TAC[]);;
3080
3081 e (NEW_GOAL `dist (u0, u1:real^3) <= dist (u0, x) + dist (x, u1)`);;
3082 e (REWRITE_TAC[DIST_TRIANGLE]);;
3083 e (UP_ASM_TAC THEN REWRITE_TAC[DIST_SYM]);;
3084 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
3085 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
3086 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);;
3087 e (REAL_ARITH_TAC);;
3088 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
3089
3090 e (NEW_GOAL `F`);;
3091 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
3092 e (REWRITE_TAC[]);;
3093 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3094 e (EXISTS_TAC `X INTER C:real^3->bool`);;
3095 e (ASM_SIMP_TAC [SET_RULE `A SUBSET B ==> X INTER A SUBSET X INTER B`]);;
3096 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; SET_RULE `{} INTER s = {}`]);;
3097 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
3098 e (UP_ASM_TAC THEN MESON_TAC[]);;
3099
3100 e (NEW_GOAL `~coplanar {u0, u1:real^3, m, s3}`);;
3101 e (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);;
3102 e (STRIP_TAC);;
3103 e (NEW_GOAL `NULLSET X`);;
3104 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3105 e (EXISTS_TAC `affine hull {u0, u1, m, s3:real^3}`);;
3106 e (STRIP_TAC);;
3107 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
3108 e (UP_ASM_TAC THEN MESON_TAC[]);;
3109 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);;
3110 e (COND_CASES_TAC);;
3111 e (LET_TAC);;
3112 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> M INTER N INTER A SUBSET B`));;
3113
3114 e (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);;
3115 e (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);;
3116 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3117 e (UP_ASM_TAC THEN STRIP_TAC);;
3118 e (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);;
3119 e (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);;
3120 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3121 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
3122 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
3123 e (ASM_REWRITE_TAC[HD; TL]);;
3124 e (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);;
3125 e (ASM_REWRITE_TAC[HD; TL]);;
3126 e (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);;
3127 e (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;  
3128    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
3129 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
3130 e (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1} UNION {m:real^3, s3}`);;
3131 e (SET_TAC[]);;
3132 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
3133 e (SET_TAC[]);;
3134 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
3135 e (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3136 e (EXISTS_TAC `X:real^3->bool`);;
3137 e (ASM_REWRITE_TAC[] THEN SET_TAC[]);;
3138
3139 (* ========================================================================= *)
3140 e (ASM_CASES_TAC `azim u0 u1 m (s3:real^3) < pi`);;
3141 e (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m s3)`);;
3142 e (ASM_SIMP_TAC[WEDGE_LUNE]);;
3143 e (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
3144                  conic_cap u0 u1 r d INTER L`);;
3145 e (SET_TAC[]);;
3146 e (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);;
3147 e (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
3148    aff_gt {u0, u1} {m, s3} DIFF conic_cap u0 u1 r d INTER L = {}`);;
3149 e (EXPAND_TAC "L");;
3150 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));;
3151 e (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);;
3152 e (REWRITE_TAC[SET_RULE `A UNION {} = A`]);;
3153 e (EXPAND_TAC "L");;
3154
3155 e (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3156                  aff_gt {u0, u1} {m, s3} UNION 
3157    UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN  {m, s3}}`);;
3158 e (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);;
3159 e (REWRITE_TAC[Geomdetail.FINITE6]);;
3160 e (REWRITE_TAC[DISJOINT]);;
3161
3162 e (ASM_CASES_TAC `m IN {u0, u1:real^3}`);;
3163 e (NEW_GOAL `F`);;
3164 e (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);;
3165 e (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);;
3166 e (UP_ASM_TAC THEN SET_TAC[]);;
3167 e (REWRITE_TAC[COPLANAR_3]);;
3168 e (UP_ASM_TAC THEN MESON_TAC[]);;
3169
3170 e (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);;
3171 e (NEW_GOAL `F`);;
3172 e (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);;
3173 e (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);;
3174 e (UP_ASM_TAC THEN SET_TAC[]);;
3175 e (REWRITE_TAC[COPLANAR_3]);;
3176 e (UP_ASM_TAC THEN MESON_TAC[]);;
3177 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
3178
3179 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3180 e (EXISTS_TAC 
3181   `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);;
3182 e (STRIP_TAC);;
3183 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3184 e (EXISTS_TAC 
3185   `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);;
3186 e (STRIP_TAC);;
3187 e (MATCH_MP_TAC NEGLIGIBLE_UNION);;
3188 e (STRIP_TAC);;
3189
3190 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3191 e (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);;
3192 e (STRIP_TAC);;
3193 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
3194 e (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);;
3195 e (SET_TAC[]);;
3196 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
3197 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3198 e (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);;
3199 e (STRIP_TAC);;
3200 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
3201 e (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);;
3202 e (SET_TAC[]);;
3203 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
3204 e (REWRITE_TAC[SET_RULE 
3205   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
3206          aff_ge {u0, u1} ({m, s3} DELETE s3) 
3207    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);;
3208 e (MATCH_MP_TAC (SET_RULE 
3209   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));;
3210 e (STRIP_TAC);;
3211 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
3212 e (STRIP_TAC);;
3213 e (SET_TAC[]);;
3214
3215 e (REWRITE_TAC[DISJOINT]);;
3216 e (ASM_CASES_TAC `m IN {u0, u1:real^3}`);;
3217 e (NEW_GOAL `F`);;
3218 e (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);;
3219 e (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);;
3220 e (UP_ASM_TAC THEN SET_TAC[]);;
3221 e (REWRITE_TAC[COPLANAR_3]);;
3222 e (UP_ASM_TAC THEN MESON_TAC[]);;
3223 e (UP_ASM_TAC THEN SET_TAC[]);;
3224
3225 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
3226 e (STRIP_TAC);;
3227 e (SET_TAC[]);;
3228 e (REWRITE_TAC[DISJOINT]);;
3229 e (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);;
3230 e (NEW_GOAL `F`);;
3231 e (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);;
3232 e (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);;
3233 e (UP_ASM_TAC THEN SET_TAC[]);;
3234 e (REWRITE_TAC[COPLANAR_3]);;
3235 e (UP_ASM_TAC THEN MESON_TAC[]);;
3236 e (UP_ASM_TAC THEN SET_TAC[]);;
3237
3238 e (SET_TAC[]);;
3239
3240 e (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);;
3241 e (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m s3) =
3242              (if &1 < d \/ r < &0
3243               then &0
3244               else azim u0 u1 m s3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);;
3245 e (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);;
3246 e (STRIP_TAC);;
3247 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3248 e (EXISTS_TAC `s3:real^3`);;
3249 e (ASM_REWRITE_TAC[]);;
3250 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3251 e (EXISTS_TAC `m:real^3`);;
3252 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
3253 e (ASM_REWRITE_TAC[]);;
3254
3255 e (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);;
3256 e (COND_CASES_TAC);;
3257 e (NEW_GOAL `F`);;
3258 e (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
3259    UP_ASM_TAC THEN REAL_ARITH_TAC);;
3260 e (UP_ASM_TAC THEN MESON_TAC[]);;
3261
3262 e (REWRITE_WITH `azim (u0:real^3) u1 m s3 = dihV u0 u1 m s3`);;
3263 e (MATCH_MP_TAC AZIM_DIHV_SAME);;
3264 e (ASM_REWRITE_TAC[]);;
3265 e (STRIP_TAC);;
3266 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3267 e (EXISTS_TAC `s3:real^3`);;
3268 e (ASM_REWRITE_TAC[]);;
3269 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3270 e (EXISTS_TAC `m:real^3`);;
3271 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
3272 e (ASM_REWRITE_TAC[]);;
3273
3274 e (REWRITE_TAC[dihX]);;
3275 e (COND_CASES_TAC);;
3276 e (NEW_GOAL `F`);;
3277 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
3278 e (REWRITE_TAC[]);;
3279 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3280 e (EXISTS_TAC `X:real^3->bool`);;
3281 e (ASM_REWRITE_TAC[] THEN SET_TAC[]);;
3282 e (UP_ASM_TAC THEN MESON_TAC[]);;
3283
3284 e (LET_TAC);;
3285
3286 e (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);;
3287 e (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3288            ul IN barV V 3 /\
3289            X = mcell k V ul /\
3290            initial_sublist [u0; u1] ul)`);;
3291 e (STRIP_TAC);;
3292 e (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);;
3293 e (MATCH_MP_TAC SELECT_AX);;
3294 e (EXISTS_TAC `(2, vl:(real^3)list)`);;
3295 e (EXPAND_TAC "P");;
3296 e (REWRITE_TAC[BETA_THM]);;
3297 e (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);;
3298 e (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);;
3299 e (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
3300 e (ASM_REWRITE_TAC[]);;
3301
3302 e (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);;
3303 e (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);;
3304 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3305 e (UP_ASM_TAC THEN STRIP_TAC);;
3306 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
3307 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);;
3308 e (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);;
3309
3310 e (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);;
3311 e (MATCH_MP_TAC Ajripqn.AJRIPQN);;
3312 e (ASM_REWRITE_TAC[]);;
3313 e (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);;
3314 e (SET_TAC[ASSUME `X = mcell k' V ul`; 
3315                ASSUME `X = mcell k V vl`; ASSUME `k = 2`]);;
3316 e (REPEAT STRIP_TAC);;
3317 e (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
3318    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);;
3319 e (SET_TAC[]);;
3320 e (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);;
3321
3322 e (COND_CASES_TAC);;
3323 e (REWRITE_TAC[dihu2]);;
3324
3325 e (REWRITE_WITH `omega_list_n V ul 3 = s3`);;
3326 e (EXPAND_TAC "s3");;
3327 e (NEW_GOAL `2  = 2 /\
3328              (!k. 2 - 1 <= k /\ k <= 3
3329                   ==> omega_list_n V ul k = omega_list_n V vl k)`);;
3330 e (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);;
3331 e (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);;
3332 e (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);;
3333 e (ASM_REWRITE_TAC[]);;
3334 e (UP_ASM_TAC THEN STRIP_TAC);;
3335
3336 e (FIRST_ASSUM MATCH_MP_TAC);;
3337 e (ARITH_TAC);;
3338
3339 e (REWRITE_WITH `mxi V ul = m`);;
3340 e (EXPAND_TAC "m");;
3341 e (MATCH_MP_TAC MCELL_ID_MXI);;
3342 e (EXISTS_TAC `2` THEN EXISTS_TAC `2`);;
3343 e (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);;
3344 e (STRIP_TAC);;
3345
3346 e (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);;
3347 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3348 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
3349 e (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
3350                  CARD (set_of_list vl) = 3 + 1`);;
3351 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
3352 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3353 e (ARITH_TAC);;
3354 e (ASM_REWRITE_TAC[HD]);;
3355
3356 e (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);;
3357 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3358 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
3359 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3360                  CARD (set_of_list ul) = 3 + 1`);;
3361 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
3362 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3363 e (ARITH_TAC);;
3364
3365 e (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);;
3366 e (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
3367 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
3368 e (REWRITE_TAC[HD]);;
3369 e (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);;
3370 e (ASM_REWRITE_TAC[]);;
3371
3372 e (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);;
3373 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
3374 e (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);;
3375 e (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
3376 e (ASM_REWRITE_TAC[]);;
3377
3378 e (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);;
3379 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3380 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
3381 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3382                  CARD (set_of_list ul) = 3 + 1`);;
3383 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
3384 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3385 e (ARITH_TAC);;
3386
3387 e (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);;
3388 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3389 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
3390 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3391                  CARD (set_of_list ul) = 3 + 1`);;
3392 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
3393 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3394 e (ARITH_TAC);;
3395 e (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);;
3396 e (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);;
3397 e (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);;
3398 e (AP_THM_TAC THEN AP_TERM_TAC);;
3399
3400 e (REWRITE_WITH 
3401   `measurable (conic_cap u0 u1 r d) /\
3402              vol (conic_cap u0 u1 r d) =
3403              (if u1 = u0 \/ &1 <= d \/ r < &0
3404               then &0
3405               else &2 / &3 * pi * (&1 - d) * r pow 3)`);;
3406 e (MATCH_MP_TAC VOLUME_CONIC_CAP);;
3407 e (EXPAND_TAC "d");;
3408 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
3409 e (COND_CASES_TAC);;
3410 e (NEW_GOAL `F`);;
3411 e (UP_ASM_TAC THEN STRIP_TAC);;
3412 e (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);;
3413 e (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
3414 e (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
3415 e (UP_ASM_TAC THEN MESON_TAC[]);;
3416 e (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);;
3417
3418 e (REWRITE_WITH `max d (--(&1)) = d`);;
3419 e (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));;
3420 e (REWRITE_TAC[REAL_NEG_LT0]);;
3421 e (STRIP_TAC);;
3422 e (EXPAND_TAC "d");;
3423 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
3424 e (REAL_ARITH_TAC);;
3425
3426 e (REWRITE_WITH `
3427   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
3428   ((&2 * pi) / (&2 * pi))`);;
3429 e (REAL_ARITH_TAC);;
3430 e (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);;
3431 e (MATCH_MP_TAC REAL_DIV_REFL);;
3432 e (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);;
3433 e (REAL_ARITH_TAC);;
3434 e (NEW_GOAL `F`);;
3435 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
3436 e (UP_ASM_TAC THEN MESON_TAC[]);;
3437
3438 (* ========================================================================= *)
3439 (* OK here *)
3440
3441 e (ASM_CASES_TAC `azim u0 u1 s3 (m:real^3) < pi`);;
3442 e (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);;
3443 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
3444 e (STRIP_TAC);;
3445 e (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 s3 m)`);;
3446 e (ASM_SIMP_TAC[WEDGE_LUNE]);;
3447 e (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
3448                  conic_cap u0 u1 r d INTER L`);;
3449 e (SET_TAC[]);;
3450 e (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);;
3451
3452 e (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
3453    aff_gt {u0, u1} {s3, m} DIFF conic_cap u0 u1 r d INTER L = {}`);;
3454 e (EXPAND_TAC "L");;
3455 e (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);;
3456 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));;
3457 e (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);;
3458 e (REWRITE_TAC[SET_RULE `A UNION {} = A`]);;
3459 e (EXPAND_TAC "L");;
3460 e (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);;
3461
3462 e (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3463                  aff_gt {u0, u1} {m, s3} UNION 
3464    UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN  {m, s3}}`);;
3465 e (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);;
3466 e (REWRITE_TAC[Geomdetail.FINITE6]);;
3467 e (REWRITE_TAC[DISJOINT]);;
3468
3469 e (ASM_CASES_TAC `m IN {u0, u1:real^3}`);;
3470 e (NEW_GOAL `F`);;
3471 e (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);;
3472 e (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);;
3473 e (UP_ASM_TAC THEN SET_TAC[]);;
3474 e (REWRITE_TAC[COPLANAR_3]);;
3475 e (UP_ASM_TAC THEN MESON_TAC[]);;
3476
3477 e (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);;
3478 e (NEW_GOAL `F`);;
3479 e (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);;
3480 e (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);;
3481 e (UP_ASM_TAC THEN SET_TAC[]);;
3482 e (REWRITE_TAC[COPLANAR_3]);;
3483 e (UP_ASM_TAC THEN MESON_TAC[]);;
3484 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
3485
3486 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3487 e (EXISTS_TAC 
3488   `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);;
3489 e (STRIP_TAC);;
3490 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3491 e (EXISTS_TAC 
3492   `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);;
3493 e (STRIP_TAC);;
3494 e (MATCH_MP_TAC NEGLIGIBLE_UNION);;
3495 e (STRIP_TAC);;
3496
3497 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3498 e (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);;
3499 e (STRIP_TAC);;
3500 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
3501 e (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);;
3502 e (SET_TAC[]);;
3503 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
3504 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3505 e (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);;
3506 e (STRIP_TAC);;
3507 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
3508 e (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);;
3509 e (SET_TAC[]);;
3510 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
3511 e (REWRITE_TAC[SET_RULE 
3512   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
3513          aff_ge {u0, u1} ({m, s3} DELETE s3) 
3514    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);;
3515 e (MATCH_MP_TAC (SET_RULE 
3516   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));;
3517 e (STRIP_TAC);;
3518 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
3519 e (STRIP_TAC);;
3520 e (SET_TAC[]);;
3521
3522 e (REWRITE_TAC[DISJOINT]);;
3523 e (ASM_CASES_TAC `m IN {u0, u1:real^3}`);;
3524 e (NEW_GOAL `F`);;
3525 e (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);;
3526 e (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);;
3527 e (UP_ASM_TAC THEN SET_TAC[]);;
3528 e (REWRITE_TAC[COPLANAR_3]);;
3529 e (UP_ASM_TAC THEN MESON_TAC[]);;
3530 e (UP_ASM_TAC THEN SET_TAC[]);;
3531
3532 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
3533 e (STRIP_TAC);;
3534 e (SET_TAC[]);;
3535 e (REWRITE_TAC[DISJOINT]);;
3536 e (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);;
3537 e (NEW_GOAL `F`);;
3538 e (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);;
3539 e (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);;
3540 e (UP_ASM_TAC THEN SET_TAC[]);;
3541 e (REWRITE_TAC[COPLANAR_3]);;
3542 e (UP_ASM_TAC THEN MESON_TAC[]);;
3543 e (UP_ASM_TAC THEN SET_TAC[]);;
3544
3545 e (SET_TAC[]);;
3546
3547 e (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);;
3548 e (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 s3 m) =
3549              (if &1 < d \/ r < &0
3550               then &0
3551               else azim u0 u1 s3 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);;
3552 e (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);;
3553 e (STRIP_TAC);;
3554 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3555 e (EXISTS_TAC `s3:real^3`);;
3556 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
3557 e (ASM_REWRITE_TAC[]);;
3558 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3559 e (EXISTS_TAC `m:real^3`);;
3560 e (ASM_REWRITE_TAC[]);;
3561
3562 e (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);;
3563 e (COND_CASES_TAC);;
3564 e (NEW_GOAL `F`);;
3565
3566 e (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
3567    UP_ASM_TAC THEN REAL_ARITH_TAC);;
3568 e (UP_ASM_TAC THEN MESON_TAC[]);;
3569
3570 e (REWRITE_WITH `azim (u0:real^3) u1 s3 m = dihV u0 u1 s3 m`);;
3571 e (MATCH_MP_TAC AZIM_DIHV_SAME);;
3572 e (ASM_REWRITE_TAC[]);;
3573 e (STRIP_TAC);;
3574
3575 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3576 e (EXISTS_TAC `m:real^3`);;
3577 e (ASM_REWRITE_TAC[]);;
3578 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3579 e (EXISTS_TAC `s3:real^3`);;
3580 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
3581 e (ASM_REWRITE_TAC[]);;
3582
3583 e (REWRITE_TAC[dihX]);;
3584 e (COND_CASES_TAC);;
3585 e (NEW_GOAL `F`);;
3586 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
3587 e (REWRITE_TAC[]);;
3588 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3589 e (EXISTS_TAC `X:real^3->bool`);;
3590 e (ASM_REWRITE_TAC[] THEN SET_TAC[]);;
3591 e (UP_ASM_TAC THEN MESON_TAC[]);;
3592
3593 e (LET_TAC);;
3594
3595 e (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);;
3596 e (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3597            ul IN barV V 3 /\
3598            X = mcell k V ul /\
3599            initial_sublist [u0; u1] ul)`);;
3600 e (STRIP_TAC);;
3601 e (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);;
3602 e (MATCH_MP_TAC SELECT_AX);;
3603 e (EXISTS_TAC `(2, vl:(real^3)list)`);;
3604 e (EXPAND_TAC "P");;
3605 e (REWRITE_TAC[BETA_THM]);;
3606 e (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);;
3607 e (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);;
3608 e (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
3609 e (ASM_REWRITE_TAC[]);;
3610
3611 e (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);;
3612 e (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);;
3613 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3614 e (UP_ASM_TAC THEN STRIP_TAC);;
3615 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
3616 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);;
3617 e (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);;
3618
3619 e (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);;
3620 e (MATCH_MP_TAC Ajripqn.AJRIPQN);;
3621 e (ASM_REWRITE_TAC[]);;
3622 e (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);;
3623 e (REWRITE_TAC[ASSUME `X = mcell k V vl`; GSYM (ASSUME `X = mcell k' V ul`);
3624    ASSUME `k = 2`]);;
3625 e (SET_TAC[]);;
3626 e (REPEAT STRIP_TAC);;
3627 e (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
3628    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);;
3629 e (SET_TAC[]);;
3630 e (UNDISCH_TAC `~NULLSET X` THEN UP_ASM_TAC THEN MESON_TAC[]);;
3631
3632 e (COND_CASES_TAC);;
3633 e (REWRITE_TAC[dihu2]);;
3634 e (REWRITE_WITH `omega_list_n V ul 3 = s3`);;
3635 e (EXPAND_TAC "s3");;
3636 e (NEW_GOAL `2  = 2 /\
3637              (!k. 2 - 1 <= k /\ k <= 3
3638                   ==> omega_list_n V ul k = omega_list_n V vl k)`);;
3639 e (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);;
3640 e (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);;
3641 e (STRIP_TAC);;
3642 e (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3643    ASSUME `k = 2`; ASSUME `k' = 2`]);;
3644 e (REWRITE_WITH `mcell 2 V ul = X`);;
3645 e (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);;
3646 e (ASM_REWRITE_TAC[]);;
3647 e (UP_ASM_TAC THEN STRIP_TAC);;
3648 e (FIRST_ASSUM MATCH_MP_TAC);;
3649 e (ARITH_TAC);;
3650
3651 e (REWRITE_WITH `mxi V ul = m`);;
3652 e (EXPAND_TAC "m");;
3653 e (MATCH_MP_TAC MCELL_ID_MXI);;
3654 e (EXISTS_TAC `2` THEN EXISTS_TAC `2`);;
3655 e (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);;
3656 e (STRIP_TAC);;
3657
3658 e (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);;
3659 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3660 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
3661 e (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ 
3662                  CARD (set_of_list vl) = 3 + 1`);;
3663 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
3664 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3665 e (ARITH_TAC);;
3666 e (ASM_REWRITE_TAC[HD]);;
3667
3668 e (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);;
3669 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3670 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
3671 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3672                  CARD (set_of_list ul) = 3 + 1`);;
3673 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
3674 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3675 e (ARITH_TAC);;
3676
3677 e (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);;
3678 e (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
3679 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
3680 e (REWRITE_TAC[HD]);;
3681
3682 e (STRIP_TAC);;
3683 e (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3684    ASSUME `k = 2`; ASSUME `k' = 2`]);;
3685 e (REWRITE_WITH `mcell 2 V ul = X`);;
3686 e (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);;
3687 e (ASM_REWRITE_TAC[]);;
3688
3689 e (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);;
3690 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
3691 e (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);;
3692 e (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
3693 e (ASM_REWRITE_TAC[]);;
3694
3695 e (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);;
3696 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3697 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
3698 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3699                  CARD (set_of_list ul) = 3 + 1`);;
3700 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
3701 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3702 e (ARITH_TAC);;
3703
3704 e (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);;
3705 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
3706 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
3707 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
3708                  CARD (set_of_list ul) = 3 + 1`);;
3709 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
3710 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3711 e (ARITH_TAC);;
3712 e (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);;
3713 e (REWRITE_TAC[DIHV_SYM_2]);;
3714 e (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);;
3715
3716 e (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);;
3717 e (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);;
3718 e (AP_THM_TAC THEN AP_TERM_TAC);;
3719 e (REWRITE_WITH 
3720   `measurable (conic_cap u0 u1 r d) /\
3721              vol (conic_cap u0 u1 r d) =
3722              (if u1 = u0 \/ &1 <= d \/ r < &0
3723               then &0
3724               else &2 / &3 * pi * (&1 - d) * r pow 3)`);;
3725 e (MATCH_MP_TAC VOLUME_CONIC_CAP);;
3726 e (EXPAND_TAC "d");;
3727 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
3728 e (COND_CASES_TAC);;
3729 e (NEW_GOAL `F`);;
3730 e (UP_ASM_TAC THEN STRIP_TAC);;
3731 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);;
3732
3733 e (UP_ASM_TAC THEN UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);;
3734 e (UP_ASM_TAC THEN UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);;
3735 e (UP_ASM_TAC THEN MESON_TAC[]);;
3736
3737 e (REWRITE_WITH `max d (--(&1)) = d`);;
3738 e (MATCH_MP_TAC (REAL_ARITH `&0 < d ==> max d (--(&1)) = d`));;
3739 e (EXPAND_TAC "d");;
3740 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
3741 e (REWRITE_WITH `
3742   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
3743   ((&2 * pi) / (&2 * pi))`);;
3744 e (REAL_ARITH_TAC);;
3745 e (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);;
3746 e (MATCH_MP_TAC REAL_DIV_REFL);;
3747 e (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);;
3748 e (REAL_ARITH_TAC);;
3749 e (NEW_GOAL `F`);;
3750 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);;
3751 e (UP_ASM_TAC THEN MESON_TAC[]);;
3752
3753 (* ========================================================================== *)
3754
3755 e (NEW_GOAL `F`);;
3756 e (NEW_GOAL `azim (u0:real^3) u1 s3 m = 
3757   (if azim u0 u1 m s3 = &0 then &0 else &2 * pi - azim u0 u1 m s3)`);;
3758 e (MATCH_MP_TAC AZIM_COMPL);;
3759 e (STRIP_TAC);;
3760
3761 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3762 e (EXISTS_TAC `s3:real^3`);;
3763 e (ASM_REWRITE_TAC[]);;
3764 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
3765 e (EXISTS_TAC `m:real^3`);;
3766 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);;
3767 e (ASM_REWRITE_TAC[]);;
3768 e (UP_ASM_TAC THEN COND_CASES_TAC);;
3769 e (NEW_GOAL `F`);;
3770 e (NEW_GOAL `(&0 < pi)`);;
3771 e (REWRITE_TAC[PI_POS]);;
3772 e (UNDISCH_TAC `~(azim (u0:real^3) u1 m s3 < pi)`);;
3773 e (ASM_REWRITE_TAC[]);;
3774 e (UP_ASM_TAC THEN MESON_TAC[]);;
3775 e (STRIP_TAC);;
3776
3777 e (NEW_GOAL `azim (u0:real^3) u1 m s3 = pi`);;
3778 e (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
3779 e (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);;
3780 e (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);;
3781 e (ASM_REWRITE_TAC[]);;
3782 e (UP_ASM_TAC THEN MESON_TAC[]);;
3783
3784
3785 (* ========================================================================= *)
3786 (*  Case k >= 4                                                              *)
3787 (* ========================================================================= *)
3788
3789 e (ASM_CASES_TAC `k >= 4`);;
3790 e (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);;
3791 e (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);;
3792 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
3793 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
3794 e (UP_ASM_TAC THEN STRIP_TAC);;
3795 e (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);;
3796
3797 e (REWRITE_WITH `u0 = v0:real^3`);;
3798 e (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);;
3799 e (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
3800    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
3801 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
3802
3803 e (REWRITE_WITH `u1 = v1:real^3`);;
3804 e (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);;
3805 e (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
3806    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
3807 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
3808 e (ASM_REWRITE_TAC[]);;
3809 e (UP_ASM_TAC THEN STRIP_TAC);;
3810
3811 e (ABBREV_TAC `L = aff_ge{u0, u1} {u2, u3:real^3}`);;
3812
3813 e (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);;
3814 e (AP_TERM_TAC);;
3815 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`;set_of_list]);;
3816 e (COND_CASES_TAC);;
3817
3818 e (EXPAND_TAC "L");;
3819 e (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);;
3820 e (STRIP_TAC);;
3821 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));;
3822 e (REWRITE_TAC[Marchal_cells_2.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);;
3823 e (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
3824                             A INTER B SUBSET C INTER B`));;
3825 e (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, u3}`);;
3826 e (REWRITE_TAC[DISJOINT]);;
3827 e (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));;
3828 e (STRIP_TAC);;
3829 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
3830 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3831 e (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);;
3832 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list]);;
3833 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3834 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
3835 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
3836 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
3837 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
3838 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
3839 e (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);;
3840 e (UP_ASM_TAC THEN SET_TAC[]);;
3841 e (REWRITE_TAC[COPLANAR_3]);;
3842 e (NEW_GOAL `u3 IN {u0, u1:real^3}`);;
3843 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
3844 e (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);;
3845 e (UP_ASM_TAC THEN SET_TAC[]);;
3846 e (REWRITE_TAC[COPLANAR_3]);;
3847
3848 e (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, u3:real^3}`; AFF_GE_2_2]);;
3849 e (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);;
3850 e (REPEAT STRIP_TAC);;
3851 e (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
3852    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);;
3853 e (ASM_REWRITE_TAC[]);;
3854 e (STRIP_TAC);;
3855
3856 e (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);;
3857 e (STRIP_TAC);;
3858 e (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);;
3859 e (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
3860    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);;
3861 e (EXPAND_TAC "D");;
3862 e (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);;
3863 e (DISJ1_TAC);;
3864 e (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);;
3865
3866 e (NEW_GOAL `(?b1:real. b1 IN P2 /\ (!x. x IN P2 ==> b1 <= x))`);;
3867 e (FIRST_ASSUM MATCH_MP_TAC);;
3868 e (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);;
3869 e (EXISTS_TAC `(f2:(real^3)list -> real) vl`);;
3870 e (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
3871 e (EXISTS_TAC `vl:(real^3)list`);;
3872 e (ASM_REWRITE_TAC[]);;
3873 e (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);;
3874 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
3875 e (STRIP_TAC);;
3876 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
3877 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3878 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
3879 e (STRIP_TAC);;
3880 e (ASM_REWRITE_TAC[]);;
3881 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
3882 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
3883 e (MATCH_MP_TAC (SET_RULE 
3884   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
3885 e (STRIP_TAC);;
3886 e (MATCH_MP_TAC SUBSET_BALL);;
3887 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
3888 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
3889 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
3890 e (FIRST_X_ASSUM CHOOSE_TAC);;
3891
3892 e (NEW_GOAL `r2 = (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x:real))`);;
3893 e (EXPAND_TAC "r2");;
3894 e (COND_CASES_TAC);;
3895 e (NEW_GOAL `F`);;
3896 e (UP_ASM_TAC THEN REWRITE_TAC[]);;
3897 e (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);;
3898 e (EXISTS_TAC `(f2:(real^3)list -> real) vl`);;
3899 e (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
3900 e (EXISTS_TAC `vl:(real^3)list`);;
3901 e (ASM_REWRITE_TAC[]);;
3902 e (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);;
3903 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
3904 e (STRIP_TAC);;
3905 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
3906 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3907 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
3908 e (STRIP_TAC);;
3909 e (ASM_REWRITE_TAC[]);;
3910 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
3911 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
3912 e (MATCH_MP_TAC (SET_RULE 
3913   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
3914 e (STRIP_TAC);;
3915 e (MATCH_MP_TAC SUBSET_BALL);;
3916 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
3917 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
3918 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
3919 e (UP_ASM_TAC THEN MESON_TAC[]);;
3920 e (REWRITE_TAC[]);;
3921
3922 e (ABBREV_TAC `Q1 = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);;
3923 e (NEW_GOAL `(Q1:real->bool) r2`);;
3924 e (ASM_REWRITE_TAC[]);;
3925 e (MATCH_MP_TAC SELECT_AX);;
3926 e (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");;
3927 e (ASM_REWRITE_TAC[]);;
3928 e (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);;
3929 e (NEW_GOAL `r2 <= f2 (vl:(real^3)list)`);;
3930 e (FIRST_ASSUM MATCH_MP_TAC);;
3931 e (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
3932 e (EXISTS_TAC `vl:(real^3)list`);;
3933 e (ASM_REWRITE_TAC[]);;
3934 e (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);;
3935 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
3936 e (STRIP_TAC);;
3937 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
3938 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
3939 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
3940 e (STRIP_TAC);;
3941 e (ASM_REWRITE_TAC[]);;
3942 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
3943 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
3944 e (MATCH_MP_TAC (SET_RULE 
3945   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
3946 e (STRIP_TAC);;
3947 e (MATCH_MP_TAC SUBSET_BALL);;
3948 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
3949 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
3950 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
3951
3952 e (UP_ASM_TAC THEN EXPAND_TAC "f2" THEN REWRITE_TAC[EL; HD; TL; 
3953    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
3954    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);;
3955 e (NEW_GOAL `!v. v IN affine hull {u1, u2, u3:real^3} ==> r2 <= dist (u0, v)`);;
3956 e (REPEAT STRIP_TAC);;
3957 e (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, u3}) u0) <= 
3958              dist (u0, v:real^3)`);;
3959 e (MATCH_MP_TAC CLOSEST_POINT_LE);;
3960 e (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);;
3961 e (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
3962
3963 e (NEW_GOAL `r <= dist (u0:real^3, x)`);;
3964 e (REWRITE_TAC[dist]);;
3965 e (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);;
3966 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
3967 e (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);;
3968 e (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
3969   (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) = 
3970   (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);;
3971 e (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 + 
3972                           t3 /(t2 + t3 + t4) % u2 + 
3973                           t4 /(t2 + t3 + t4) % u3`);;
3974 e (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % u3) = (t2 + t3 + t4) % (y:real^3)`);;
3975 e (EXPAND_TAC "y");;
3976 e (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 +  t3 / x % u2 + t4 / x % u3) = 
3977    (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);;
3978 e (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);;
3979 e (MATCH_MP_TAC REAL_DIV_REFL);;
3980 e (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);;
3981 e (REAL_ARITH_TAC);;
3982 e (VECTOR_ARITH_TAC);;
3983 e (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);;
3984
3985 e (NEW_GOAL `&1 < t2 + t3 + t4`);;
3986 e (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);;
3987 e (REAL_ARITH_TAC);;
3988 e (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`);;
3989 e (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
3990 e (REWRITE_TAC[GSYM dist]);;
3991 e (NEW_GOAL `r2 <= dist (u0, y:real^3)`);;
3992 e (FIRST_ASSUM MATCH_MP_TAC);;
3993 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
3994 e (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
3995    EXISTS_TAC `t4 / (t2 + t3 + t4)`);;
3996 e (STRIP_TAC);;
3997 e (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);;
3998 e (MATCH_MP_TAC REAL_DIV_REFL);;
3999 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
4000 e (ASM_REWRITE_TAC[]);;
4001
4002 e (NEW_GOAL `r2 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);;
4003 e (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);;
4004 e (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);;
4005 e (MATCH_MP_TAC REAL_LE_MUL);;
4006 e (REWRITE_TAC[DIST_POS_LE]);;
4007 e (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
4008 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
4009 e (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
4010 e (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
4011
4012 (* ========================================================================== *)
4013
4014 e (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);;
4015 e (STRIP_TAC);;
4016 e (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);;
4017 e (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
4018    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);;
4019 e (EXPAND_TAC "D");;
4020 e (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);;
4021 e (DISJ2_TAC);;
4022 e (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);;
4023
4024 e (NEW_GOAL `(?b1:real. b1 IN P4 /\ (!x. x IN P4 ==> x <= b1))`);;
4025 e (FIRST_ASSUM MATCH_MP_TAC);;
4026 e (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);;
4027 e (EXISTS_TAC `(f4:(real^3)list -> real) vl`);;
4028 e (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
4029 e (EXISTS_TAC `vl:(real^3)list`);;
4030 e (ASM_REWRITE_TAC[]);;
4031 e (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);;
4032 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
4033 e (STRIP_TAC);;
4034 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
4035 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4036 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
4037 e (STRIP_TAC);;
4038 e (ASM_REWRITE_TAC[]);;
4039 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
4040 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
4041 e (MATCH_MP_TAC (SET_RULE 
4042   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
4043 e (STRIP_TAC);;
4044 e (MATCH_MP_TAC SUBSET_BALL);;
4045 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
4046 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
4047 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
4048 e (FIRST_X_ASSUM CHOOSE_TAC);;
4049
4050 e (NEW_GOAL `d2 = (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b:real))`);;
4051 e (EXPAND_TAC "d2");;
4052 e (COND_CASES_TAC);;
4053 e (NEW_GOAL `F`);;
4054 e (UP_ASM_TAC THEN REWRITE_TAC[]);;
4055 e (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);;
4056 e (EXISTS_TAC `(f4:(real^3)list -> real) vl`);;
4057 e (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
4058 e (EXISTS_TAC `vl:(real^3)list`);;
4059 e (ASM_REWRITE_TAC[]);;
4060 e (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);;
4061 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
4062 e (STRIP_TAC);;
4063 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
4064 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4065 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
4066 e (STRIP_TAC);;
4067 e (ASM_REWRITE_TAC[]);;
4068 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
4069 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
4070 e (MATCH_MP_TAC (SET_RULE 
4071   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
4072 e (STRIP_TAC);;
4073 e (MATCH_MP_TAC SUBSET_BALL);;
4074 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
4075 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
4076 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
4077 e (UP_ASM_TAC THEN MESON_TAC[]);;
4078 e (REWRITE_TAC[]);;
4079
4080 e (ABBREV_TAC `Q1 = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);;
4081 e (NEW_GOAL `(Q1:real->bool) d2`);;
4082 e (ASM_REWRITE_TAC[]);;
4083 e (MATCH_MP_TAC SELECT_AX);;
4084 e (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");;
4085 e (ASM_REWRITE_TAC[]);;
4086 e (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);;
4087
4088 e (NEW_GOAL `f4 (vl:(real^3)list) <= d2`);;
4089 e (FIRST_ASSUM MATCH_MP_TAC);;
4090 e (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
4091 e (EXISTS_TAC `vl:(real^3)list`);;
4092 e (ASM_REWRITE_TAC[]);;
4093 e (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);;
4094 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
4095 e (STRIP_TAC);;
4096 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
4097 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4098 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
4099 e (STRIP_TAC);;
4100 e (ASM_REWRITE_TAC[]);;
4101 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
4102 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
4103 e (MATCH_MP_TAC (SET_RULE 
4104   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
4105 e (STRIP_TAC);;
4106 e (MATCH_MP_TAC SUBSET_BALL);;
4107 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
4108 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
4109 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
4110
4111 e (UP_ASM_TAC THEN EXPAND_TAC "f4");;
4112 e (REWRITE_TAC[EL; HD; TL; 
4113    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
4114    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);;
4115 e (ABBREV_TAC `xx = smallest_angle_line u2 u3 u0 u1`);;
4116
4117 e (MP_TAC (ASSUME `smallest_angle_line u2 u3 u0 u1 = xx`));;
4118 e (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);;
4119 e (ABBREV_TAC `Q2 = 
4120  (\x:real^3. x IN convex hull {u2, u3} /\
4121              (!y. y IN convex hull {u2, u3}
4122                   ==> ((y - u0) dot (u1 - u0)) /
4123                       (norm (y - u0) * norm (u1 - u0)) <=
4124                       ((x - u0) dot (u1 - u0)) /
4125                       (norm (x - u0) * norm (u1 - u0))))`);;
4126 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);;
4127 e (NEW_GOAL `(Q2:real^3->bool) xx`);;
4128 e (ONCE_ASM_REWRITE_TAC[]);;
4129 e (MATCH_MP_TAC SELECT_AX);;
4130 e (EXPAND_TAC "Q2");;
4131
4132 e (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);;
4133 e (STRIP_TAC);;
4134 e (ASM_REWRITE_TAC[]);;
4135 e (STRIP_TAC);;
4136
4137 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
4138 e (REWRITE_TAC[]);;
4139 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4140 e (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);;
4141 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`]);;
4142 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4143
4144 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
4145 e (STRIP_TAC);;
4146 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
4147 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
4148 e (REWRITE_TAC[coplanar]);;
4149 e (UNDISCH_TAC `u0 IN convex hull {u2, u3:real^3}`);;
4150 e (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);;
4151 e (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4152    EXISTS_TAC `u3:real^3`);;
4153 e (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));;
4154 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
4155 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
4156 e (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);;
4157 e (STRIP_TAC);;
4158 e (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);;
4159 e (UP_ASM_TAC THEN VECTOR_ARITH_TAC);;
4160 e (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
4161 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
4162 e (SET_TAC[]);;
4163
4164 e (UP_ASM_TAC THEN EXPAND_TAC "Q2");;
4165 e (STRIP_TAC);;
4166 e (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) / 
4167                                (norm (y - u0) * norm (u1 - u0)))`);;
4168
4169 e (NEW_GOAL `d < (g:real^3->real) x`);;
4170 e (EXPAND_TAC "g");;
4171 e (REWRITE_WITH 
4172   `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
4173    d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);;
4174 e (MATCH_MP_TAC REAL_LT_RDIV_EQ);;
4175 e (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));;
4176 e (STRIP_TAC);;
4177 e (MATCH_MP_TAC REAL_LE_MUL);;
4178 e (ASM_REWRITE_TAC[NORM_POS_LE]);;
4179 e (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);;
4180 e (ASM_REWRITE_TAC[]);;
4181 e (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = u0:real^3 <=>
4182   t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = (t1 + t2 + t3 + t4) % u0`);;
4183 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
4184 e (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);;
4185 e (STRIP_TAC);;
4186
4187 e (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);;
4188 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4189 e (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);;
4190 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);;
4191 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4192 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
4193 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
4194 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
4195 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
4196 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
4197 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
4198 e (REWRITE_TAC[affine_dependent]);;
4199 e (EXISTS_TAC `u1:real^3`);;
4200 e (STRIP_TAC);;
4201 e (SET_TAC[]);;
4202
4203 e (NEW_GOAL `~(u1 IN {u0, u2, u3:real^3})`);;
4204 e (STRIP_TAC);;
4205 e (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);;
4206 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4207 e (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);;
4208 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);;
4209 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4210 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
4211 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
4212 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
4213 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
4214 e (REWRITE_WITH `{u0, u1, u2, u3} = {u0:real^3,u2, u3}`);;
4215 e (UP_ASM_TAC THEN SET_TAC[]);;
4216 e (REWRITE_TAC[COPLANAR_3]);;
4217 e (SET_TAC[]);;
4218 e (REWRITE_WITH `{u0, u1, u2, u3} DELETE u1 = {u0, u2, u3:real^3}`);;
4219 e (UP_ASM_TAC THEN SET_TAC[]);;
4220 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
4221 e (EXISTS_TAC `(t2 + t3 + t4) / t2`);;
4222 e (EXISTS_TAC `(-- t3) / t2`);;
4223 e (EXISTS_TAC `(-- t4) / t2`);;
4224
4225 e (STRIP_TAC);;
4226 e (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);;
4227 e (REAL_ARITH_TAC);;
4228 e (MATCH_MP_TAC REAL_DIV_REFL);;
4229 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
4230 e (REWRITE_WITH 
4231   `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3:real^3 <=> 
4232    u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % u3)`);;
4233 e (VECTOR_ARITH_TAC);;
4234 e (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % u3 = 
4235                              (t2 + t3 + t4) % u0:real^3`)]);;
4236 e (REWRITE_TAC[VECTOR_ARITH 
4237   `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);;
4238 e (REWRITE_TAC[VECTOR_MUL_ASSOC]);;
4239 e (REWRITE_WITH `&1 / t2 * t2 = &1`);;
4240 e (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);;
4241 e (MATCH_MP_TAC REAL_DIV_REFL);;
4242 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
4243 e (VECTOR_ARITH_TAC);;
4244 e (SET_TAC[]);;
4245 e (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);;
4246 e (ASM_REWRITE_TAC[]);;
4247
4248 e (NEW_GOAL `g x <= (g:real^3->real) xx`);;
4249 e (NEW_GOAL `!y. y IN convex hull {u2 , u3:real^3} ==> g y <= g xx`);;
4250 e (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);;
4251 e (NEW_GOAL `&0 < (t3 + t4)`);;
4252 e (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0)  ==> &0 < x`));;
4253 e (STRIP_TAC);;
4254 e (MATCH_MP_TAC REAL_LE_ADD);;
4255 e (ASM_REWRITE_TAC[]);;
4256 e (STRIP_TAC);;
4257 e (NEW_GOAL `t3 = &0 /\ t4 = &0`);;
4258 e (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN 
4259    UP_ASM_TAC THEN REAL_ARITH_TAC);;
4260 e (UP_ASM_TAC THEN STRIP_TAC);;
4261
4262 e (NEW_GOAL `F`);;
4263 e (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);;
4264 e (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);;
4265 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
4266 e (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));;
4267 e (STRIP_TAC);;
4268 e (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) - 
4269                  (t1 + t2 + t3 + t4) % u0:real^3`);;
4270 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
4271 e (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH 
4272   `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; 
4273    DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);;
4274 e (MATCH_MP_TAC REAL_LE_MUL);;
4275 e (REWRITE_TAC[DOT_POS_LE]);;
4276 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
4277 e (MATCH_MP_TAC REAL_LE_MUL);;
4278 e (REWRITE_TAC[DIST_POS_LE]);;
4279 e (MATCH_MP_TAC REAL_LE_MUL);;
4280 e (REWRITE_TAC[DIST_POS_LE]);;
4281 e (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);;
4282 e (REAL_ARITH_TAC);;
4283 e (UP_ASM_TAC THEN MESON_TAC[]);;
4284
4285 e (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3:real^3`);;
4286 e (NEW_GOAL `(g:real^3->real) y <= g xx`);;
4287 e (FIRST_ASSUM MATCH_MP_TAC);;
4288 e (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);;
4289 e (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);;
4290 e (REPEAT STRIP_TAC);;
4291 e (MATCH_MP_TAC REAL_LE_DIV);;
4292 e (ASM_SIMP_TAC[REAL_LE_ADD]);;
4293 e (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);;
4294 e (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);;
4295 e (MATCH_MP_TAC REAL_DIV_REFL);;
4296 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
4297 e (ASM_REWRITE_TAC[]);;
4298
4299 e (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 + 
4300                    t4 / (t1 + t3 + t4) % u3:real^3`);;
4301 e (NEW_GOAL `(g:real^3->real) y = g w`);;
4302 e (EXPAND_TAC "g");;
4303
4304 e (REWRITE_WITH `y:real^3 - u0 = 
4305                 &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);;
4306 e (EXPAND_TAC "y");;
4307 e (REWRITE_TAC[VECTOR_ARITH 
4308   `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
4309    &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
4310    (t3 + t4) / (t3 + t4) % u0 = u0`]);;
4311 e (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);;
4312 e (MATCH_MP_TAC REAL_DIV_REFL);;
4313 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
4314 e (VECTOR_ARITH_TAC);;
4315 e (REWRITE_TAC[NORM_MUL; DOT_LMUL]);;
4316
4317 e (REWRITE_WITH `w:real^3 - u0 = 
4318                 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);;
4319 e (EXPAND_TAC "w");;
4320 e (REWRITE_TAC[VECTOR_ARITH 
4321    `(t1 / (t1 + t3 + t4) % u0 +
4322     t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
4323     &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
4324     (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);;
4325 e (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);;
4326 e (MATCH_MP_TAC REAL_DIV_REFL);;
4327 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
4328    THEN REAL_ARITH_TAC);;
4329 e (VECTOR_ARITH_TAC);;
4330 e (REWRITE_TAC[NORM_MUL; DOT_LMUL]);;
4331 e (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);;
4332 e (REWRITE_TAC[REAL_ABS_REFL]);;
4333 e (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);;
4334 e (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);;
4335 e (REWRITE_TAC[REAL_ABS_REFL]);;
4336 e (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);;
4337 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
4338    THEN REAL_ARITH_TAC);;
4339 e (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) = 
4340                            (a * x) / (a * (y * z))`]);;
4341 e (ABBREV_TAC 
4342   `a1 = norm (t3 % u2 + t4 % u3 - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);;
4343 e (NEW_GOAL `~(a1 = &0)`);;
4344 e (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; 
4345    VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);;
4346 e (STRIP_TAC);;
4347
4348 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
4349 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4350 e (EXISTS_TAC `(X:real^3->bool)`);;
4351 e (STRIP_TAC);;
4352 e (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);;
4353 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4354 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
4355 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
4356 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
4357 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
4358 e (REWRITE_TAC[coplanar]);;
4359 e (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4360    EXISTS_TAC `u3:real^3`);;
4361 e (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));;
4362 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
4363 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
4364 e (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
4365    THEN EXISTS_TAC `t4 / (t3 + t4)`);;
4366 e (REPEAT STRIP_TAC);;
4367 e (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
4368                           (t3 + t4) / (t3 + t4)`]);;
4369 e (MATCH_MP_TAC REAL_DIV_REFL);;
4370 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
4371 e (ASM_REWRITE_TAC[VECTOR_ARITH 
4372    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
4373     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);;
4374 e (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);;
4375 e (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);;
4376 e (MATCH_MP_TAC REAL_DIV_REFL);;
4377 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
4378 e (VECTOR_ARITH_TAC);;
4379 e (SET_TAC[]);;
4380
4381 e (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);;
4382 e (NEW_GOAL `&0 < &1 / (t3 + t4)`);;
4383 e (MATCH_MP_TAC REAL_LT_DIV);;
4384 e (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);;
4385 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
4386
4387 e (REWRITE_WITH 
4388  `(&1 / (t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4389   (&1 / (t3 + t4) * a1) = 
4390   ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);;
4391 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);;
4392
4393 e (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);;
4394 e (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);;
4395 e (MATCH_MP_TAC REAL_LT_DIV);;
4396 e (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);;
4397 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4398    REAL_ARITH_TAC);;
4399 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
4400
4401 e (REWRITE_WITH 
4402  `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4403   (&1 / (t1 + t3 + t4) * a1) = 
4404   ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);;
4405 e (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
4406    MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);;
4407
4408 e (NEW_GOAL `(g:real^3->real) x <= g w`);;
4409 e (EXPAND_TAC "g");;
4410
4411 e (REWRITE_WITH 
4412   `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
4413   ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
4414   ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <= 
4415   ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);;
4416 e (MATCH_MP_TAC RAT_LEMMA4);;
4417 e (STRIP_TAC);;
4418 e (MATCH_MP_TAC REAL_LT_MUL);;
4419 e (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);;
4420 e (STRIP_TAC);;
4421 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
4422 e (REWRITE_TAC[]);;
4423
4424 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4425 e (EXISTS_TAC `(X:real^3->bool)`);;
4426 e (STRIP_TAC);;
4427 e (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);;
4428 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4429 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
4430 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
4431 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
4432 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
4433 e (REWRITE_TAC[coplanar]);;
4434 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4435    EXISTS_TAC `u3:real^3`);;
4436 e (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);;
4437 e (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));;
4438 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
4439 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
4440 e (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
4441    THEN EXISTS_TAC `(--t4) / t2`);;
4442 e (REPEAT STRIP_TAC);;
4443 e (REWRITE_TAC[REAL_ARITH 
4444    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);;
4445 e (MATCH_MP_TAC REAL_DIV_REFL);;
4446 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
4447 e (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);;
4448 e (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);;
4449 e (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % u3:real^3 = t2 % u1`);;
4450 e (UP_ASM_TAC THEN VECTOR_ARITH_TAC);;
4451 e (ASM_REWRITE_TAC[VECTOR_ARITH 
4452    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
4453     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);;
4454 e (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);;
4455 e (REWRITE_WITH `t2 / t2 = &1`);;
4456 e (MATCH_MP_TAC REAL_DIV_REFL);;
4457 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
4458 e (VECTOR_ARITH_TAC);;
4459 e (SET_TAC[]);;
4460
4461 e (MATCH_MP_TAC REAL_LT_MUL);;
4462 e (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);;
4463 e (EXPAND_TAC "w" THEN STRIP_TAC);;
4464 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
4465 e (REWRITE_TAC[]);;
4466
4467 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4468 e (EXISTS_TAC `(X:real^3->bool)`);;
4469 e (STRIP_TAC);;
4470 e (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);;
4471 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4472 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
4473 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
4474 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
4475 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
4476 e (REWRITE_TAC[coplanar]);;
4477 e (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
4478    EXISTS_TAC `u3:real^3`);;
4479 e (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));;
4480 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
4481 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
4482
4483 e (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
4484    THEN EXISTS_TAC `t4 / (t3 + t4)`);;
4485 e (REPEAT STRIP_TAC);;
4486 e (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
4487                           (t3 + t4) / (t3 + t4)`]);;
4488 e (MATCH_MP_TAC REAL_DIV_REFL);;
4489 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
4490 e (ASM_REWRITE_TAC[VECTOR_ARITH 
4491    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
4492     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);;
4493 e (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH 
4494    `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 = 
4495     (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);;
4496 e (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % u3) = u0 <=> 
4497                  t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0:real^3`);;
4498 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
4499 e (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);;
4500 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN 
4501    REAL_ARITH_TAC);;
4502
4503 e (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
4504    <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);;
4505 e (STRIP_TAC THEN ASM_REWRITE_TAC[]);;
4506 e (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);;
4507 e (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);;
4508 e (MATCH_MP_TAC REAL_DIV_REFL);;
4509 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
4510 e (VECTOR_ARITH_TAC);;
4511 e (SET_TAC[]);;
4512
4513 e (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);;
4514 e (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");;
4515 e (REWRITE_TAC[VECTOR_ARITH 
4516   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
4517    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);;
4518 e (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);;
4519 e (MATCH_MP_TAC REAL_DIV_REFL);;
4520 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4521    REAL_ARITH_TAC);;
4522 e (VECTOR_ARITH_TAC);;
4523 e (ABBREV_TAC `t = t1 + t3 + t4`);;
4524 e (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 = 
4525                 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);;
4526 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
4527 e (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);;
4528 e (EXPAND_TAC "t" THEN REAL_ARITH_TAC);;
4529 e (REWRITE_TAC[VECTOR_ARITH 
4530   `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);;
4531 e (ABBREV_TAC `x1 = u1 - u0:real^3`);;
4532 e (ABBREV_TAC `x2 = w - u0:real^3`);;
4533
4534 e (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 = 
4535    t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);;
4536 e (REWRITE_TAC[NORM_POW_2]);;
4537 e (VECTOR_ARITH_TAC);;
4538
4539 e (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <= 
4540              t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);;
4541 e (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
4542    t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);;
4543 e (MATCH_MP_TAC REAL_LE_MUL);;
4544 e (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);;
4545 e (MATCH_MP_TAC REAL_LE_MUL);;
4546 e (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);;
4547 e (STRIP_TAC);;
4548 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
4549 e (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);;
4550
4551 e (NEW_GOAL 
4552  `t2 * (x2 dot x1) * norm x1 * norm x1 + t * (x2 dot x1) * norm x2 * norm x1 <= 
4553   (x2 dot x1) * norm (t2 % x1 + t % x2) * norm (x1:real^3)`);;
4554
4555 e (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
4556  x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);;
4557 e (MATCH_MP_TAC REAL_LE_MUL);;
4558 e (STRIP_TAC);;
4559 e (MATCH_MP_TAC REAL_LE_MUL);;
4560 e (REWRITE_TAC[NORM_POS_LE]);;
4561 e (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);;
4562 e (NEW_GOAL `F`);;
4563 e (NEW_GOAL `(g:real^3->real) x <= &0`);;
4564 e (EXPAND_TAC "g");;
4565 e (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);;
4566 e (MATCH_MP_TAC REAL_LE_DIV);;
4567 e (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);;
4568
4569 e (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);;
4570 e (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");;
4571 e (REWRITE_TAC[VECTOR_ARITH 
4572   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
4573    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);;
4574 e (EXPAND_TAC "t");;
4575 e (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);;
4576 e (MATCH_MP_TAC REAL_DIV_REFL);;
4577 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4578    REAL_ARITH_TAC);;
4579 e (VECTOR_ARITH_TAC);;
4580
4581 e (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);;
4582 e (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 = 
4583                  (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);;
4584 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
4585 e (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 = 
4586    t2 % x1 + t % x2:real^3`);;
4587 e (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
4588    THEN VECTOR_ARITH_TAC);;
4589 e (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);;
4590 e (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);;
4591 e (MATCH_MP_TAC REAL_LE_MUL);;
4592 e (STRIP_TAC);;
4593 e (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4594    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);;
4595 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
4596 e (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);;
4597 e (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);;
4598 e (MATCH_MP_TAC REAL_LE_MUL);;
4599 e (STRIP_TAC);;
4600 e (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4601    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);;
4602 e (REWRITE_TAC[DOT_POS_LE]);;
4603 e (REWRITE_TAC[DOT_LADD]);;
4604 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
4605 e (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);;
4606 e (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);;
4607 e (REAL_ARITH_TAC);;
4608 e (UP_ASM_TAC THEN MESON_TAC[]);;
4609 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
4610
4611 e (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);;
4612 e (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);;
4613 e (AP_THM_TAC THEN AP_TERM_TAC);;
4614 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
4615 e (REWRITE_TAC[REAL_ABS_REFL]);;
4616 e (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
4617    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);;
4618 e (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);;
4619 e (AP_THM_TAC THEN AP_TERM_TAC);;
4620 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
4621 e (REWRITE_TAC[REAL_ABS_REFL]);;
4622 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
4623 e (REWRITE_TAC[GSYM NORM_MUL]);;
4624 e (REWRITE_WITH 
4625   `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);;
4626 e (AP_TERM_TAC THEN VECTOR_ARITH_TAC);;
4627 e (REWRITE_TAC[NORM_TRIANGLE]);;
4628 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
4629 e (UNDISCH_TAC `(g:real^3->real) y <= g xx`);;
4630 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
4631
4632 e (NEW_GOAL `(g:real^3->real) xx <= d2`);;
4633 e (FIRST_ASSUM MATCH_MP_TAC);;
4634 e (EXPAND_TAC "P4");;
4635 e (EXPAND_TAC "g" THEN EXPAND_TAC "f4");;
4636 e (REWRITE_TAC[IN_ELIM_THM; IN]);;
4637 e (EXISTS_TAC `vl:(real^3)list`);;
4638 e (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`; 
4639                TRUNCATE_SIMPLEX_EXPLICIT_1]);;
4640 e (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);;
4641 e (EXPAND_TAC "xx");;
4642 e (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
4643 e (REWRITE_WITH `mcell 4 V vl = mcell k V vl`);;
4644 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
4645 e (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);;
4646 e (STRIP_TAC);;
4647
4648 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
4649 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4650 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
4651 e (STRIP_TAC);;
4652 e (ASM_REWRITE_TAC[]);;
4653 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
4654 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
4655 e (MATCH_MP_TAC (SET_RULE 
4656   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
4657 e (STRIP_TAC);;
4658 e (MATCH_MP_TAC SUBSET_BALL);;
4659 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
4660 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
4661 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
4662
4663 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");;
4664 e (REAL_ARITH_TAC);;
4665
4666 e (NEW_GOAL `F`);;
4667 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
4668 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4669 e (EXISTS_TAC `(X:real^3->bool)`);;
4670 e (STRIP_TAC);;
4671 e (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);;
4672 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
4673 e (SET_TAC[]);;
4674 e (UP_ASM_TAC THEN MESON_TAC[]);;
4675
4676 (* ========================================================================= *)
4677
4678 e (NEW_GOAL `~coplanar {u0, u1, u2, u3:real^3}`);;
4679 e (STRIP_TAC);;
4680 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
4681 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4682 e (EXISTS_TAC `X:real^3->bool`);;
4683 e (STRIP_TAC);;
4684 e (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);;
4685 e (COND_CASES_TAC);;
4686 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4687 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
4688 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
4689 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
4690 e (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
4691 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
4692 e (SET_TAC[]);;
4693
4694 e (ASM_CASES_TAC `azim u0 u1 u2 (u3:real^3) < pi`);;
4695 e (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 u3)`);;
4696 e (ASM_SIMP_TAC[WEDGE_LUNE]);;
4697 e (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
4698                  conic_cap u0 u1 r d INTER L`);;
4699 e (SET_TAC[]);;
4700 e (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);;
4701 e (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
4702    aff_gt {u0, u1} {u2, u3} DIFF conic_cap u0 u1 r d INTER L = {}`);;
4703 e (EXPAND_TAC "L");;
4704 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));;
4705 e (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);;
4706 e (REWRITE_TAC[SET_RULE `A UNION {} = A`]);;
4707 e (EXPAND_TAC "L");;
4708
4709 e (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
4710                  aff_gt {u0, u1} {u2, u3} UNION 
4711    UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN  {u2, u3}}`);;
4712 e (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);;
4713 e (REWRITE_TAC[Geomdetail.FINITE6]);;
4714 e (REWRITE_TAC[DISJOINT]);;
4715
4716 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
4717 e (NEW_GOAL `F`);;
4718 e (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);;
4719 e (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);;
4720 e (UP_ASM_TAC THEN SET_TAC[]);;
4721 e (REWRITE_TAC[COPLANAR_3]);;
4722 e (UP_ASM_TAC THEN MESON_TAC[]);;
4723
4724 e (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);;
4725 e (NEW_GOAL `F`);;
4726 e (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);;
4727 e (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);;
4728 e (UP_ASM_TAC THEN SET_TAC[]);;
4729 e (REWRITE_TAC[COPLANAR_3]);;
4730 e (UP_ASM_TAC THEN MESON_TAC[]);;
4731 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
4732
4733 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4734 e (EXISTS_TAC 
4735   `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);;
4736 e (STRIP_TAC);;
4737 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4738 e (EXISTS_TAC 
4739   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);;
4740 e (STRIP_TAC);;
4741 e (MATCH_MP_TAC NEGLIGIBLE_UNION);;
4742 e (STRIP_TAC);;
4743
4744 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4745 e (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);;
4746 e (STRIP_TAC);;
4747 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
4748 e (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);;
4749 e (SET_TAC[]);;
4750 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
4751 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4752 e (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);;
4753 e (STRIP_TAC);;
4754 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
4755 e (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);;
4756 e (SET_TAC[]);;
4757 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
4758 e (REWRITE_TAC[SET_RULE 
4759   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
4760          aff_ge {u0, u1} ({m, s3} DELETE s3) 
4761    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);;
4762 e (MATCH_MP_TAC (SET_RULE 
4763   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));;
4764 e (STRIP_TAC);;
4765 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
4766 e (STRIP_TAC);;
4767 e (SET_TAC[]);;
4768
4769 e (REWRITE_TAC[DISJOINT]);;
4770 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
4771 e (NEW_GOAL `F`);;
4772 e (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);;
4773 e (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);;
4774 e (UP_ASM_TAC THEN SET_TAC[]);;
4775 e (REWRITE_TAC[COPLANAR_3]);;
4776 e (UP_ASM_TAC THEN MESON_TAC[]);;
4777 e (UP_ASM_TAC THEN SET_TAC[]);;
4778
4779 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
4780 e (STRIP_TAC);;
4781 e (SET_TAC[]);;
4782 e (REWRITE_TAC[DISJOINT]);;
4783 e (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);;
4784 e (NEW_GOAL `F`);;
4785 e (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);;
4786 e (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);;
4787 e (UP_ASM_TAC THEN SET_TAC[]);;
4788 e (REWRITE_TAC[COPLANAR_3]);;
4789 e (UP_ASM_TAC THEN MESON_TAC[]);;
4790 e (UP_ASM_TAC THEN SET_TAC[]);;
4791
4792 e (SET_TAC[]);;
4793
4794 (* begin the computation *)
4795
4796 e (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);;
4797 e (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 u3) =
4798              (if &1 < d \/ r < &0
4799               then &0
4800               else azim u0 u1 u2 u3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);;
4801 e (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);;
4802 e (STRIP_TAC);;
4803 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
4804 e (EXISTS_TAC `u3:real^3`);;
4805 e (ASM_REWRITE_TAC[]);;
4806 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
4807 e (EXISTS_TAC `u2:real^3`);;
4808 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
4809 e (ASM_REWRITE_TAC[]);;
4810
4811 e (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);;
4812 e (COND_CASES_TAC);;
4813 e (NEW_GOAL `F`);;
4814 e (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
4815    UP_ASM_TAC THEN REAL_ARITH_TAC);;
4816 e (UP_ASM_TAC THEN MESON_TAC[]);;
4817
4818 e (REWRITE_WITH `azim (u0:real^3) u1 u2 u3 = dihV u0 u1 u2 u3`);;
4819 e (MATCH_MP_TAC AZIM_DIHV_SAME);;
4820 e (ASM_REWRITE_TAC[]);;
4821 e (STRIP_TAC);;
4822 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
4823 e (EXISTS_TAC `u3:real^3`);;
4824 e (ASM_REWRITE_TAC[]);;
4825 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
4826 e (EXISTS_TAC `u2:real^3`);;
4827 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
4828 e (ASM_REWRITE_TAC[]);;
4829
4830 e (REWRITE_TAC[dihX]);;
4831 e (COND_CASES_TAC);;
4832 e (NEW_GOAL `F`);;
4833 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
4834 e (REWRITE_TAC[]);;
4835 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4836 e (EXISTS_TAC `X:real^3->bool`);;
4837 e (ASM_REWRITE_TAC[] THEN SET_TAC[]);;
4838 e (UP_ASM_TAC THEN MESON_TAC[]);;
4839
4840 e (LET_TAC);;
4841
4842 e (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);;
4843 e (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
4844            ul IN barV V 3 /\
4845            X = mcell k V ul /\
4846            initial_sublist [u0; u1] ul)`);;
4847 e (STRIP_TAC);;
4848 e (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);;
4849 e (MATCH_MP_TAC SELECT_AX);;
4850 e (EXISTS_TAC `(4, vl:(real^3)list)`);;
4851 e (EXPAND_TAC "P");;
4852 e (REWRITE_TAC[BETA_THM]);;
4853 e (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);;
4854 e (STRIP_TAC);;
4855 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
4856
4857 e (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
4858                  LENGTH [u0;u1] = 1 + 1`);;
4859 e (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
4860 e (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
4861 e (ASM_REWRITE_TAC[]);;
4862 e (REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
4863 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);;
4864 e (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);;
4865
4866 e (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);;
4867 e (MATCH_MP_TAC Ajripqn.AJRIPQN);;
4868 e (ASM_REWRITE_TAC[]);;
4869 e (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
4870 e (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);;
4871 e (REWRITE_WITH `mcell 4 V vl = X`);;
4872 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
4873 e (SET_TAC[ASSUME `X = mcell k' V ul`]);;
4874
4875 e (REPEAT STRIP_TAC);;
4876 e (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
4877    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);;
4878 e (SET_TAC[]);;
4879 e (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);;
4880
4881 e (COND_CASES_TAC);;
4882 e (NEW_GOAL `F`);;
4883 e (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);;
4884 e (UP_ASM_TAC THEN MESON_TAC[]);;
4885 e (COND_CASES_TAC);;
4886 e (NEW_GOAL `F`);;
4887 e (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);;
4888 e (UP_ASM_TAC THEN MESON_TAC[]);;
4889 e (COND_CASES_TAC);;
4890
4891 e (REWRITE_TAC[dihu4]);;
4892
4893 e (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) = 
4894    dihV u0 u1 u2 (u3:real^3)`);;
4895
4896 e (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);;
4897 e (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
4898 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
4899
4900 e (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);;
4901 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
4902 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
4903 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4904                  CARD (set_of_list ul) = 3 + 1`);;
4905 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
4906 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
4907 e (ARITH_TAC);;
4908
4909 e (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);;
4910 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
4911 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
4912 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
4913                  CARD (set_of_list ul) = 3 + 1`);;
4914 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
4915 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
4916 e (ARITH_TAC);;
4917
4918 e (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);;
4919 e (REWRITE_WITH `
4920     {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
4921     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = 
4922     convex hull {u0, u1,u2,u3:real^3}`);;
4923 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
4924 e (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);;
4925 e (REPEAT STRIP_TAC);;
4926
4927 e (UNDISCH_TAC `~NULLSET X`);;
4928 e (REWRITE_TAC[]);;
4929 e (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
4930    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);;
4931 e (COND_CASES_TAC);;
4932 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
4933 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
4934 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
4935 e (UP_ASM_TAC THEN STRIP_TAC);;
4936 e (ASM_REWRITE_TAC[set_of_list]);;
4937 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4938 e (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);;
4939 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
4940 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
4941 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
4942 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
4943 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
4944 e (UNDISCH_TAC 
4945    `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);;
4946 e (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
4947                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
4948
4949 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
4950
4951 e (UNDISCH_TAC `~NULLSET X`);;
4952 e (REWRITE_TAC[]);;
4953 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);;
4954 e (COND_CASES_TAC);;
4955 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
4956 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
4957 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
4958 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
4959 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
4960 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
4961 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
4962 e (ASM_REWRITE_TAC[]);;
4963 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
4964
4965 e (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);;
4966 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);;
4967 e (COND_CASES_TAC);;
4968 e (MESON_TAC[]);;
4969 e (NEW_GOAL `F`);;
4970 e (UNDISCH_TAC `~NULLSET X`);;
4971 e (REWRITE_TAC[]);;
4972 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);;
4973 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
4974 e (UP_ASM_TAC THEN MESON_TAC[]);;
4975
4976 e (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
4977    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);;
4978 e (COND_CASES_TAC);;
4979 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
4980 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
4981 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
4982 e (UP_ASM_TAC THEN STRIP_TAC);;
4983 e (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
4984 e (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);;
4985 e (NEW_GOAL `F`);;
4986 e (UNDISCH_TAC `~NULLSET X`);;
4987 e (REWRITE_TAC[]);;
4988 e (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
4989    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);;
4990 e (COND_CASES_TAC);;
4991 e (NEW_GOAL `F`);;
4992 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);;
4993 e (UP_ASM_TAC THEN MESON_TAC[]);;
4994 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
4995 e (UP_ASM_TAC THEN MESON_TAC[]);;
4996
4997 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);;
4998 e (STRIP_TAC);;
4999
5000 e (ASM_CASES_TAC `EL 2 ul = u2:real^3`);;
5001 e (NEW_GOAL `EL 3 ul = u3:real^3`);;
5002 e (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));;
5003 e (STRIP_TAC);;
5004 e (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);;
5005 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
5006 e (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
5007    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5008    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);;
5009 e (ASM_REWRITE_TAC[]);;
5010
5011 e (NEW_GOAL `EL 2 ul = u3:real^3`);;
5012 e (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));;
5013 e (STRIP_TAC);;
5014 e (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);;
5015 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
5016 e (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
5017    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5018    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);;
5019
5020 e (NEW_GOAL `EL 3 ul = u2:real^3`);;
5021 e (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));;
5022 e (STRIP_TAC);;
5023 e (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);;
5024 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
5025 e (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
5026    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5027    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);;
5028 e (ASM_REWRITE_TAC[]);;
5029 e (REWRITE_TAC[DIHV_SYM_2]);;
5030
5031 e (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);;
5032 e (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);;
5033 e (AP_THM_TAC THEN AP_TERM_TAC);;
5034
5035 e (REWRITE_WITH 
5036   `measurable (conic_cap u0 u1 r d) /\
5037              vol (conic_cap u0 u1 r d) =
5038              (if u1 = u0 \/ &1 <= d \/ r < &0
5039               then &0
5040               else &2 / &3 * pi * (&1 - d) * r pow 3)`);;
5041 e (MATCH_MP_TAC VOLUME_CONIC_CAP);;
5042 e (EXPAND_TAC "d");;
5043 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
5044 e (COND_CASES_TAC);;
5045 e (NEW_GOAL `F`);;
5046 e (UP_ASM_TAC THEN STRIP_TAC);;
5047 e (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);;
5048 e (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5049 e (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5050 e (UP_ASM_TAC THEN MESON_TAC[]);;
5051 e (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);;
5052
5053 e (REWRITE_WITH `max d (--(&1)) = d`);;
5054 e (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));;
5055 e (REWRITE_TAC[REAL_NEG_LT0]);;
5056 e (STRIP_TAC);;
5057 e (EXPAND_TAC "d");;
5058 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
5059 e (REAL_ARITH_TAC);;
5060
5061 e (REWRITE_WITH `
5062   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
5063   ((&2 * pi) / (&2 * pi))`);;
5064 e (REAL_ARITH_TAC);;
5065 e (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);;
5066 e (MATCH_MP_TAC REAL_DIV_REFL);;
5067 e (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);;
5068 e (REAL_ARITH_TAC);;
5069 e (NEW_GOAL `F`);;
5070 e (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
5071    THEN MESON_TAC[]);;
5072 e (UP_ASM_TAC THEN MESON_TAC[]);;
5073
5074 (* ========================================================================= *)
5075 (* OK here *)
5076
5077 e (ASM_CASES_TAC `azim u0 u1 u3 (u2:real^3) < pi`);;
5078 e (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);;
5079 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
5080 e (STRIP_TAC);;
5081 e (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u3 u2)`);;
5082 e (ASM_SIMP_TAC[WEDGE_LUNE]);;
5083 e (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
5084                  conic_cap u0 u1 r d INTER L`);;
5085 e (SET_TAC[]);;
5086 e (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);;
5087
5088 e (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
5089    aff_gt {u0, u1} {u3, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);;
5090 e (EXPAND_TAC "L");;
5091 e (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);;
5092 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));;
5093 e (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);;
5094 e (REWRITE_TAC[SET_RULE `A UNION {} = A`]);;
5095 e (EXPAND_TAC "L");;
5096 e (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);;
5097
5098 e (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
5099                  aff_gt {u0, u1} {u2, u3} UNION 
5100    UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN  {u2, u3}}`);;
5101 e (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);;
5102 e (REWRITE_TAC[Geomdetail.FINITE6]);;
5103 e (REWRITE_TAC[DISJOINT]);;
5104
5105 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
5106 e (NEW_GOAL `F`);;
5107 e (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);;
5108 e (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);;
5109 e (UP_ASM_TAC THEN SET_TAC[]);;
5110 e (REWRITE_TAC[COPLANAR_3]);;
5111 e (UP_ASM_TAC THEN MESON_TAC[]);;
5112
5113 e (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);;
5114 e (NEW_GOAL `F`);;
5115 e (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);;
5116 e (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);;
5117 e (UP_ASM_TAC THEN SET_TAC[]);;
5118 e (REWRITE_TAC[COPLANAR_3]);;
5119 e (UP_ASM_TAC THEN MESON_TAC[]);;
5120 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
5121
5122 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5123 e (EXISTS_TAC 
5124   `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);;
5125 e (STRIP_TAC);;
5126 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5127 e (EXISTS_TAC 
5128   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);;
5129 e (STRIP_TAC);;
5130 e (MATCH_MP_TAC NEGLIGIBLE_UNION);;
5131 e (STRIP_TAC);;
5132
5133 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5134 e (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);;
5135 e (STRIP_TAC);;
5136 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
5137 e (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);;
5138 e (SET_TAC[]);;
5139 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
5140 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5141 e (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);;
5142 e (STRIP_TAC);;
5143 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
5144 e (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);;
5145 e (SET_TAC[]);;
5146 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
5147 e (REWRITE_TAC[SET_RULE 
5148   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
5149          aff_ge {u0, u1} ({m, s3} DELETE s3) 
5150    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);;
5151 e (MATCH_MP_TAC (SET_RULE 
5152   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));;
5153 e (STRIP_TAC);;
5154 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
5155 e (STRIP_TAC);;
5156 e (SET_TAC[]);;
5157
5158 e (REWRITE_TAC[DISJOINT]);;
5159 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
5160 e (NEW_GOAL `F`);;
5161 e (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);;
5162 e (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);;
5163 e (UP_ASM_TAC THEN SET_TAC[]);;
5164 e (REWRITE_TAC[COPLANAR_3]);;
5165 e (UP_ASM_TAC THEN MESON_TAC[]);;
5166 e (UP_ASM_TAC THEN SET_TAC[]);;
5167
5168 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
5169 e (STRIP_TAC);;
5170 e (SET_TAC[]);;
5171 e (REWRITE_TAC[DISJOINT]);;
5172 e (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);;
5173 e (NEW_GOAL `F`);;
5174 e (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);;
5175 e (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);;
5176 e (UP_ASM_TAC THEN SET_TAC[]);;
5177 e (REWRITE_TAC[COPLANAR_3]);;
5178 e (UP_ASM_TAC THEN MESON_TAC[]);;
5179 e (UP_ASM_TAC THEN SET_TAC[]);;
5180
5181 e (SET_TAC[]);;
5182
5183 e (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);;
5184 e (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u3 u2) =
5185              (if &1 < d \/ r < &0
5186               then &0
5187               else azim u0 u1 u3 u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);;
5188 e (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);;
5189 e (STRIP_TAC);;
5190 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
5191 e (EXISTS_TAC `u3:real^3`);;
5192 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
5193 e (ASM_REWRITE_TAC[]);;
5194 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
5195 e (EXISTS_TAC `u2:real^3`);;
5196 e (ASM_REWRITE_TAC[]);;
5197
5198 e (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);;
5199 e (COND_CASES_TAC);;
5200 e (NEW_GOAL `F`);;
5201
5202 e (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
5203    UP_ASM_TAC THEN REAL_ARITH_TAC);;
5204 e (UP_ASM_TAC THEN MESON_TAC[]);;
5205
5206 e (REWRITE_WITH `azim (u0:real^3) u1 u3 u2 = dihV u0 u1 u3 u2`);;
5207 e (MATCH_MP_TAC AZIM_DIHV_SAME);;
5208 e (ASM_REWRITE_TAC[]);;
5209 e (STRIP_TAC);;
5210
5211 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
5212 e (EXISTS_TAC `u2:real^3`);;
5213 e (ASM_REWRITE_TAC[]);;
5214 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
5215 e (EXISTS_TAC `u3:real^3`);;
5216 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
5217 e (ASM_REWRITE_TAC[]);;
5218
5219 e (REWRITE_TAC[dihX]);;
5220 e (COND_CASES_TAC);;
5221 e (NEW_GOAL `F`);;
5222 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
5223 e (REWRITE_TAC[]);;
5224 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5225 e (EXISTS_TAC `X:real^3->bool`);;
5226 e (ASM_REWRITE_TAC[] THEN SET_TAC[]);;
5227 e (UP_ASM_TAC THEN MESON_TAC[]);;
5228
5229 e (LET_TAC);;
5230
5231 e (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);;
5232 e (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
5233            ul IN barV V 3 /\
5234            X = mcell k V ul /\
5235            initial_sublist [u0; u1] ul)`);;
5236 e (STRIP_TAC);;
5237 e (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);;
5238 e (MATCH_MP_TAC SELECT_AX);;
5239 e (EXISTS_TAC `(4, vl:(real^3)list)`);;
5240 e (EXPAND_TAC "P");;
5241 e (REWRITE_TAC[BETA_THM]);;
5242 e (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);;
5243 e (STRIP_TAC);;
5244 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
5245
5246 e (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
5247                  LENGTH [u0;u1] = 1 + 1`);;
5248 e (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
5249 e (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
5250 e (ASM_REWRITE_TAC[]);;
5251 e (REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
5252 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);;
5253 e (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);;
5254
5255 e (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);;
5256 e (MATCH_MP_TAC Ajripqn.AJRIPQN);;
5257 e (ASM_REWRITE_TAC[]);;
5258 e (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
5259 e (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);;
5260 e (REWRITE_WITH `mcell 4 V vl = X`);;
5261 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
5262 e (SET_TAC[ASSUME `X = mcell k' V ul`]);;
5263
5264 e (REPEAT STRIP_TAC);;
5265 e (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
5266    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);;
5267 e (SET_TAC[]);;
5268 e (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);;
5269
5270 e (COND_CASES_TAC);;
5271 e (NEW_GOAL `F`);;
5272 e (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);;
5273 e (UP_ASM_TAC THEN MESON_TAC[]);;
5274 e (COND_CASES_TAC);;
5275 e (NEW_GOAL `F`);;
5276 e (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);;
5277 e (UP_ASM_TAC THEN MESON_TAC[]);;
5278 e (COND_CASES_TAC);;
5279
5280 e (REWRITE_TAC[dihu4]);;
5281
5282 e (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) = 
5283    dihV u0 u1 u2 (u3:real^3)`);;
5284
5285 e (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);;
5286 e (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
5287 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
5288
5289 e (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);;
5290 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
5291 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
5292 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5293                  CARD (set_of_list ul) = 3 + 1`);;
5294 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
5295 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
5296 e (ARITH_TAC);;
5297
5298 e (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);;
5299 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
5300 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
5301 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
5302                  CARD (set_of_list ul) = 3 + 1`);;
5303 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
5304 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
5305 e (ARITH_TAC);;
5306
5307 e (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);;
5308 e (REWRITE_WITH `
5309     {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
5310     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = 
5311     convex hull {u0, u1,u2,u3:real^3}`);;
5312 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
5313 e (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);;
5314 e (REPEAT STRIP_TAC);;
5315
5316 e (UNDISCH_TAC `~NULLSET X`);;
5317 e (REWRITE_TAC[]);;
5318 e (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5319    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);;
5320 e (COND_CASES_TAC);;
5321 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
5322 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
5323 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
5324 e (UP_ASM_TAC THEN STRIP_TAC);;
5325 e (ASM_REWRITE_TAC[set_of_list]);;
5326 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5327 e (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);;
5328 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
5329 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
5330 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
5331 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
5332 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
5333 e (UNDISCH_TAC 
5334    `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);;
5335 e (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
5336                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
5337
5338 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
5339
5340 e (UNDISCH_TAC `~NULLSET X`);;
5341 e (REWRITE_TAC[]);;
5342 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);;
5343 e (COND_CASES_TAC);;
5344 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5345 e (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);;
5346 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
5347 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
5348 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
5349 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
5350 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
5351 e (ASM_REWRITE_TAC[]);;
5352 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
5353
5354 e (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);;
5355 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);;
5356 e (COND_CASES_TAC);;
5357 e (MESON_TAC[]);;
5358 e (NEW_GOAL `F`);;
5359 e (UNDISCH_TAC `~NULLSET X`);;
5360 e (REWRITE_TAC[]);;
5361 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);;
5362 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
5363 e (UP_ASM_TAC THEN MESON_TAC[]);;
5364
5365 e (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5366    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);;
5367 e (COND_CASES_TAC);;
5368 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
5369 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
5370 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
5371 e (UP_ASM_TAC THEN STRIP_TAC);;
5372 e (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
5373 e (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);;
5374 e (NEW_GOAL `F`);;
5375 e (UNDISCH_TAC `~NULLSET X`);;
5376 e (REWRITE_TAC[]);;
5377 e (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; 
5378    ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);;
5379 e (COND_CASES_TAC);;
5380 e (NEW_GOAL `F`);;
5381 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);;
5382 e (UP_ASM_TAC THEN MESON_TAC[]);;
5383 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
5384 e (UP_ASM_TAC THEN MESON_TAC[]);;
5385
5386 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);;
5387 e (STRIP_TAC);;
5388
5389 e (ASM_CASES_TAC `EL 2 ul = u2:real^3`);;
5390 e (NEW_GOAL `EL 3 ul = u3:real^3`);;
5391 e (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));;
5392 e (STRIP_TAC);;
5393 e (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);;
5394 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
5395 e (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);;
5396 e (REWRITE_TAC[]);;
5397 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
5398 e (REWRITE_TAC[
5399    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5400    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);;
5401 e (ASM_REWRITE_TAC[]);;
5402
5403 e (NEW_GOAL `EL 2 ul = u3:real^3`);;
5404 e (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));;
5405 e (STRIP_TAC);;
5406 e (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);;
5407 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
5408 e (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);;
5409 e (REWRITE_TAC[]);;
5410 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
5411
5412 e (REWRITE_TAC[
5413    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5414    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);;
5415 e (NEW_GOAL `EL 3 ul = u2:real^3`);;
5416 e (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));;
5417 e (STRIP_TAC);;
5418 e (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);;
5419 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
5420 e (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);;
5421 e (REWRITE_TAC[]);;
5422 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
5423
5424 e (REWRITE_TAC[
5425    GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5426    ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);;
5427 e (ASM_REWRITE_TAC[]);;
5428 e (REWRITE_TAC[DIHV_SYM_2]);;
5429
5430 e (REWRITE_TAC[DIHV_SYM_2]);;
5431 e (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);;
5432 e (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);;
5433 e (AP_THM_TAC THEN AP_TERM_TAC);;
5434
5435 e (REWRITE_WITH 
5436   `measurable (conic_cap u0 u1 r d) /\
5437              vol (conic_cap u0 u1 r d) =
5438              (if u1 = u0 \/ &1 <= d \/ r < &0
5439               then &0
5440               else &2 / &3 * pi * (&1 - d) * r pow 3)`);;
5441 e (MATCH_MP_TAC VOLUME_CONIC_CAP);;
5442 e (EXPAND_TAC "d");;
5443 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
5444 e (COND_CASES_TAC);;
5445 e (NEW_GOAL `F`);;
5446 e (UP_ASM_TAC THEN STRIP_TAC);;
5447 e (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);;
5448 e (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5449 e (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5450 e (UP_ASM_TAC THEN MESON_TAC[]);;
5451
5452 e (REWRITE_WITH `max d (--(&1)) = d`);;
5453 e (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));;
5454 e (REWRITE_TAC[REAL_NEG_LT0]);;
5455 e (STRIP_TAC);;
5456 e (EXPAND_TAC "d");;
5457 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
5458 e (REAL_ARITH_TAC);;
5459
5460 e (REWRITE_WITH `
5461   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
5462   ((&2 * pi) / (&2 * pi))`);;
5463 e (REAL_ARITH_TAC);;
5464 e (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);;
5465 e (MATCH_MP_TAC REAL_DIV_REFL);;
5466 e (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);;
5467 e (REAL_ARITH_TAC);;
5468 e (NEW_GOAL `F`);;
5469 e (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
5470    THEN MESON_TAC[]);;
5471 e (UP_ASM_TAC THEN MESON_TAC[]);;
5472
5473 (* ========================================================================== *)
5474
5475 e (NEW_GOAL `F`);;
5476 e (NEW_GOAL `azim (u0:real^3) u1 u3 u2 = 
5477   (if azim u0 u1 u2 u3 = &0 then &0 else &2 * pi - azim u0 u1 u2 u3)`);;
5478 e (MATCH_MP_TAC AZIM_COMPL);;
5479 e (STRIP_TAC);;
5480
5481 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
5482 e (EXISTS_TAC `u3:real^3`);;
5483 e (ASM_REWRITE_TAC[]);;
5484 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
5485 e (EXISTS_TAC `u2:real^3`);;
5486 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);;
5487 e (ASM_REWRITE_TAC[]);;
5488 e (UP_ASM_TAC THEN COND_CASES_TAC);;
5489 e (NEW_GOAL `F`);;
5490 e (NEW_GOAL `(&0 < pi)`);;
5491 e (REWRITE_TAC[PI_POS]);;
5492 e (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 u3 < pi)`);;
5493 e (ASM_REWRITE_TAC[]);;
5494 e (UP_ASM_TAC THEN MESON_TAC[]);;
5495 e (STRIP_TAC);;
5496
5497 e (NEW_GOAL `azim (u0:real^3) u1 u2 u3 = pi`);;
5498 e (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5499 e (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);;
5500 e (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);;
5501 e (ASM_REWRITE_TAC[]);;
5502 e (UP_ASM_TAC THEN MESON_TAC[]);;
5503
5504 (* ========================================================================= *)
5505 (*  Case k = 3                                                               *)
5506 (* ========================================================================= *)
5507
5508 e (NEW_GOAL `k = 3`);;
5509 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `2 <= k` THEN ARITH_TAC);;
5510 e (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);;
5511 e (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);;
5512 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
5513 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
5514 e (UP_ASM_TAC THEN STRIP_TAC);;
5515 e (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);;
5516
5517 e (REWRITE_WITH `u0 = v0:real^3`);;
5518 e (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);;
5519 e (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
5520    TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
5521 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);;
5522
5523 e (REWRITE_WITH `u1 = v1:real^3`);;
5524 e (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);;
5525 e (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`; 
5526    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
5527 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
5528 e (ASM_REWRITE_TAC[]);;
5529 e (UP_ASM_TAC THEN STRIP_TAC);;
5530
5531 e (ABBREV_TAC `L = aff_ge{u0, u1} {u2, mxi V vl}`);;
5532
5533 e (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);;
5534 e (AP_TERM_TAC);;
5535 e (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
5536    mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
5537 e (COND_CASES_TAC);;
5538 e (ABBREV_TAC `m = mxi V vl`);;
5539 e (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);;
5540 e (EXPAND_TAC "m" THEN DEL_TAC THEN ASM_REWRITE_TAC[]);;
5541
5542 e (EXPAND_TAC "L");;
5543 e (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);;
5544 e (STRIP_TAC);;
5545 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));;
5546 e (REWRITE_TAC[Marchal_cells_2.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);;
5547 e (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
5548                             A INTER B SUBSET C INTER B`));;
5549 e (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, m}`);;
5550 e (REWRITE_TAC[DISJOINT]);;
5551 e (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));;
5552 e (STRIP_TAC);;
5553 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
5554 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5555 e (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);;
5556
5557 e (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
5558    mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
5559 e (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);;
5560 e (EXPAND_TAC "m" THEN REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
5561 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5562 e (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);;
5563 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
5564 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
5565 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
5566
5567 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
5568 e (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);;
5569 e (UP_ASM_TAC THEN SET_TAC[]);;
5570 e (REWRITE_TAC[COPLANAR_3]);;
5571 e (NEW_GOAL `m IN {u0, u1:real^3}`);;
5572 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
5573 e (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);;
5574 e (UP_ASM_TAC THEN SET_TAC[]);;
5575 e (REWRITE_TAC[COPLANAR_3]);;
5576
5577 e (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, m:real^3}`; AFF_GE_2_2]);;
5578 e (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);;
5579 e (REPEAT STRIP_TAC);;
5580 e (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN 
5581    EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);;
5582 e (ASM_REWRITE_TAC[]);;
5583 e (STRIP_TAC);;
5584
5585 e (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);;
5586 e (STRIP_TAC);;
5587 e (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);;
5588 e (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5589    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);;
5590 e (EXPAND_TAC "D");;
5591 e (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);;
5592 e (DISJ1_TAC);;
5593 e (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);;
5594
5595 e (NEW_GOAL `(?b1:real. b1 IN P1 /\ (!x. x IN P1 ==> b1 <= x))`);;
5596 e (FIRST_ASSUM MATCH_MP_TAC);;
5597 e (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);;
5598 e (EXISTS_TAC `(f1:(real^3)list -> real) vl`);;
5599 e (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
5600 e (EXISTS_TAC `vl:(real^3)list`);;
5601 e (ASM_REWRITE_TAC[]);;
5602 e (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);;
5603 e (ASM_REWRITE_TAC[]);;
5604 e (STRIP_TAC);;
5605 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
5606 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5607 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
5608 e (STRIP_TAC);;
5609 e (ASM_REWRITE_TAC[]);;
5610 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
5611 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
5612 e (MATCH_MP_TAC (SET_RULE 
5613   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
5614 e (STRIP_TAC);;
5615 e (MATCH_MP_TAC SUBSET_BALL);;
5616 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
5617 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
5618 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
5619 e (FIRST_X_ASSUM CHOOSE_TAC);;
5620
5621 e (NEW_GOAL `r1 = (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x:real))`);;
5622 e (EXPAND_TAC "r1");;
5623 e (COND_CASES_TAC);;
5624 e (NEW_GOAL `F`);;
5625 e (UP_ASM_TAC THEN REWRITE_TAC[]);;
5626 e (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);;
5627 e (EXISTS_TAC `(f1:(real^3)list -> real) vl`);;
5628 e (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
5629 e (EXISTS_TAC `vl:(real^3)list`);;
5630 e (ASM_REWRITE_TAC[]);;
5631 e (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);;
5632 e (ASM_SIMP_TAC[]);;
5633 e (STRIP_TAC);;
5634 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
5635 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5636 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
5637 e (STRIP_TAC);;
5638 e (ASM_REWRITE_TAC[]);;
5639 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
5640 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
5641 e (MATCH_MP_TAC (SET_RULE 
5642   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
5643 e (STRIP_TAC);;
5644 e (MATCH_MP_TAC SUBSET_BALL);;
5645 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
5646 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
5647 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
5648 e (UP_ASM_TAC THEN MESON_TAC[]);;
5649 e (REWRITE_TAC[]);;
5650
5651 e (ABBREV_TAC `Q1 = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);;
5652 e (NEW_GOAL `(Q1:real->bool) r1`);;
5653 e (ASM_REWRITE_TAC[]);;
5654 e (MATCH_MP_TAC SELECT_AX);;
5655 e (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");;
5656 e (ASM_REWRITE_TAC[]);;
5657 e (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);;
5658 e (NEW_GOAL `r1 <= f1 (vl:(real^3)list)`);;
5659 e (FIRST_ASSUM MATCH_MP_TAC);;
5660 e (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
5661 e (EXISTS_TAC `vl:(real^3)list`);;
5662 e (ASM_REWRITE_TAC[]);;
5663 e (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);;
5664 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);;
5665 e (STRIP_TAC);;
5666 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
5667 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5668 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
5669 e (STRIP_TAC);;
5670 e (ASM_REWRITE_TAC[]);;
5671 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
5672 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
5673 e (MATCH_MP_TAC (SET_RULE 
5674   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
5675 e (STRIP_TAC);;
5676 e (MATCH_MP_TAC SUBSET_BALL);;
5677 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
5678 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
5679 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
5680
5681 e (UP_ASM_TAC THEN EXPAND_TAC "f1" THEN REWRITE_TAC[EL; HD; TL; 
5682    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
5683    ASSUME `vl= [u0; u1; u2; u3:real^3]`]);;
5684 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
5685 e (EXPAND_TAC "m");;
5686 e (REWRITE_TAC[ASSUME `vl = [u0;u1;u2;u3:real^3]`]);;
5687 e (STRIP_TAC);;
5688
5689 e (NEW_GOAL `!v. v IN affine hull {u1, u2, m:real^3} ==> r1 <= dist (u0, v)`);;
5690 e (REPEAT STRIP_TAC);;
5691 e (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, m}) u0) <= 
5692              dist (u0, v:real^3)`);;
5693 e (MATCH_MP_TAC CLOSEST_POINT_LE);;
5694 e (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);;
5695 e (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5696
5697 e (NEW_GOAL `r <= dist (u0:real^3, x)`);;
5698 e (REWRITE_TAC[dist]);;
5699 e (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);;
5700 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
5701 e (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);;
5702 e (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
5703   (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) = 
5704   (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);;
5705 e (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 + 
5706                           t3 /(t2 + t3 + t4) % u2 + 
5707                           t4 /(t2 + t3 + t4) % m`);;
5708 e (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % m) = (t2 + t3 + t4) % (y:real^3)`);;
5709 e (EXPAND_TAC "y");;
5710 e (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 +  t3 / x % u2 + t4 / x % u3) = 
5711    (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);;
5712 e (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);;
5713 e (MATCH_MP_TAC REAL_DIV_REFL);;
5714 e (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);;
5715 e (REAL_ARITH_TAC);;
5716 e (VECTOR_ARITH_TAC);;
5717 e (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);;
5718
5719 e (NEW_GOAL `&1 < t2 + t3 + t4`);;
5720 e (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);;
5721 e (REAL_ARITH_TAC);;
5722 e (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`);;
5723 e (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5724 e (REWRITE_TAC[GSYM dist]);;
5725 e (NEW_GOAL `r1 <= dist (u0, y:real^3)`);;
5726 e (FIRST_ASSUM MATCH_MP_TAC);;
5727 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
5728 e (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
5729    EXISTS_TAC `t4 / (t2 + t3 + t4)`);;
5730 e (STRIP_TAC);;
5731 e (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);;
5732 e (MATCH_MP_TAC REAL_DIV_REFL);;
5733 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
5734 e (ASM_REWRITE_TAC[]);;
5735
5736 e (NEW_GOAL `r1 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);;
5737 e (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);;
5738 e (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);;
5739 e (MATCH_MP_TAC REAL_LE_MUL);;
5740 e (REWRITE_TAC[DIST_POS_LE]);;
5741 e (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5742 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5743 e (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5744 e (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
5745
5746 (* ========================================================================== *)
5747
5748 e (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);;
5749 e (STRIP_TAC);;
5750 e (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);;
5751 e (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5752    GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);;
5753 e (EXPAND_TAC "D");;
5754 e (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);;
5755 e (DISJ2_TAC);;
5756 e (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);;
5757
5758 e (NEW_GOAL `(?b1:real. b1 IN P3 /\ (!x. x IN P3 ==> x <= b1))`);;
5759 e (FIRST_ASSUM MATCH_MP_TAC);;
5760 e (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);;
5761 e (EXISTS_TAC `(f3:(real^3)list -> real) vl`);;
5762 e (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
5763 e (EXISTS_TAC `vl:(real^3)list`);;
5764 e (ASM_REWRITE_TAC[]);;
5765 e (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);;
5766 e (ASM_SIMP_TAC[MCELL_EXPLICIT]);;
5767 e (STRIP_TAC);;
5768 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
5769 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5770 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
5771 e (STRIP_TAC);;
5772 e (ASM_REWRITE_TAC[]);;
5773 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
5774 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
5775 e (MATCH_MP_TAC (SET_RULE 
5776   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
5777 e (STRIP_TAC);;
5778 e (MATCH_MP_TAC SUBSET_BALL);;
5779 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
5780 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
5781 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
5782 e (FIRST_X_ASSUM CHOOSE_TAC);;
5783
5784 e (NEW_GOAL `d1 = (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b:real))`);;
5785 e (EXPAND_TAC "d1");;
5786 e (COND_CASES_TAC);;
5787 e (NEW_GOAL `F`);;
5788 e (UP_ASM_TAC THEN REWRITE_TAC[]);;
5789 e (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);;
5790 e (EXISTS_TAC `(f3:(real^3)list -> real) vl`);;
5791 e (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
5792 e (EXISTS_TAC `vl:(real^3)list`);;
5793 e (ASM_REWRITE_TAC[]);;
5794 e (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);;
5795 e (ASM_SIMP_TAC[MCELL_EXPLICIT]);;
5796 e (STRIP_TAC);;
5797 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
5798 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5799 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
5800 e (STRIP_TAC);;
5801 e (ASM_REWRITE_TAC[]);;
5802 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
5803 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
5804 e (MATCH_MP_TAC (SET_RULE 
5805   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
5806 e (STRIP_TAC);;
5807 e (MATCH_MP_TAC SUBSET_BALL);;
5808 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
5809 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
5810 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
5811 e (UP_ASM_TAC THEN MESON_TAC[]);;
5812 e (REWRITE_TAC[]);;
5813
5814 e (ABBREV_TAC `Q1 = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);;
5815 e (NEW_GOAL `(Q1:real->bool) d1`);;
5816 e (ASM_REWRITE_TAC[]);;
5817 e (MATCH_MP_TAC SELECT_AX);;
5818 e (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");;
5819 e (ASM_REWRITE_TAC[]);;
5820 e (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);;
5821
5822 e (NEW_GOAL `f3 (vl:(real^3)list) <= d1`);;
5823 e (FIRST_ASSUM MATCH_MP_TAC);;
5824 e (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);;
5825 e (EXISTS_TAC `vl:(real^3)list`);;
5826 e (ASM_REWRITE_TAC[]);;
5827 e (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);;
5828 e (ASM_SIMP_TAC[MCELL_EXPLICIT]);;
5829 e (STRIP_TAC);;
5830 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
5831 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5832 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
5833 e (STRIP_TAC);;
5834 e (ASM_REWRITE_TAC[]);;
5835 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
5836 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
5837 e (MATCH_MP_TAC (SET_RULE 
5838   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
5839 e (STRIP_TAC);;
5840 e (MATCH_MP_TAC SUBSET_BALL);;
5841 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
5842 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
5843 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
5844
5845 e (UP_ASM_TAC THEN EXPAND_TAC "f3");;
5846 e (REWRITE_TAC[EL; HD; TL; 
5847    ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; ASSUME `mxi V vl = m`; 
5848    ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);;
5849
5850 e (ABBREV_TAC `xx = smallest_angle_line u2 m u0 u1`);;
5851
5852 e (MP_TAC (ASSUME `smallest_angle_line u2 m u0 u1 = xx`));;
5853 e (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);;
5854 e (ABBREV_TAC `Q2 = 
5855  (\x:real^3. x IN convex hull {u2, m} /\
5856              (!y. y IN convex hull {u2, m}
5857                   ==> ((y - u0) dot (u1 - u0)) /
5858                       (norm (y - u0) * norm (u1 - u0)) <=
5859                       ((x - u0) dot (u1 - u0)) /
5860                       (norm (x - u0) * norm (u1 - u0))))`);;
5861 e (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);;
5862 e (NEW_GOAL `(Q2:real^3->bool) xx`);;
5863 e (ONCE_ASM_REWRITE_TAC[]);;
5864 e (MATCH_MP_TAC SELECT_AX);;
5865 e (EXPAND_TAC "Q2");;
5866
5867 e (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);;
5868 e (STRIP_TAC);;
5869 e (ASM_REWRITE_TAC[]);;
5870 e (STRIP_TAC);;
5871
5872 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
5873 e (REWRITE_TAC[]);;
5874 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5875 e (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);;
5876 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;TRUNCATE_SIMPLEX_EXPLICIT_2;
5877     SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
5878 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
5879 e (EXPAND_TAC "m");;
5880 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
5881
5882 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5883
5884 e (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);;
5885 e (STRIP_TAC);;
5886 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
5887 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
5888 e (REWRITE_TAC[coplanar]);;
5889 e (UNDISCH_TAC `u0 IN convex hull {u2, m:real^3}`);;
5890 e (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);;
5891 e (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
5892    EXISTS_TAC `m:real^3`);;
5893 e (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));;
5894 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
5895 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
5896 e (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);;
5897 e (STRIP_TAC);;
5898 e (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);;
5899 e (UP_ASM_TAC THEN VECTOR_ARITH_TAC);;
5900 e (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
5901 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
5902 e (SET_TAC[]);;
5903
5904 e (UP_ASM_TAC THEN EXPAND_TAC "Q2");;
5905 e (STRIP_TAC);;
5906 e (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) / 
5907                                (norm (y - u0) * norm (u1 - u0)))`);;
5908
5909 e (NEW_GOAL `d < (g:real^3->real) x`);;
5910 e (EXPAND_TAC "g");;
5911 e (REWRITE_WITH 
5912   `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
5913    d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);;
5914 e (MATCH_MP_TAC REAL_LT_RDIV_EQ);;
5915 e (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));;
5916 e (STRIP_TAC);;
5917 e (MATCH_MP_TAC REAL_LE_MUL);;
5918 e (ASM_REWRITE_TAC[NORM_POS_LE]);;
5919 e (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);;
5920 e (ASM_REWRITE_TAC[]);;
5921 e (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = u0:real^3 <=>
5922   t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = (t1 + t2 + t3 + t4) % u0`);;
5923 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
5924 e (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);;
5925 e (STRIP_TAC);;
5926
5927 e (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);;
5928 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5929 e (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);;
5930 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list; 
5931    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
5932 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
5933 e (EXPAND_TAC "m");;
5934 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
5935 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5936
5937 e (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);;
5938 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
5939 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
5940 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
5941 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
5942 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
5943 e (REWRITE_TAC[affine_dependent]);;
5944 e (EXISTS_TAC `u1:real^3`);;
5945 e (STRIP_TAC);;
5946 e (SET_TAC[]);;
5947
5948 e (NEW_GOAL `~(u1 IN {u0, u2, m:real^3})`);;
5949 e (STRIP_TAC);;
5950 e (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);;
5951 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5952 e (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);;
5953 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list; 
5954    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
5955 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
5956 e (EXPAND_TAC "m");;
5957 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
5958 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
5959 e (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);;
5960 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
5961 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
5962 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
5963 e (REWRITE_WITH `{u0, u1, u2, m} = {u0:real^3,u2, m}`);;
5964 e (UP_ASM_TAC THEN SET_TAC[]);;
5965 e (REWRITE_TAC[COPLANAR_3]);;
5966 e (SET_TAC[]);;
5967 e (REWRITE_WITH `{u0, u1, u2, m} DELETE u1 = {u0, u2, m:real^3}`);;
5968 e (UP_ASM_TAC THEN SET_TAC[]);;
5969 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
5970 e (EXISTS_TAC `(t2 + t3 + t4) / t2`);;
5971 e (EXISTS_TAC `(-- t3) / t2`);;
5972 e (EXISTS_TAC `(-- t4) / t2`);;
5973
5974 e (STRIP_TAC);;
5975 e (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);;
5976 e (REAL_ARITH_TAC);;
5977 e (MATCH_MP_TAC REAL_DIV_REFL);;
5978 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
5979 e (REWRITE_WITH 
5980   `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % m:real^3 <=> 
5981    u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % m)`);;
5982 e (VECTOR_ARITH_TAC);;
5983 e (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % m = 
5984                              (t2 + t3 + t4) % u0:real^3`)]);;
5985 e (REWRITE_TAC[VECTOR_ARITH 
5986   `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);;
5987 e (REWRITE_TAC[VECTOR_MUL_ASSOC]);;
5988 e (REWRITE_WITH `&1 / t2 * t2 = &1`);;
5989 e (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);;
5990 e (MATCH_MP_TAC REAL_DIV_REFL);;
5991 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
5992 e (VECTOR_ARITH_TAC);;
5993 e (SET_TAC[]);;
5994 e (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);;
5995 e (ASM_REWRITE_TAC[]);;
5996
5997 e (NEW_GOAL `g x <= (g:real^3->real) xx`);;
5998 e (NEW_GOAL `!y. y IN convex hull {u2 , m:real^3} ==> g y <= g xx`);;
5999 e (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);;
6000 e (NEW_GOAL `&0 < (t3 + t4)`);;
6001 e (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0)  ==> &0 < x`));;
6002 e (STRIP_TAC);;
6003 e (MATCH_MP_TAC REAL_LE_ADD);;
6004 e (ASM_REWRITE_TAC[]);;
6005 e (STRIP_TAC);;
6006 e (NEW_GOAL `t3 = &0 /\ t4 = &0`);;
6007 e (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN 
6008    UP_ASM_TAC THEN REAL_ARITH_TAC);;
6009 e (UP_ASM_TAC THEN STRIP_TAC);;
6010
6011 e (NEW_GOAL `F`);;
6012 e (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);;
6013 e (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);;
6014 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
6015 e (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));;
6016 e (STRIP_TAC);;
6017 e (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) - 
6018                  (t1 + t2 + t3 + t4) % u0:real^3`);;
6019 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
6020 e (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH 
6021   `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; 
6022    DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);;
6023 e (MATCH_MP_TAC REAL_LE_MUL);;
6024 e (REWRITE_TAC[DOT_POS_LE]);;
6025 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
6026 e (MATCH_MP_TAC REAL_LE_MUL);;
6027 e (REWRITE_TAC[DIST_POS_LE]);;
6028 e (MATCH_MP_TAC REAL_LE_MUL);;
6029 e (REWRITE_TAC[DIST_POS_LE]);;
6030 e (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);;
6031 e (REAL_ARITH_TAC);;
6032 e (UP_ASM_TAC THEN MESON_TAC[]);;
6033
6034 e (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % m:real^3`);;
6035 e (NEW_GOAL `(g:real^3->real) y <= g xx`);;
6036 e (FIRST_ASSUM MATCH_MP_TAC);;
6037 e (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);;
6038 e (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);;
6039 e (REPEAT STRIP_TAC);;
6040 e (MATCH_MP_TAC REAL_LE_DIV);;
6041 e (ASM_SIMP_TAC[REAL_LE_ADD]);;
6042 e (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);;
6043 e (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);;
6044 e (MATCH_MP_TAC REAL_DIV_REFL);;
6045 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
6046 e (ASM_REWRITE_TAC[]);;
6047
6048 e (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 + 
6049                    t4 / (t1 + t3 + t4) % m:real^3`);;
6050 e (NEW_GOAL `(g:real^3->real) y = g w`);;
6051 e (EXPAND_TAC "g");;
6052
6053 e (REWRITE_WITH `y:real^3 - u0 = 
6054                 &1 / (t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);;
6055 e (EXPAND_TAC "y");;
6056 e (REWRITE_TAC[VECTOR_ARITH 
6057   `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
6058    &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
6059    (t3 + t4) / (t3 + t4) % u0 = u0`]);;
6060 e (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);;
6061 e (MATCH_MP_TAC REAL_DIV_REFL);;
6062 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
6063 e (VECTOR_ARITH_TAC);;
6064 e (REWRITE_TAC[NORM_MUL; DOT_LMUL]);;
6065
6066 e (REWRITE_WITH `w:real^3 - u0 = 
6067                 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);;
6068 e (EXPAND_TAC "w");;
6069 e (REWRITE_TAC[VECTOR_ARITH 
6070    `(t1 / (t1 + t3 + t4) % u0 +
6071     t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
6072     &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=> 
6073     (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);;
6074 e (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);;
6075 e (MATCH_MP_TAC REAL_DIV_REFL);;
6076 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
6077    THEN REAL_ARITH_TAC);;
6078 e (VECTOR_ARITH_TAC);;
6079 e (REWRITE_TAC[NORM_MUL; DOT_LMUL]);;
6080 e (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);;
6081 e (REWRITE_TAC[REAL_ABS_REFL]);;
6082 e (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);;
6083 e (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);;
6084 e (REWRITE_TAC[REAL_ABS_REFL]);;
6085 e (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);;
6086 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` 
6087    THEN REAL_ARITH_TAC);;
6088 e (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) = 
6089                            (a * x) / (a * (y * z))`]);;
6090 e (ABBREV_TAC 
6091   `a1 = norm (t3 % u2 + t4 % m - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);;
6092 e (NEW_GOAL `~(a1 = &0)`);;
6093 e (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; 
6094    VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);;
6095 e (STRIP_TAC);;
6096
6097 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
6098 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6099 e (EXISTS_TAC `(X:real^3->bool)`);;
6100 e (STRIP_TAC);;
6101
6102 e (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6103                 set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
6104 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
6105 e (EXPAND_TAC "m");;
6106 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
6107
6108 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6109 e (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);;
6110 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
6111 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
6112 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
6113 e (REWRITE_TAC[coplanar]);;
6114 e (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6115    EXISTS_TAC `m:real^3`);;
6116 e (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));;
6117 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
6118 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
6119 e (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
6120    THEN EXISTS_TAC `t4 / (t3 + t4)`);;
6121 e (REPEAT STRIP_TAC);;
6122 e (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
6123                           (t3 + t4) / (t3 + t4)`]);;
6124 e (MATCH_MP_TAC REAL_DIV_REFL);;
6125 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
6126 e (ASM_REWRITE_TAC[VECTOR_ARITH 
6127    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
6128     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);;
6129 e (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);;
6130 e (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);;
6131 e (MATCH_MP_TAC REAL_DIV_REFL);;
6132 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
6133 e (VECTOR_ARITH_TAC);;
6134 e (SET_TAC[]);;
6135
6136 e (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);;
6137 e (NEW_GOAL `&0 < &1 / (t3 + t4)`);;
6138 e (MATCH_MP_TAC REAL_LT_DIV);;
6139 e (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);;
6140 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
6141
6142 e (REWRITE_WITH 
6143  `(&1 / (t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6144   (&1 / (t3 + t4) * a1) = 
6145   ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);;
6146 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);;
6147
6148 e (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);;
6149 e (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);;
6150 e (MATCH_MP_TAC REAL_LT_DIV);;
6151 e (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);;
6152 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6153    REAL_ARITH_TAC);;
6154 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
6155
6156 e (REWRITE_WITH 
6157  `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6158   (&1 / (t1 + t3 + t4) * a1) = 
6159   ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);;
6160 e (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
6161    MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);;
6162
6163 e (NEW_GOAL `(g:real^3->real) x <= g w`);;
6164 e (EXPAND_TAC "g");;
6165
6166 e (REWRITE_WITH 
6167   `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
6168   ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
6169   ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <= 
6170   ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);;
6171 e (MATCH_MP_TAC RAT_LEMMA4);;
6172 e (STRIP_TAC);;
6173 e (MATCH_MP_TAC REAL_LT_MUL);;
6174 e (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);;
6175 e (STRIP_TAC);;
6176 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
6177 e (REWRITE_TAC[]);;
6178
6179 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6180 e (EXISTS_TAC `(X:real^3->bool)`);;
6181 e (STRIP_TAC);;
6182 e (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6183    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
6184 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
6185 e (EXPAND_TAC "m");;
6186 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
6187 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6188 e (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);;
6189 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
6190 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
6191 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
6192 e (REWRITE_TAC[coplanar]);;
6193 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6194    EXISTS_TAC `m:real^3`);;
6195 e (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);;
6196 e (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));;
6197 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
6198 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
6199 e (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2` 
6200    THEN EXISTS_TAC `(--t4) / t2`);;
6201 e (REPEAT STRIP_TAC);;
6202 e (REWRITE_TAC[REAL_ARITH 
6203    `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);;
6204 e (MATCH_MP_TAC REAL_DIV_REFL);;
6205 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
6206 e (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);;
6207 e (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);;
6208 e (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % m:real^3 = t2 % u1`);;
6209 e (UP_ASM_TAC THEN VECTOR_ARITH_TAC);;
6210 e (ASM_REWRITE_TAC[VECTOR_ARITH 
6211    `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 = 
6212     (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);;
6213 e (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);;
6214 e (REWRITE_WITH `t2 / t2 = &1`);;
6215 e (MATCH_MP_TAC REAL_DIV_REFL);;
6216 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
6217 e (VECTOR_ARITH_TAC);;
6218 e (SET_TAC[]);;
6219
6220 e (MATCH_MP_TAC REAL_LT_MUL);;
6221 e (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);;
6222 e (EXPAND_TAC "w" THEN STRIP_TAC);;
6223 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
6224 e (REWRITE_TAC[]);;
6225
6226 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6227 e (EXISTS_TAC `(X:real^3->bool)`);;
6228 e (STRIP_TAC);;
6229 e (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6230    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
6231 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
6232 e (EXPAND_TAC "m");;
6233 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
6234 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6235 e (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);;
6236 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
6237 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
6238 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
6239 e (REWRITE_TAC[coplanar]);;
6240 e (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN 
6241    EXISTS_TAC `m:real^3`);;
6242 e (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));;
6243 e (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);;
6244 e (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);;
6245
6246 e (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)` 
6247    THEN EXISTS_TAC `t4 / (t3 + t4)`);;
6248 e (REPEAT STRIP_TAC);;
6249 e (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) = 
6250                           (t3 + t4) / (t3 + t4)`]);;
6251 e (MATCH_MP_TAC REAL_DIV_REFL);;
6252 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
6253 e (ASM_REWRITE_TAC[VECTOR_ARITH 
6254    `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 = 
6255     (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);;
6256 e (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH 
6257    `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 = 
6258     (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);;
6259 e (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % m) = u0 <=> 
6260                  t1 % u0 + t3 % u2 + t4 % m = (t1 + t3 + t4) % u0:real^3`);;
6261 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
6262 e (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);;
6263 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN 
6264    REAL_ARITH_TAC);;
6265
6266 e (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
6267    <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);;
6268 e (STRIP_TAC THEN ASM_REWRITE_TAC[]);;
6269 e (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);;
6270 e (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);;
6271 e (MATCH_MP_TAC REAL_DIV_REFL);;
6272 e (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);;
6273 e (VECTOR_ARITH_TAC);;
6274 e (SET_TAC[]);;
6275
6276 e (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);;
6277 e (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");;
6278 e (REWRITE_TAC[VECTOR_ARITH 
6279   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
6280    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);;
6281 e (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);;
6282 e (MATCH_MP_TAC REAL_DIV_REFL);;
6283 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6284    REAL_ARITH_TAC);;
6285 e (VECTOR_ARITH_TAC);;
6286 e (ABBREV_TAC `t = t1 + t3 + t4`);;
6287 e (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 = 
6288                 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);;
6289 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
6290 e (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);;
6291 e (EXPAND_TAC "t" THEN REAL_ARITH_TAC);;
6292 e (REWRITE_TAC[VECTOR_ARITH 
6293   `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);;
6294 e (ABBREV_TAC `x1 = u1 - u0:real^3`);;
6295 e (ABBREV_TAC `x2 = w - u0:real^3`);;
6296
6297 e (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 = 
6298    t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);;
6299 e (REWRITE_TAC[NORM_POW_2]);;
6300 e (VECTOR_ARITH_TAC);;
6301
6302 e (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <= 
6303              t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);;
6304 e (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
6305    t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);;
6306 e (MATCH_MP_TAC REAL_LE_MUL);;
6307 e (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);;
6308 e (MATCH_MP_TAC REAL_LE_MUL);;
6309 e (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);;
6310 e (STRIP_TAC);;
6311 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
6312 e (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);;
6313
6314 e (NEW_GOAL 
6315  `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)`);;
6316
6317 e (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
6318  x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);;
6319 e (MATCH_MP_TAC REAL_LE_MUL);;
6320 e (STRIP_TAC);;
6321 e (MATCH_MP_TAC REAL_LE_MUL);;
6322 e (REWRITE_TAC[NORM_POS_LE]);;
6323 e (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);;
6324 e (NEW_GOAL `F`);;
6325 e (NEW_GOAL `(g:real^3->real) x <= &0`);;
6326 e (EXPAND_TAC "g");;
6327 e (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);;
6328 e (MATCH_MP_TAC REAL_LE_DIV);;
6329 e (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);;
6330
6331 e (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);;
6332 e (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");;
6333 e (REWRITE_TAC[VECTOR_ARITH 
6334   `x % (t1 /x % u0 + t3 / x % u2 + t4 /x  % u3) = 
6335    (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);;
6336 e (EXPAND_TAC "t");;
6337 e (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);;
6338 e (MATCH_MP_TAC REAL_DIV_REFL);;
6339 e (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6340    REAL_ARITH_TAC);;
6341 e (VECTOR_ARITH_TAC);;
6342
6343 e (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);;
6344 e (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 = 
6345                  (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);;
6346 e (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);;
6347 e (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 = 
6348    t2 % x1 + t % x2:real^3`);;
6349 e (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
6350    THEN VECTOR_ARITH_TAC);;
6351 e (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);;
6352 e (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);;
6353 e (MATCH_MP_TAC REAL_LE_MUL);;
6354 e (STRIP_TAC);;
6355 e (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6356    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);;
6357 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
6358 e (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);;
6359 e (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);;
6360 e (MATCH_MP_TAC REAL_LE_MUL);;
6361 e (STRIP_TAC);;
6362 e (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6363    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);;
6364 e (REWRITE_TAC[DOT_POS_LE]);;
6365 e (REWRITE_TAC[DOT_LADD]);;
6366 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
6367 e (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);;
6368 e (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);;
6369 e (REAL_ARITH_TAC);;
6370 e (UP_ASM_TAC THEN MESON_TAC[]);;
6371 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
6372
6373 e (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);;
6374 e (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);;
6375 e (AP_THM_TAC THEN AP_TERM_TAC);;
6376 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
6377 e (REWRITE_TAC[REAL_ABS_REFL]);;
6378 e (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN 
6379    UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);;
6380 e (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);;
6381 e (AP_THM_TAC THEN AP_TERM_TAC);;
6382 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
6383 e (REWRITE_TAC[REAL_ABS_REFL]);;
6384 e (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);;
6385 e (REWRITE_TAC[GSYM NORM_MUL]);;
6386 e (REWRITE_WITH 
6387   `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);;
6388 e (AP_TERM_TAC THEN VECTOR_ARITH_TAC);;
6389 e (REWRITE_TAC[NORM_TRIANGLE]);;
6390 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
6391 e (UNDISCH_TAC `(g:real^3->real) y <= g xx`);;
6392 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
6393
6394 e (NEW_GOAL `(g:real^3->real) xx <= d1`);;
6395 e (FIRST_ASSUM MATCH_MP_TAC);;
6396 e (EXPAND_TAC "P3");;
6397 e (EXPAND_TAC "g" THEN EXPAND_TAC "f3");;
6398 e (REWRITE_TAC[IN_ELIM_THM; IN]);;
6399 e (EXISTS_TAC `vl:(real^3)list`);;
6400 e (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`; 
6401                TRUNCATE_SIMPLEX_EXPLICIT_1]);;
6402 e (STRIP_TAC);;
6403 e (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
6404 e (REWRITE_WITH `mcell 3 V vl = mcell k V vl`);;
6405 e (ASM_SIMP_TAC[]);;
6406 e (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);;
6407 e (STRIP_TAC);;
6408
6409 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
6410 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6411 e (EXISTS_TAC `X INTER (C:real^3->bool)`);;
6412 e (STRIP_TAC);;
6413 e (ASM_REWRITE_TAC[]);;
6414 e (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));;
6415 e (EXPAND_TAC "D" THEN EXPAND_TAC "C");;
6416 e (MATCH_MP_TAC (SET_RULE 
6417   `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));;
6418 e (STRIP_TAC);;
6419 e (MATCH_MP_TAC SUBSET_BALL);;
6420 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
6421 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
6422 e (EXPAND_TAC "d" THEN REAL_ARITH_TAC);;
6423
6424 e (EXPAND_TAC "xx");;
6425 e (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);;
6426 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
6427 e (EXPAND_TAC "m");;
6428 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
6429
6430 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");;
6431 e (REAL_ARITH_TAC);;
6432
6433 e (NEW_GOAL `F`);;
6434 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
6435 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6436 e (EXISTS_TAC `(X:real^3->bool)`);;
6437 e (STRIP_TAC);;
6438 e (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6439                set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
6440 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
6441 e (SET_TAC[]);;
6442 e (UP_ASM_TAC THEN MESON_TAC[]);;
6443
6444 (* ========================================================================= *)
6445
6446 e (ABBREV_TAC `m = mxi V vl`);;
6447 e (NEW_GOAL `~coplanar {u0, u1, u2, m:real^3}`);;
6448 e (STRIP_TAC);;
6449 e (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);;
6450 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6451 e (EXISTS_TAC `X:real^3->bool`);;
6452 e (STRIP_TAC);;
6453 e (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);;
6454 e (COND_CASES_TAC);;
6455 e (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6456    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
6457 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
6458 e (EXPAND_TAC "m");;
6459 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
6460
6461 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6462 e (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);;
6463 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
6464 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
6465 e (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
6466 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
6467 e (SET_TAC[]);;
6468
6469 e (ASM_CASES_TAC `azim u0 u1 u2 (m:real^3) < pi`);;
6470 e (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 m)`);;
6471 e (ASM_SIMP_TAC[WEDGE_LUNE]);;
6472 e (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
6473                  conic_cap u0 u1 r d INTER L`);;
6474 e (SET_TAC[]);;
6475 e (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);;
6476 e (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
6477    aff_gt {u0, u1} {u2, m} DIFF conic_cap u0 u1 r d INTER L = {}`);;
6478 e (EXPAND_TAC "L");;
6479 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));;
6480 e (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);;
6481 e (REWRITE_TAC[SET_RULE `A UNION {} = A`]);;
6482 e (EXPAND_TAC "L");;
6483
6484 e (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, m} =
6485                  aff_gt {u0, u1} {u2, m} UNION 
6486    UNIONS {aff_ge {u0, u1} ({u2, m} DELETE a) | a | a IN  {u2, m}}`);;
6487 e (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);;
6488 e (REWRITE_TAC[Geomdetail.FINITE6]);;
6489 e (REWRITE_TAC[DISJOINT]);;
6490
6491 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
6492 e (NEW_GOAL `F`);;
6493 e (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);;
6494 e (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);;
6495 e (UP_ASM_TAC THEN SET_TAC[]);;
6496 e (REWRITE_TAC[COPLANAR_3]);;
6497 e (UP_ASM_TAC THEN MESON_TAC[]);;
6498
6499 e (ASM_CASES_TAC `m IN {u0, u1:real^3}`);;
6500 e (NEW_GOAL `F`);;
6501 e (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);;
6502 e (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);;
6503 e (UP_ASM_TAC THEN SET_TAC[]);;
6504 e (REWRITE_TAC[COPLANAR_3]);;
6505 e (UP_ASM_TAC THEN MESON_TAC[]);;
6506 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
6507
6508 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6509 e (EXISTS_TAC 
6510   `UNIONS {aff_ge {u0, u1:real^3} ({u2, m} DELETE a) | a | a IN {u2, m}}`);;
6511 e (STRIP_TAC);;
6512 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6513 e (EXISTS_TAC 
6514   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);;
6515 e (STRIP_TAC);;
6516 e (MATCH_MP_TAC NEGLIGIBLE_UNION);;
6517 e (STRIP_TAC);;
6518
6519 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6520 e (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);;
6521 e (STRIP_TAC);;
6522 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
6523 e (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);;
6524 e (SET_TAC[]);;
6525 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
6526 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6527 e (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);;
6528 e (STRIP_TAC);;
6529 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
6530 e (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);;
6531 e (SET_TAC[]);;
6532 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
6533 e (REWRITE_TAC[SET_RULE 
6534   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
6535          aff_ge {u0, u1} ({m, s3} DELETE s3) 
6536    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);;
6537 e (MATCH_MP_TAC (SET_RULE 
6538   `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));;
6539 e (STRIP_TAC);;
6540 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
6541 e (STRIP_TAC);;
6542 e (SET_TAC[]);;
6543
6544 e (REWRITE_TAC[DISJOINT]);;
6545 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
6546 e (NEW_GOAL `F`);;
6547 e (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);;
6548 e (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);;
6549 e (UP_ASM_TAC THEN SET_TAC[]);;
6550 e (REWRITE_TAC[COPLANAR_3]);;
6551 e (UP_ASM_TAC THEN MESON_TAC[]);;
6552 e (UP_ASM_TAC THEN SET_TAC[]);;
6553
6554 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
6555 e (STRIP_TAC);;
6556 e (SET_TAC[]);;
6557 e (REWRITE_TAC[DISJOINT]);;
6558 e (ASM_CASES_TAC `m IN {u0, u1:real^3}`);;
6559 e (NEW_GOAL `F`);;
6560 e (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);;
6561 e (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);;
6562 e (UP_ASM_TAC THEN SET_TAC[]);;
6563 e (REWRITE_TAC[COPLANAR_3]);;
6564 e (UP_ASM_TAC THEN MESON_TAC[]);;
6565 e (UP_ASM_TAC THEN SET_TAC[]);;
6566
6567 e (SET_TAC[]);;
6568
6569 (* begin the computation *)
6570
6571 e (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);;
6572 e (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 m) =
6573              (if &1 < d \/ r < &0
6574               then &0
6575               else azim u0 u1 u2 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);;
6576 e (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);;
6577 e (STRIP_TAC);;
6578 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
6579 e (EXISTS_TAC `m:real^3`);;
6580 e (ASM_REWRITE_TAC[]);;
6581 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
6582 e (EXISTS_TAC `u2:real^3`);;
6583 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
6584 e (ASM_REWRITE_TAC[]);;
6585 e (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);;
6586
6587 e (COND_CASES_TAC);;
6588 e (NEW_GOAL `F`);;
6589 e (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
6590    UP_ASM_TAC THEN REAL_ARITH_TAC);;
6591 e (UP_ASM_TAC THEN MESON_TAC[]);;
6592
6593 e (REWRITE_WITH `azim (u0:real^3) u1 u2 m = dihV u0 u1 u2 m`);;
6594 e (MATCH_MP_TAC AZIM_DIHV_SAME);;
6595 e (ASM_REWRITE_TAC[]);;
6596 e (STRIP_TAC);;
6597 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
6598 e (EXISTS_TAC `m:real^3`);;
6599 e (ASM_REWRITE_TAC[]);;
6600 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
6601 e (EXISTS_TAC `u2:real^3`);;
6602 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
6603 e (ASM_REWRITE_TAC[]);;
6604
6605 e (REWRITE_TAC[dihX]);;
6606 e (COND_CASES_TAC);;
6607 e (NEW_GOAL `F`);;
6608 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
6609 e (REWRITE_TAC[]);;
6610 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6611 e (EXISTS_TAC `X:real^3->bool`);;
6612 e (ASM_REWRITE_TAC[] THEN SET_TAC[]);;
6613 e (UP_ASM_TAC THEN MESON_TAC[]);;
6614
6615 e (LET_TAC);;
6616
6617 e (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);;
6618 e (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
6619            ul IN barV V 3 /\
6620            X = mcell k V ul /\
6621            initial_sublist [u0; u1] ul)`);;
6622 e (STRIP_TAC);;
6623 e (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);;
6624 e (MATCH_MP_TAC SELECT_AX);;
6625 e (EXISTS_TAC `(3, vl:(real^3)list)`);;
6626 e (EXPAND_TAC "P");;
6627 e (REWRITE_TAC[BETA_THM]);;
6628 e (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);;
6629 e (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
6630                  LENGTH [u0;u1] = 1 + 1`);;
6631 e (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
6632 e (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
6633 e (ASM_REWRITE_TAC[]);;
6634 e (REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
6635 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);;
6636 e (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);;
6637
6638 e (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);;
6639 e (MATCH_MP_TAC Ajripqn.AJRIPQN);;
6640 e (ASM_REWRITE_TAC[]);;
6641 e (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
6642 e (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);;
6643 e (REWRITE_WITH `mcell 3 V vl = X`);;
6644 e (ASM_SIMP_TAC[]);;
6645 e (SET_TAC[ASSUME `X = mcell k' V ul`]);;
6646
6647 e (REPEAT STRIP_TAC);;
6648 e (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
6649    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);;
6650 e (SET_TAC[]);;
6651 e (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);;
6652
6653 e (COND_CASES_TAC);;
6654 e (NEW_GOAL `F`);;
6655 e (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);;
6656 e (UP_ASM_TAC THEN MESON_TAC[]);;
6657 e (COND_CASES_TAC);;
6658
6659 e (REWRITE_TAC[dihu3]);;
6660
6661 e (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) = 
6662    dihV u0 u1 u2 (m:real^3)`);;
6663
6664 e (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);;
6665 e (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
6666 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
6667
6668 e (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);;
6669 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
6670 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
6671 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6672                  CARD (set_of_list ul) = 3 + 1`);;
6673 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
6674 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
6675 e (ARITH_TAC);;
6676
6677 e (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);;
6678 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
6679 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
6680 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6681                  CARD (set_of_list ul) = 3 + 1`);;
6682 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
6683 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
6684 e (ARITH_TAC);;
6685
6686 e (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);;
6687 e (REWRITE_WITH `
6688     {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
6689     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = 
6690     convex hull {u0, u1,u2,m:real^3}`);;
6691 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
6692 e (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);;
6693 e (REPEAT STRIP_TAC);;
6694
6695 e (UNDISCH_TAC `~NULLSET X`);;
6696 e (REWRITE_TAC[]);;
6697 e (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);;
6698 e (COND_CASES_TAC);;
6699 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
6700 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
6701 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
6702 e (UP_ASM_TAC THEN STRIP_TAC);;
6703 e (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2; 
6704                    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
6705 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6706 e (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);;
6707 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
6708 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
6709 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
6710 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
6711 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
6712 e (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);;
6713 e (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
6714                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
6715
6716 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
6717
6718 e (UNDISCH_TAC `~NULLSET X`);;
6719 e (REWRITE_TAC[]);;
6720 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
6721    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
6722 e (COND_CASES_TAC);;
6723 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6724 e (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);;
6725 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
6726 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
6727 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
6728 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
6729 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
6730 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
6731 e (EXPAND_TAC "m");;
6732 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
6733 e (ASM_REWRITE_TAC[]);;
6734
6735 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
6736
6737 e (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);;
6738 e (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);;
6739 e (COND_CASES_TAC);;
6740 e (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6741    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
6742 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
6743 e (EXPAND_TAC "m");;
6744 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
6745
6746 e (NEW_GOAL `F`);;
6747 e (UNDISCH_TAC `~NULLSET X`);;
6748 e (REWRITE_TAC[]);;
6749 e (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);;
6750 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
6751 e (UP_ASM_TAC THEN MESON_TAC[]);;
6752
6753 e (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);;
6754 e (COND_CASES_TAC);;
6755 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
6756 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
6757 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
6758 e (UP_ASM_TAC THEN STRIP_TAC);;
6759 e (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
6760                TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6761                SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
6762 e (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);;
6763 e (NEW_GOAL `F`);;
6764 e (UNDISCH_TAC `~NULLSET X`);;
6765 e (REWRITE_TAC[]);;
6766 e (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);;
6767 e (ASM_REWRITE_TAC[]);;
6768 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
6769 e (UP_ASM_TAC THEN MESON_TAC[]);;
6770
6771 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);;
6772
6773 e (NEW_GOAL `mxi V ul = m`);;
6774 e (EXPAND_TAC "m");;
6775 e (MATCH_MP_TAC MCELL_ID_MXI);;
6776 e (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);;
6777 e (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);;
6778 e (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);;
6779 e (ASM_REWRITE_TAC[]);;
6780 e (ASM_REWRITE_TAC[HD]);;
6781 e (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);;
6782 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
6783 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
6784 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
6785                  CARD (set_of_list ul) = 3 + 1`);;
6786 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
6787 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
6788 e (ARITH_TAC);;
6789 e (ASM_REWRITE_TAC[HD]);;
6790 e (ASM_REWRITE_TAC[]);;
6791
6792 e (STRIP_TAC);;
6793 e (NEW_GOAL `EL 2 ul = u2:real^3`);;
6794 e (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));;
6795 e (STRIP_TAC);;
6796 e (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);;
6797 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
6798 e (UNDISCH_TAC `~coplanar {u0,u1,u2,m:real^3}` THEN REWRITE_TAC[
6799    GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
6800    ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);;
6801 e (ASM_REWRITE_TAC[]);;
6802
6803 e (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);;
6804 e (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);;
6805 e (AP_THM_TAC THEN AP_TERM_TAC);;
6806
6807 e (REWRITE_WITH 
6808   `measurable (conic_cap u0 u1 r d) /\
6809              vol (conic_cap u0 u1 r d) =
6810              (if u1 = u0 \/ &1 <= d \/ r < &0
6811               then &0
6812               else &2 / &3 * pi * (&1 - d) * r pow 3)`);;
6813 e (MATCH_MP_TAC VOLUME_CONIC_CAP);;
6814 e (EXPAND_TAC "d");;
6815 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
6816 e (COND_CASES_TAC);;
6817 e (NEW_GOAL `F`);;
6818 e (UP_ASM_TAC THEN STRIP_TAC);;
6819 e (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);;
6820 e (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
6821 e (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
6822 e (UP_ASM_TAC THEN MESON_TAC[]);;
6823 e (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);;
6824
6825 e (REWRITE_WITH `max d (--(&1)) = d`);;
6826 e (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));;
6827 e (REWRITE_TAC[REAL_NEG_LT0]);;
6828 e (STRIP_TAC);;
6829 e (EXPAND_TAC "d");;
6830 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
6831 e (REAL_ARITH_TAC);;
6832
6833 e (REWRITE_WITH `
6834   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
6835   ((&2 * pi) / (&2 * pi))`);;
6836 e (REAL_ARITH_TAC);;
6837 e (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);;
6838 e (MATCH_MP_TAC REAL_DIV_REFL);;
6839 e (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);;
6840 e (REAL_ARITH_TAC);;
6841 e (NEW_GOAL `F`);;
6842 e (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
6843    THEN MESON_TAC[]);;
6844 e (UP_ASM_TAC THEN MESON_TAC[]);;
6845
6846 (* ========================================================================= *)
6847
6848 e (ASM_CASES_TAC `azim u0 u1 m (u2:real^3) < pi`);;
6849 e (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);;
6850 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
6851 e (STRIP_TAC);;
6852 e (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m u2)`);;
6853 e (ASM_SIMP_TAC[WEDGE_LUNE]);;
6854 e (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d = 
6855                  conic_cap u0 u1 r d INTER L`);;
6856 e (SET_TAC[]);;
6857 e (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);;
6858
6859 e (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER 
6860    aff_gt {u0, u1} {m, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);;
6861 e (EXPAND_TAC "L");;
6862 e (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);;
6863 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));;
6864 e (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);;
6865 e (REWRITE_TAC[SET_RULE `A UNION {} = A`]);;
6866 e (EXPAND_TAC "L");;
6867 e (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);;
6868
6869 e (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, u2} =
6870                  aff_gt {u0, u1} {m, u2} UNION 
6871    UNIONS {aff_ge {u0, u1} ({m, u2} DELETE a) | a | a IN  {m, u2}}`);;
6872 e (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);;
6873 e (REWRITE_TAC[Geomdetail.FINITE6]);;
6874 e (REWRITE_TAC[DISJOINT]);;
6875
6876 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
6877 e (NEW_GOAL `F`);;
6878 e (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);;
6879 e (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);;
6880 e (UP_ASM_TAC THEN SET_TAC[]);;
6881 e (REWRITE_TAC[COPLANAR_3]);;
6882 e (UP_ASM_TAC THEN MESON_TAC[]);;
6883
6884 e (ASM_CASES_TAC `m IN {u0, u1:real^3}`);;
6885 e (NEW_GOAL `F`);;
6886 e (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);;
6887 e (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);;
6888 e (UP_ASM_TAC THEN SET_TAC[]);;
6889 e (REWRITE_TAC[COPLANAR_3]);;
6890 e (UP_ASM_TAC THEN MESON_TAC[]);;
6891 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
6892
6893 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6894 e (EXISTS_TAC 
6895   `UNIONS {aff_ge {u0, u1:real^3} ({m, u2} DELETE a) | a | a IN {m, u2}}`);;
6896 e (STRIP_TAC);;
6897 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6898 e (EXISTS_TAC 
6899   `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);;
6900 e (STRIP_TAC);;
6901 e (MATCH_MP_TAC NEGLIGIBLE_UNION);;
6902 e (STRIP_TAC);;
6903
6904 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6905 e (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);;
6906 e (STRIP_TAC);;
6907 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
6908 e (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);;
6909 e (SET_TAC[]);;
6910 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
6911 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6912 e (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);;
6913 e (STRIP_TAC);;
6914 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
6915 e (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);;
6916 e (SET_TAC[]);;
6917 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);;
6918 e (REWRITE_TAC[SET_RULE 
6919   `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} = 
6920          aff_ge {u0, u1} ({m, s3} DELETE s3) 
6921    UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);;
6922 e (MATCH_MP_TAC (SET_RULE 
6923   `A SUBSET D /\ C SUBSET B ==> A UNION C SUBSET B UNION D`));;
6924 e (STRIP_TAC);;
6925 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
6926 e (STRIP_TAC);;
6927 e (SET_TAC[]);;
6928
6929 e (REWRITE_TAC[DISJOINT]);;
6930 e (ASM_CASES_TAC `m IN {u0, u1:real^3}`);;
6931 e (NEW_GOAL `F`);;
6932 e (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);;
6933 e (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);;
6934 e (UP_ASM_TAC THEN SET_TAC[]);;
6935 e (REWRITE_TAC[COPLANAR_3]);;
6936 e (UP_ASM_TAC THEN MESON_TAC[]);;
6937 e (UP_ASM_TAC THEN SET_TAC[]);;
6938
6939 e (MATCH_MP_TAC AFF_GE_MONO_RIGHT);;
6940 e (STRIP_TAC);;
6941 e (SET_TAC[]);;
6942 e (REWRITE_TAC[DISJOINT]);;
6943 e (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);;
6944 e (NEW_GOAL `F`);;
6945 e (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);;
6946 e (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);;
6947 e (UP_ASM_TAC THEN SET_TAC[]);;
6948 e (REWRITE_TAC[COPLANAR_3]);;
6949 e (UP_ASM_TAC THEN MESON_TAC[]);;
6950 e (UP_ASM_TAC THEN SET_TAC[]);;
6951
6952 e (SET_TAC[]);;
6953
6954 e (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);;
6955 e (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m u2) =
6956              (if &1 < d \/ r < &0
6957               then &0
6958               else azim u0 u1 m u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);;
6959 e (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);;
6960 e (STRIP_TAC);;
6961 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
6962 e (EXISTS_TAC `m:real^3`);;
6963 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
6964 e (ASM_REWRITE_TAC[]);;
6965 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
6966 e (EXISTS_TAC `u2:real^3`);;
6967 e (ASM_REWRITE_TAC[]);;
6968
6969 e (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);;
6970 e (COND_CASES_TAC);;
6971 e (NEW_GOAL `F`);;
6972
6973 e (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN 
6974    UP_ASM_TAC THEN REAL_ARITH_TAC);;
6975 e (UP_ASM_TAC THEN MESON_TAC[]);;
6976
6977 e (REWRITE_WITH `azim (u0:real^3) u1 m u2 = dihV u0 u1 m u2`);;
6978 e (MATCH_MP_TAC AZIM_DIHV_SAME);;
6979 e (ASM_REWRITE_TAC[]);;
6980 e (STRIP_TAC);;
6981
6982 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
6983 e (EXISTS_TAC `u2:real^3`);;
6984 e (ASM_REWRITE_TAC[]);;
6985 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
6986 e (EXISTS_TAC `m:real^3`);;
6987 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
6988 e (ASM_REWRITE_TAC[]);;
6989
6990 e (REWRITE_TAC[dihX]);;
6991 e (COND_CASES_TAC);;
6992 e (NEW_GOAL `F`);;
6993 e (UNDISCH_TAC `~NULLSET (X INTER D)`);;
6994 e (REWRITE_TAC[]);;
6995 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
6996 e (EXISTS_TAC `X:real^3->bool`);;
6997 e (ASM_REWRITE_TAC[] THEN SET_TAC[]);;
6998 e (UP_ASM_TAC THEN MESON_TAC[]);;
6999
7000 e (LET_TAC);;
7001
7002 e (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);;
7003 e (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
7004            ul IN barV V 3 /\
7005            X = mcell k V ul /\
7006            initial_sublist [u0; u1] ul)`);;
7007 e (STRIP_TAC);;
7008 e (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);;
7009 e (MATCH_MP_TAC SELECT_AX);;
7010 e (EXISTS_TAC `(3, vl:(real^3)list)`);;
7011 e (EXPAND_TAC "P");;
7012 e (REWRITE_TAC[BETA_THM]);;
7013 e (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);;
7014
7015 e (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\ 
7016                  LENGTH [u0;u1] = 1 + 1`);;
7017 e (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
7018 e (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
7019 e (ASM_REWRITE_TAC[]);;
7020 e (REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
7021 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);;
7022 e (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);;
7023
7024 e (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);;
7025 e (MATCH_MP_TAC Ajripqn.AJRIPQN);;
7026 e (ASM_REWRITE_TAC[]);;
7027 e (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);;
7028 e (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);;
7029 e (REWRITE_WITH `mcell 3 V vl = X`);;
7030 e (ASM_SIMP_TAC[]);;
7031 e (SET_TAC[ASSUME `X = mcell k' V ul`]);;
7032
7033 e (REPEAT STRIP_TAC);;
7034 e (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE 
7035    `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);;
7036 e (SET_TAC[]);;
7037 e (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);;
7038
7039 e (COND_CASES_TAC);;
7040 e (NEW_GOAL `F`);;
7041 e (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);;
7042 e (UP_ASM_TAC THEN MESON_TAC[]);;
7043 e (COND_CASES_TAC);;
7044
7045 e (REWRITE_TAC[dihu3]);;
7046
7047 e (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) = 
7048    dihV u0 u1 u2 (m:real^3)`);;
7049
7050 e (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);;
7051 e (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);;
7052 e (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);;
7053
7054 e (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);;
7055 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
7056 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
7057 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7058                  CARD (set_of_list ul) = 3 + 1`);;
7059 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
7060 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7061 e (ARITH_TAC);;
7062
7063 e (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);;
7064 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
7065 e (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);;
7066 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7067                  CARD (set_of_list ul) = 3 + 1`);;
7068 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
7069 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7070 e (ARITH_TAC);;
7071
7072 e (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);;
7073 e (REWRITE_WITH `
7074     {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
7075     convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = 
7076     convex hull {u0, u1,u2,m:real^3}`);;
7077 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
7078 e (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);;
7079 e (REPEAT STRIP_TAC);;
7080
7081 e (UNDISCH_TAC `~NULLSET X`);;
7082 e (REWRITE_TAC[]);;
7083 e (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);;
7084 e (COND_CASES_TAC);;
7085 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
7086 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
7087 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7088 e (UP_ASM_TAC THEN STRIP_TAC);;
7089 e (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2; 
7090                    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
7091 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7092 e (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);;
7093 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
7094 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
7095 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
7096 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
7097 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
7098 e (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);;
7099 e (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; 
7100                ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
7101
7102 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
7103
7104 e (UNDISCH_TAC `~NULLSET X`);;
7105 e (REWRITE_TAC[]);;
7106 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7107    TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
7108 e (COND_CASES_TAC);;
7109 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7110 e (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);;
7111 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
7112 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
7113 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
7114 e (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);;
7115 e (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);;
7116 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
7117 e (EXPAND_TAC "m");;
7118 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
7119 e (ASM_REWRITE_TAC[]);;
7120
7121 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
7122
7123 e (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);;
7124 e (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);;
7125 e (COND_CASES_TAC);;
7126 e (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7127    SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
7128 e (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);;
7129 e (EXPAND_TAC "m");;
7130 e (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);;
7131
7132 e (NEW_GOAL `F`);;
7133 e (UNDISCH_TAC `~NULLSET X`);;
7134 e (REWRITE_TAC[]);;
7135 e (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);;
7136 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
7137 e (UP_ASM_TAC THEN MESON_TAC[]);;
7138
7139 e (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);;
7140 e (COND_CASES_TAC);;
7141 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);;
7142 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
7143 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7144 e (UP_ASM_TAC THEN STRIP_TAC);;
7145 e (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
7146                TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7147                SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
7148 e (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);;
7149 e (NEW_GOAL `F`);;
7150 e (UNDISCH_TAC `~NULLSET X`);;
7151 e (REWRITE_TAC[]);;
7152 e (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);;
7153 e (ASM_REWRITE_TAC[]);;
7154 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
7155 e (UP_ASM_TAC THEN MESON_TAC[]);;
7156
7157 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);;
7158
7159 e (NEW_GOAL `mxi V ul = m`);;
7160 e (EXPAND_TAC "m");;
7161 e (MATCH_MP_TAC MCELL_ID_MXI);;
7162 e (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);;
7163 e (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);;
7164 e (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);;
7165 e (ASM_REWRITE_TAC[]);;
7166 e (ASM_REWRITE_TAC[HD]);;
7167 e (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);;
7168 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
7169 e (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);;
7170 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7171                  CARD (set_of_list ul) = 3 + 1`);;
7172 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
7173 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7174 e (ARITH_TAC);;
7175 e (ASM_REWRITE_TAC[HD]);;
7176 e (ASM_REWRITE_TAC[]);;
7177
7178 e (STRIP_TAC);;
7179 e (NEW_GOAL `EL 2 ul = u2:real^3`);;
7180 e (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));;
7181 e (STRIP_TAC);;
7182 e (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);;
7183 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
7184 e (UNDISCH_TAC `~coplanar {u0,u1,m,u2:real^3}`);;
7185 e (REWRITE_TAC[]);;
7186 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);;
7187 e (REWRITE_TAC[GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
7188               ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);;
7189 e (ASM_REWRITE_TAC[]);;
7190 e (REWRITE_TAC[DIHV_SYM_2]);;
7191
7192 e (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);;
7193 e (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);;
7194 e (AP_THM_TAC THEN AP_TERM_TAC);;
7195
7196 e (REWRITE_WITH 
7197   `measurable (conic_cap u0 u1 r d) /\
7198              vol (conic_cap u0 u1 r d) =
7199              (if u1 = u0 \/ &1 <= d \/ r < &0
7200               then &0
7201               else &2 / &3 * pi * (&1 - d) * r pow 3)`);;
7202 e (MATCH_MP_TAC VOLUME_CONIC_CAP);;
7203 e (EXPAND_TAC "d");;
7204 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
7205 e (COND_CASES_TAC);;
7206 e (NEW_GOAL `F`);;
7207 e (UP_ASM_TAC THEN STRIP_TAC);;
7208 e (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);;
7209 e (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
7210 e (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
7211 e (UP_ASM_TAC THEN MESON_TAC[]);;
7212 e (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);;
7213
7214 e (REWRITE_WITH `max d (--(&1)) = d`);;
7215 e (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));;
7216 e (REWRITE_TAC[REAL_NEG_LT0]);;
7217 e (STRIP_TAC);;
7218 e (EXPAND_TAC "d");;
7219 e (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
7220 e (REAL_ARITH_TAC);;
7221
7222 e (REWRITE_WITH `
7223   (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *   
7224   ((&2 * pi) / (&2 * pi))`);;
7225 e (REAL_ARITH_TAC);;
7226 e (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);;
7227 e (MATCH_MP_TAC REAL_DIV_REFL);;
7228 e (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);;
7229 e (REAL_ARITH_TAC);;
7230 e (NEW_GOAL `F`);;
7231 e (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
7232    THEN MESON_TAC[]);;
7233 e (UP_ASM_TAC THEN MESON_TAC[]);;
7234
7235 (* ========================================================================= *)
7236
7237 e (NEW_GOAL `F`);;
7238 e (NEW_GOAL `azim (u0:real^3) u1 m u2 = 
7239   (if azim u0 u1 u2 m = &0 then &0 else &2 * pi - azim u0 u1 u2 m)`);;
7240 e (MATCH_MP_TAC AZIM_COMPL);;
7241 e (STRIP_TAC);;
7242
7243 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
7244 e (EXISTS_TAC `m:real^3`);;
7245 e (ASM_REWRITE_TAC[]);;
7246 e (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);;
7247 e (EXISTS_TAC `u2:real^3`);;
7248 e (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);;
7249 e (ASM_REWRITE_TAC[]);;
7250 e (UP_ASM_TAC THEN COND_CASES_TAC);;
7251 e (NEW_GOAL `F`);;
7252 e (NEW_GOAL `(&0 < pi)`);;
7253 e (REWRITE_TAC[PI_POS]);;
7254 e (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 m < pi)`);;
7255 e (ASM_REWRITE_TAC[]);;
7256 e (UP_ASM_TAC THEN MESON_TAC[]);;
7257 e (STRIP_TAC);;
7258
7259 e (NEW_GOAL `azim (u0:real^3) u1 u2 m = pi`);;
7260 e (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
7261 e (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);;
7262 e (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);;
7263 e (ASM_REWRITE_TAC[]);;
7264 e (UP_ASM_TAC THEN MESON_TAC[]);;
7265
7266 (* ========================================================================= *)
7267 (* ========================================================================= *)
7268
7269 (* ========================================================================= *)
7270 (* ========================================================================= *)
7271
7272 e (ABBREV_TAC `E = D INTER wedge_ge u0 u1 n1 n2`);;
7273 e (ABBREV_TAC 
7274    `s = {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2}`);;
7275 e (NEW_GOAL `sum s (\t. vol (t INTER E)) = vol (E)`);;
7276 e (ABBREV_TAC `f = (\t:real^3->bool. t INTER E)`);;
7277 e (REWRITE_WITH `(\t. vol (t INTER E)) = (\x:real^3->bool. vol (f x))`);;
7278 e (EXPAND_TAC "f");;
7279 e (REWRITE_TAC[]);;
7280 e (REWRITE_WITH `sum s (\x:real^3->bool. vol (f x)) = vol (UNIONS (IMAGE f s))`);;
7281 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
7282 e (MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE);;
7283 e (REPEAT STRIP_TAC);;
7284
7285 e (EXPAND_TAC "s");;
7286 e (MATCH_MP_TAC FINITE_SUBSET);;
7287 e (EXISTS_TAC `{X | mcell_set V X /\ edgeX V X e}`);;
7288 e (STRIP_TAC);;
7289 e (MATCH_MP_TAC FINITE_EDGE_X2);;
7290 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);;
7291 e (ASM_REWRITE_TAC[]);;
7292 e (SET_TAC[]);;
7293
7294 e (EXPAND_TAC "f");;
7295 e (MATCH_MP_TAC MEASURABLE_INTER);;
7296 e (STRIP_TAC);;
7297 e (UP_ASM_TAC THEN EXPAND_TAC "s");;
7298 e (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);;
7299 e (REPEAT STRIP_TAC);;
7300 e (ASM_SIMP_TAC[MEASURABLE_MCELL]);;
7301 e (EXPAND_TAC "E");;
7302 e (REWRITE_TAC[ASSUME `D:real^3->bool = conic_cap u0 u1 r d`]);;
7303 e (REWRITE_TAC[MEASURABLE_CONIC_CAP_WEDGE_GE]);;
7304
7305
7306 e (EXPAND_TAC "f");;
7307 e (UNDISCH_TAC `(x:real^3->bool) IN s` THEN 
7308    UNDISCH_TAC `(y:real^3->bool) IN s` THEN EXPAND_TAC "s");;
7309 e (REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);;
7310 e (REPEAT STRIP_TAC);;
7311 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7312 e (EXISTS_TAC `x INTER (y:real^3->bool)`);;
7313 e (ASM_REWRITE_TAC[SET_RULE `(x INTER D) INTER y INTER D SUBSET x INTER y`]);;
7314 e (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));;
7315 e (STRIP_TAC);;
7316
7317 e (NEW_GOAL `i' = i /\ mcell i' V ul' = mcell i V ul`);;
7318 e (MATCH_MP_TAC Ajripqn.AJRIPQN);;
7319 e (ASM_REWRITE_TAC[SET_RULE `i IN {0, 1, 2, 3, 4} <=>
7320                              i = 0 \/ i = 1 \/ i = 2 \/ i = 3 \/ i = 4`]);;
7321 e (UNDISCH_TAC `i <= 4` THEN UNDISCH_TAC `i' <= 4` THEN ARITH_TAC);;
7322 e (UNDISCH_TAC `~(x = y:real^3->bool)` THEN ASM_REWRITE_TAC[]);;
7323
7324 e (EXPAND_TAC "s");;
7325 e (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);;
7326
7327
7328 e (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);;
7329 e (REWRITE_WITH 
7330    `UNIONS
7331   {y | ?x. x IN
7332           {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2} /\
7333           y = x INTER E} DIFF E = {}`);;
7334 e (REWRITE_TAC[SET_RULE `A DIFF B = {} <=> A SUBSET B`]);;
7335 e (REWRITE_TAC[UNIONS_SUBSET; IN; IN_ELIM_THM]);;
7336 e (SET_TAC[]);;
7337 e (REWRITE_TAC[SET_RULE `{} UNION A = A`]);;
7338
7339 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7340 e (EXISTS_TAC `UNIONS {y | ?x. x IN {X | mcell_set V X /\ NULLSET (X INTER E) /\ 
7341               ~(X INTER E = {})} /\  y = x INTER E}`);;
7342 e (STRIP_TAC);;
7343 e (MATCH_MP_TAC NEGLIGIBLE_UNIONS);;
7344 e (STRIP_TAC);;
7345 e (REWRITE_WITH 
7346   `{y | ?x. x IN
7347           {X | mcell_set V X /\ NULLSET (X INTER E) /\ ~(X INTER E = {})} /\
7348           y = x INTER E} = 
7349    {y | ?x. x IN
7350           {X | mcell_set V X /\ NULLSET (X INTER E) /\ ~(X INTER E = {})} /\
7351           y = f x}`);;
7352 e (EXPAND_TAC "f" THEN REWRITE_TAC[]);;
7353 e (MATCH_MP_TAC FINITE_IMAGE_EXPAND);;
7354
7355 e (MATCH_MP_TAC FINITE_SUBSET);;
7356 e (EXISTS_TAC `{X | X SUBSET ball (u0, &10) /\ mcell_set V X}`);;
7357 e (STRIP_TAC);;
7358 e (ASM_SIMP_TAC[FINITE_MCELL_SET_LEMMA_2]);;
7359 e (REWRITE_TAC[SUBSET; IN_BALL; IN; IN_ELIM_THM; mcell_set] THEN 
7360    REPEAT STRIP_TAC);;
7361
7362 e (NEW_GOAL `?v1:real^3. v1 IN x /\ v1 IN D`);;
7363 e (REWRITE_TAC[GSYM IN_INTER]);;
7364 e (UNDISCH_TAC `~(x:real^3->bool INTER E = {})` THEN EXPAND_TAC "E" THEN SET_TAC[]);;
7365 e (UP_ASM_TAC THEN STRIP_TAC);;
7366 e (NEW_GOAL `dist (u0, x') <= dist (u0, v1:real^3) + dist (v1, x')`);;
7367 e (NORM_ARITH_TAC);;
7368 e (NEW_GOAL `dist (u0, v1:real^3) < &1`);;
7369 e (REWRITE_TAC[GSYM IN_BALL]);;
7370 e (NEW_GOAL `D SUBSET ball (u0:real^3, &1)`);;
7371 e (EXPAND_TAC "D");;
7372 e (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);;
7373 e (MATCH_MP_TAC SUBSET_BALL);;
7374 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
7375 e (UP_ASM_TAC THEN SET_TAC[]);;
7376 e (UP_ASM_TAC THEN UNDISCH_TAC `v1:real^3 IN D` THEN SET_TAC[]);;
7377 e (NEW_GOAL `dist (v1,x':real^3) < &8`);;
7378 e (REWRITE_TAC[GSYM IN_BALL]);;
7379
7380 e (NEW_GOAL `x SUBSET ball (v1:real^3, &8)`);;
7381 e (ASM_REWRITE_TAC[]);;
7382 e (MATCH_MP_TAC MCELL_SUBSET_BALL8);;
7383 e (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN ASM_REWRITE_TAC[]);;
7384 e (UNDISCH_TAC `(x:real^3->bool) x'` THEN UP_ASM_TAC THEN SET_TAC[]);;
7385 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
7386 e (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list`);;
7387 e (ASM_REWRITE_TAC[]);;
7388
7389 e (REWRITE_TAC[IN; IN_ELIM_THM]);;
7390 e (REPEAT STRIP_TAC);;
7391 e (REWRITE_TAC[ASSUME `t:real^3->bool = x INTER E`]);;
7392 e (ASM_REWRITE_TAC[]);;
7393
7394 (* ========================================================================= *)
7395
7396 e (REWRITE_TAC[SUBSET; IN_UNIONS]);;
7397 e (REPEAT STRIP_TAC);;
7398
7399 e (NEW_GOAL `?v:real^3. v IN V /\ x IN voronoi_closed V v`);;
7400 e (ASM_SIMP_TAC[TIWWFYQ]);;
7401 e (UP_ASM_TAC THEN STRIP_TAC);;
7402 e (UP_ASM_TAC THEN REWRITE_WITH 
7403    `x IN voronoi_closed V v <=>  (?vl. vl IN barV V 3 /\ x IN rogers V vl /\
7404                                        truncate_simplex 0 vl = [v])`);;
7405 e (ASM_SIMP_TAC[GLTVHUM]);;
7406 e (REWRITE_TAC[IN] THEN STRIP_TAC);;
7407 e (NEW_GOAL `?i. i <= 4 /\ x IN mcell i V vl`);;
7408 e (ASM_SIMP_TAC[IN;SLTSTLO1]);;
7409 e (UP_ASM_TAC THEN STRIP_TAC);;
7410
7411 e (ABBREV_TAC `X = mcell i V vl`);;
7412 e (NEW_GOAL `~NULLSET (X INTER E) ==> F`);;
7413 e (STRIP_TAC);;
7414
7415 e (NEW_GOAL `?k ul.
7416                    2 <= k /\
7417                    barV V 3 ul /\
7418                    X = mcell k V ul /\
7419                    truncate_simplex 1 ul = [u0; u1]`);;
7420 e (FIRST_ASSUM MATCH_MP_TAC);;
7421 e (STRIP_TAC);;
7422 e (REWRITE_TAC[mcell_set; IN_ELIM_THM; IN]);;
7423 e (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);;
7424 e (ASM_REWRITE_TAC[]);;
7425 e (STRIP_TAC);;
7426 e (UNDISCH_TAC `~NULLSET (X INTER E)` THEN REWRITE_TAC[]);;
7427 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7428 e (EXISTS_TAC `X INTER (D:real^3->bool)`);;
7429 e (STRIP_TAC);;
7430 e (ASM_REWRITE_TAC[]);;
7431 e (EXPAND_TAC "E" THEN SET_TAC[]);;
7432 e (UP_ASM_TAC THEN STRIP_TAC);;
7433
7434 e (MP_TAC (ASSUME `x IN
7435       E DIFF
7436       UNIONS
7437       {y | ?x. x IN
7438                {X | mcell_set V X /\
7439                     edgeX V X e /\
7440                     (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7441                y = x INTER E}`));;
7442 e (REWRITE_TAC[IN_DIFF; MESON[] `~(A /\ ~B) <=> ~A \/ B`]);;
7443 e (DISJ2_TAC);;
7444 e (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);;
7445 e (EXISTS_TAC `X INTER (E:real^3->bool)`);;
7446 e (STRIP_TAC);;
7447
7448 e (EXISTS_TAC `(X:real^3->bool)`);;
7449 e (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM] THEN STRIP_TAC);;
7450 e (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);;
7451 e (ASM_REWRITE_TAC[]);;
7452
7453 e (REWRITE_TAC[edgeX; IN_ELIM_THM]);;
7454 e (STRIP_TAC);;
7455 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);;
7456 e (STRIP_TAC);;
7457
7458 e (NEW_GOAL `VX V X = V INTER X`);;
7459 e (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);;
7460 e (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `(if k < 4 then k else 4)`);;
7461 e (ASM_REWRITE_TAC[]);;
7462 e (STRIP_TAC);;
7463 e (COND_CASES_TAC);;
7464 e (MESON_TAC[]);;
7465 e (NEW_GOAL `k >= 4`);;
7466 e (UP_ASM_TAC THEN ARITH_TAC);;
7467 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);;
7468 e (UNDISCH_TAC `~NULLSET (X INTER E)` THEN ASM_REWRITE_TAC[]);;
7469 e (MESON_TAC[NEGLIGIBLE_SUBSET; SET_RULE `A INTER B SUBSET A`]);;
7470
7471 e (NEW_GOAL `(V:real^3->bool) INTER X = 
7472             set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);;
7473 e (REWRITE_WITH `X = mcell (if k < 4 then k else 4) V ul`);;
7474 e (ASM_REWRITE_TAC[]);;
7475 e (COND_CASES_TAC);;
7476 e (REFL_TAC);;
7477 e (NEW_GOAL `k >= 4`);;
7478 e (UP_ASM_TAC THEN ARITH_TAC);;
7479 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);;
7480
7481 e (MATCH_MP_TAC Lepjbdj.LEPJBDJ);;
7482 e (ASM_REWRITE_TAC[]);;
7483 e (STRIP_TAC);;
7484 e (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);;
7485 e (STRIP_TAC);;
7486 e (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);;
7487 e (REWRITE_WITH `mcell (if k < 4 then k else 4) V ul = X`);;
7488 e (ASM_REWRITE_TAC[]);;
7489 e (COND_CASES_TAC);;
7490 e (REFL_TAC);;
7491 e (NEW_GOAL `k >= 4`);;
7492 e (UP_ASM_TAC THEN ARITH_TAC);;
7493 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);;
7494 e (STRIP_TAC);;
7495 e (UNDISCH_TAC `~NULLSET (X INTER E)` THEN 
7496    REWRITE_TAC[ASSUME `X = {}:real^3->bool`; SET_RULE `{} INTER x = {}`;
7497    NEGLIGIBLE_EMPTY]);;
7498 e (ASM_REWRITE_TAC[]);;
7499 e (NEW_GOAL `set_of_list (truncate_simplex 1 (ul:(real^3)list)) SUBSET 
7500            set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);;
7501 e (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);;
7502 e (REWRITE_WITH `LENGTH ul = 3 + 1 /\ 
7503                  CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);;
7504 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
7505 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7506 e (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);;
7507 e (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`]);;
7508
7509 e (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `truncate_simplex 1 ul = [u0; u1:real^3]`;
7510     set_of_list]);;
7511 e (SET_TAC[]);;
7512 e (ASM_REWRITE_TAC[]);;
7513
7514 e (REWRITE_TAC[MESON[IN] `(X:real^3->bool) a <=> a IN X`]);;
7515 e (REWRITE_TAC[GSYM SUBSET]);;
7516
7517 e (NEW_GOAL `X SUBSET wedge_ge u0 u1 n1 n2 \/ X SUBSET wedge_ge u0 u1 n2 n1`);;
7518 e (FIRST_ASSUM MATCH_MP_TAC);;
7519 e (STRIP_TAC);;
7520 e (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);;
7521 e (EXISTS_TAC `k:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);;
7522
7523 e (REWRITE_TAC[edgeX; IN; IN_ELIM_THM]);;
7524 e (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);;
7525
7526 e (NEW_GOAL `VX V X = V INTER X`);;
7527 e (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);;
7528 e (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `(if k < 4 then k else 4)`);;
7529 e (ASM_REWRITE_TAC[]);;
7530 e (STRIP_TAC);;
7531 e (COND_CASES_TAC);;
7532 e (MESON_TAC[]);;
7533 e (NEW_GOAL `k >= 4`);;
7534 e (UP_ASM_TAC THEN ARITH_TAC);;
7535 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);;
7536 e (UNDISCH_TAC `~NULLSET (X INTER E)` THEN ASM_REWRITE_TAC[]);;
7537 e (MESON_TAC[NEGLIGIBLE_SUBSET; SET_RULE `A INTER B SUBSET A`]);;
7538
7539 e (NEW_GOAL `(V:real^3->bool) INTER X = 
7540             set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);;
7541 e (REWRITE_WITH `X = mcell (if k < 4 then k else 4) V ul`);;
7542 e (ASM_REWRITE_TAC[]);;
7543 e (COND_CASES_TAC);;
7544 e (REFL_TAC);;
7545 e (NEW_GOAL `k >= 4`);;
7546 e (UP_ASM_TAC THEN ARITH_TAC);;
7547 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);;
7548
7549 e (MATCH_MP_TAC Lepjbdj.LEPJBDJ);;
7550 e (ASM_REWRITE_TAC[]);;
7551 e (STRIP_TAC);;
7552 e (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);;
7553 e (STRIP_TAC);;
7554 e (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);;
7555 e (REWRITE_WITH `mcell (if k < 4 then k else 4) V ul = X`);;
7556 e (ASM_REWRITE_TAC[]);;
7557 e (COND_CASES_TAC);;
7558 e (REFL_TAC);;
7559 e (NEW_GOAL `k >= 4`);;
7560 e (UP_ASM_TAC THEN ARITH_TAC);;
7561 e (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);;
7562 e (STRIP_TAC);;
7563 e (UNDISCH_TAC `~NULLSET (X INTER E)` THEN 
7564    REWRITE_TAC[ASSUME `X = {}:real^3->bool`; SET_RULE `{} INTER x = {}`;
7565    NEGLIGIBLE_EMPTY]);;
7566 e (ASM_REWRITE_TAC[]);;
7567 e (NEW_GOAL `set_of_list (truncate_simplex 1 (ul:(real^3)list)) SUBSET 
7568            set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);;
7569 e (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);;
7570 e (REWRITE_WITH `LENGTH ul = 3 + 1 /\ 
7571                  CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);;
7572 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
7573 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7574 e (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);;
7575 e (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`]);;
7576
7577 e (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `truncate_simplex 1 ul = [u0; u1:real^3]`;
7578     set_of_list]);;
7579 e (SET_TAC[]);;
7580
7581 e (UP_ASM_TAC THEN STRIP_TAC);;
7582 e (NEW_GOAL `F`);;
7583 e (NEW_GOAL 
7584   `X INTER E SUBSET (wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1)`);;
7585 e (REWRITE_TAC[SUBSET_INTER]);;
7586 e (STRIP_TAC);;
7587 e (EXPAND_TAC "E" THEN SET_TAC[]);;
7588 e (UP_ASM_TAC THEN SET_TAC[]);;
7589 e (UNDISCH_TAC `~NULLSET (X INTER E)` THEN REWRITE_TAC[]);;
7590 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7591 e (EXISTS_TAC `wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1`);;
7592 e (STRIP_TAC);;
7593 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7594 e (EXISTS_TAC `aff_ge {u0,u1} {n1} UNION aff_ge {u0,u1} {n2:real^3}`);;
7595 e (STRIP_TAC);;
7596
7597 e (MATCH_MP_TAC NEGLIGIBLE_UNION);;
7598 e (STRIP_TAC);;
7599 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7600 e (EXISTS_TAC `affine hull {u0,u1,n1:real^3}`);;
7601 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
7602 e (REWRITE_TAC[SET_RULE `{a,b,c} = {a,b} UNION {c}`;  
7603                AFF_GE_SUBSET_AFFINE_HULL]);;
7604
7605 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7606 e (EXISTS_TAC `affine hull {u0,u1,n2:real^3}`);;
7607 e (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);;
7608 e (REWRITE_TAC[SET_RULE `{a,b,c} = {a,b} UNION {c}`;  
7609                AFF_GE_SUBSET_AFFINE_HULL]);;
7610
7611 e (MATCH_MP_TAC INTER_2_WEDGE_GE_SUBSET_UNION_2_AFF_GE_LEMMA);;
7612 e (ASM_REWRITE_TAC[]);;
7613
7614 e (ASM_REWRITE_TAC[]);;
7615 e (UP_ASM_TAC THEN MESON_TAC[]);;
7616 e (NEW_GOAL `(x:real^3) IN E`);;
7617 e (UNDISCH_TAC `x IN
7618       E DIFF
7619       UNIONS
7620       {y | ?x. x IN
7621                {X | mcell_set V X /\
7622                     edgeX V X e /\
7623                     (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7624                y = x INTER E}` THEN SET_TAC[]);;
7625
7626 e (REWRITE_TAC[MESON[IN] `(X INTER Y) a <=> a IN (X INTER Y)`]);;
7627 e (REWRITE_TAC[IN_INTER]);;
7628 e (ASM_REWRITE_TAC[]);;
7629
7630 e (EXISTS_TAC `X INTER (E:real^3 ->bool)`);;
7631 e (STRIP_TAC);;
7632 e (REWRITE_TAC[IN_ELIM_THM]);;
7633 e (EXISTS_TAC `X:real^3->bool`);;
7634 e (ASM_REWRITE_TAC[mcell_set; IN_ELIM_THM]);;
7635 e (UP_ASM_TAC THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);;
7636 e (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);;
7637 e (ASM_REWRITE_TAC[]);;
7638 e (ASM_REWRITE_TAC[]);;
7639 e (NEW_GOAL `(x:real^3) IN X INTER E`);;
7640 e (REWRITE_TAC[IN_INTER]);;
7641 e (ASM_REWRITE_TAC[]);;
7642 e (UNDISCH_TAC `x IN
7643       E DIFF
7644       UNIONS
7645       {y | ?x. x IN
7646                {X | mcell_set V X /\
7647                     edgeX V X e /\
7648                     (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7649                y = x INTER E}` THEN SET_TAC[]);;
7650 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
7651
7652 e (REWRITE_TAC[MESON[IN] `(X INTER Y) a <=> a IN (X INTER Y)`]);;
7653 e (REWRITE_TAC[IN_INTER]);;
7654 e (ASM_REWRITE_TAC[]);;
7655 e (UNDISCH_TAC `x IN
7656       E DIFF
7657       UNIONS
7658       {y | ?x. x IN
7659                {X | mcell_set V X /\
7660                     edgeX V X e /\
7661                     (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7662                y = x INTER E}` THEN SET_TAC[]);;
7663
7664 e (UP_ASM_TAC THEN 
7665    REWRITE_WITH `sum s (\t. vol (t INTER E)) = sum s (\t. vol (t INTER D))`);;
7666 e (MATCH_MP_TAC SUM_EQ);;
7667 e (EXPAND_TAC "s" THEN REWRITE_TAC[IN; IN_ELIM_THM; BETA_THM] THEN 
7668    REPEAT STRIP_TAC);;
7669 e (AP_TERM_TAC);;
7670 e (EXPAND_TAC "E" THEN UP_ASM_TAC THEN SET_TAC[]);;
7671
7672
7673 (* ========================================================================= *)
7674
7675 e (ABBREV_TAC 
7676   `t = {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2 /\
7677            ~NULLSET (X INTER D)}`);;
7678
7679 e (REWRITE_WITH `sum s (\t. dihX V t (u0,u1)) = 
7680                  sum t (\t. dihX V t (u0,u1))`);;
7681 e (MATCH_MP_TAC SUM_SUPERSET);;
7682 e (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);;
7683 e (SET_TAC[]);;
7684
7685 e (NEW_GOAL `NULLSET (x INTER D)`);;
7686 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );;
7687 e (MESON_TAC[]);;
7688
7689 e (NEW_GOAL `mcell_set V x /\ edgeX V x e`);;
7690 e (UNDISCH_TAC 
7691   `x IN {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2}`);;
7692 e (REWRITE_TAC[IN; IN_ELIM_THM]);;
7693 e (MESON_TAC[]);;
7694 e (UP_ASM_TAC THEN REWRITE_TAC[mcell_set_2; IN_ELIM_THM;IN] THEN STRIP_TAC);;
7695
7696 e (NEW_GOAL `~NULLSET x`);;
7697 e (UP_ASM_TAC THEN REWRITE_TAC[edgeX; VX; IN_ELIM_THM]);;
7698 e (COND_CASES_TAC THEN REPEAT STRIP_TAC);;
7699 e (UNDISCH_TAC `{} (u:real^3)` THEN REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);;
7700 e (SET_TAC[]);;
7701
7702 e (NEW_GOAL `VX V x = V INTER (x:real^3->bool)`);;
7703 e (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);;
7704 e (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);;
7705 e (ASM_REWRITE_TAC[]);;
7706
7707 e (NEW_GOAL `V INTER (x:real^3->bool) = 
7708              set_of_list (truncate_simplex (i - 1) ul)`);;
7709 e (ASM_REWRITE_TAC[]);;
7710 e (MATCH_MP_TAC Lepjbdj.LEPJBDJ);;
7711 e (ASM_REWRITE_TAC[]);;
7712 e (STRIP_TAC);;
7713 e (ASM_CASES_TAC `i = 0`);;
7714 e (NEW_GOAL `V INTER (x:real^3->bool) = {}`);;
7715 e (ASM_REWRITE_TAC[]);;
7716 e (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);;
7717 e (ASM_REWRITE_TAC[]);;
7718 e (NEW_GOAL `F`);;
7719 e (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM]);;
7720 e (STRIP_TAC);;
7721 e (UNDISCH_TAC `VX V x u` THEN ASM_REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);;
7722 e (SET_TAC[]);;
7723 e (UP_ASM_TAC THEN MESON_TAC[]);;
7724 e (UP_ASM_TAC THEN ARITH_TAC);;
7725 e (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN STRIP_TAC);;
7726 e (UNDISCH_TAC `~NULLSET x` THEN REWRITE_TAC[ASSUME `x:real^3->bool = {}`;
7727    NEGLIGIBLE_EMPTY]);;
7728
7729 e (NEW_GOAL `(u0:real^3) IN VX V x /\ u1 IN VX V x`);;
7730 e (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM; 
7731    ASSUME `e = {u0, u1:real^3}`]);;
7732 e (STRIP_TAC);;
7733 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
7734
7735 (* ========================================================================== *)
7736 e (NEW_GOAL `F`);;
7737
7738 e (ASM_CASES_TAC `i <= 1`);;
7739 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);;
7740 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
7741 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7742 e (UP_ASM_TAC THEN STRIP_TAC);;
7743 e (NEW_GOAL `i - 1 = 0`);;
7744 e (UNDISCH_TAC `i <= 1` THEN ARITH_TAC);;
7745 e (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);;
7746 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0; set_of_list]);;
7747 e (UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);;
7748
7749 e (ASM_CASES_TAC `i = 3`);;
7750 e (NEW_GOAL `vol (x INTER D) > &0`);;
7751 e (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);;
7752 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);;
7753 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
7754 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7755 e (UP_ASM_TAC THEN STRIP_TAC);;
7756 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; TRUNCATE_SIMPLEX_EXPLICIT_2; 
7757    set_of_list; SET_RULE `{a,c,d} UNION {x} = {a,c,d,x}`]);;
7758 e (COND_CASES_TAC);;
7759 e (NEW_GOAL `i - 1 = 2`);;
7760 e (UNDISCH_TAC `i = 3` THEN ARITH_TAC);;
7761 e (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);;
7762 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);;
7763 e (STRIP_TAC);;
7764 e (NEW_GOAL `?v:real^3. {u0, u1, v} = {v0, v1, v2}`);;
7765 e (NEW_GOAL `?v:real^3. v IN {v0, v1, v2} DIFF {u0, u1}`);;
7766 e (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);;
7767 e (REWRITE_WITH `{v0, v1, v2} DIFF {u0, u1:real^3} = {} <=> 
7768                   CARD ({v0, v1, v2} DIFF {u0, u1}) = 0`);;
7769 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
7770 e (MATCH_MP_TAC CARD_EQ_0);;
7771 e (MATCH_MP_TAC FINITE_SUBSET);;
7772 e (EXISTS_TAC `{v0, v1, v2:real^3}`);;
7773 e (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);;
7774 e (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);;
7775
7776 e (NEW_GOAL `CARD {v0, v1, v2} = CARD ({v0, v1, v2} DIFF {u0, u1:real^3}) +
7777                                  CARD {u0, u1}`);;
7778 e (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);;
7779 e (ASM_REWRITE_TAC[Geomdetail.FINITE6]);;
7780 e (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2:real^3}) = 3`);;
7781 e (REWRITE_WITH `{v0, v1, v2:real^3} = set_of_list (truncate_simplex 2 ul)`);;
7782 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);;
7783 e (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);;
7784 e (REWRITE_WITH `LENGTH (xl:(real^3)list) = 2 + 1 /\ 
7785                  CARD (set_of_list xl) = 2 + 1`);;
7786 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
7787 e (EXISTS_TAC `V:real^3->bool` THEN STRIP_TAC);;
7788 e (ASM_REWRITE_TAC[]);;
7789 e (EXPAND_TAC "xl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);;
7790 e (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);;
7791 e (ARITH_TAC);;
7792
7793 e (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);;
7794 e (REWRITE_TAC[Geomdetail.CARD2]);;
7795 e (UP_ASM_TAC THEN ARITH_TAC);;
7796 e (UP_ASM_TAC THEN STRIP_TAC);;
7797 e (EXISTS_TAC `v:real^3`);;
7798 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
7799    UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);;
7800 e (UP_ASM_TAC THEN STRIP_TAC);;
7801 e (NEW_GOAL `{v0, v1, v2, mxi V [v0; v1; v2; v3]} = 
7802              {u0, u1, v, mxi V [v0; v1; v2; v3]}`);;
7803 e (UP_ASM_TAC THEN SET_TAC[]);;
7804 e (ASM_REWRITE_TAC[]);;
7805 e (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);;
7806 e (ASM_REWRITE_TAC[]);;
7807 e (STRIP_TAC);;
7808 e (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
7809 e (REWRITE_TAC[GSYM (ASSUME `{v0, v1, v2, mxi V [v0; v1; v2; v3]} =
7810                {u0, u1, v, mxi V [v0; v1; v2; v3]}`)] THEN STRIP_TAC);;
7811 e (UNDISCH_TAC `~NULLSET x`);;
7812 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7813    TRUNCATE_SIMPLEX_EXPLICIT_2]);;
7814 e (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);;
7815 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7816 e (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);;
7817 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
7818 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
7819 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
7820 e (ASM_REWRITE_TAC[]);;
7821
7822 e (NEW_GOAL `F`);;
7823 e (UNDISCH_TAC `~NULLSET x`);;
7824 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7825    TRUNCATE_SIMPLEX_EXPLICIT_2]);;
7826 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
7827 e (UP_ASM_TAC THEN MESON_TAC[]);;
7828
7829 e (NEW_GOAL `vol (x INTER D) = &0`);;
7830 e (MATCH_MP_TAC MEASURE_EQ_0);;
7831 e (ASM_REWRITE_TAC[]);;
7832 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
7833
7834
7835 (* ========================================== *)
7836
7837 e (ASM_CASES_TAC `i = 4`);;
7838 e (NEW_GOAL `vol (x INTER D) > &0`);;
7839 e (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);;
7840 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);;
7841 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
7842 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7843 e (UP_ASM_TAC THEN STRIP_TAC);;
7844 e (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`; 
7845    set_of_list]);;
7846 e (COND_CASES_TAC);;
7847 e (NEW_GOAL `i - 1 = 3`);;
7848 e (UNDISCH_TAC `i = 4` THEN ARITH_TAC);;
7849 e (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);;
7850 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; set_of_list]);;
7851 e (STRIP_TAC);;
7852
7853 e (NEW_GOAL `?v w:real^3. {u0, u1, v, w} = {v0, v1, v2, v3}`);;
7854
7855 e (NEW_GOAL `?v:real^3. v IN {v0, v1, v2, v3} DIFF {u0, u1}`);;
7856 e (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);;
7857 e (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1:real^3} = {} <=> 
7858                   CARD ({v0, v1, v2, v3} DIFF {u0, u1}) = 0`);;
7859 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
7860 e (MATCH_MP_TAC CARD_EQ_0);;
7861 e (MATCH_MP_TAC FINITE_SUBSET);;
7862 e (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);;
7863 e (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);;
7864 e (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);;
7865
7866 e (NEW_GOAL `CARD {v0, v1, v2, v3} = 
7867              CARD ({v0, v1, v2, v3} DIFF {u0, u1:real^3}) + CARD {u0, u1}`);;
7868 e (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);;
7869 e (ASM_REWRITE_TAC[Geomdetail.FINITE6]);;
7870
7871 e (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);;
7872 e (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);;
7873 e (ASM_REWRITE_TAC[set_of_list]);;
7874 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7875                  CARD (set_of_list ul) = 3 + 1`);;
7876 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
7877 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7878 e (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);;
7879 e (REWRITE_TAC[Geomdetail.CARD2]);;
7880 e (UP_ASM_TAC THEN ARITH_TAC);;
7881 e (UP_ASM_TAC THEN STRIP_TAC);;
7882
7883 e (NEW_GOAL `?w:real^3. w IN {v0, v1, v2, v3} DIFF {u0, u1, v}`);;
7884 e (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);;
7885 e (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1, v:real^3} = {} <=> 
7886                   CARD ({v0, v1, v2, v3} DIFF {u0, u1, v}) = 0`);;
7887 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
7888 e (MATCH_MP_TAC CARD_EQ_0);;
7889 e (MATCH_MP_TAC FINITE_SUBSET);;
7890 e (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);;
7891 e (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);;
7892 e (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);;
7893
7894 e (NEW_GOAL `CARD ({v0, v1, v2, v3} DIFF {u0, u1,v:real^3}) = 
7895              CARD {v0, v1, v2, v3} - CARD {u0,u1,v}`);;
7896 e (MATCH_MP_TAC CARD_DIFF);;
7897 e (ASM_REWRITE_TAC[Geomdetail.FINITE6]);;
7898 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
7899 e (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);;
7900 e (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);;
7901 e (ASM_REWRITE_TAC[set_of_list]);;
7902 e (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\ 
7903                  CARD (set_of_list ul) = 3 + 1`);;
7904 e (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);;
7905 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7906 e (NEW_GOAL `CARD {u0, u1, v:real^3} <= 3`);;
7907 e (REWRITE_TAC[Geomdetail.CARD3]);;
7908 e (UP_ASM_TAC THEN ARITH_TAC);;
7909 e (UP_ASM_TAC THEN STRIP_TAC);;
7910
7911 e (EXISTS_TAC `v:real^3` THEN EXISTS_TAC `w:real^3`);;
7912 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN 
7913    UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);;
7914 e (UP_ASM_TAC THEN STRIP_TAC);;
7915 e (REWRITE_TAC[GSYM (ASSUME `{u0:real^3, u1, v, w} = {v0, v1, v2, v3}`)]);;
7916 e (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);;
7917 e (ASM_REWRITE_TAC[]);;
7918 e (STRIP_TAC);;
7919 e (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
7920 e (STRIP_TAC);;
7921 e (UNDISCH_TAC `~NULLSET x`);;
7922 e (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`; 
7923    ASSUME `x  = mcell i V ul`; ASSUME `i = 4`; 
7924    ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
7925 e (COND_CASES_TAC);;
7926 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
7927 e (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);;
7928 e (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);;
7929 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
7930 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
7931 e (ASM_REWRITE_TAC[]);;
7932 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
7933
7934 e (NEW_GOAL `F`);;
7935 e (UNDISCH_TAC `~NULLSET x`);;
7936 e (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`; 
7937    ASSUME `x  = mcell i V ul`; ASSUME `i = 4`; 
7938    ASSUME `ul = [v0; v1; v2; v3:real^3]`]);;
7939 e (COND_CASES_TAC);;
7940 e (NEW_GOAL `F`);;
7941 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
7942 e (UP_ASM_TAC THEN MESON_TAC[]);;
7943 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
7944 e (UP_ASM_TAC THEN MESON_TAC[]);;
7945
7946 e (NEW_GOAL `vol (x INTER D) = &0`);;
7947 e (MATCH_MP_TAC MEASURE_EQ_0);;
7948 e (ASM_REWRITE_TAC[]);;
7949 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
7950
7951 (* ========================================== *)
7952
7953 e (NEW_GOAL `i = 2`);;
7954 e (UNDISCH_TAC `i <= 4` THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC 
7955    THEN ARITH_TAC);;
7956
7957 e (NEW_GOAL `vol (x INTER D) > &0`);;
7958 e (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);;
7959 e (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);;
7960 e (MATCH_MP_TAC BARV_3_EXPLICIT);;
7961 e (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);;
7962 e (UP_ASM_TAC THEN STRIP_TAC);;
7963 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; TRUNCATE_SIMPLEX_EXPLICIT_1; 
7964    set_of_list; HD; TL]);;
7965 e (LET_TAC);;
7966 e (COND_CASES_TAC);;
7967
7968 e (NEW_GOAL `i - 1 = 1`);;
7969 e (UNDISCH_TAC `i = 2` THEN ARITH_TAC);;
7970 e (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);;
7971 e (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list]);;
7972 e (STRIP_TAC);;
7973 e (NEW_GOAL `{u0, u1} = {v0, v1:real^3}`);;
7974 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN
7975    SET_TAC[]);;
7976 e (REWRITE_TAC[SET_RULE `A INTER B INTER C INTER D = 
7977                         (A INTER (B INTER C)) INTER D`]);;
7978 e (REWRITE_WITH `rcone_ge v0 v1 a' INTER rcone_ge v1 v0 a' = 
7979                  rcone_ge u0 u1 a' INTER rcone_ge u1 (u0:real^3) a'`);;
7980 e (ASM_CASES_TAC `u0:real^3 = v0`);;
7981 e (NEW_GOAL `u1 = v1:real^3`);;
7982 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
7983 e (ASM_REWRITE_TAC[]);;
7984 e (NEW_GOAL `u0 = v1:real^3`);;
7985 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
7986 e (NEW_GOAL `u1 = v0:real^3`);;
7987 e (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
7988 e (ASM_REWRITE_TAC[]);;
7989 e (SET_TAC[]);;
7990
7991 e (REWRITE_WITH 
7992   `conic_cap u0 u1 r d INTER rcone_ge u0 u1 a' INTER rcone_ge u1 u0 a' =
7993    conic_cap (u0:real^3) u1 r d`);;
7994 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER B = A`));;
7995
7996 e (NEW_GOAL `conic_cap (u0:real^3) u1 r d SUBSET rcone_ge u0 u1 a'`);;
7997 e (REWRITE_TAC[conic_cap]);;
7998 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET B`));;
7999 e (NEW_GOAL `rcone_gt u0 u1 d SUBSET rcone_gt (u0:real^3) u1 a'`);;
8000 e (MATCH_MP_TAC RCONE_GT_SUBSET);;
8001 e (EXPAND_TAC "d" THEN EXPAND_TAC "c");;
8002 e (MATCH_MP_TAC (REAL_ARITH `a = x ==> a <= max (max y x) (max z t)`));;
8003 e (EXPAND_TAC "a'" THEN REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);;
8004 e (NEW_GOAL `rcone_gt u0 u1 a' SUBSET rcone_ge (u0:real^3) u1 a'`);;
8005 e (REWRITE_TAC[RCONE_GT_SUBSET_RCONE_GE]);;
8006 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
8007 e (REWRITE_TAC[SUBSET_INTER] THEN STRIP_TAC);;
8008 e (ASM_REWRITE_TAC[]);;
8009
8010 e (REWRITE_TAC[SUBSET]);;
8011 e (REPEAT STRIP_TAC);;
8012 e (MATCH_MP_TAC Marchal_cells_2_new.RCONEGE_INTER_VORONOI_CLOSED_IMP_RCONEGE);;
8013 e (EXISTS_TAC `V:real^3->bool`);;
8014 e (ASM_REWRITE_TAC[]);;
8015 e (REPEAT STRIP_TAC);;
8016
8017 e (REWRITE_WITH `a' = hl [u0; u1:real^3] / sqrt (&2)`);;
8018 e (EXPAND_TAC "a'");;
8019 e (REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);;
8020 e (MATCH_MP_TAC REAL_LT_DIV);;
8021 e (REWRITE_TAC[HL_2]);;
8022 e (STRIP_TAC);;
8023 e (MATCH_MP_TAC REAL_LT_MUL);;
8024 e (REWRITE_TAC[REAL_ARITH `&0 < inv (&2)`]);;
8025 e (MATCH_MP_TAC DIST_POS_LT);;
8026 e (ASM_REWRITE_TAC[]);;
8027 e (MATCH_MP_TAC SQRT_POS_LT);;
8028 e (REAL_ARITH_TAC);;
8029 e (EXPAND_TAC "a'");;
8030 e (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);;
8031 e (STRIP_TAC);;
8032 e (MATCH_MP_TAC SQRT_POS_LT);;
8033 e (REAL_ARITH_TAC);;
8034 e (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));;
8035 e (ASM_REWRITE_TAC[]);;
8036
8037 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
8038 e (NEW_GOAL `x':real^3 IN ball (u0, (&1))`);;
8039 e (UP_ASM_TAC THEN REWRITE_TAC[conic_cap;NORMBALL_BALL] THEN STRIP_TAC);;
8040 e (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);;
8041 e (MATCH_MP_TAC SUBSET_BALL);;
8042 e (EXPAND_TAC "r");;
8043 e (REAL_ARITH_TAC);;
8044 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
8045 e (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL] THEN ONCE_REWRITE_TAC[DIST_SYM] 
8046    THEN STRIP_TAC);;
8047 e (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);;
8048 e (REPEAT STRIP_TAC);;
8049 e (ASM_CASES_TAC `u0 = w:real^3`);;
8050 e (ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);;
8051 e (NEW_GOAL `&2 <= dist (u0, w:real^3)`);;
8052 e (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);;
8053 e (STRIP_TAC);;
8054 e (FIRST_ASSUM MATCH_MP_TAC);;
8055 e (ASM_REWRITE_TAC[]);;
8056 e (UNDISCH_TAC `u0:real^3 IN V` THEN REWRITE_TAC[IN]);;
8057 e (NEW_GOAL `dist (x', u0) >= dist (u0, w) - dist (x', w:real^3)`);;
8058 e (NORM_ARITH_TAC);;
8059 e (UP_ASM_TAC THEN UP_ASM_TAC THEN DEL_TAC THEN DEL_TAC THEN UP_ASM_TAC
8060    THEN REAL_ARITH_TAC);;
8061 e (ABBREV_TAC `M = mxi V [v0; v1; v2; v3]`);;
8062 e (ABBREV_TAC `R = omega_list_n V [v0; v1; v2; v3] 3`);;
8063
8064 e (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0:real^3,v1,M,R}) 
8065          <=  vol (conic_cap u0 u1 r d INTER aff_ge {v0, v1} {M, R})`);;
8066 e (MATCH_MP_TAC MEASURE_SUBSET);;
8067 e (REPEAT STRIP_TAC);;
8068 e (MATCH_MP_TAC MEASURABLE_INTER);;
8069 e (REWRITE_TAC[MEASURABLE_CONIC_CAP]);;
8070 e (MATCH_MP_TAC MEASURABLE_CONVEX_HULL);;
8071 e (MATCH_MP_TAC FINITE_IMP_BOUNDED);;
8072 e (REWRITE_TAC[Geomdetail.FINITE6]);;
8073
8074 e (REWRITE_TAC[conic_cap; NORMBALL_BALL]);;
8075 e (ONCE_REWRITE_TAC[SET_RULE `(a INTER b) INTER c = 
8076                               (a INTER b) INTER (a INTER c)`]);;
8077 e (MATCH_MP_TAC MEASURABLE_INTER);;
8078 e (REWRITE_TAC[MEASURABLE_BALL_AFF_GE]);;
8079 e (REWRITE_TAC[GSYM conic_cap; GSYM NORMBALL_BALL; MEASURABLE_CONIC_CAP]);;
8080
8081 e (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET C INTER B`));;
8082 e (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);;
8083
8084
8085
8086 e (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0, v1, M, R}) > &0`);;
8087 e (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);;
8088 e (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);;
8089 e (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);;
8090 e (ASM_REWRITE_TAC[]);;
8091 e (REPEAT STRIP_TAC);;
8092 e (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
8093
8094 e (UNDISCH_TAC `~NULLSET x`);;
8095 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
8096    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
8097 e (LET_TAC);;
8098 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
8099 e (EXISTS_TAC `aff_ge {v0, v1} {M, R:real^3}`);;
8100 e (REWRITE_TAC[SET_RULE `a INTER B INTER c SUBSET c`]);;
8101 e (MATCH_MP_TAC NEGLIGIBLE_SUBSET);;
8102 e (EXISTS_TAC `affine hull ({v0, v1} UNION {M, R:real^3})`);;
8103 e (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL; SET_RULE 
8104   `{a, b} UNION {c, d} = {a,b,c,d}`]);;
8105 e (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);;
8106 e (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);;
8107 e (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);;
8108 e (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);;
8109 e (ASM_REWRITE_TAC[]);;
8110 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
8111
8112 e (NEW_GOAL `F`);;
8113 e (UNDISCH_TAC `~NULLSET x`);;
8114 e (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
8115    TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);;
8116 e (REWRITE_TAC[NEGLIGIBLE_EMPTY]);;
8117 e (UP_ASM_TAC THEN MESON_TAC[]);;
8118
8119 e (NEW_GOAL `vol (x INTER D) = &0`);;
8120 e (MATCH_MP_TAC MEASURE_EQ_0);;
8121 e (ASM_REWRITE_TAC[]);;
8122 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);;
8123 e (UP_ASM_TAC THEN MESON_TAC[]);;
8124
8125 (* ========================================== *)
8126
8127 e (REWRITE_WITH `sum s (\t. vol (t INTER D)) = 
8128                  sum t (\t. vol (t INTER D))`);;
8129 e (MATCH_MP_TAC SUM_SUPERSET);;
8130 e (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);;
8131 e (SET_TAC[]);;
8132 e (MATCH_MP_TAC MEASURE_EQ_0);;
8133 e (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );;
8134 e (MESON_TAC[]);;
8135
8136 e (REWRITE_WITH `sum t (\t. vol (t INTER D)) = 
8137                  sum t (\t. vol D * dihX V t (u0,u1) / (&2 * pi))`);;
8138 e (MATCH_MP_TAC SUM_EQ);;
8139 e (EXPAND_TAC "t" THEN REWRITE_TAC[IN_ELIM_THM; IN] THEN REPEAT STRIP_TAC);;
8140 e (ASM_SIMP_TAC[]);;
8141
8142 e (REWRITE_TAC[REAL_ARITH `a * b / c = (a / c) * b`]);;
8143 e (REWRITE_TAC[SUM_LMUL]);;
8144 e (ABBREV_TAC `R = sum t (\t. dihX V t (u0,u1))`);;
8145
8146 e (REWRITE_WITH `vol E = vol D * azim u0 u1 n1 n2 / (&2 * pi)`);;
8147 e (EXPAND_TAC "E" THEN 
8148    REWRITE_TAC[ASSUME `D:real^3->bool = conic_cap u0 u1 r d`]);;
8149 e (MATCH_MP_TAC VOLUME_CONIC_CAP_WEDGE_GE_VS_CONIC_CAP);;
8150 e (REPEAT STRIP_TAC);;
8151 e (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
8152 e (ASM_REWRITE_TAC[]);;
8153 e (ASM_REWRITE_TAC[]);;
8154 e (EXPAND_TAC "r" THEN REAL_ARITH_TAC);;
8155
8156 e (UP_ASM_TAC THEN REWRITE_TAC[]);;
8157 e (NEW_GOAL `?a0 a1 a2. vl1 = [a0;a1;a2:real^3]`);;
8158 e (MATCH_MP_TAC Qzksykg.BARV_2_EXPLICIT);;
8159 e (EXISTS_TAC `V:real^3->bool` THEN 
8160    ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl1 <=> vl1 IN barV V 2`]);;
8161 e (UP_ASM_TAC THEN STRIP_TAC);;
8162 e (REWRITE_WITH `{u0,u1,n1:real^3} = set_of_list vl1`);;
8163 e (ASM_REWRITE_TAC[set_of_list; EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);;
8164 e (NEW_GOAL `{a0, a1:real^3} = {u0,u1}`);;
8165 e (REWRITE_TAC[GSYM (ASSUME `e = {u0,u1:real^3}`); 
8166    GSYM (ASSUME `set_of_list (truncate_simplex 1 vl1) = e:real^3->bool`)]);;
8167 e (REWRITE_TAC[ASSUME `vl1 = [a0; a1; a2:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_1; 
8168                set_of_list]);;
8169 e (UP_ASM_TAC THEN SET_TAC[]);;
8170 e (MATCH_MP_TAC BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST);;
8171 e (EXISTS_TAC `V:real^3->bool` THEN 
8172    ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl1 <=> vl1 IN barV V 2`]);;
8173
8174
8175 e (UP_ASM_TAC THEN REWRITE_TAC[]);;
8176 e (NEW_GOAL `?a0 a1 a2. vl2 = [a0;a1;a2:real^3]`);;
8177 e (MATCH_MP_TAC Qzksykg.BARV_2_EXPLICIT);;
8178 e (EXISTS_TAC `V:real^3->bool` THEN 
8179    ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl2 <=> vl2 IN barV V 2`]);;
8180 e (UP_ASM_TAC THEN STRIP_TAC);;
8181 e (REWRITE_WITH `{u0,u1,n2:real^3} = set_of_list vl2`);;
8182 e (ASM_REWRITE_TAC[set_of_list; EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);;
8183 e (NEW_GOAL `{a0, a1:real^3} = {u0,u1}`);;
8184 e (REWRITE_TAC[GSYM (ASSUME `e = {u0,u1:real^3}`); 
8185    GSYM (ASSUME `set_of_list (truncate_simplex 1 vl2) = e:real^3->bool`)]);;
8186 e (REWRITE_TAC[ASSUME `vl2 = [a0; a1; a2:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_1; 
8187                set_of_list]);;
8188 e (UP_ASM_TAC THEN SET_TAC[]);;
8189 e (MATCH_MP_TAC BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST);;
8190 e (EXISTS_TAC `V:real^3->bool` THEN 
8191    ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl2 <=> vl2 IN barV V 2`]);;
8192
8193 e (REWRITE_TAC[REAL_ARITH `a / b * c = (a * c) / b`]);;
8194 e (REWRITE_WITH 
8195    `(vol D * R) / (&2 * pi) = vol D * azim u0 u1 n1 n2 / (&2 * pi) <=>
8196     (vol D * R) = (vol D * azim u0 u1 n1 n2 / (&2 * pi)) * (&2 * pi)`);;
8197 e (MATCH_MP_TAC REAL_EQ_LDIV_EQ);;
8198 e (MATCH_MP_TAC REAL_LT_MUL);;
8199 e (REWRITE_TAC[PI_POS]);;
8200 e (REAL_ARITH_TAC);;
8201 e (REWRITE_TAC[REAL_ARITH `(a * b / c) * c = (a * b)  * c/c`]);;
8202 e (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);;
8203 e (MATCH_MP_TAC REAL_DIV_REFL);;
8204 e (MATCH_MP_TAC (REAL_ARITH `&0 < a ==> ~(a = &0)`));;
8205 e (MATCH_MP_TAC REAL_LT_MUL);;
8206 e (REWRITE_TAC[PI_POS]);;
8207 e (REAL_ARITH_TAC);;
8208 e (REWRITE_TAC[REAL_ARITH `a * x = (a * t) * &1 <=> a * (x - t) = &0`]);;
8209 e (REWRITE_TAC[REAL_ENTIRE]);;
8210 e (STRIP_TAC);;
8211 e (NEW_GOAL `F`);;
8212 e (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);;
8213
8214 e (NEW_GOAL `&0 < d`);;
8215 e (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);;
8216 e (ASM_SIMP_TAC[VOLUME_CONIC_CAP]);;
8217 e (COND_CASES_TAC);;
8218 e (REWRITE_TAC[]);;
8219 e (UNDISCH_TAC `d < &1` THEN UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC 
8220    THEN REAL_ARITH_TAC);;
8221 e (REWRITE_TAC[REAL_ARITH `&2 / &3 * a = &0 <=> a = &0`]);;
8222 e (REWRITE_TAC[REAL_ENTIRE]);;
8223 e (NEW_GOAL `~(pi = &0)`);;
8224 e (MP_TAC PI_POS THEN REAL_ARITH_TAC);;
8225 e (NEW_GOAL `~(&1 - d = &0)`);;
8226 e (UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);;
8227 e (NEW_GOAL `~(r pow 3 = &0)`);;
8228 e (MATCH_MP_TAC REAL_POW_NZ);;
8229 e (UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);;
8230 e (ASM_REWRITE_TAC[]);;
8231 e (UP_ASM_TAC THEN MESON_TAC[]);;
8232 e (UP_ASM_TAC THEN REAL_ARITH_TAC);;
8233
8234 let REUHADY = top_thm();;
8235