1 (* ========================================================================= *)
2 (* FLYSPECK - BOOK FORMALIZATION *)
4 (* Author : VU KHAC KY *)
5 (* Book lemma: REUHADY *)
6 (* Chapter : Packing (Marchal cells) *)
9 (* ========================================================================= *)
11 module Reuhady = struct
14 open Euler_main_theorem;;
21 open Vukhacky_tactics;;
24 (* open Marchal_cells_2;; *)
25 open Marchal_cells_2_new;;
40 open Upfzbzm_support_lemmas;;
41 open Marchal_cells_3;;
44 open Sum_gammax_lmfun_estimate;;
52 let wedge_ge = new_definition `wedge_ge v0 v1 w1 w2 = { z |
53 &0 <= azim v0 v1 w1 z /\ azim v0 v1 w1 z <= azim v0 v1 w1 w2 }`;;
55 let BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST = prove_by_refinement (
56 `!V ul. packing V /\ barV V 2 ul ==>
57 ~collinear (set_of_list ul)`,
58 [(REWRITE_TAC[COLLINEAR_AFF_DIM]);
60 (NEW_GOAL `aff_dim (set_of_list (ul:(real^3)list)) = &2`);
61 (MATCH_MP_TAC MHFTTZN1);
62 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
65 (* ========================================================================= *)
66 (* ==== Harrison lemmas about WEDGE_GE ===== *)
67 (* ========================================================================= *)
69 let WEDGE_SIMPLE = prove
72 {y | &0 < azim v0 v1 w1 y /\ azim v0 v1 w1 y < azim v0 v1 w1 w2}`,
73 REPEAT GEN_TAC THEN REWRITE_TAC[wedge] THEN
75 `(!x. P x ==> ~Q x) ==> {x | ~P x /\ Q x /\ R x} = {x | Q x /\ R x}`) THEN
76 SIMP_TAC[AZIM_DEGENERATE; REAL_LT_REFL]);;
78 let WEDGE_GE_WEDGE = prove
80 wedge_ge v0 v1 w1 w2 =
81 wedge v0 v1 w1 w2 UNION
82 {z | azim v0 v1 w1 z = &0} UNION
83 {z | azim v0 v1 w1 z = azim v0 v1 w1 w2}`,
84 REWRITE_TAC[wedge_ge; WEDGE_SIMPLE; EXTENSION; IN_UNION; IN_ELIM_THM] THEN
86 MP_TAC(ISPECL [`v0:real^3`; `v1:real^3`; `w1:real^3`; `w2:real^3`] azim) THEN
89 let ARG_EQ_SUBSET_HALFLINE = prove
90 (`!a. ?b. ~(b = vec 0) /\ {z | Arg z = a} SUBSET aff_ge {vec 0} {b}`,
91 GEN_TAC THEN ASM_CASES_TAC `{z | Arg z = a} SUBSET {vec 0}` THENL
92 [EXISTS_TAC `basis 1:real^2` THEN
93 SIMP_TAC[BASIS_NONZERO; DIMINDEX_2; ARITH] THEN
94 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ]
95 SUBSET_TRANS)) THEN SIMP_TAC[SUBSET; IN_SING; ENDS_IN_HALFLINE];
97 FIRST_X_ASSUM(MP_TAC o MATCH_MP (SET_RULE
98 `~(s SUBSET {a}) ==> ?z. ~(a = z) /\ z IN s`)) THEN
99 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `z:complex` THEN
100 REWRITE_TAC[IN_ELIM_THM] THEN DISCH_THEN(STRIP_ASSUME_TAC o GSYM) THEN
101 ASM_REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
102 X_GEN_TAC `x:complex` THEN
103 ASM_CASES_TAC `x:complex = vec 0` THEN ASM_REWRITE_TAC[ENDS_IN_HALFLINE] THEN
104 RULE_ASSUM_TAC(REWRITE_RULE[COMPLEX_VEC_0]) THEN ASM_SIMP_TAC[ARG_EQ] THEN
105 DISCH_THEN(X_CHOOSE_THEN `u:real` STRIP_ASSUME_TAC) THEN
106 ASM_REWRITE_TAC[GSYM COMPLEX_CMUL] THEN
107 REWRITE_TAC[HALFLINE_EXPLICIT; IN_ELIM_THM; VECTOR_MUL_RZERO] THEN
108 MAP_EVERY EXISTS_TAC [`&1 - u`; `u:real`] THEN
109 ASM_SIMP_TAC[VECTOR_ADD_LID; REAL_LT_IMP_LE] THEN ASM_REAL_ARITH_TAC);;
111 let ARG_DIV_EQ_SUBSET_HALFLINE = prove
113 ==> ?b. ~(b = vec 0) /\
114 {z | Arg(z / w) = a} SUBSET aff_ge {vec 0} {b}`,
115 REPEAT GEN_TAC THEN GEOM_BASIS_MULTIPLE_TAC 1 `w:complex` THEN
116 X_GEN_TAC `w:real` THEN ASM_CASES_TAC `w = &0` THEN
117 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; REAL_LE_LT] THEN DISCH_TAC THEN
118 X_GEN_TAC `a:real` THEN DISCH_THEN(K ALL_TAC) THEN
119 ASM_SIMP_TAC[ARG_DIV_CX; COMPLEX_CMUL; COMPLEX_BASIS; GSYM CX_MUL;
120 REAL_MUL_RID; ARG_EQ_SUBSET_HALFLINE]);;
122 let COPLANAR_AZIM_EQ = prove
124 (collinear{v0,v1,w1} ==> ~(a = &0))
125 ==> coplanar {z | azim v0 v1 w1 z = a}`,
126 REPEAT GEN_TAC THEN ASM_CASES_TAC `collinear{v0:real^3,v1,w1}` THENL
127 [ASM_SIMP_TAC[azim_def; EMPTY_GSPEC; COPLANAR_EMPTY]; ALL_TAC] THEN
128 ASM_REWRITE_TAC[] THEN POP_ASSUM MP_TAC THEN
129 GEOM_ORIGIN_TAC `v0:real^3` THEN
130 GEOM_BASIS_MULTIPLE_TAC 3 `v1:real^3` THEN
131 X_GEN_TAC `v1:real` THEN ASM_CASES_TAC `v1 = &0` THENL
132 [ASM_REWRITE_TAC[VECTOR_MUL_LZERO; INSERT_AC; COLLINEAR_2]; ALL_TAC] THEN
133 ASM_SIMP_TAC[REAL_LE_LT; COLLINEAR_SPECIAL_SCALE] THEN REPEAT STRIP_TAC THEN
134 ASM_SIMP_TAC[AZIM_SPECIAL_SCALE; AZIM_ARG] THEN
135 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV [COLLINEAR_BASIS_3]) THEN
136 POP_ASSUM_LIST(K ALL_TAC) THEN DISCH_THEN(X_CHOOSE_THEN `b:real^2`
137 STRIP_ASSUME_TAC o SPEC `a:real` o MATCH_MP ARG_DIV_EQ_SUBSET_HALFLINE) THEN
138 REWRITE_TAC[coplanar] THEN MAP_EVERY EXISTS_TAC
139 [`vec 0:real^3`; `pushin 3 (&0) (b:real^2):real^3`; `basis 3:real^3`] THEN
140 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN
141 REWRITE_TAC[AFFINE_HULL_3; HALFLINE; SUBSET; IN_ELIM_THM] THEN
142 DISCH_THEN(fun th -> X_GEN_TAC `x:real^3` THEN DISCH_TAC THEN
143 MP_TAC(SPEC `(dropout 3:real^3->real^2) x` th)) THEN
144 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID] THEN
145 DISCH_THEN(X_CHOOSE_THEN `v:real` STRIP_ASSUME_TAC) THEN
146 MAP_EVERY EXISTS_TAC [`&1 - v - (x:real^3)$3`; `v:real`; `(x:real^3)$3`] THEN
147 CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
148 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [CART_EQ]) THEN
149 SIMP_TAC[CART_EQ; DIMINDEX_2; DIMINDEX_3; FORALL_2; FORALL_3; LAMBDA_BETA;
150 dropout; pushin; VECTOR_ADD_COMPONENT; VECTOR_MUL_COMPONENT; ARITH;
151 BASIS_COMPONENT] THEN
154 (* ------------------------------------------------------------------------- *)
155 (* The actual theorems. *)
156 (* ------------------------------------------------------------------------- *)
158 let UNIV_GSPEC = prove
163 let MEASURABLE_CONIC_CAP_WEDGE_GE = prove
165 measurable (conic_cap v0 v1 r a INTER wedge_ge v0 v1 w1 w2)`,
166 REPEAT STRIP_TAC THEN REWRITE_TAC[WEDGE_GE_WEDGE] THEN
167 ASM_CASES_TAC `collinear{v0:real^3,v1,w1}` THENL
168 [ASM_SIMP_TAC[AZIM_DEGENERATE; UNIV_GSPEC; UNION_UNIV; INTER_UNIV] THEN
169 REWRITE_TAC[MEASURABLE_CONIC_CAP];
170 REWRITE_TAC[UNION_OVER_INTER] THEN MATCH_MP_TAC MEASURABLE_UNION THEN
171 REWRITE_TAC[MEASURABLE_CONIC_CAP_WEDGE] THEN
172 MATCH_MP_TAC MEASURABLE_UNION THEN CONJ_TAC THEN
173 MATCH_MP_TAC NEGLIGIBLE_IMP_MEASURABLE THEN
174 MATCH_MP_TAC NEGLIGIBLE_INTER THEN DISJ2_TAC THEN
175 MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE THEN
176 ASM_SIMP_TAC[COPLANAR_AZIM_EQ]]);;
179 let VOLUME_CONIC_CAP_WEDGE_GE_VS_CONIC_CAP = prove
183 ~collinear {v0, v1, w1} /\
184 ~collinear {v0, v1, w2}
185 ==> vol (conic_cap v0 v1 r a INTER wedge_ge v0 v1 w1 w2) =
186 vol (conic_cap v0 v1 r a) * (azim v0 v1 w1 w2) / (&2 * pi)`,
187 REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
188 EXISTS_TAC `vol (conic_cap v0 v1 r a INTER wedge v0 v1 w1 w2)` THEN
190 [MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF THEN
191 REWRITE_TAC[GSYM UNION_OVER_INTER; SET_RULE
192 `s INTER t DIFF s INTER y = s INTER (t DIFF y)`] THEN
193 MATCH_MP_TAC NEGLIGIBLE_INTER THEN DISJ2_TAC THEN
194 REWRITE_TAC[WEDGE_GE_WEDGE; SET_RULE
195 `((s UNION t) DIFF s) UNION (s DIFF (s UNION t)) = t DIFF s`] THEN
196 MATCH_MP_TAC NEGLIGIBLE_DIFF THEN MATCH_MP_TAC NEGLIGIBLE_UNION THEN
197 CONJ_TAC THEN MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE THEN
198 ASM_SIMP_TAC[COPLANAR_AZIM_EQ];
199 ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE; VOLUME_CONIC_CAP] THEN
200 ASM_SIMP_TAC[REAL_ARITH `a < b ==> ~(b < a) /\ ~(b <= a)`] THEN
201 ASM_CASES_TAC `v1:real^3 = v0` THENL
202 [ASM_MESON_TAC[INSERT_AC; COLLINEAR_2]; ASM_REWRITE_TAC[]] THEN
203 ASM_SIMP_TAC[REAL_ARITH `&0 < a ==> max a (--(&1)) = a`] THEN
204 MP_TAC PI_POS THEN CONV_TAC REAL_FIELD]);;
206 (* ======================================================================== *)
208 let REUHADY_concl1_new =
209 `!V u0 u1 vl1 vl2 v1 v2 e.
215 hl [u0; u1] < sqrt (&2) /\
217 wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1 SUBSET
218 aff_ge {u0,u1} {n1} UNION aff_ge {u0,u1} {n2} /\
219 ~(azim u0 u1 n1 n2 = &0) /\
225 set_of_list (truncate_simplex 1 vl1) = e /\
226 set_of_list (truncate_simplex 1 vl2) = e /\
229 (!X. X IN mcell_set V /\ e IN edgeX V X
230 ==> X SUBSET wedge_ge u0 u1 n1 n2 \/
231 X SUBSET wedge_ge u0 u1 n2 n1)
233 {X | mcell_set V X /\ e IN edgeX V X /\ X SUBSET wedge_ge u0 u1 n1 n2}
234 (\t. dihX V t (u0,u1)) =
237 (* ========================================================================= *)
238 (* ========================================================================= *)
240 let REUHADY1 = prove_by_refinement (REUHADY_concl1_new,
242 (NEW_GOAL `barV V 1 [u0;u1:real^3]`);
243 (MATCH_MP_TAC HL_LE_SQRT2_IMP_BARV_1);
247 voronoi_list V [u0;u1:real^3] =
250 ({omega_list_n V vl i | i IN 1..k - 1} UNION
251 voronoi_list V vl) | vl | barV V k vl /\
252 truncate_simplex 1 vl = [u0;u1]}} =
254 (MATCH_MP_TAC Rogers.GLTVHUM_lemma1);
255 (ASM_REWRITE_TAC[] THEN ARITH_TAC);
257 `3 IN {k | k IN 1..3 /\
258 voronoi_list V [u0; u1] =
261 ({omega_list_n V vl i | i IN 1..k - 1} UNION voronoi_list V vl) | vl |
263 truncate_simplex 1 vl = [u0; u1]}}`);
264 (ASM_REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC);
265 (UP_ASM_TAC THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
268 {convex hull ({omega_list_n V vl i | i IN 1..3 - 1} UNION voronoi_list V vl) | vl | barV V 3 vl /\
269 truncate_simplex 1 vl = [u0; u1]} =
270 UNIONS {convex hull {omega_list_n V vl 1, omega_list_n V vl 2,
271 omega_list_n V vl 3} | vl | barV V 3 vl /\
272 truncate_simplex 1 vl = [u0; u1]}`);
273 (ONCE_REWRITE_TAC[SET_EQ_LEMMA]);
274 (REWRITE_TAC[IN_UNIONS] THEN ONCE_REWRITE_TAC[IN] THEN
275 REWRITE_TAC[IN_ELIM_THM]);
277 (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);
278 (EXISTS_TAC `vl:(real^3)list`);
280 (NEW_GOAL `?a. voronoi_list V vl = {a} /\
281 a = circumcenter (set_of_list vl) /\
282 hl vl = dist (HD vl,a)`);
283 (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);
285 (UP_ASM_TAC THEN STRIP_TAC);
287 (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);
288 (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
289 (REWRITE_TAC[OMEGA_LIST]);
290 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
291 CARD (set_of_list vl) = 3 + 1`);
292 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
293 (EXISTS_TAC `V:real^3->bool`);
295 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
296 (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
297 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
298 (NEW_GOAL `omega_list_n V vl 3 = a`);
301 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG;
302 ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);
303 (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} =
304 {omega_list_n V vl 1,omega_list_n V vl 2}`);
306 (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
307 {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2, circumcenter (set_of_list vl)}`);
310 (EXISTS_TAC `t:real^3->bool` THEN ASM_REWRITE_TAC[]);
311 (EXISTS_TAC `vl:(real^3)list`);
313 (NEW_GOAL `?a. voronoi_list V vl = {a} /\
314 a = circumcenter (set_of_list vl) /\
315 hl vl = dist (HD vl,a)`);
316 (MATCH_MP_TAC Marchal_cells_2_new.VORONOI_LIST_3_SINGLETON_EXPLICIT);
318 (UP_ASM_TAC THEN STRIP_TAC);
321 (NEW_GOAL `omega_list_n V vl 3 IN voronoi_list V vl`);
322 (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
323 (REWRITE_TAC[OMEGA_LIST]);
324 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
325 CARD (set_of_list vl) = 3 + 1`);
326 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
327 (EXISTS_TAC `V:real^3->bool`);
329 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
330 (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
331 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
332 (NEW_GOAL `omega_list_n V vl 3 = a`);
335 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; IN_NUMSEG;
336 ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`]);
337 (REWRITE_WITH `{omega_list_n V vl i | i = 1 \/ i = 2} =
338 {omega_list_n V vl 1,omega_list_n V vl 2}`);
340 (REWRITE_WITH `{omega_list_n V vl 1, omega_list_n V vl 2} UNION
341 {circumcenter (set_of_list vl)} = {omega_list_n V vl 1, omega_list_n V vl 2,
342 circumcenter (set_of_list vl)}`);
346 (* ======================================================================= *)
348 (ABBREV_TAC `p = circumcenter {u0, u1:real^3}`);
349 (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0;u1]) = &3`);
350 (REWRITE_TAC[AFF_DIM_INSERT]);
354 (NEW_GOAL `affine hull voronoi_list V [u0; u1] SUBSET
355 affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);
356 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
357 (REWRITE_TAC[VORONOI_LIST; set_of_list; Packing3.VORONOI_SET_2]);
358 (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
359 (ASM_SIMP_TAC[Pack2.INTER_VORONOI_SUBSET_BISECTOR]);
361 `affine hull {x | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2} =
362 {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2}`);
363 (REWRITE_TAC[AFFINE_HULL_EQ]);
364 (REWRITE_TAC[AFFINE_HYPERPLANE]);
366 `~(u0 IN {x:real^3 | &2 % (u0 - u1) dot x = norm u0 pow 2 - norm u1 pow 2})`);
367 (REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
368 (ONCE_REWRITE_TAC [REAL_ARITH `a = b <=> a - b = &0`]);
369 (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 - (u0 dot u0 - u1 dot u1) =
370 (u0 - u1) dot (u0 - u1)`]);
371 (REWRITE_TAC[DOT_EQ_0] THEN ASM_NORM_ARITH_TAC);
374 (REWRITE_TAC[ARITH_RULE `a + &1 = b:int <=> a = b - &1`]);
375 (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
378 (NEW_GOAL `aff_dim (u0 INSERT voronoi_list V [u0; u1]) = &(dimindex (:3))`);
379 (ASM_REWRITE_TAC[DIMINDEX_3]);
380 (UP_ASM_TAC THEN REWRITE_TAC[AFF_DIM_EQ_FULL]);
383 (ABBREV_TAC `S = voronoi_list V [u0;u1]`);
384 (NEW_GOAL `!x. x IN S ==> (x - u0) dot (u1 - u0) =
385 dist (p, u0) * dist (u1, u0:real^3)`);
387 (NEW_GOAL `p = inv (&2) % (u0 + (u1:real^3))`);
388 (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);
390 (REWRITE_WITH `u1 - u0 = &2 % (p - u0:real^3)`);
393 (REWRITE_TAC[NORM_MUL; REAL_ARITH `abs (&2) = &2`;
394 REAL_ARITH `a * b * a = b * a pow 2`; NORM_POW_2; DOT_RMUL]);
395 (REWRITE_WITH `(x - u0) dot (p - u0:real^3) =
396 (p - u0) dot (p - u0) - (x - p) dot (u0 - p)`);
398 (REWRITE_WITH `(x - p) dot (u0 - p:real^3) = &0`);
400 (REWRITE_WITH `{u0, u1} = set_of_list [u0; u1:real^3]`);
401 (REWRITE_TAC[set_of_list]);
402 (MATCH_MP_TAC Rogers.MHFTTZN4);
403 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
407 (NEW_GOAL `S SUBSET affine hull voronoi_list V [u0; u1]`);
409 (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
411 (REWRITE_TAC[set_of_list]);
412 (NEW_GOAL `{u0,u1} SUBSET affine hull {u0,u1:real^3}`);
413 (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
417 (* ========================================================================= *)
419 (ABBREV_TAC `S1 = {x:real^3 | &2 % (u0 - u1) dot x =
420 norm u0 pow 2 - norm u1 pow 2}`);
421 (ABBREV_TAC `S2:real^3->bool = (S1 DIFF (relative_interior S))`);
422 (NEW_GOAL `closed_in (subtopology euclidean (S1:real^3->bool)) S2`);
424 (MATCH_MP_TAC CLOSED_IN_DIFF);
426 (NEW_GOAL `closed (S1:real^3->bool)`);
427 (EXPAND_TAC "S1" THEN REWRITE_TAC[CLOSED_HYPERPLANE]);
428 (MATCH_MP_TAC CLOSED_SUBSET);
429 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
431 (REWRITE_WITH `S1 = affine hull (S:real^3->bool)`);
433 (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
434 (REWRITE_TAC[AFFINE_HULL_EQ]);
435 (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
436 (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);
437 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
438 (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);
440 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list;
441 SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
442 (DEL_TAC THEN EXPAND_TAC "S1");
443 (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
445 (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);
446 (DEL_TAC THEN EXPAND_TAC "S1");
447 (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
448 (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);
450 (REWRITE_TAC[DIMINDEX_3]);
451 (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);
452 (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
456 (REWRITE_TAC[OPEN_IN_RELATIVE_INTERIOR]);
458 (NEW_GOAL `closed (S2:real^3->bool)`);
459 (MATCH_MP_TAC CLOSED_IN_CLOSED_TRANS);
460 (EXISTS_TAC `S1:real^3->bool`);
463 (REWRITE_TAC[CLOSED_HYPERPLANE]);
466 (NEW_GOAL `~(S2:real^3->bool = {})`);
468 (REWRITE_TAC [SET_RULE `A DIFF B = {} <=> A SUBSET B`]);
470 (NEW_GOAL `S1 SUBSET S:real^3->bool`);
471 (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);
472 (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);
473 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
475 (NEW_GOAL `S1 = S:real^3->bool`);
476 (NEW_GOAL `S SUBSET S1:real^3->bool`);
478 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list;
479 SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
481 (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
483 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
485 (NEW_GOAL `bounded (S1:real^3->bool)`);
486 (REWRITE_TAC[ASSUME `S1 = S:real^3->bool`]);
487 (DEL_TAC THEN EXPAND_TAC "S");
488 (MATCH_MP_TAC Packing3.BOUNDED_VORONOI_LIST);
492 (NEW_GOAL `~bounded (S1:real^3->bool)`);
494 (MATCH_MP_TAC UNBOUNDED_HYPERPLANE);
495 (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) = vec 0 <=> u0 = u1`]);
499 (NEW_GOAL `?z:real^3. z IN S2 /\
500 (!w. w IN S2 ==> dist (u0,z) <= dist (u0,w))`);
501 (MATCH_MP_TAC DISTANCE_ATTAINS_INF);
503 (UP_ASM_TAC THEN STRIP_TAC);
505 (* ======================================================================== *)
507 (ABBREV_TAC `a = dist (p, u0:real^3) / dist (z, u0)`);
508 (NEW_GOAL `&0 < a /\ a < &1`);
510 (NEW_GOAL `~(u0:real^3 IN S1)`);
511 (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
512 (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);
513 (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 =
514 (u0 - u1) dot (u0 - u1)`]);
515 (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
517 (NEW_GOAL `&0 < dist (p,u0:real^3)`);
518 (MATCH_MP_TAC DIST_POS_LT);
519 (EXPAND_TAC "p" THEN REWRITE_TAC[Rogers.CIRCUMCENTER_2; midpoint]);
520 (REWRITE_TAC[VECTOR_ARITH `inv (&2) % (u0 + u1) = u0 <=> u0 = u1`]);
522 (NEW_GOAL `&0 < dist (z,u0:real^3)`);
523 (MATCH_MP_TAC DIST_POS_LT);
525 (NEW_GOAL `z:real^3 IN S1`);
529 (MATCH_MP_TAC REAL_LT_DIV);
532 `dist (p,u0) / dist (z,u0:real^3) < &1 <=> dist (p,u0) < &1 * dist (z,u0)`);
533 (ASM_SIMP_TAC[REAL_LT_LDIV_EQ]);
534 (REWRITE_TAC[REAL_MUL_LID]);
535 (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LT);
537 (ASM_REAL_ARITH_TAC);
538 (ASM_REAL_ARITH_TAC);
540 (REWRITE_WITH `norm (z - u0:real^3) pow 2 =
541 norm (p - u0) pow 2 + norm (z - p) pow 2`);
542 (MATCH_MP_TAC PYTHAGORAS);
543 (REWRITE_TAC[orthogonal]);
544 (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
545 (ASM_REWRITE_TAC[set_of_list]);
546 (ONCE_REWRITE_TAC[DOT_SYM]);
547 (MATCH_MP_TAC Rogers.MHFTTZN4);
548 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
553 (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);
554 (REWRITE_WITH `affine hull (S:real^3->bool) = S1`);
555 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
557 (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
558 (REWRITE_TAC[AFFINE_HULL_EQ]);
559 (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
560 (ONCE_REWRITE_TAC[GSYM (ASSUME `affine hull S1 = S1:real^3->bool`)]);
561 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
562 (MATCH_MP_TAC AFF_DIM_EQ_AFFINE_HULL);
564 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list;
565 SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
566 (DEL_TAC THEN EXPAND_TAC "S1");
567 (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
569 (REWRITE_WITH `aff_dim (S1:(real^3->bool)) = &(dimindex (:3)) - &1`);
570 (DEL_TAC THEN EXPAND_TAC "S1");
571 (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
572 (REWRITE_TAC[VECTOR_ARITH `&2 % (s - t) = vec 0 <=> s = t`]);
574 (REWRITE_TAC[DIMINDEX_3]);
575 (REWRITE_WITH `aff_dim (voronoi_list V [u0;u1:real^3]) = &3 - &1`);
576 (MATCH_MP_TAC Packing3.AFF_DIM_VORONOI_LIST);
580 (REWRITE_TAC[set_of_list]);
581 (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);
582 (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
584 (REWRITE_TAC[REAL_ARITH `a < a + b <=> &0 < b`; NORM_POW_2; DOT_POS_LT]);
585 (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
587 (NEW_GOAL `~(z:real^3 IN S2)`);
588 (REWRITE_TAC[ASSUME `z = p:real^3`]);
590 (NEW_GOAL `p:real^3 IN relative_interior S`);
593 (ABBREV_TAC `B = V INTER ball (p:real^3, &8)`);
594 (ABBREV_TAC `A = B DIFF {u0, u1:real^3}`);
595 (NEW_GOAL `FINITE (A:real^3->bool)`);
597 (MATCH_MP_TAC FINITE_DIFF);
599 (MATCH_MP_TAC Packing3.KIUMVTC THEN ASM_REWRITE_TAC[]);
600 (NEW_GOAL `?y. dist (p,y:real^3) = &4`);
601 (MATCH_MP_TAC VECTOR_CHOOSE_DIST);
603 (UP_ASM_TAC THEN STRIP_TAC);
604 (UNDISCH_TAC `saturated (V:real^3->bool)`);
605 (REWRITE_TAC[saturated] THEN STRIP_TAC);
606 (NEW_GOAL `?z. z IN V /\ dist (y:real^3, z) < &2`);
608 (UP_ASM_TAC THEN STRIP_TAC);
610 (NEW_GOAL `z':real^3 IN A`);
611 (EXPAND_TAC "A" THEN EXPAND_TAC "B");
612 (REWRITE_TAC[IN_DIFF; IN_INTER; IN_BALL]);
616 (NEW_GOAL `dist (p,z') <= dist (p, y) + dist (y, z':real^3)`);
617 (REWRITE_TAC[DIST_TRIANGLE]);
618 (ASM_REAL_ARITH_TAC);
619 (NEW_GOAL `dist (p, y) <= dist (p, z') + dist (z', y:real^3)`);
620 (REWRITE_TAC[DIST_TRIANGLE]);
621 (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);
623 (NEW_GOAL `&2 < dist (z', p:real^3)`);
624 (ASM_REAL_ARITH_TAC);
625 (UP_ASM_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM]);
626 (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
627 (ASM_MESON_TAC[set_of_list]);
628 (NEW_GOAL `(!w. w IN set_of_list [u0;u1:real^3]
629 ==> dist (circumcenter (set_of_list [u0;u1]),w) = hl [u0;u1])`);
630 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
631 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
634 (REWRITE_WITH `dist (circumcenter (set_of_list [u0; u1:real^3]),z') =
636 (FIRST_ASSUM MATCH_MP_TAC);
637 (ASM_REWRITE_TAC[set_of_list]);
638 (NEW_GOAL `sqrt (&2) <= &2`);
639 (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
640 (SIMP_TAC[REAL_ARITH `&0 <= &2`; SQRT_POS_LE; SQRT_POW_2]);
642 (ASM_REAL_ARITH_TAC);
644 (NEW_GOAL `?a:real^3. a IN A /\ (!x. x IN A ==> dist (p,a) <= dist (p,x))`);
645 (MATCH_MP_TAC Packing3.REAL_FINITE_ARGMIN);
647 (UP_ASM_TAC THEN SET_TAC[]);
648 (UP_ASM_TAC THEN STRIP_TAC);
650 (ABBREV_TAC `d = inv (&4) * (dist (p, a') - dist (p, u0:real^3))`);
653 (MATCH_MP_TAC REAL_LT_MUL);
656 (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> a > b`]);
657 (ONCE_REWRITE_TAC[DIST_SYM]);
658 (NEW_GOAL `!u v. u IN {u0,u1} /\ v IN V DIFF {u0,u1} ==>
659 dist (v,p) > dist (u,p:real^3)`);
660 (MATCH_MP_TAC Rogers.XYOFCGX);
664 (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_INDEPENDENT_2]);
665 (ASM_MESON_TAC[set_of_list]);
666 (REWRITE_WITH `radV {u0, u1:real^3} = hl [u0;u1]`);
667 (REWRITE_TAC[HL;set_of_list]);
669 (FIRST_ASSUM MATCH_MP_TAC);
672 (REWRITE_TAC[relative_interior; IN; IN_ELIM_THM]);
673 (ABBREV_TAC `St = S INTER ball (p:real^3, d)`);
674 (EXISTS_TAC `St:real^3->bool`);
677 (REWRITE_TAC[open_in]);
679 (NEW_GOAL `S SUBSET affine hull (S:real^3->bool)`);
680 (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
681 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
682 (EXISTS_TAC `d - dist (p:real^3, x)`);
684 (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);
685 (REWRITE_TAC[GSYM IN_BALL]);
688 (REWRITE_TAC[IN_INTER]);
691 (NEW_GOAL `dist (x',x:real^3) < d`);
692 (NEW_GOAL `&0 <= dist (p,x:real^3)`);
693 (REWRITE_TAC[DIST_POS_LE]);
694 (ASM_REAL_ARITH_TAC);
696 (NEW_GOAL `x' IN voronoi_closed V (u0:real^3)`);
697 (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
700 (ASM_CASES_TAC `w IN {u0, u1:real^3}`);
701 (ASM_CASES_TAC `w = u0:real^3`);
702 (REWRITE_TAC[ASSUME `w = u0:real^3`]);
704 (NEW_GOAL `w = u1:real^3`);
706 (REWRITE_TAC[ASSUME `w = u1:real^3`]);
707 (MATCH_MP_TAC (REAL_ARITH `a = b ==> a <= b`));
709 (NEW_GOAL `x':real^3 IN S1`);
710 (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
711 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
712 (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM
713 (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET;
714 set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
715 (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
717 (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);
718 (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);
719 (REWRITE_TAC[AFFINE_HULL_EQ]);
720 (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
723 (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);
724 (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);
726 VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) =
727 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);
728 (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);
730 (REWRITE_TAC[DIST_EQ]);
731 (ONCE_REWRITE_TAC[DIST_SYM]);
734 (NEW_GOAL `dist (x', u0:real^3) <= dist (x', x) + dist (x, u0)`);
735 (REWRITE_TAC[DIST_TRIANGLE]);
736 (NEW_GOAL `dist (x, u0:real^3) <= dist (x, p:real^3) + dist (p, u0)`);
737 (REWRITE_TAC[DIST_TRIANGLE]);
738 (NEW_GOAL `dist (x,p:real^3) < d`);
739 (NEW_GOAL `x IN ball (p:real^3, d)`);
741 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
742 (REWRITE_TAC[DIST_SYM]);
743 (NEW_GOAL `dist (x',u0) < &2 * d + dist (p:real^3,u0)`);
744 (ASM_REAL_ARITH_TAC);
746 (NEW_GOAL `dist (p, w:real^3)- &2 * d <= dist (x',w)`);
747 (NEW_GOAL `dist (x, w:real^3) <= dist (x, x') + dist (x', w)`);
748 (REWRITE_TAC[DIST_TRIANGLE]);
749 (NEW_GOAL `dist (p, w:real^3) <= dist (p, x) + dist (x, w)`);
750 (REWRITE_TAC[DIST_TRIANGLE]);
751 (NEW_GOAL `dist (x, x':real^3) < d /\ dist (p, x:real^3) < d`);
752 (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
753 (ASM_REAL_ARITH_TAC);
754 (NEW_GOAL `dist (p, u0) + &4 * d <= dist (p, w:real^3)`);
756 (REWRITE_TAC[REAL_ARITH `&4 * inv (&4) * a = a`]);
757 (REWRITE_TAC[REAL_ARITH `a + b - a = b`]);
759 (ASM_CASES_TAC `w:real^3 IN B`);
760 (FIRST_ASSUM MATCH_MP_TAC);
762 (NEW_GOAL `~(dist (p,w:real^3) < &8)`);
763 (REWRITE_TAC[GSYM IN_BALL]);
765 (NEW_GOAL `dist (p,a':real^3) < &8`);
766 (REWRITE_TAC[GSYM IN_BALL]);
768 (ASM_REAL_ARITH_TAC);
769 (ASM_REAL_ARITH_TAC);
771 (NEW_GOAL `x' IN voronoi_closed V (u1:real^3)`);
772 (NEW_GOAL `x':real^3 IN S1`);
773 (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
774 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
775 (EXPAND_TAC "S1" THEN REWRITE_TAC[GSYM
776 (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET;
777 set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
778 (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
780 (REWRITE_WITH `x' IN S1 <=> x':real^3 IN affine hull S1`);
781 (REWRITE_WITH `affine hull S1 = S1:real^3->bool`);
782 (REWRITE_TAC[AFFINE_HULL_EQ]);
783 (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
786 (UP_ASM_TAC THEN EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM; NORM_POW_2]);
787 (ONCE_REWRITE_TAC[REAL_ARITH `a = b <=> a - b = &0`]);
789 VECTOR_ARITH `&2 % (u0 - u1) dot x - (u0 dot u0 - u1 dot u1) =
790 (u1 - x) dot (u1 - x) - (u0 - x) dot (u0 - x)`]);
791 (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`; GSYM NORM_POW_2; GSYM dist]);
793 (UNDISCH_TAC `x' IN voronoi_closed V (u0:real^3)`);
794 (REWRITE_TAC[voronoi_closed; IN_ELIM_THM; IN]);
796 (REWRITE_WITH `dist (x', u1)= dist (x', u0:real^3)`);
797 (ONCE_REWRITE_TAC[DIST_SYM]);
798 (ASM_REWRITE_TAC[DIST_EQ]);
802 (ASSUME `voronoi_list V [u0; u1] = S`); VORONOI_LIST; VORONOI_SET;
803 set_of_list; SET_RULE `INTERS {f v | v IN {a, b}} = f a INTER f b`]);
804 (ASM_REWRITE_TAC[IN_INTER]);
806 (REWRITE_TAC[IN_BALL]);
807 (NEW_GOAL `dist (p,x':real^3) <= dist (p,x) + dist (x, x':real^3)`);
808 (REWRITE_TAC[DIST_TRIANGLE]);
809 (NEW_GOAL `dist (x,x':real^3) = dist (x',x)`);
810 (REWRITE_TAC[DIST_SYM]);
811 (ASM_REAL_ARITH_TAC);
812 (REWRITE_WITH `St p <=> p:real^3 IN St`);
814 (EXPAND_TAC "St" THEN REWRITE_TAC[IN_INTER; IN_BALL; DIST_REFL]);
816 (REWRITE_WITH `p = omega_list V [u0; u1]`);
817 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
818 (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
819 (ASM_MESON_TAC[set_of_list]);
820 (MATCH_MP_TAC Rogers.XNHPWAB1);
822 (ASM_REWRITE_TAC[IN]);
823 (REWRITE_TAC[GSYM (ASSUME `voronoi_list V [u0;u1] = S`)]);
824 (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
825 (EXISTS_TAC `1` THEN ASM_REWRITE_TAC[]);
827 (UP_ASM_TAC THEN SET_TAC[]);
828 (UP_ASM_TAC THEN SET_TAC[]);
831 (* ======================================================================== *)
833 (NEW_GOAL `?b. &0 < b /\ b < &1 /\
834 rcone_gt u0 u1 b SUBSET aff_ge_alt {u0:real^3} S`);
836 (EXISTS_TAC `a:real`);
840 (REWRITE_TAC[SET_RULE `A SUBSET B <=> (!x. ~(x IN B) ==> ~(x IN A))`]);
842 (NEW_GOAL `x:real^3 IN affine hull (u0 INSERT S)`);
844 (UP_ASM_TAC THEN REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);
847 (ABBREV_TAC `h = sum (s DELETE u0:real^3) u`);
848 (NEW_GOAL `(x - u0) dot (u1 - u0:real^3) =
849 h * dist (p, u0) * dist (u1, u0:real^3)`);
851 (NEW_GOAL `u0 = vsum s (\v:real^3. (u:real^3->real) v % (u0:real^3))`);
852 (ASM_SIMP_TAC[VSUM_RMUL]);
854 (REWRITE_WITH `vsum (s:real^3->bool) (\v. u v % v) - u0:real^3 =
855 vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0)`);
857 (UP_ASM_TAC THEN MESON_TAC[]);
858 (REWRITE_WITH `vsum s (\v. u v % v) - vsum s (\v:real^3. u v % u0:real^3) =
859 vsum s (\x. (\v. u v % v) x - (\v. u v % u0) x)`);
860 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
861 (MATCH_MP_TAC VSUM_SUB);
863 (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`]);
864 (REWRITE_WITH `vsum s (\x:real^3. u x % (x - u0)) dot (u1 - u0) =
865 sum s (\x. (\x. u x % (x - u0)) x dot (u1 - u0:real^3))`);
866 (ASM_SIMP_TAC[DOT_LSUM]);
867 (REWRITE_TAC[DOT_LMUL]);
868 (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) =
869 sum (s DELETE u0) (\x. u x * (dist (p,u0) * dist (u1,u0)))`);
870 (ASM_CASES_TAC `u0:real^3 IN s`);
871 (NEW_GOAL `s = u0 INSERT (s DELETE u0:real^3)`);
873 (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
874 (MATCH_MP_TAC FINITE_SUBSET);
875 (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
877 (REWRITE_WITH `sum s (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3))) =
878 sum (u0 INSERT (s DELETE u0)) (\x. u x * ((x - u0) dot (u1 - u0)))`);
880 (ABBREV_TAC `f = (\x:real^3. u x * ((x - u0) dot (u1 - u0:real^3)))`);
881 (REWRITE_WITH `sum (u0:real^3 INSERT (s DELETE u0)) f =
882 (if u0 IN (s DELETE u0) then sum (s DELETE u0) f
883 else f u0 + sum (s DELETE u0) f)`);
884 (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
890 (REWRITE_WITH `f (u0:real^3) = &0`);
892 (REWRITE_TAC[VECTOR_ARITH `(u0 - u0) dot (u1 - u0) = &0`]);
894 (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
895 (MATCH_MP_TAC SUM_EQ);
898 (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);
899 (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);
900 (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);
901 (FIRST_ASSUM MATCH_MP_TAC);
905 (REWRITE_WITH `s DELETE u0:real^3 = s`);
907 (MATCH_MP_TAC SUM_EQ);
910 (REWRITE_TAC[REAL_ARITH `a * x = a * y * z <=> a * (x - y * z) = &0`]);
911 (NEW_GOAL `(x' - u0) dot (u1 - u0) - dist (p,u0) * dist (u1,u0:real^3) = &0`);
912 (REWRITE_TAC[REAL_ARITH `a - b = &0 <=> a = b`]);
913 (FIRST_ASSUM MATCH_MP_TAC);
917 (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
918 (MATCH_MP_TAC FINITE_SUBSET);
919 (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
920 (ASM_SIMP_TAC[SUM_RMUL]);
922 (ASM_CASES_TAC `h <= &0`);
923 (NEW_GOAL `~(x IN rcone_gt u0 (u1:real^3) a)`);
924 (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);
926 (MATCH_MP_TAC (REAL_ARITH `&0 <= x /\ y <= &0 ==> ~(y > x)`));
928 (MATCH_MP_TAC REAL_LE_MUL);
929 (REWRITE_TAC[DIST_POS_LE]);
930 (MATCH_MP_TAC REAL_LE_MUL);
931 (REWRITE_TAC[DIST_POS_LE]);
932 (ASM_REAL_ARITH_TAC);
934 (REWRITE_TAC[REAL_ARITH `a * b * c <= &0 <=> &0 <= b * c * (--a)`]);
935 (MATCH_MP_TAC REAL_LE_MUL);
936 (REWRITE_TAC[DIST_POS_LE]);
937 (MATCH_MP_TAC REAL_LE_MUL);
938 (REWRITE_TAC[DIST_POS_LE]);
939 (ASM_REAL_ARITH_TAC);
944 (ABBREV_TAC `y = inv (h) % vsum (s DELETE u0) (\v:real^3. u v % v)`);
945 (NEW_GOAL `?t. t + h = &1 /\ x = t % u0 + h % (y:real^3)`);
946 (EXISTS_TAC `&1 - h`);
949 (ASM_CASES_TAC `u0:real^3 IN s`);
950 (REWRITE_TAC[GSYM (ASSUME `sum s (u:real^3->real) = &1`)]);
953 (REWRITE_WITH `sum s u = sum (u0 INSERT (s DELETE u0)) (u:real^3->real)`);
954 (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);
956 (NEW_GOAL `FINITE (s DELETE u0:real^3)`);
957 (MATCH_MP_TAC FINITE_SUBSET);
958 (EXISTS_TAC `s:real^3->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]);
960 (SIMP_TAC[Marchal_cells_2_new.SUM_CLAUSES_alt;
961 ASSUME `FINITE (s DELETE u0:real^3)`]);
964 (UP_ASM_TAC THEN SET_TAC[]);
966 (REWRITE_TAC[REAL_ARITH `(a + b:real) - b = a`]);
969 (REWRITE_TAC[VECTOR_MUL_ASSOC]);
970 (REWRITE_WITH `h * inv h = &1`);
971 (NEW_GOAL `~(h = &0)`);
972 (ASM_REAL_ARITH_TAC);
973 (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV]);
974 (REWRITE_TAC[VECTOR_MUL_LID]);
977 (REWRITE_WITH `vsum s (\v. u v % v) =
978 vsum (u0 INSERT (s DELETE u0)) (\v:real^3. u v % v)`);
979 (REWRITE_WITH `(u0 INSERT (s DELETE u0:real^3)) = s`);
981 (SIMP_TAC[Marchal_cells_2_new.VSUM_CLAUSES_alt;
982 ASSUME `FINITE (s DELETE u0:real^3)`]);
985 (UP_ASM_TAC THEN SET_TAC[]);
990 (EXPAND_TAC "h" THEN REWRITE_WITH `s DELETE u0:real^3 = s`);
993 (EXPAND_TAC "y" THEN REWRITE_TAC[ASSUME `h = &1`]);
994 (REWRITE_WITH `s DELETE u0:real^3 = s`);
996 (ASM_REWRITE_TAC[REAL_ARITH `inv (&1) = &1 /\ &1 - &1 = &0`]);
998 (UP_ASM_TAC THEN STRIP_TAC);
1000 (NEW_GOAL `~(y:real^3 IN S)`);
1002 (NEW_GOAL `x IN aff_ge_alt {u0:real^3} S`);
1003 (REWRITE_TAC[IN; aff_ge_alt; lin_combo]);
1005 (ABBREV_TAC `f = (\v:real^3. if v = u0 then t
1006 else if v = y then h else &0)`);
1007 (EXISTS_TAC `f:real^3->real`);
1008 (EXISTS_TAC `{y:real^3}`);
1011 (REWRITE_TAC[FINITE_SING]);
1014 (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a, b}`]);
1015 (REWRITE_WITH `vsum {u0:real^3, y} (\v. f v % v) =
1016 (\v. f v % v) u0 + (\v. f v % v) y`);
1017 (MATCH_MP_TAC Geomdetail.VSUM_DIS2);
1019 (NEW_GOAL `~(u0:real^3 IN S)`);
1021 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list;
1022 SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1024 (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1026 (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1028 (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1029 (FIRST_ASSUM MATCH_MP_TAC);
1031 (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1032 (MATCH_MP_TAC DIST_POS_LT);
1033 (ASM_REWRITE_TAC[]);
1036 (REWRITE_WITH `(f:real^3->real) u0 = t`);
1044 (REWRITE_WITH `(f:real^3->real) y = h`);
1048 (NEW_GOAL `~(u0:real^3 IN S)`);
1050 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list;
1051 SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1053 (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1055 (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1057 (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1058 (FIRST_ASSUM MATCH_MP_TAC);
1060 (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1061 (MATCH_MP_TAC DIST_POS_LT);
1062 (ASM_REWRITE_TAC[]);
1070 (ASM_REWRITE_TAC[]);
1075 (NEW_GOAL `~({y:real^3} u0)`);
1076 (REWRITE_WITH `~({y} u0) <=> ~(u0:real^3 IN {y})`);
1078 (REWRITE_TAC[IN_SING]);
1081 (NEW_GOAL `~(u0:real^3 IN S)`);
1083 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list;
1084 SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1087 (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1089 (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1091 (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1092 (FIRST_ASSUM MATCH_MP_TAC);
1094 (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1095 (MATCH_MP_TAC DIST_POS_LT);
1096 (ASM_REWRITE_TAC[]);
1102 (ASM_REAL_ARITH_TAC);
1105 (REWRITE_TAC[SET_RULE `{a} UNION {b} = {a,b}`]);
1106 (REWRITE_WITH `sum {u0:real^3, y} f = f u0 + f y`);
1107 (MATCH_MP_TAC Geomdetail.SUM_DIS2);
1109 (NEW_GOAL `~(u0:real^3 IN S)`);
1111 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list;
1112 SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1114 (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1116 (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1118 (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1119 (FIRST_ASSUM MATCH_MP_TAC);
1121 (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1122 (MATCH_MP_TAC DIST_POS_LT);
1123 (ASM_REWRITE_TAC[]);
1126 (REWRITE_WITH `(f:real^3->real) u0 = t`);
1134 (REWRITE_WITH `(f:real^3->real) y = h`);
1138 (NEW_GOAL `~(u0:real^3 IN S)`);
1140 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list;
1141 SET_RULE `v IN {a,b} <=> v = a \/ v = b`]);
1143 (NEW_GOAL `u0 IN voronoi_closed V (u1:real^3)`);
1145 (UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
1147 (NEW_GOAL `dist (u0,u1) <= dist (u0,u0:real^3)`);
1148 (FIRST_ASSUM MATCH_MP_TAC);
1150 (UP_ASM_TAC THEN REWRITE_TAC[DIST_REFL; REAL_ARITH `~(a <= b) <=> b < a`]);
1151 (MATCH_MP_TAC DIST_POS_LT);
1152 (ASM_REWRITE_TAC[]);
1161 (ASM_REWRITE_TAC[]);
1164 (NEW_GOAL `y:real^3 IN S2`);
1166 (NEW_GOAL `y:real^3 IN S1`);
1167 (NEW_GOAL `y:real^3 IN affine hull S`);
1168 (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT]);
1169 (REWRITE_TAC[IN; IN_ELIM_THM]);
1170 (EXISTS_TAC `s DELETE u0:real^3`);
1171 (EXISTS_TAC `(\v:real^3. inv h * u v)`);
1173 (ASM_REWRITE_TAC[FINITE_DELETE]);
1175 (REWRITE_TAC[SUM_LMUL]);
1176 (ASM_REWRITE_TAC[]);
1177 (ASM_SIMP_TAC[Trigonometry2.REAL_MUL_LRINV;
1178 REAL_ARITH `~(h <= &0) ==> ~(h = &0)`]);
1179 (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);
1180 (ASM_SIMP_TAC[VSUM_LMUL; FINITE_DELETE]);
1181 (NEW_GOAL `affine hull S1 = S1:real^3->bool`);
1182 (REWRITE_TAC[AFFINE_HULL_EQ]);
1183 (EXPAND_TAC "S1" THEN REWRITE_TAC[AFFINE_HYPERPLANE]);
1185 (NEW_GOAL `affine hull S SUBSET affine hull (S1:real^3->bool)`);
1186 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
1188 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET; set_of_list;
1189 SET_RULE `INTERS {f x | x IN {a, b}} = f a INTER f b`]);
1190 (DEL_TAC THEN EXPAND_TAC "S1");
1191 (MATCH_MP_TAC Pack2.INTER_VORONOI_SUBSET_BISECTOR);
1192 (ASM_REWRITE_TAC[]);
1195 (NEW_GOAL `relative_interior S SUBSET S:real^3->bool`);
1196 (REWRITE_TAC[RELATIVE_INTERIOR_SUBSET]);
1199 (NEW_GOAL `dist (z,u0) <= dist (y,u0:real^3)`);
1200 (ONCE_REWRITE_TAC[DIST_SYM]);
1202 (UNDISCH_TAC `x:real^3 IN rcone_gt u0 u1 a`);
1203 (REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM]);
1204 (ASM_REWRITE_TAC[]);
1205 (REWRITE_WITH `dist (t % u0 + h % y,u0) = h * dist (y, u0:real^3)`);
1206 (REWRITE_TAC[dist]);
1207 (REWRITE_WITH `(t % u0 + h % y:real^3) - u0 = (t % u0 + h % y) - (t + h) % u0`);
1208 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
1209 (REWRITE_TAC[VECTOR_ARITH `(t % u0 + h % y) - (t + h) % u0 = h % (y - u0)`]);
1210 (REWRITE_TAC[NORM_MUL]);
1211 (REWRITE_WITH `abs h = h`);
1212 (REWRITE_TAC[REAL_ABS_REFL]);
1213 (ASM_REAL_ARITH_TAC);
1215 (REWRITE_TAC[REAL_ARITH `~(a > b) <=> a <= b`]);
1216 (REWRITE_WITH `h * dist (p,u0:real^3) * dist (u1,u0) =
1217 (h * dist (z,u0)) * dist (u1,u0) * a`);
1219 (REWRITE_TAC[REAL_ARITH `(a * b) * c * d / b = (a * d * c) * (b / b)`]);
1220 (REWRITE_WITH `dist (z,u0) / dist (z,u0:real^3) = &1`);
1221 (MATCH_MP_TAC REAL_DIV_REFL);
1222 (REWRITE_TAC[DIST_EQ_0]);
1225 (NEW_GOAL `~(u0:real^3 IN S1)`);
1226 (EXPAND_TAC "S1" THEN REWRITE_TAC[IN; IN_ELIM_THM; NORM_POW_2]);
1227 (REWRITE_TAC[REAL_ARITH `a = b - c <=> a + c - b = &0`]);
1228 (REWRITE_TAC[VECTOR_ARITH `&2 % (u0 - u1) dot u0 + u1 dot u1 - u0 dot u0 =
1229 (u0 - u1) dot (u0 - u1)`]);
1230 (REWRITE_TAC[DOT_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
1231 (ASM_REWRITE_TAC[]);
1232 (NEW_GOAL `z:real^3 IN S1`);
1237 (REWRITE_TAC[REAL_ARITH
1238 `(a * x) * b * c <= (a * y) * b * c <=> &0 <= a * b * c *(y - x)`]);
1239 (MATCH_MP_TAC REAL_LE_MUL);
1241 (ASM_REAL_ARITH_TAC);
1242 (MATCH_MP_TAC REAL_LE_MUL);
1243 (REWRITE_TAC[DIST_POS_LE]);
1244 (MATCH_MP_TAC REAL_LE_MUL);
1246 (ASM_REAL_ARITH_TAC);
1247 (ASM_REAL_ARITH_TAC);
1249 (UP_ASM_TAC THEN STRIP_TAC);
1252 (* ========================================================================= *)
1254 (ABBREV_TAC `W = aff_ge_alt {u0:real^3} S`);
1255 (ABBREV_TAC `c = max b (hl[u0;u1:real^3] / sqrt (&2))`);
1256 (NEW_GOAL `&0 < c /\ c < &1`);
1257 (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_LT_MAX]);
1258 (ASM_REWRITE_TAC[]);
1259 (EXPAND_TAC "c" THEN REWRITE_TAC[REAL_MAX_LT]);
1261 (ASM_REWRITE_TAC[]);
1262 (REWRITE_WITH `hl [u0; u1:real^3] / sqrt (&2) < &1 <=>
1263 hl [u0; u1] < &1 * sqrt (&2)`);
1264 (MATCH_MP_TAC REAL_LT_LDIV_EQ);
1265 (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
1266 (ASM_REAL_ARITH_TAC);
1268 (NEW_GOAL `rcone_gt u0 u1 c SUBSET
1269 W INTER (rcone_gt u0 u1 (hl [u0; u1:real^3] / sqrt (&2)))`);
1270 (REWRITE_TAC[SUBSET_INTER]);
1272 (NEW_GOAL `rcone_gt (u0:real^3) u1 c SUBSET rcone_gt u0 u1 b`);
1273 (MATCH_MP_TAC RCONE_GT_SUBSET);
1274 (EXPAND_TAC "c" THEN REAL_ARITH_TAC);
1276 (MATCH_MP_TAC RCONE_GT_SUBSET);
1277 (EXPAND_TAC "c" THEN REAL_ARITH_TAC);
1279 (ABBREV_TAC `C = ball (u0:real^3,&1) INTER rcone_gt u0 u1 c`);
1282 {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1283 (REWRITE_TAC[SUBSET]);
1285 (NEW_GOAL `x IN ball (u0:real^3,&1) /\ x IN aff_ge_alt {u0} S`);
1287 (UP_ASM_TAC THEN STRIP_TAC);
1289 (NEW_GOAL `(x:real^3) IN convex hull (u0 INSERT S)`);
1290 (REWRITE_TAC[CONVEX_HULL_EXPLICIT; IN; IN_ELIM_THM]);
1292 (UP_ASM_TAC THEN REWRITE_TAC[IN; aff_ge_alt; lin_combo]);
1294 (EXISTS_TAC `{u0:real^3} UNION q`);
1295 (EXISTS_TAC `f:real^3->real`);
1297 (REWRITE_TAC[SET_RULE `{a} UNION b = a INSERT b`; FINITE_INSERT]);
1298 (ASM_REWRITE_TAC[]);
1300 (ASM_CASES_TAC `x':real^3 IN q`);
1301 (FIRST_ASSUM MATCH_MP_TAC);
1302 (UP_ASM_TAC THEN MESON_TAC[IN]);
1303 (REWRITE_WITH `x' = u0:real^3`);
1304 (NEW_GOAL `x' IN ({u0:real^3} UNION q)`);
1305 (ASM_REWRITE_TAC[IN]);
1306 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
1307 (REWRITE_TAC[REAL_ARITH `&0 <= x <=> ~(x < &0)`]);
1309 (UNDISCH_TAC `x IN ball (u0:real^3,&1)`);
1310 (ASM_REWRITE_TAC[IN_BALL; SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);
1311 (REWRITE_WITH `vsum (u0 INSERT (q DELETE u0:real^3)) (\v. f v % v) =
1312 (if u0 IN (q DELETE u0) then vsum (q DELETE u0) (\v. f v % v)
1313 else (\v. f v % v) u0 + vsum (q DELETE u0) (\v. f v % v))`);
1314 (MATCH_MP_TAC Marchal_cells_2_new.VSUM_CLAUSES_alt);
1315 (ASM_REWRITE_TAC[FINITE_DELETE]);
1318 (UP_ASM_TAC THEN SET_TAC[]);
1320 (ONCE_REWRITE_TAC[DIST_SYM]);
1321 (REWRITE_TAC[dist]);
1322 (REWRITE_WITH `!a. a - u0 = a - (sum ({u0:real^3} UNION q) f) % u0`);
1323 (ASM_REWRITE_TAC[]);
1326 (NEW_GOAL `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`);
1327 (REWRITE_TAC[SET_RULE `{u} UNION q = u INSERT (q DELETE u)`]);
1328 (REWRITE_WITH `sum (u0 INSERT (q DELETE u0:real^3)) f =
1329 (if u0 IN (q DELETE u0) then sum (q DELETE u0) f
1330 else f u0 + sum (q DELETE u0) f)`);
1331 (MATCH_MP_TAC Marchal_cells_2_new.SUM_CLAUSES_alt);
1332 (ASM_REWRITE_TAC[FINITE_DELETE]);
1335 (UP_ASM_TAC THEN SET_TAC[]);
1337 (ASM_REWRITE_TAC[]);
1338 (REWRITE_TAC[VECTOR_ADD_RDISTRIB;
1339 VECTOR_ARITH `(a + b) - (a + c:real^3) = b - c`;
1340 ASSUME `sum ({u0} UNION q) f = f u0 + sum (q DELETE u0:real^3) f`; ]);
1341 (ABBREV_TAC `h = sum (q DELETE u0:real^3) f`);
1342 (ABBREV_TAC `y = inv (h) % vsum (q DELETE u0) (\v:real^3. f v % v)`);
1343 (NEW_GOAL `h > &1`);
1344 (ASM_REAL_ARITH_TAC);
1345 (REWRITE_WITH `vsum (q DELETE u0) (\v. f v % v) = h % y:real^3`);
1347 (REWRITE_TAC[VECTOR_MUL_ASSOC]);
1348 (REWRITE_WITH `h * inv h = &1`);
1349 (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);
1351 (REWRITE_TAC[VECTOR_ARITH `h % a - h % b = h % (a - b)`; NORM_MUL]);
1352 (REWRITE_TAC[REAL_ARITH `~(a < b) <=> b <= a`]);
1354 (NEW_GOAL `norm (p - u0) <= norm (y - u0:real^3)`);
1355 (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
1356 (REWRITE_TAC[NORM_POS_LE]);
1358 `norm (y - u0) pow 2 = norm (p - u0) pow 2 + norm (y - p:real^3) pow 2`);
1359 (MATCH_MP_TAC PYTHAGORAS);
1360 (REWRITE_TAC[orthogonal]);
1361 (REWRITE_WITH `p = circumcenter (set_of_list [u0;u1:real^3])`);
1362 (ASM_REWRITE_TAC[set_of_list]);
1363 (ONCE_REWRITE_TAC[DOT_SYM]);
1364 (MATCH_MP_TAC Rogers.MHFTTZN4);
1365 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `1`);
1367 (ASM_REWRITE_TAC[]);
1368 (ASM_REWRITE_TAC[]);
1370 (REWRITE_TAC[ASSUME `voronoi_list V [u0; u1] = S`]);
1371 (REWRITE_TAC[AFFINE_HULL_EXPLICIT_ALT; IN; IN_ELIM_THM]);
1372 (EXISTS_TAC `q DELETE u0:real^3`);
1373 (EXISTS_TAC `(\v:real^3. inv h * f v)`);
1375 (ASM_REWRITE_TAC[FINITE_DELETE]);
1377 (ASM_REWRITE_TAC[SUM_LMUL]);
1378 (ASM_SIMP_TAC [Trigonometry2.REAL_MUL_LRINV; REAL_ARITH `h > &1 ==> ~(h = &0)`]);
1379 (REWRITE_TAC[GSYM VECTOR_MUL_ASSOC]);
1380 (ASM_REWRITE_TAC[VSUM_LMUL]);
1382 (REWRITE_TAC[set_of_list]);
1383 (NEW_GOAL `{u0, u1:real^3} SUBSET affine hull {u0, u1}`);
1384 (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
1386 (REWRITE_TAC[REAL_ARITH `a <= a + b <=> &0 <= b`; NORM_POW_2; DOT_POS_LE]);
1388 (NEW_GOAL `&1 <= norm (p - u0:real^3)`);
1390 (REWRITE_TAC[CIRCUMCENTER_2; midpoint;
1391 VECTOR_ARITH `inv (&2) % (u0 + u1) - u0 = inv (&2) % (u1 - u0)`;
1392 NORM_MUL; REAL_ARITH `abs (inv(&2)) = inv (&2)`]);
1393 (REWRITE_TAC[GSYM dist]);
1394 (REWRITE_WITH `&1 = inv (&2) * &2`);
1396 (REWRITE_TAC[REAL_ARITH `inv (&2) * &2 <= inv (&2) * a <=> &2 <= a`]);
1397 (MP_TAC (ASSUME `packing (V:real^3->bool)`));
1398 (REWRITE_TAC[packing] THEN STRIP_TAC);
1399 (FIRST_ASSUM MATCH_MP_TAC);
1400 (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1401 (REWRITE_WITH `abs h = h`);
1402 (ASM_REAL_ARITH_TAC);
1404 (NEW_GOAL `h <= h * norm (y - u0:real^3)`);
1405 (REWRITE_TAC[REAL_ARITH `h <= h * a <=> &0 <= h * (a - &1)`]);
1406 (MATCH_MP_TAC REAL_LE_MUL);
1407 (ASM_REAL_ARITH_TAC);
1408 (ASM_REAL_ARITH_TAC);
1410 (ASM_REWRITE_TAC[]);
1411 (ASM_REWRITE_TAC[]);
1413 (NEW_GOAL `~(S:real^3->bool = {})`);
1415 (NEW_GOAL `~(aff_dim (u0:real^3 INSERT S) = &3)`);
1416 (REWRITE_TAC[ASSUME `S:real^3->bool = {}`; AFF_DIM_SING]);
1420 (UP_ASM_TAC THEN SIMP_TAC[CONVEX_HULL_INSERT;
1421 ASSUME `~(S:real^3->bool = {})`]);
1422 (REWRITE_WITH `convex hull S = S:real^3->bool`);
1423 (REWRITE_TAC[CONVEX_HULL_EQ]);
1424 (EXPAND_TAC "S" THEN REWRITE_TAC[Packing3.CONVEX_VORONOI_LIST]);
1425 (ASM_REWRITE_TAC[]);
1426 (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);
1429 (EXISTS_TAC `rogers V vl`);
1431 (EXISTS_TAC `vl:(real^3)list`);
1432 (ASM_REWRITE_TAC[]);
1434 (ASM_SIMP_TAC[Marchal_cells_2_new.ROGERS_EXPLICIT]);
1435 (REWRITE_TAC[CONVEX_HULL_4; IN_ELIM_THM]);
1437 (UNDISCH_TAC `(t:real^3->bool) b'`);
1438 (ASM_REWRITE_TAC[CONVEX_HULL_3; IN_ELIM_THM]);
1441 (EXISTS_TAC `u:real`);
1442 (EXISTS_TAC `v * u'`);
1443 (EXISTS_TAC `v * v'`);
1444 (EXISTS_TAC `v * w`);
1445 (ASM_SIMP_TAC[REAL_LE_MUL]);
1448 (REWRITE_TAC[REAL_ARITH `u + v * u' + v * v' + v * w = u + v * (u' + v' +w)`]);
1449 (ASM_REWRITE_TAC[]);
1450 (ASM_REAL_ARITH_TAC);
1452 (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
1453 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1454 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1455 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1456 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1457 (EXISTS_TAC `V:real^3->bool`);
1458 (ASM_REWRITE_TAC[]);
1461 (ASM_REWRITE_TAC[HD]);
1464 (* ========================================================================== *)
1467 `!X. mcell_set V X /\ ~NULLSET (X INTER C)
1472 truncate_simplex 1 vl = [u0; u1])`);
1474 (REWRITE_TAC[mcell_set_2; IN_ELIM_THM]);
1477 (NEW_GOAL `~NULLSET (X INTER UNIONS
1478 {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]})`);
1480 (UNDISCH_TAC `~NULLSET (X INTER C)`);
1482 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1483 (EXISTS_TAC `X INTER
1485 {rogers V vl | vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1487 (ASM_REWRITE_TAC[]);
1489 (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1493 `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);
1494 (MESON_TAC[NEGLIGIBLE_UNIONS]);
1495 (ABBREV_TAC `St = {X INTER x | x IN
1496 {rogers V vl | vl | barV V 3 vl /\
1497 truncate_simplex 1 vl = [u0; u1]}}`);
1498 (NEW_GOAL `?t. t IN St /\ ~NULLSET t`);
1499 (FIRST_ASSUM MATCH_MP_TAC);
1500 (ASM_REWRITE_TAC[]);
1502 (ABBREV_TAC `Sr = {rogers V vl | vl | barV V 3 vl /\
1503 truncate_simplex 1 vl = [u0; u1]}`);
1504 (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);
1505 (MATCH_MP_TAC FINITE_SUBSET);
1506 (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sr /\ y = f x }`);
1509 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1510 (ABBREV_TAC `Ss = {vl | barV V 3 vl /\ truncate_simplex 1 vl = [u0; u1]}`);
1511 (MATCH_MP_TAC FINITE_SUBSET);
1512 (EXISTS_TAC `{y | ?vl. vl IN Ss /\ y = rogers V vl}`);
1514 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1515 (ABBREV_TAC `Sx = V INTER ball (u0:real^3, &4)`);
1516 (MATCH_MP_TAC FINITE_SUBSET);
1517 (EXISTS_TAC `{y | ?u0 u1 u2 u3:real^3.
1522 y = [u0; u1; u2; u3]}`);
1524 (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA);
1526 (MATCH_MP_TAC Pack2.KIUMVTC);
1527 (ASM_REWRITE_TAC[]);
1529 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
1532 (NEW_GOAL `?v0 v1 v2 v3. x = [v0;v1;v2;v3:real^3]`);
1533 (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1534 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1535 (UP_ASM_TAC THEN STRIP_TAC);
1536 (EXISTS_TAC `v0:real^3`);
1537 (EXISTS_TAC `v1:real^3`);
1538 (EXISTS_TAC `v2:real^3`);
1539 (EXISTS_TAC `v3:real^3`);
1540 (ASM_REWRITE_TAC[]);
1542 (NEW_GOAL `{v0, v1, v2, v3:real^3} SUBSET Sx`);
1544 (REWRITE_TAC[SUBSET_INTER]);
1545 (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list x`);
1546 (ASM_REWRITE_TAC[set_of_list]);
1548 (MATCH_MP_TAC Packing3.BARV_SUBSET);
1549 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1550 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1551 (EXISTS_TAC `V:real^3->bool`);
1552 (ASM_REWRITE_TAC[]);
1553 (NEW_GOAL `HD (truncate_simplex 1 x) = u0:real^3`);
1554 (ASM_REWRITE_TAC[HD]);
1555 (NEW_GOAL `HD (truncate_simplex 1 x) = v0:real^3`);
1556 (REWRITE_TAC[ASSUME `x = [v0; v1; v2; v3:real^3]`;
1557 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1559 (REWRITE_WITH `u0 = v0:real^3`);
1561 (REWRITE_TAC[set_of_list] THEN SET_TAC[]);
1562 (UP_ASM_TAC THEN SET_TAC[]);
1564 (EXPAND_TAC "Sr" THEN EXPAND_TAC "Ss");
1566 (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sr} = {f x | x IN Sr}`);
1570 (UP_ASM_TAC THEN EXPAND_TAC "St" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1573 (NEW_GOAL `x SUBSET UNIONS {mcell i V vl | i <= 4}`);
1574 (ASM_REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM]);
1576 (NEW_GOAL `?i. i <= 4 /\ x' IN mcell i V vl`);
1577 (MATCH_MP_TAC Sltstlo.SLTSTLO1);
1578 (ASM_REWRITE_TAC[IN]);
1579 (UP_ASM_TAC THEN STRIP_TAC);
1580 (EXISTS_TAC `mcell i' V vl`);
1582 (EXISTS_TAC `i':num` THEN ASM_REWRITE_TAC[]);
1583 (UP_ASM_TAC THEN REWRITE_TAC[IN]);
1585 (NEW_GOAL `~NULLSET (X INTER UNIONS {mcell i V vl | i <= 4})`);
1587 (UNDISCH_TAC `~NULLSET (t)`);
1588 (REWRITE_TAC[ASSUME `t:real^3->bool = X INTER x`]);
1589 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1590 (EXISTS_TAC `X INTER UNIONS {mcell i V vl | i <= 4}`);
1592 (ASM_REWRITE_TAC[]);
1594 (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1598 `!s. ~NULLSET (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~NULLSET t)`);
1599 (MESON_TAC[NEGLIGIBLE_UNIONS]);
1600 (ABBREV_TAC `Sx = {X INTER x | x IN {mcell i V vl | i <= 4}}`);
1601 (NEW_GOAL `?t. t IN Sx /\ ~NULLSET t`);
1602 (FIRST_ASSUM MATCH_MP_TAC);
1603 (ASM_REWRITE_TAC[]);
1605 (ABBREV_TAC `Sy = {mcell i V vl | i <= 4}`);
1606 (ABBREV_TAC `f = (\x:real^3->bool. X INTER x)`);
1607 (MATCH_MP_TAC FINITE_SUBSET);
1608 (EXISTS_TAC `{y:real^3->bool | ?x:real^3->bool. x IN Sy /\ y = f x }`);
1610 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1612 (REWRITE_TAC[GSYM IN_NUMSEG_0]);
1613 (ABBREV_TAC `g = (\i:num. mcell i V vl)`);
1614 (REWRITE_WITH `{mcell i V vl | i IN 0..4} = {g i | i IN 0..4}`);
1615 (EXPAND_TAC "g" THEN REWRITE_TAC[]);
1616 (MATCH_MP_TAC FINITE_SUBSET);
1617 (EXISTS_TAC `{y:real^3->bool | ?i. i IN 0..4 /\ y = g i}`);
1619 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1620 (REWRITE_TAC[FINITE_NUMSEG]);
1622 (REWRITE_WITH `{X INTER x:real^3->bool | x IN Sy} = {f x | x IN Sy}`);
1623 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
1625 (UP_ASM_TAC THEN EXPAND_TAC "Sx" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1628 (* ========================================================================= *)
1630 (NEW_GOAL `i = i' /\ mcell i V ul = mcell i' V vl`);
1631 (MATCH_MP_TAC Ajripqn.AJRIPQN);
1632 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
1634 (UNDISCH_TAC `ul IN barV V 3` THEN REWRITE_TAC[IN]);
1635 (UNDISCH_TAC `~NULLSET t'`);
1636 (ASM_REWRITE_TAC[]);
1637 (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
1638 (ASM_REWRITE_TAC[]);
1640 (* ========================================================================= *)
1642 (ASM_CASES_TAC `i' = 0`);
1644 (UNDISCH_TAC `~NULLSET (X INTER C)`);
1646 (REWRITE_WITH `X INTER C = {}:real^3->bool`);
1647 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
1648 (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
1649 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1650 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1651 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1652 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1653 (EXISTS_TAC `V:real^3->bool`);
1654 (ASM_REWRITE_TAC[]);
1656 (ASM_REWRITE_TAC[HD]);
1657 (NEW_GOAL `C SUBSET ball (u0:real^3, sqrt (&2))`);
1658 (NEW_GOAL `ball (u0:real^3, &1) SUBSET ball (u0, sqrt (&2))`);
1659 (MATCH_MP_TAC SUBSET_BALL);
1660 (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));
1661 (REWRITE_TAC[Marchal_cells_2_new.ZERO_LT_SQRT_2]);
1663 (UP_ASM_TAC THEN SET_TAC[]);
1664 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1667 (ASM_CASES_TAC `i' = 1`);
1669 (UNDISCH_TAC `~NULLSET (X INTER C)`);
1671 (REWRITE_WITH `X INTER C = {}:real^3->bool`);
1672 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell1]);
1674 (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
1675 (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1676 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1677 (UP_ASM_TAC THEN STRIP_TAC);
1678 (ASM_REWRITE_TAC[HD; TL]);
1680 (REWRITE_WITH `v0 = u0:real^3`);
1681 (NEW_GOAL `HD (truncate_simplex 1 vl) = u0:real^3`);
1682 (ASM_REWRITE_TAC[HD]);
1683 (NEW_GOAL `HD (truncate_simplex 1 vl) = v0:real^3`);
1684 (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;
1685 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1688 (REWRITE_WITH `v1 = u1:real^3`);
1689 (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
1690 (ASM_REWRITE_TAC[HD; TL]);
1691 (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
1692 (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;
1693 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1696 (NEW_GOAL `C SUBSET (rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2)))`);
1698 (SET_TAC[ASSUME `rcone_gt u0 u1 c SUBSET
1699 W INTER rcone_gt u0 u1 (hl [u0:real^3; u1] / sqrt (&2))`]);
1700 (UP_ASM_TAC THEN SET_TAC[]);
1702 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1703 (UP_ASM_TAC THEN MESON_TAC[]);
1706 (* ========================================================================= *)
1709 (\ul. dist (u0:real^3,
1710 closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0))`);
1712 (ABBREV_TAC `P1 = { (f1:(real^3)list->real) ul |ul | barV V 3 ul /\
1713 ~NULLSET (mcell 3 V ul INTER C) /\
1714 truncate_simplex 1 ul = [u0; u1]}`);
1716 (NEW_GOAL `~(P1 = {}) ==> (?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
1718 (MATCH_MP_TAC INF_FINITE_LEMMA);
1719 (ASM_REWRITE_TAC[]);
1721 (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1722 (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1723 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1724 (MATCH_MP_TAC FINITE_SUBSET);
1725 (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1726 v0 IN (V INTER ball (u0:real^3, &4)) /\
1727 v1 IN (V INTER ball (u0, &4)) /\
1728 u2 IN (V INTER ball (u0, &4)) /\
1729 u3 IN (V INTER ball (u0, &4)) /\
1730 y = [v0; v1; u2; u3]}`);
1732 (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1733 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1734 (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1736 (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1737 (MATCH_MP_TAC BARV_3_EXPLICIT);
1738 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1739 (UP_ASM_TAC THEN STRIP_TAC);
1740 (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN
1741 EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1742 (ASM_REWRITE_TAC[]);
1743 (NEW_GOAL `v0 = u0:real^3`);
1744 (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1745 (ASM_REWRITE_TAC[HD]);
1746 (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1747 (ASM_REWRITE_TAC[HD]);
1748 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1749 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1750 (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1751 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1752 (EXISTS_TAC `V:real^3->bool`);
1753 (ASM_REWRITE_TAC[set_of_list]);
1755 (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1756 (MATCH_MP_TAC Packing3.BARV_SUBSET);
1757 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1758 (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1761 (ABBREV_TAC `r1 = (if (P1 = {}:real->bool) then &1
1762 else (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x)))`);
1763 (NEW_GOAL `&0 < r1`);
1767 (NEW_GOAL `?b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x)`);
1769 (UP_ASM_TAC THEN STRIP_TAC);
1770 (ABBREV_TAC `P = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
1771 (ABBREV_TAC `zz = (@) (P:real->bool)`);
1772 (NEW_GOAL `(P:real->bool) zz`);
1774 (MATCH_MP_TAC SELECT_AX);
1775 (EXISTS_TAC `b':real`);
1776 (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1777 (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1778 (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1780 (ASM_REWRITE_TAC[]);
1782 (MATCH_MP_TAC DIST_POS_LT);
1783 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1784 (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, mxi V ul}) u0 = u0
1785 <=> u0 IN (affine hull {u1:real^3, EL 2 ul, mxi V ul})`);
1786 (MATCH_MP_TAC CLOSEST_POINT_REFL);
1787 (REWRITE_TAC[CLOSED_AFFINE_HULL]);
1788 (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
1790 (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
1791 (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1792 (EXISTS_TAC `mcell 3 V ul`);
1793 (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1794 (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
1797 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1798 (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1799 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1800 (UP_ASM_TAC THEN STRIP_TAC);
1801 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
1803 (REWRITE_WITH `v0 = u0:real^3`);
1804 (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1805 (ASM_REWRITE_TAC[HD]);
1806 (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1807 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
1808 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1811 (REWRITE_WITH `v1 = u1:real^3`);
1812 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1813 (ASM_REWRITE_TAC[HD; TL]);
1814 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1815 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
1816 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1817 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1818 (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
1820 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1821 (EXISTS_TAC `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]}`);
1822 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1823 (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} =
1824 affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
1825 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
1826 (REWRITE_WITH `affine hull {u1, v2, mxi V [u0; u1; v2; v3]} =
1827 affine hull {u1, EL 2 ul, mxi V ul}`);
1828 (ASM_REWRITE_TAC[EL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
1830 (REWRITE_WITH `v0 = u0:real^3`);
1831 (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1832 (ASM_REWRITE_TAC[HD]);
1833 (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1834 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
1835 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1838 (REWRITE_WITH `v1 = u1:real^3`);
1839 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1840 (ASM_REWRITE_TAC[HD; TL]);
1841 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1842 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
1843 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1844 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1845 (ASM_REWRITE_TAC[]);
1846 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1847 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1849 (* ========================================================================= *)
1852 (\ul. dist (u0:real^3,
1853 closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0))`);
1855 (ABBREV_TAC `P2 = { (f2:(real^3)list->real) ul |ul | barV V 3 ul /\
1856 ~NULLSET (mcell 4 V ul INTER C) /\
1857 truncate_simplex 1 ul = [u0; u1]}`);
1859 (NEW_GOAL `~(P2 = {}) ==> (?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
1861 (MATCH_MP_TAC INF_FINITE_LEMMA);
1862 (ASM_REWRITE_TAC[]);
1864 (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
1865 (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
1866 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1867 (MATCH_MP_TAC FINITE_SUBSET);
1868 (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
1869 v0 IN (V INTER ball (u0:real^3, &4)) /\
1870 v1 IN (V INTER ball (u0, &4)) /\
1871 u2 IN (V INTER ball (u0, &4)) /\
1872 u3 IN (V INTER ball (u0, &4)) /\
1873 y = [v0; v1; u2; u3]}`);
1875 (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
1876 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
1877 (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
1879 (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
1880 (MATCH_MP_TAC BARV_3_EXPLICIT);
1881 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1882 (UP_ASM_TAC THEN STRIP_TAC);
1883 (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN
1884 EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
1885 (ASM_REWRITE_TAC[]);
1886 (NEW_GOAL `v0 = u0:real^3`);
1887 (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
1888 (ASM_REWRITE_TAC[HD]);
1889 (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
1890 (ASM_REWRITE_TAC[HD]);
1891 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1892 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
1893 (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
1894 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
1895 (EXISTS_TAC `V:real^3->bool`);
1896 (ASM_REWRITE_TAC[set_of_list]);
1898 (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
1899 (MATCH_MP_TAC Packing3.BARV_SUBSET);
1900 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
1901 (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
1904 (ABBREV_TAC `r2 = (if (P2 = {}:real->bool) then &1
1905 else (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x)))`);
1907 (NEW_GOAL `&0 < r2`);
1911 (NEW_GOAL `?b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x)`);
1913 (UP_ASM_TAC THEN STRIP_TAC);
1914 (ABBREV_TAC `P = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
1915 (ABBREV_TAC `zz = (@) (P:real->bool)`);
1916 (NEW_GOAL `(P:real->bool) zz`);
1918 (MATCH_MP_TAC SELECT_AX);
1919 (EXISTS_TAC `b':real`);
1920 (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
1921 (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
1922 (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
1924 (ASM_REWRITE_TAC[]);
1926 (MATCH_MP_TAC DIST_POS_LT);
1927 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1928 (REWRITE_WITH `closest_point (affine hull {u1, EL 2 ul, EL 3 ul}) u0 = u0
1929 <=> u0 IN (affine hull {u1:real^3, EL 2 ul, EL 3 ul})`);
1930 (MATCH_MP_TAC CLOSEST_POINT_REFL);
1931 (REWRITE_TAC[CLOSED_AFFINE_HULL]);
1932 (REWRITE_TAC[AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
1934 (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
1935 (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1936 (EXISTS_TAC `mcell 4 V ul`);
1937 (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
1938 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4]);
1941 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
1942 (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
1943 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1944 (UP_ASM_TAC THEN STRIP_TAC);
1945 (ASM_REWRITE_TAC[set_of_list]);
1947 (REWRITE_WITH `v0 = u0:real^3`);
1948 (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
1949 (ASM_REWRITE_TAC[HD]);
1950 (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
1951 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
1952 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
1953 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1955 (REWRITE_WITH `v1 = u1:real^3`);
1956 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
1957 (ASM_REWRITE_TAC[HD; TL]);
1958 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
1959 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
1960 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
1961 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
1963 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1964 (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
1965 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1966 (REWRITE_WITH `affine hull {u0, u1, v2, v3:real^3} =
1967 affine hull {u1, v2, v3}`);
1968 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
1969 (REWRITE_WITH `affine hull {u1, v2, v3:real^3} =
1970 affine hull {u1, EL 2 ul, EL 3 ul}`);
1971 (ASM_REWRITE_TAC[EL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
1972 (ASM_REWRITE_TAC[]);
1974 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
1975 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1977 (* ========================================================================= *)
1979 (ABBREV_TAC `r = min (&1) (min r1 r2)`);
1980 (NEW_GOAL `&0 < r`);
1982 (UNDISCH_TAC `&0 < r1` THEN UNDISCH_TAC `&0 < r2` THEN REAL_ARITH_TAC);
1984 (* ========================================================================= *)
1987 (\ul. (((smallest_angle_line (EL 2 ul) (mxi V ul) u0 u1) - u0)
1989 (norm ((smallest_angle_line (EL 2 ul) (mxi V ul) u0 u1) - u0)
1990 * norm (u1 - u0)))`);
1992 (ABBREV_TAC `P3 = {(f3:(real^3)list->real) ul |ul | barV V 3 ul /\
1993 ~NULLSET (mcell 3 V ul INTER C) /\
1994 truncate_simplex 1 ul = [u0; u1]}`);
1996 (NEW_GOAL `~(P3 = {}) ==> (?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
1998 (MATCH_MP_TAC SUP_FINITE_LEMMA);
1999 (ASM_REWRITE_TAC[]);
2001 (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
2002 (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
2003 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
2004 (MATCH_MP_TAC FINITE_SUBSET);
2005 (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
2006 v0 IN (V INTER ball (u0:real^3, &4)) /\
2007 v1 IN (V INTER ball (u0, &4)) /\
2008 u2 IN (V INTER ball (u0, &4)) /\
2009 u3 IN (V INTER ball (u0, &4)) /\
2010 y = [v0; v1; u2; u3]}`);
2012 (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
2013 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
2014 (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
2016 (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
2017 (MATCH_MP_TAC BARV_3_EXPLICIT);
2018 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2019 (UP_ASM_TAC THEN STRIP_TAC);
2020 (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN
2021 EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
2022 (ASM_REWRITE_TAC[]);
2023 (NEW_GOAL `v0 = u0:real^3`);
2024 (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
2025 (ASM_REWRITE_TAC[HD]);
2026 (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
2027 (ASM_REWRITE_TAC[HD]);
2028 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2029 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2030 (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
2031 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2032 (EXISTS_TAC `V:real^3->bool`);
2033 (ASM_REWRITE_TAC[set_of_list]);
2035 (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
2036 (MATCH_MP_TAC Packing3.BARV_SUBSET);
2037 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2038 (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
2041 (ABBREV_TAC `d1 = (if (P3 = {}:real->bool) then c
2042 else (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b)))`);
2044 (NEW_GOAL `d1 < &1`);
2047 (ASM_REWRITE_TAC[]);
2048 (NEW_GOAL `?b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b)`);
2050 (UP_ASM_TAC THEN STRIP_TAC);
2051 (ABBREV_TAC `P = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
2052 (ABBREV_TAC `zz = (@) (P:real->bool)`);
2053 (NEW_GOAL `(P:real->bool) zz`);
2055 (MATCH_MP_TAC SELECT_AX);
2056 (EXISTS_TAC `b':real`);
2057 (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
2058 (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
2059 (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
2061 (ASM_REWRITE_TAC[]);
2064 (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (mxi V ul) u0 u1`);
2065 (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
2067 (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
2069 (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
2070 (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2071 (ASM_REWRITE_TAC[]);
2073 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
2074 REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2076 (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, mxi V ul} /\
2077 (!y. y IN convex hull {EL 2 ul, mxi V ul}
2078 ==> ((y - u0) dot (u1 - u0)) /
2079 (norm (y - u0) * norm (u1 - u0)) <=
2080 ((x - u0) dot (u1 - u0)) /
2081 (norm (x - u0) * norm (u1 - u0))))`);
2082 (NEW_GOAL `(Q:real^3->bool) u0`);
2083 (REWRITE_TAC[ASSUME `u0 = (@) (Q:real^3->bool)`]);
2084 (MATCH_MP_TAC SELECT_AX);
2086 (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
2088 (ASM_REWRITE_TAC[]);
2090 (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2091 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2092 (MATCH_MP_TAC BARV_3_EXPLICIT);
2093 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2094 (UP_ASM_TAC THEN STRIP_TAC);
2095 (EXISTS_TAC `v1:real^3` THEN
2096 EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2097 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2099 (NEW_GOAL `v0 = u0:real^3`);
2100 (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2101 (ASM_REWRITE_TAC[HD]);
2102 (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2103 (ASM_REWRITE_TAC[HD]);
2104 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2105 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2106 (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2107 (UP_ASM_TAC THEN STRIP_TAC);
2108 (REWRITE_WITH `EL 2 ul = v2:real^3`);
2109 (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
2112 (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
2114 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2115 (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);
2116 (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
2117 TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
2118 SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);
2120 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2121 (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);
2123 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2124 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2125 (REWRITE_TAC[coplanar]);
2126 (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);
2127 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2128 (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN
2129 EXISTS_TAC `mxi V ul`);
2130 (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2131 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2132 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2133 (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2135 (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2136 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2137 (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2138 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2141 (UP_ASM_TAC THEN EXPAND_TAC "Q");
2143 (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);
2144 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2145 (EXISTS_TAC `mcell 3 V ul`);
2146 (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2147 (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
2149 (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2150 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2151 (MATCH_MP_TAC BARV_3_EXPLICIT);
2152 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2153 (UP_ASM_TAC THEN STRIP_TAC);
2154 (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2155 (REWRITE_TAC[ASSUME `ul = [v0;v1;v2;v3:real^3]`]);
2157 (REWRITE_WITH `v0 = u0:real^3`);
2158 (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2159 (ASM_REWRITE_TAC[HD]);
2160 (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2161 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
2162 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2163 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2165 (REWRITE_WITH `v1 = u1:real^3`);
2166 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2167 (ASM_REWRITE_TAC[HD; TL]);
2168 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2169 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
2170 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2171 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2172 (UP_ASM_TAC THEN STRIP_TAC);
2173 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
2174 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
2175 (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);
2177 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2178 (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);
2179 (REWRITE_TAC[ASSUME `ul = [u0; u1; v2; v3:real^3]`;
2180 CONVEX_HULL_SUBSET_AFFINE_HULL]);
2181 (REWRITE_WITH `affine hull {u0, u1, v2, mxi V [u0; u1; v2; v3]} =
2182 affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
2183 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2185 (NEW_GOAL `convex hull {EL 2 ul, mxi V ul} SUBSET
2186 affine hull {EL 2 ul, mxi V ul}`);
2187 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2188 (NEW_GOAL `affine hull {EL 2 ul, mxi V ul} SUBSET
2189 affine hull {u1, v2, mxi V [u0; u1; v2; v3]}`);
2190 (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
2191 (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
2193 (UP_ASM_TAC THEN UP_ASM_TAC THEN
2194 UNDISCH_TAC `u0 IN convex hull {EL 2 ul, mxi V ul}` THEN SET_TAC[]);
2195 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2196 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2198 (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));
2199 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);
2200 (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(mxi V ul)}`);
2201 (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2202 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2203 (ASM_REWRITE_TAC[]);
2205 (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2206 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2207 (MATCH_MP_TAC BARV_3_EXPLICIT);
2208 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2209 (UP_ASM_TAC THEN STRIP_TAC);
2210 (EXISTS_TAC `v1:real^3` THEN
2211 EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2212 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2214 (NEW_GOAL `v0 = u0:real^3`);
2215 (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2216 (ASM_REWRITE_TAC[HD]);
2217 (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2218 (ASM_REWRITE_TAC[HD]);
2219 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2220 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2221 (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2222 (UP_ASM_TAC THEN STRIP_TAC);
2223 (REWRITE_WITH `EL 2 ul = v2:real^3`);
2224 (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
2227 (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)`);
2229 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2230 (EXISTS_TAC `mcell 3 V ul` THEN STRIP_TAC);
2231 (REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
2232 TRUNCATE_SIMPLEX_EXPLICIT_2; ASSUME `ul = [u0; v1; v2; v3:real^3]`;
2233 SET_RULE `{a,b,c} UNION {d} = {a,b, c,d}`]);
2235 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2236 (EXISTS_TAC `affine hull {u0, v1, v2, mxi V ul}`);
2238 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2239 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2240 (REWRITE_TAC[coplanar]);
2241 (UNDISCH_TAC `u0 IN convex hull {v2, mxi V ul}`);
2242 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2243 (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN
2244 EXISTS_TAC `mxi V ul`);
2245 (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2246 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2247 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2248 (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2250 (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2251 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2252 (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2253 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2258 (UNDISCH_TAC `~NULLSET (mcell 3 V ul INTER C)` THEN REWRITE_TAC[]);
2259 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2260 (EXISTS_TAC `mcell 3 V ul`);
2261 (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2262 (REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
2264 (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2265 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2266 (MATCH_MP_TAC BARV_3_EXPLICIT);
2267 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2268 (UP_ASM_TAC THEN STRIP_TAC);
2269 (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2270 (ASM_REWRITE_TAC[]);
2272 (REWRITE_WITH `v0 = u0:real^3`);
2273 (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2274 (ASM_REWRITE_TAC[HD]);
2275 (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2276 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
2277 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2278 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2280 (REWRITE_WITH `v1 = u1:real^3`);
2281 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2282 (ASM_REWRITE_TAC[HD; TL]);
2283 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2284 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
2285 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2286 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2287 (UP_ASM_TAC THEN STRIP_TAC);
2288 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
2289 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
2291 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2292 (EXISTS_TAC `affine hull {u0, u1, v2, mxi V ul}`);
2293 (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2294 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2295 (ABBREV_TAC `m = mxi V ul`);
2296 (NEW_GOAL `mxi V [u0; u1;v2;v3] = m`);
2297 (EXPAND_TAC "m" THEN AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
2298 (ASM_REWRITE_TAC[]);
2299 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2300 (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);
2301 (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);
2302 (UNDISCH_TAC `xx IN convex hull {EL 2 ul, m:real^3}`);
2303 (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `2 = SUC 1/\ 1 = SUC 0`;
2304 CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2305 (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);
2306 (ASM_REWRITE_TAC[]);
2310 (REWRITE_TAC[coplanar]);
2311 (NEW_GOAL `~(k2 = &0)`);
2313 (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2314 (ASM_REWRITE_TAC[]);
2317 (ASM_CASES_TAC `~(v = &0)`);
2318 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN
2319 EXISTS_TAC `v2:real^3`);
2321 (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));
2323 (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2324 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2325 (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);
2326 (EXISTS_TAC `k1 / (k2 * v)`);
2327 (EXISTS_TAC `(--k2 * u) / (k2 * v)`);
2329 (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2330 (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);
2331 (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2332 (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);
2333 (MATCH_MP_TAC REAL_DIV_REFL);
2334 (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2336 (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 =
2337 (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2338 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2340 `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = m:real^3 <=>
2341 ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % m`);
2342 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2343 (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2344 (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2345 (ASM_REWRITE_TAC[VECTOR_ARITH
2346 `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % m <=>
2347 k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2349 (NEW_GOAL `~(u = &0)`);
2350 (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN
2351 REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
2354 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN
2355 EXISTS_TAC `m:real^3`);
2356 (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));
2358 (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2359 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2361 (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);
2362 (EXISTS_TAC `k1 / (k2 * u)`);
2363 (EXISTS_TAC `(--k2 * v) / (k2 * u)`);
2365 (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2366 (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);
2367 (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2368 (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);
2369 (MATCH_MP_TAC REAL_DIV_REFL);
2370 (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2372 (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 =
2373 (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2374 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2376 `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = v2:real^3 <=>
2377 ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m) = (k2 * u) % v2`);
2378 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2379 (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2380 (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2381 (ASM_REWRITE_TAC[VECTOR_ARITH
2382 `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=>
2383 k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2385 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2387 (* ========================================================================== *)
2390 (\ul. (((smallest_angle_line (EL 2 ul) (EL 3 ul) u0 u1) - u0)
2392 (norm ((smallest_angle_line (EL 2 ul) (EL 3 ul) u0 u1) - u0)
2393 * norm (u1 - u0)))`);
2395 (ABBREV_TAC `P4 = {(f4:(real^3)list->real) ul |ul | barV V 3 ul /\
2396 ~NULLSET (mcell 4 V ul INTER C) /\
2397 truncate_simplex 1 ul = [u0; u1]}`);
2399 (NEW_GOAL `~(P4 = {}) ==> (?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
2401 (MATCH_MP_TAC SUP_FINITE_LEMMA);
2402 (ASM_REWRITE_TAC[]);
2404 (ONCE_REWRITE_TAC [SET_RULE `{f x| x | P x} = {f x | x IN {y | P y}}`]);
2405 (ONCE_REWRITE_TAC [SET_RULE `{f x| x IN s} = {y | ?x. x IN s /\ y = f x}`]);
2406 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
2407 (MATCH_MP_TAC FINITE_SUBSET);
2408 (EXISTS_TAC `{y | ?v0:real^3 v1 u2 u3.
2409 v0 IN (V INTER ball (u0:real^3, &4)) /\
2410 v1 IN (V INTER ball (u0, &4)) /\
2411 u2 IN (V INTER ball (u0, &4)) /\
2412 u3 IN (V INTER ball (u0, &4)) /\
2413 y = [v0; v1; u2; u3]}`);
2415 (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
2416 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
2417 (REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
2419 (NEW_GOAL `?v0 v1 u2 u3. x = [v0; v1; u2; u3:real^3]`);
2420 (MATCH_MP_TAC BARV_3_EXPLICIT);
2421 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2422 (UP_ASM_TAC THEN STRIP_TAC);
2423 (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN
2424 EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
2425 (ASM_REWRITE_TAC[]);
2426 (NEW_GOAL `v0 = u0:real^3`);
2427 (REWRITE_WITH `v0 = HD (x:(real^3)list)`);
2428 (ASM_REWRITE_TAC[HD]);
2429 (REWRITE_WITH `u0 = HD (truncate_simplex 1 (x:(real^3)list))`);
2430 (ASM_REWRITE_TAC[HD]);
2431 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2432 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2433 (NEW_GOAL `set_of_list x SUBSET ball (u0:real^3,&4)`);
2434 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2435 (EXISTS_TAC `V:real^3->bool`);
2436 (ASM_REWRITE_TAC[set_of_list]);
2438 (NEW_GOAL `set_of_list x SUBSET V:real^3->bool`);
2439 (MATCH_MP_TAC Packing3.BARV_SUBSET);
2440 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2441 (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
2444 (ABBREV_TAC `d2 = (if (P4 = {}:real->bool) then c
2445 else (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b)))`);
2446 (NEW_GOAL `d2 < &1`);
2449 (ASM_REWRITE_TAC[]);
2450 (NEW_GOAL `?b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b)`);
2452 (UP_ASM_TAC THEN STRIP_TAC);
2453 (ABBREV_TAC `P = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
2454 (ABBREV_TAC `zz = (@) (P:real->bool)`);
2455 (NEW_GOAL `(P:real->bool) zz`);
2457 (MATCH_MP_TAC SELECT_AX);
2458 (EXISTS_TAC `b':real`);
2459 (EXPAND_TAC "P" THEN ASM_REWRITE_TAC[]);
2460 (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[]);
2461 (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
2463 (ASM_REWRITE_TAC[]);
2466 (ABBREV_TAC `xx = smallest_angle_line (EL 2 ul) (EL 3 ul) u0 u1`);
2467 (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
2469 (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
2471 (SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
2472 (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2473 (ASM_REWRITE_TAC[]);
2475 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
2476 REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2478 (ABBREV_TAC `Q = (\x:real^3. x IN convex hull {EL 2 ul, EL 3 ul} /\
2479 (!y. y IN convex hull {EL 2 ul, EL 3 ul}
2480 ==> ((y - u0) dot (u1 - u0)) /
2481 (norm (y - u0) * norm (u1 - u0)) <=
2482 ((x - u0) dot (u1 - u0)) /
2483 (norm (x - u0) * norm (u1 - u0))))`);
2484 (NEW_GOAL `(Q:real^3->bool) u0`);
2485 (ONCE_ASM_REWRITE_TAC[]);
2486 (MATCH_MP_TAC SELECT_AX);
2489 (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
2491 (ASM_REWRITE_TAC[]);
2493 (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2494 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2495 (MATCH_MP_TAC BARV_3_EXPLICIT);
2496 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2497 (UP_ASM_TAC THEN STRIP_TAC);
2498 (EXISTS_TAC `v1:real^3` THEN
2499 EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2500 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2502 (NEW_GOAL `v0 = u0:real^3`);
2503 (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2504 (ASM_REWRITE_TAC[HD]);
2505 (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2506 (ASM_REWRITE_TAC[HD]);
2507 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2508 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2509 (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2510 (UP_ASM_TAC THEN STRIP_TAC);
2511 (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);
2512 (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
2515 (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
2517 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2518 (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);
2519 (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`;
2520 ASSUME `ul = [u0; v1; v2; v3:real^3]`]);
2523 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2524 (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);
2526 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2527 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2528 (REWRITE_TAC[coplanar]);
2529 (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);
2530 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2531 (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN
2532 EXISTS_TAC `v3:real^3`);
2533 (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2534 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2535 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2536 (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2538 (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2539 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2540 (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2541 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2544 (UP_ASM_TAC THEN EXPAND_TAC "Q");
2546 (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);
2547 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2548 (EXISTS_TAC `mcell 4 V ul`);
2549 (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2550 (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
2552 (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2553 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2554 (MATCH_MP_TAC BARV_3_EXPLICIT);
2555 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2556 (UP_ASM_TAC THEN STRIP_TAC);
2557 (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2558 (ASM_REWRITE_TAC[]);
2560 (REWRITE_WITH `v0 = u0:real^3`);
2561 (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2562 (ASM_REWRITE_TAC[HD]);
2563 (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2564 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
2565 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2566 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2568 (REWRITE_WITH `v1 = u1:real^3`);
2569 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2570 (ASM_REWRITE_TAC[HD; TL]);
2571 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2572 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
2573 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2574 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2575 (ASM_REWRITE_TAC[]);
2576 (UP_ASM_TAC THEN STRIP_TAC);
2578 (ASM_REWRITE_TAC[set_of_list]);
2579 (REWRITE_TAC[GSYM (ASSUME `u0 = (@) (Q:real^3->bool)`)]);
2580 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2581 (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
2582 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2583 (REWRITE_WITH `affine hull {u0, u1, v2, v3} =
2584 affine hull {u1, v2, v3:real^3}`);
2585 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2587 (NEW_GOAL `convex hull {EL 2 ul, (EL 3 ul):real^3} SUBSET
2588 affine hull {EL 2 ul, EL 3 ul}`);
2589 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2590 (NEW_GOAL `affine hull {EL 2 ul, (EL 3 ul):real^3} SUBSET
2591 affine hull {u1, v2, v3}`);
2592 (MATCH_MP_TAC AFFINE_SUBSET_KY_LEMMA);
2593 (ASM_REWRITE_TAC[EL; HD; TL;
2594 ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
2596 (UP_ASM_TAC THEN UP_ASM_TAC THEN
2597 UNDISCH_TAC `u0 IN convex hull {EL 2 ul, (EL 3 ul):real^3}` THEN SET_TAC[]);
2598 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
2599 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2601 (MATCH_MP_TAC (REAL_ARITH `(a <= b) /\ ~(a = b) ==> a < b`));
2602 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ; NORM_CAUCHY_SCHWARZ_EQ]);
2603 (NEW_GOAL `xx IN convex hull {(EL 2 ul) ,(EL 3 ul):real^3}`);
2604 (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2605 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2606 (ASM_REWRITE_TAC[]);
2608 (NEW_GOAL `?v1 v2 v3. ul = [u0; v1; v2; v3:real^3]`);
2609 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2610 (MATCH_MP_TAC BARV_3_EXPLICIT);
2611 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2612 (UP_ASM_TAC THEN STRIP_TAC);
2613 (EXISTS_TAC `v1:real^3` THEN
2614 EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2615 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
2617 (NEW_GOAL `v0 = u0:real^3`);
2618 (REWRITE_WITH `v0 = HD (ul:(real^3)list)`);
2619 (ASM_REWRITE_TAC[HD]);
2620 (REWRITE_WITH `u0 = HD (truncate_simplex 1 (ul:(real^3)list))`);
2621 (ASM_REWRITE_TAC[HD]);
2622 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2623 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2624 (REWRITE_TAC[ASSUME `v0 = u0:real^3`]);
2625 (UP_ASM_TAC THEN STRIP_TAC);
2626 (REWRITE_WITH `EL 2 ul = v2:real^3 /\ EL 3 ul = v3`);
2627 (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
2630 (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)`);
2632 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2633 (EXISTS_TAC `mcell 4 V ul` THEN STRIP_TAC);
2634 (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`;
2635 ASSUME `ul = [u0; v1; v2; v3:real^3]`]);
2638 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2639 (EXISTS_TAC `affine hull {u0, v1, v2, v3:real^3}`);
2641 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2642 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2643 (REWRITE_TAC[coplanar]);
2644 (UNDISCH_TAC `u0 IN convex hull {v2, v3:real^3}`);
2645 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2646 (EXISTS_TAC `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN
2647 EXISTS_TAC `v3:real^3`);
2648 (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
2649 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
2650 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2651 (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2653 (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
2654 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
2655 (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2656 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2661 (UNDISCH_TAC `~NULLSET (mcell 4 V ul INTER C)` THEN REWRITE_TAC[]);
2662 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2663 (EXISTS_TAC `mcell 4 V ul`);
2664 (REWRITE_TAC[SET_RULE `A INTER B SUBSET A`]);
2665 (SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
2667 (NEW_GOAL `?v2 v3. ul = [u0;u1;v2;v3:real^3]`);
2668 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0;v1;v2;v3:real^3]`);
2669 (MATCH_MP_TAC BARV_3_EXPLICIT);
2670 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2671 (UP_ASM_TAC THEN STRIP_TAC);
2672 (EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2673 (ASM_REWRITE_TAC[]);
2675 (REWRITE_WITH `v0 = u0:real^3`);
2676 (NEW_GOAL `HD (truncate_simplex 1 ul) = u0:real^3`);
2677 (ASM_REWRITE_TAC[HD]);
2678 (NEW_GOAL `HD (truncate_simplex 1 ul) = v0:real^3`);
2679 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
2680 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
2681 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2683 (REWRITE_WITH `v1 = u1:real^3`);
2684 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = u1:real^3`);
2685 (ASM_REWRITE_TAC[HD; TL]);
2686 (NEW_GOAL `HD (TL(truncate_simplex 1 ul)) = v1:real^3`);
2687 (REWRITE_TAC[ASSUME `ul = [v0; v1; v2; v3:real^3]`;
2688 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2689 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2690 (UP_ASM_TAC THEN STRIP_TAC);
2691 (ASM_REWRITE_TAC[set_of_list]);
2693 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2694 (EXISTS_TAC `affine hull {u0, u1, v2, v3:real^3}`);
2695 (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2696 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
2697 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
2698 (ABBREV_TAC `k1 = norm (xx - u0:real^3)`);
2699 (ABBREV_TAC `k2 = norm (u1 - u0:real^3)`);
2700 (UNDISCH_TAC `xx IN convex hull {EL 2 ul,(EL 3 ul):real^3}`);
2701 (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1/\ 1 = SUC 0`;
2702 CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
2703 (UNDISCH_TAC `k1 % (u1 - u0) = k2 % (xx - u0:real^3)`);
2704 (ASM_REWRITE_TAC[]);
2708 (REWRITE_TAC[coplanar]);
2709 (NEW_GOAL `~(k2 = &0)`);
2711 (REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2712 (ASM_REWRITE_TAC[]);
2714 (ASM_CASES_TAC `~(v = &0)`);
2715 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN
2716 EXISTS_TAC `v2:real^3`);
2717 (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,c,d} SUBSET X`));
2719 (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2720 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2721 (EXISTS_TAC `(k2 - k1:real) / (k2 * v)`);
2722 (EXISTS_TAC `k1 / (k2 * v)`);
2723 (EXISTS_TAC `(--k2 * u) / (k2 * v)`);
2725 (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2726 (REWRITE_WITH `k2 - k1 + k1 + --k2 * u = k2 * (u + v) - k1 + k1 + --k2 * u`);
2727 (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2728 (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * u = k2 * v`]);
2729 (MATCH_MP_TAC REAL_DIV_REFL);
2730 (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2732 (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 =
2733 (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2734 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2736 `&1 / (k2 * v) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = v3:real^3 <=>
2737 ((k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2) = (k2 * v) % v3`);
2738 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2739 (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2740 (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2741 (ASM_REWRITE_TAC[VECTOR_ARITH
2742 `(k2 - k1) % u0 + k1 % u1 + (--k2 * u) % v2 = (k2 * v) % v3 <=>
2743 k1 % (u1 - u0) = k2 % ((u % v2 + v % v3) - u0)`]);
2745 (NEW_GOAL `~(u = &0)`);
2746 (UP_ASM_TAC THEN UNDISCH_TAC `u + v = &(SUC 0):real` THEN
2747 REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
2750 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3` THEN
2751 EXISTS_TAC `v3:real^3`);
2752 (MATCH_MP_TAC (SET_RULE `{a,b,c} SUBSET X /\ d IN X ==> {a,b,d,c} SUBSET X`));
2754 (REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL]);
2755 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2757 (EXISTS_TAC `(k2 - k1:real) / (k2 * u)`);
2758 (EXISTS_TAC `k1 / (k2 * u)`);
2759 (EXISTS_TAC `(--k2 * v) / (k2 * u)`);
2761 (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
2762 (REWRITE_WITH `k2 - k1 + k1 + --k2 * v = k2 * (u + v) - k1 + k1 + --k2 * v`);
2763 (ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`] THEN REAL_ARITH_TAC);
2764 (REWRITE_TAC[REAL_ARITH `k2 * (u + v) - k1 + k1 + --k2 * v = k2 * u`]);
2765 (MATCH_MP_TAC REAL_DIV_REFL);
2766 (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2768 (REWRITE_TAC[VECTOR_ARITH `a / x % u0 + b / x % u1 + d / x % u2 =
2769 (&1 / x) % (a % u0 + b % u1 + d % u2)`]);
2770 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2772 `&1 / (k2 * u) % ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = v2:real^3 <=>
2773 ((k2 - k1) % u0 + k1 % u1 + (--k2 * v) % v3) = (k2 * u) % v2`);
2774 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2775 (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
2776 (REWRITE_TAC[REAL_ENTIRE] THEN ASM_REWRITE_TAC[]);
2777 (ASM_REWRITE_TAC[VECTOR_ARITH
2778 `(k2 - k1) % u0 + k1 % u1 + (--k2 * v) % m = (k2 * u) % v2 <=>
2779 k1 % (u1 - u0) = k2 % ((u % v2 + v % m) - u0)`]);
2780 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
2782 (* ========================================================================== *)
2784 (ABBREV_TAC `d = max c (max d1 d2)`);
2785 (NEW_GOAL `d < &1`);
2786 (UNDISCH_TAC `d2 < &1` THEN UNDISCH_TAC `d1 < &1` THEN
2787 UNDISCH_TAC `&0 < c /\ c < &1`);
2788 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2790 (* ========================================================================== *)
2791 (ABBREV_TAC `D = ball (u0:real^3,r) INTER rcone_gt u0 u1 d`);
2792 (NEW_GOAL `D SUBSET C:real^3->bool`);
2793 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
2794 (MATCH_MP_TAC (SET_RULE
2795 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
2797 (MATCH_MP_TAC SUBSET_BALL);
2798 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2799 (MATCH_MP_TAC RCONE_GT_SUBSET);
2800 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2802 (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D)
2807 truncate_simplex 1 vl = [u0; u1])`);
2809 (FIRST_ASSUM MATCH_MP_TAC);
2810 (ASM_REWRITE_TAC[]);
2812 (UNDISCH_TAC `~NULLSET (X INTER D)`);
2813 (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
2814 (EXISTS_TAC `X INTER C:real^3->bool`);
2815 (ASM_REWRITE_TAC[] THEN UNDISCH_TAC `D SUBSET C:real^3->bool`);
2818 (* ========================================================================= *)
2820 (NEW_GOAL `D = conic_cap (u0:real^3) u1 r d`);
2821 (EXPAND_TAC "D" THEN REWRITE_TAC[conic_cap; NORMBALL_BALL]);
2823 (NEW_GOAL `!X. mcell_set V X /\ ~NULLSET (X INTER D) ==>
2824 vol (X INTER D) = vol (D) * (dihX V X (u0,u1)) / (&2 * pi)`);
2830 truncate_simplex 1 vl = [u0; u1]`);
2831 (FIRST_ASSUM MATCH_MP_TAC);
2832 (ASM_REWRITE_TAC[]);
2833 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
2835 (* ========================================================================= *)
2837 (* ========================================================================= *)
2839 (ASM_CASES_TAC `k = 2`);
2840 (ABBREV_TAC `m = mxi V vl`);
2841 (ABBREV_TAC `s3 = omega_list_n V vl 3`);
2842 (ABBREV_TAC `L = aff_ge{u0, u1} {m, s3:real^3}`);
2844 (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
2846 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
2849 (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
2850 (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
2851 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2852 (UP_ASM_TAC THEN STRIP_TAC);
2854 (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);
2855 (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
2856 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2857 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2858 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
2859 (ASM_REWRITE_TAC[HD; TL]);
2860 (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
2861 (ASM_REWRITE_TAC[HD; TL]);
2862 (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
2863 (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;
2864 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
2865 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
2868 (REWRITE_TAC [SET_RULE `(A INTER B INTER C) INTER D = C INTER D
2869 <=> (!x. x IN C INTER D ==> x IN A /\ x IN B)`]);
2871 (REPEAT GEN_TAC THEN STRIP_TAC);
2872 (NEW_GOAL `x:real^3 IN D`);
2873 (UP_ASM_TAC THEN UNDISCH_TAC `D = conic_cap (u0:real^3) u1 r d`);
2875 (UP_ASM_TAC THEN EXPAND_TAC "D" THEN STRIP_TAC);
2876 (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a'`);
2877 (NEW_GOAL `rcone_gt (u0:real^3) u1 d SUBSET rcone_gt u0 u1 c`);
2878 (MATCH_MP_TAC RCONE_GT_SUBSET);
2879 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
2880 (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
2881 `rcone_gt (u0:real^3) u1 c SUBSET W INTER rcone_gt u0 u1 a'`);
2884 (UP_ASM_TAC THEN SET_TAC[RCONE_GT_SUBSET_RCONE_GE]);
2886 (* ========================================================================== *)
2887 (UP_ASM_TAC THEN REWRITE_TAC[rcone_ge; rconesgn; rcone_gt; IN; IN_ELIM_THM]);
2890 (ABBREV_TAC `y = u0 + proj_point (u1 - u0:real^3) (x - u0)`);
2891 (NEW_GOAL `orthogonal (x - y) (u1 - u0:real^3)`);
2892 (REWRITE_WITH `x - y = (x - u0) - proj_point (u1 - u0) (x - u0:real^3)`);
2893 (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2894 (REWRITE_TAC[GSYM Marchal_cells_2_new.projection_proj_point]);
2895 (REWRITE_TAC[orthogonal; Packing3.PROJECTION_ORTHOGONAL]);
2897 (NEW_GOAL `norm (x - u0) pow 2 = norm (y - u0) pow 2 + norm (x - y:real^3) pow 2`);
2898 (MATCH_MP_TAC PYTHAGORAS);
2899 (REWRITE_TAC[orthogonal]);
2900 (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = --(c dot (b - a))`]);
2901 (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);
2902 (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);
2903 (REWRITE_TAC[PRO_EXP; DOT_RMUL]);
2904 (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);
2905 (ASM_REWRITE_TAC[]);
2908 (NEW_GOAL `norm (x - u1) pow 2 = norm (y - u1) pow 2 + norm (x - y:real^3) pow 2`);
2909 (MATCH_MP_TAC PYTHAGORAS);
2910 (REWRITE_TAC[orthogonal]);
2911 (ONCE_REWRITE_TAC[VECTOR_ARITH `(a - b) dot c = c dot (a - b)`]);
2912 (REWRITE_WITH `u1 - y = (u1 - u0) - proj_point (u1 - u0) (x - u0:real^3)`);
2913 (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
2914 (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x - a % x = (&1 - a) % x`]);
2915 (REWRITE_TAC[DOT_RMUL] THEN DEL_TAC);
2916 (UP_ASM_TAC THEN REWRITE_TAC[orthogonal] THEN STRIP_TAC);
2917 (ASM_REWRITE_TAC[]);
2920 (MP_TAC (ASSUME `(x - u0:real^3) dot (u1 - u0) >
2921 dist (x,u0) * dist (u1,u0) * a'`));
2922 (REWRITE_WITH `(x - u0) dot (u1 - u0) =
2923 (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);
2925 (REWRITE_WITH `(x - u1) dot (u0 - u1) =
2926 (x - y) dot (u0 - u1) + (y - u1) dot (u0 - u1:real^3)`);
2928 (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);
2929 (ASM_REWRITE_TAC[GSYM orthogonal]);
2930 (REWRITE_WITH `(x - y) dot (u0 - u1:real^3) = &0`);
2931 (ONCE_REWRITE_TAC[VECTOR_ARITH `a dot (u0 - u1) = --(a dot (u1 - u0))`]);
2932 (REWRITE_TAC[REAL_ARITH `--a = &0 <=> a = &0`]);
2933 (ASM_REWRITE_TAC[GSYM orthogonal]);
2934 (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
2937 (NEW_GOAL `(y - u0) dot (u1 - u0) = norm (y - u0) * norm (u1 - u0:real^3)`);
2938 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
2939 (REWRITE_WITH `y - u0 = proj_point (u1 - u0) (x - u0:real^3)`);
2940 (EXPAND_TAC "y" THEN REWRITE_TAC[VECTOR_ARITH `(a + b) - a:real^3 = b`]);
2941 (REWRITE_TAC[PRO_EXP; NORM_MUL; VECTOR_MUL_ASSOC]);
2942 (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));
2943 (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);
2944 (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));
2945 (REWRITE_TAC[REAL_ABS_REFL]);
2946 (MATCH_MP_TAC REAL_LE_DIV);
2947 (REWRITE_TAC[DOT_POS_LE]);
2949 (REWRITE_WITH `(x - u0) dot (u1 - u0) =
2950 (x - y) dot (u1 - u0) + (y - u0) dot (u1 - u0:real^3)`);
2952 (REWRITE_WITH `(x - y) dot (u1 - u0:real^3) = &0`);
2953 (ASM_REWRITE_TAC[GSYM orthogonal]);
2954 (REWRITE_TAC[REAL_ARITH `&0 + a = a`]);
2956 (NEW_GOAL `y IN convex hull {u0, u1:real^3}`);
2957 (NEW_GOAL `y IN affine hull {u0, u1:real^3}`);
2958 (REWRITE_TAC[AFFINE_HULL_2; IN; IN_ELIM_THM]);
2959 (EXPAND_TAC "y" THEN REWRITE_TAC[PRO_EXP]);
2960 (ABBREV_TAC `rtemp = ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 -
2962 (EXISTS_TAC `&1 - rtemp` THEN EXISTS_TAC `rtemp:real`);
2966 (UP_ASM_TAC THEN REWRITE_TAC[IN; AFFINE_HULL_2; CONVEX_HULL_2; IN_ELIM_THM]);
2968 (EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
2969 (ASM_REWRITE_TAC[]);
2971 (NEW_GOAL `y - u0 = v % (u1 - u0:real^3)`);
2972 (NEW_GOAL `y - u0 = y - (u + v) % u0:real^3`);
2973 (REWRITE_TAC[ASSUME `u + v = &1`; VECTOR_MUL_LID]);
2974 (UP_ASM_TAC THEN REWRITE_WITH `y - (u + v) % u0 = v % (u1 - u0:real^3)`);
2975 (REWRITE_TAC[ASSUME `y = u % u0 + v % u1:real^3`] THEN VECTOR_ARITH_TAC);
2977 (ASM_CASES_TAC `u < &0`);
2979 (NEW_GOAL `norm (y - u0) <= norm (x - u0:real^3)`);
2980 (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
2981 (REWRITE_TAC[NORM_POS_LE; ASSUME
2982 `norm (x - u0:real^3) pow 2 = norm (y - u0) pow 2 + norm (x - y) pow 2`;
2983 REAL_ARITH `a <= a + b <=> &0 <= b`; REAL_LE_POW_2]);
2984 (NEW_GOAL `norm (x - u0:real^3) < &1`);
2985 (REWRITE_TAC[GSYM dist] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN
2986 REWRITE_TAC[GSYM IN_BALL]);
2987 (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
2988 (MATCH_MP_TAC SUBSET_BALL);
2989 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
2990 (UP_ASM_TAC THEN UNDISCH_TAC
2991 `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
2993 (NEW_GOAL `norm (y - u0) = v * norm (u1:real^3 - u0)`);
2994 (ASM_REWRITE_TAC[NORM_MUL]);
2996 (REWRITE_WITH `abs v = v`);
2997 (REWRITE_TAC[REAL_ABS_REFL]);
2998 (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);
2999 (NEW_GOAL `&2 <= norm (u1 - u0:real^3)`);
3000 (REWRITE_TAC[GSYM dist]);
3001 (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
3003 (FIRST_ASSUM MATCH_MP_TAC);
3004 (ASM_REWRITE_TAC[]);
3005 (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);
3006 (ASM_REWRITE_TAC[]);
3008 (NEW_GOAL `v * &2 <= v * norm (u1 - u0:real^3)`);
3009 (REWRITE_TAC[REAL_ARITH `a * b <= a * c <=> &0 <= a * (c - b)`]);
3010 (MATCH_MP_TAC REAL_LE_MUL);
3011 (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN UP_ASM_TAC);
3014 (NEW_GOAL `&1 < v`);
3015 (UNDISCH_TAC `u + v = &1` THEN UNDISCH_TAC `u < &0` THEN REAL_ARITH_TAC);
3016 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN
3017 UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3018 (UP_ASM_TAC THEN MESON_TAC[]);
3020 (ASM_CASES_TAC `v < &0`);
3022 (NEW_GOAL `(y - u0) dot (u1 - u0:real^3) <= &0`);
3023 (ASM_REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
3024 (MATCH_MP_TAC REAL_LE_MUL);
3025 (REWRITE_TAC[DOT_POS_LE]);
3026 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3028 (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);
3029 (MATCH_MP_TAC REAL_LE_MUL);
3030 (REWRITE_TAC[DIST_POS_LE]);
3031 (MATCH_MP_TAC REAL_LE_MUL);
3032 (REWRITE_TAC[DIST_POS_LE]);
3033 (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3035 (REWRITE_TAC[HL_2]);
3036 (MATCH_MP_TAC REAL_LE_MUL);
3037 (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3038 (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3039 (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
3040 `(y - u0:real^3) dot (u1 - u0) > dist (x,u0) * dist (u1,u0) * a'`);
3042 (UP_ASM_TAC THEN MESON_TAC[]);
3043 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3045 (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a'`);
3046 (MATCH_MP_TAC REAL_LE_MUL);
3047 (REWRITE_TAC[DIST_POS_LE]);
3048 (MATCH_MP_TAC REAL_LE_MUL);
3049 (REWRITE_TAC[DIST_POS_LE]);
3050 (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3052 (REWRITE_TAC[HL_2]);
3053 (MATCH_MP_TAC REAL_LE_MUL);
3054 (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3055 (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3056 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3058 (NEW_GOAL `(y - u1) dot (u0 - u1) = norm (y - u1) * norm (u0 - u1:real^3)`);
3059 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
3060 (REWRITE_WITH `y - u1 = proj_point (u1 - u0) (x - u0:real^3) - (u1 - u0)`);
3061 (EXPAND_TAC "y" THEN VECTOR_ARITH_TAC);
3062 (REWRITE_TAC[PRO_EXP; VECTOR_ARITH `x % a - a = (x - &1) % a`; NORM_MUL;
3066 (((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) - &1)) % (u1 - u0) =
3067 (norm (u0 - u1:real^3) *
3068 (&1 - ((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)))) % (u0 - u1)`);
3070 (MATCH_MP_TAC (MESON[] `a = b ==> a % x = b % x`));
3071 (REWRITE_TAC[REAL_ARITH `a * norm b = norm b * a`]);
3072 (REWRITE_TAC[NORM_ARITH `norm (a - b) = norm (b - a)`]);
3073 (MATCH_MP_TAC (MESON[] `a = b ==> x * a = x * b`));
3074 (REWRITE_TAC[REAL_ARITH `abs (x - &1) = abs (&1 - x)`]);
3075 (REWRITE_TAC[REAL_ABS_REFL; REAL_ARITH `&0 <= a - b <=> b <= a`]);
3076 (REWRITE_WITH `((x - u0) dot (u1 - u0)) / ((u1 - u0) dot (u1 - u0)) <= &1
3077 <=> ((x - u0) dot (u1 - u0)) <= &1 * ((u1 - u0) dot (u1 - u0:real^3))`);
3078 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
3079 (REWRITE_TAC[DOT_POS_LT; VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
3080 (ASM_REWRITE_TAC[]);
3081 (NEW_GOAL `(x - u0) dot (u1 - u0) <= norm (x - u0) * norm (u1 - u0:real^3)`);
3082 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
3084 (NEW_GOAL `norm (x - u0) * norm (u1 - u0) <= &1 * norm (u1 - u0:real^3)`);
3085 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
3086 (MATCH_MP_TAC REAL_LE_MUL);
3087 (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);
3088 (MATCH_MP_TAC (REAL_ARITH `a < x ==> a <= x`));
3089 (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
3090 (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
3091 (MATCH_MP_TAC SUBSET_BALL);
3092 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3093 (UP_ASM_TAC THEN UNDISCH_TAC
3094 `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
3095 (REWRITE_TAC[GSYM NORM_POW_2; REAL_ARITH `&1 * a pow 2 = a * a`]);
3096 (NEW_GOAL `&1 * norm (u1 - u0) <= norm (u1 - u0) * norm (u1 - u0:real^3)`);
3097 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
3098 (MATCH_MP_TAC REAL_LE_MUL);
3099 (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`; GSYM dist]);
3100 (MATCH_MP_TAC (REAL_ARITH `&2 <= x ==> &1 <= x`));
3101 (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
3103 (FIRST_ASSUM MATCH_MP_TAC);
3104 (ASM_REWRITE_TAC[]);
3105 (ONCE_REWRITE_TAC[MESON[IN] `V x <=> x IN (V:real^3->bool)`]);
3106 (ASM_REWRITE_TAC[]);
3107 (UNDISCH_TAC `(x - u0:real^3) dot (u1 - u0) <=
3108 norm (x - u0) * norm (u1 - u0)` THEN
3109 UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3110 (ASM_REWRITE_TAC[dist]);
3111 (REWRITE_TAC[REAL_ARITH `a * b >= x * b * c <=> &0 <= b * (a - x * c)`]);
3112 (MATCH_MP_TAC REAL_LE_MUL);
3113 (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
3114 (MATCH_MP_TAC Tactics_jordan.REAL_POW_2_LE);
3117 (MATCH_MP_TAC REAL_LE_MUL);
3118 (REWRITE_TAC[NORM_POS_LE]);
3119 (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3121 (REWRITE_TAC[HL_2]);
3122 (MATCH_MP_TAC REAL_LE_MUL);
3123 (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3124 (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3125 (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);
3126 (ASM_REWRITE_TAC[]);
3127 (REWRITE_TAC[REAL_ARITH `(a + b) * x <= a <=> b * x <= (&1 - x) * a`]);
3129 (UNDISCH_TAC `(y - u0) dot (u1 - u0) > dist (x,u0) * dist (u1,u0:real^3) * a'`);
3130 (ASM_REWRITE_TAC[dist]);
3131 (REWRITE_TAC[REAL_ARITH `a * b > x * b * c <=> &0 < b * (a - x * c)`]);
3132 (REWRITE_TAC[REAL_MUL_POS_LT]);
3133 (REWRITE_WITH `~(norm (u1 - u0:real^3) < &0 /\
3134 norm (y - u0) - norm (x - u0) * a' < &0)`);
3135 (NEW_GOAL `&0 <= norm (u1 - u0:real^3)`);
3136 (REWRITE_TAC[NORM_POS_LE]);
3137 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3138 (REWRITE_TAC[REAL_ARITH `&0 < a - b <=> b < a`]);
3139 (REWRITE_WITH `norm (x - u0) * a' < norm (y - u0:real^3) <=>
3140 (norm (x - u0) * a') pow 2 < norm (y - u0) pow 2`);
3141 (MATCH_MP_TAC Pack1.bp_bdt);
3143 (MATCH_MP_TAC REAL_LE_MUL);
3144 (REWRITE_TAC[NORM_POS_LE]);
3145 (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3147 (REWRITE_TAC[HL_2]);
3148 (MATCH_MP_TAC REAL_LE_MUL);
3149 (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3150 (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3151 (REWRITE_TAC[NORM_POS_LE]);
3153 (ASM_REWRITE_TAC[REAL_ARITH `(a * b) pow 2 = a pow 2 * b pow 2`]);
3154 (REWRITE_TAC[REAL_ARITH `(a + b) * x < a <=> b * x < (&1 - x) * a`]);
3157 (NEW_GOAL `(&1 - a' pow 2) * norm (y - u0) pow 2 <=
3158 (&1 - a' pow 2) * norm (y - u1:real^3) pow 2`);
3159 (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= a * (y - x)`]);
3160 (MATCH_MP_TAC REAL_LE_MUL);
3162 (REWRITE_TAC[REAL_ARITH `&0 <= &1 - b <=> b <= &1 pow 2`]);
3163 (REWRITE_WITH `a' pow 2 <= &1 pow 2 <=> a' <= &1`);
3164 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3165 (MATCH_MP_TAC Collect_geom.POW2_COND);
3166 (REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
3167 (EXPAND_TAC "a'" THEN MATCH_MP_TAC REAL_LE_DIV);
3169 (REWRITE_TAC[HL_2]);
3170 (MATCH_MP_TAC REAL_LE_MUL);
3171 (REWRITE_TAC[DIST_POS_LE] THEN REAL_ARITH_TAC);
3172 (MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC);
3175 (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);
3176 (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
3177 (UNDISCH_TAC `hl [u0; u1:real^3] < sqrt (&2)` THEN REAL_ARITH_TAC);
3178 (NEW_GOAL `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2`);
3179 (REWRITE_WITH `norm (x - u0) pow 2 <= norm (x - u1:real^3) pow 2 <=>
3180 norm (x - u0) <= norm (x - u1:real^3)`);
3181 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3182 (MATCH_MP_TAC Collect_geom.POW2_COND);
3183 (REWRITE_TAC[NORM_POS_LE]);
3184 (MATCH_MP_TAC (REAL_ARITH `&2 * x <= x + y ==> x <= y`));
3185 (REWRITE_TAC[GSYM dist]);
3187 (NEW_GOAL `dist (x, u0:real^3) < &1`);
3188 (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
3189 (NEW_GOAL `ball (u0:real^3, r) SUBSET ball (u0, &1)`);
3190 (MATCH_MP_TAC SUBSET_BALL);
3191 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
3192 (UP_ASM_TAC THEN UNDISCH_TAC
3193 `x IN ball (u0:real^3,r) INTER rcone_gt u0 u1 d` THEN SET_TAC[]);
3194 (NEW_GOAL `&2 * dist (x, u0:real^3) < &2`);
3195 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3196 (NEW_GOAL `&2 <= dist (x, u0) + dist (x, u1:real^3)`);
3197 (NEW_GOAL `&2 <= dist (u0, u1:real^3)`);
3198 (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
3200 (FIRST_ASSUM MATCH_MP_TAC);
3201 (ASM_REWRITE_TAC[]);
3202 (ONCE_REWRITE_TAC[MESON[IN] `V a <=> a:real^3 IN V`]);
3203 (ASM_REWRITE_TAC[]);
3205 (NEW_GOAL `dist (u0, u1:real^3) <= dist (u0, x) + dist (x, u1)`);
3206 (REWRITE_TAC[DIST_TRIANGLE]);
3207 (UP_ASM_TAC THEN REWRITE_TAC[DIST_SYM]);
3208 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3209 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3210 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3212 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3215 (UNDISCH_TAC `~NULLSET (X INTER D)`);
3217 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3218 (EXISTS_TAC `X INTER C:real^3->bool`);
3219 (ASM_SIMP_TAC [SET_RULE `A SUBSET B ==> X INTER A SUBSET X INTER B`]);
3220 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; SET_RULE `{} INTER s = {}`]);
3221 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
3222 (UP_ASM_TAC THEN MESON_TAC[]);
3224 (NEW_GOAL `~coplanar {u0, u1:real^3, m, s3}`);
3225 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3227 (NEW_GOAL `NULLSET X`);
3228 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3229 (EXISTS_TAC `affine hull {u0, u1, m, s3:real^3}`);
3231 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
3232 (UP_ASM_TAC THEN MESON_TAC[]);
3233 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
3236 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> M INTER N INTER A SUBSET B`));
3238 (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3239 (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3240 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3241 (UP_ASM_TAC THEN STRIP_TAC);
3242 (REWRITE_WITH `HD vl = u0 /\ HD (TL vl) = u1:real^3`);
3243 (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3244 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3245 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3246 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3247 (ASM_REWRITE_TAC[HD; TL]);
3248 (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = u1:real^3`);
3249 (ASM_REWRITE_TAC[HD; TL]);
3250 (NEW_GOAL `HD (TL(truncate_simplex 1 vl)) = v1:real^3`);
3251 (REWRITE_TAC[ASSUME `vl = [v0; v1; v2; v3:real^3]`;
3252 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3253 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3254 (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1} UNION {m:real^3, s3}`);
3256 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3258 (UNDISCH_TAC `~NULLSET (X INTER D)`);
3259 (REWRITE_TAC[] THEN MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3260 (EXISTS_TAC `X:real^3->bool`);
3261 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3263 (* ========================================================================= *)
3264 (ASM_CASES_TAC `azim u0 u1 m (s3:real^3) < pi`);
3265 (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m s3)`);
3266 (ASM_SIMP_TAC[WEDGE_LUNE]);
3267 (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d =
3268 conic_cap u0 u1 r d INTER L`);
3270 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3271 (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER
3272 aff_gt {u0, u1} {m, s3} DIFF conic_cap u0 u1 r d INTER L = {}`);
3274 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
3275 (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3276 (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
3279 (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3280 aff_gt {u0, u1} {m, s3} UNION
3281 UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3282 (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3283 (REWRITE_TAC[Geomdetail.FINITE6]);
3284 (REWRITE_TAC[DISJOINT]);
3286 (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3288 (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3289 (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);
3290 (UP_ASM_TAC THEN SET_TAC[]);
3291 (REWRITE_TAC[COPLANAR_3]);
3292 (UP_ASM_TAC THEN MESON_TAC[]);
3294 (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3296 (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3297 (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);
3298 (UP_ASM_TAC THEN SET_TAC[]);
3299 (REWRITE_TAC[COPLANAR_3]);
3300 (UP_ASM_TAC THEN MESON_TAC[]);
3301 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3303 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3305 `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3307 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3309 `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);
3311 (MATCH_MP_TAC NEGLIGIBLE_UNION);
3314 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3315 (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
3317 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3318 (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
3320 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3321 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3322 (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);
3324 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3325 (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);
3327 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3328 (REWRITE_TAC[SET_RULE
3329 `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} =
3330 aff_ge {u0, u1} ({m, s3} DELETE s3)
3331 UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3332 (MATCH_MP_TAC (SET_RULE
3333 `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3335 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3339 (REWRITE_TAC[DISJOINT]);
3340 (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3342 (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3343 (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, s3:real^3}`);
3344 (UP_ASM_TAC THEN SET_TAC[]);
3345 (REWRITE_TAC[COPLANAR_3]);
3346 (UP_ASM_TAC THEN MESON_TAC[]);
3347 (UP_ASM_TAC THEN SET_TAC[]);
3349 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3352 (REWRITE_TAC[DISJOINT]);
3353 (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3355 (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3356 (REWRITE_WITH `{u0, u1, m, s3} = {u0, u1, m:real^3}`);
3357 (UP_ASM_TAC THEN SET_TAC[]);
3358 (REWRITE_TAC[COPLANAR_3]);
3359 (UP_ASM_TAC THEN MESON_TAC[]);
3360 (UP_ASM_TAC THEN SET_TAC[]);
3364 (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
3365 (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m s3) =
3366 (if &1 < d \/ r < &0
3368 else azim u0 u1 m s3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
3369 (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);
3371 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3372 (EXISTS_TAC `s3:real^3`);
3373 (ASM_REWRITE_TAC[]);
3374 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3375 (EXISTS_TAC `m:real^3`);
3376 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3377 (ASM_REWRITE_TAC[]);
3379 (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
3382 (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN
3383 UP_ASM_TAC THEN REAL_ARITH_TAC);
3384 (UP_ASM_TAC THEN MESON_TAC[]);
3386 (REWRITE_WITH `azim (u0:real^3) u1 m s3 = dihV u0 u1 m s3`);
3387 (MATCH_MP_TAC AZIM_DIHV_SAME);
3388 (ASM_REWRITE_TAC[]);
3390 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3391 (EXISTS_TAC `s3:real^3`);
3392 (ASM_REWRITE_TAC[]);
3393 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3394 (EXISTS_TAC `m:real^3`);
3395 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3396 (ASM_REWRITE_TAC[]);
3398 (REWRITE_TAC[dihX]);
3401 (UNDISCH_TAC `~NULLSET (X INTER D)`);
3403 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3404 (EXISTS_TAC `X:real^3->bool`);
3405 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3406 (UP_ASM_TAC THEN MESON_TAC[]);
3410 (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
3411 (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3414 initial_sublist [u0; u1] ul)`);
3416 (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
3417 (MATCH_MP_TAC SELECT_AX);
3418 (EXISTS_TAC `(2, vl:(real^3)list)`);
3420 (REWRITE_TAC[BETA_THM]);
3421 (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);
3422 (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);
3423 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3424 (ASM_REWRITE_TAC[]);
3426 (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3427 (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3428 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3429 (UP_ASM_TAC THEN STRIP_TAC);
3430 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3431 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3432 (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
3434 (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);
3435 (MATCH_MP_TAC Ajripqn.AJRIPQN);
3436 (ASM_REWRITE_TAC[]);
3437 (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);
3438 (SET_TAC[ASSUME `X = mcell k' V ul`;
3439 ASSUME `X = mcell k V vl`; ASSUME `k = 2`]);
3441 (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE
3442 `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
3444 (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
3447 (REWRITE_TAC[dihu2]);
3449 (REWRITE_WITH `omega_list_n V ul 3 = s3`);
3452 (!k. 2 - 1 <= k /\ k <= 3
3453 ==> omega_list_n V ul k = omega_list_n V vl k)`);
3454 (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
3455 (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);
3456 (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);
3457 (ASM_REWRITE_TAC[]);
3458 (UP_ASM_TAC THEN STRIP_TAC);
3460 (FIRST_ASSUM MATCH_MP_TAC);
3463 (REWRITE_WITH `mxi V ul = m`);
3465 (MATCH_MP_TAC MCELL_ID_MXI);
3466 (EXISTS_TAC `2` THEN EXISTS_TAC `2`);
3467 (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);
3470 (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3471 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3472 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3473 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
3474 CARD (set_of_list vl) = 3 + 1`);
3475 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3476 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3478 (ASM_REWRITE_TAC[HD]);
3480 (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);
3481 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3482 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3483 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
3484 CARD (set_of_list ul) = 3 + 1`);
3485 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3486 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3489 (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3490 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3491 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3493 (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul`); GSYM (ASSUME `k' = 2`)]);
3494 (ASM_REWRITE_TAC[]);
3496 (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);
3497 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3498 (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3499 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3500 (ASM_REWRITE_TAC[]);
3502 (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
3503 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3504 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3505 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
3506 CARD (set_of_list ul) = 3 + 1`);
3507 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3508 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3511 (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
3512 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3513 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3514 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
3515 CARD (set_of_list ul) = 3 + 1`);
3516 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3517 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3519 (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);
3520 (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
3521 (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
3522 (AP_THM_TAC THEN AP_TERM_TAC);
3525 `measurable (conic_cap u0 u1 r d) /\
3526 vol (conic_cap u0 u1 r d) =
3527 (if u1 = u0 \/ &1 <= d \/ r < &0
3529 else &2 / &3 * pi * (&1 - d) * r pow 3)`);
3530 (MATCH_MP_TAC VOLUME_CONIC_CAP);
3532 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3535 (UP_ASM_TAC THEN STRIP_TAC);
3536 (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
3537 (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3538 (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3539 (UP_ASM_TAC THEN MESON_TAC[]);
3540 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
3542 (REWRITE_WITH `max d (--(&1)) = d`);
3543 (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
3544 (REWRITE_TAC[REAL_NEG_LT0]);
3547 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3551 (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *
3552 ((&2 * pi) / (&2 * pi))`);
3554 (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
3555 (MATCH_MP_TAC REAL_DIV_REFL);
3556 (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
3559 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3560 (UP_ASM_TAC THEN MESON_TAC[]);
3562 (* ========================================================================= *)
3565 (ASM_CASES_TAC `azim u0 u1 s3 (m:real^3) < pi`);
3566 (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3567 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3569 (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 s3 m)`);
3570 (ASM_SIMP_TAC[WEDGE_LUNE]);
3571 (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d =
3572 conic_cap u0 u1 r d INTER L`);
3574 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3576 (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER
3577 aff_gt {u0, u1} {s3, m} DIFF conic_cap u0 u1 r d INTER L = {}`);
3579 (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
3580 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
3581 (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3582 (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
3584 (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
3586 (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} =
3587 aff_gt {u0, u1} {m, s3} UNION
3588 UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3589 (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3590 (REWRITE_TAC[Geomdetail.FINITE6]);
3591 (REWRITE_TAC[DISJOINT]);
3593 (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3595 (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3596 (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);
3597 (UP_ASM_TAC THEN SET_TAC[]);
3598 (REWRITE_TAC[COPLANAR_3]);
3599 (UP_ASM_TAC THEN MESON_TAC[]);
3601 (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3603 (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3604 (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);
3605 (UP_ASM_TAC THEN SET_TAC[]);
3606 (REWRITE_TAC[COPLANAR_3]);
3607 (UP_ASM_TAC THEN MESON_TAC[]);
3608 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3610 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3612 `UNIONS {aff_ge {u0, u1:real^3} ({m, s3} DELETE a) | a | a IN {m, s3}}`);
3614 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3616 `aff_ge {u0, u1:real^3} {m} UNION aff_ge {u0, u1:real^3} {s3}`);
3618 (MATCH_MP_TAC NEGLIGIBLE_UNION);
3621 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3622 (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
3624 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3625 (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
3627 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3628 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3629 (EXISTS_TAC `affine hull {u0, u1:real^3, s3}`);
3631 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3632 (REWRITE_WITH `{u0,u1,s3:real^3} = {u0,u1} UNION {s3}`);
3634 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3635 (REWRITE_TAC[SET_RULE
3636 `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} =
3637 aff_ge {u0, u1} ({m, s3} DELETE s3)
3638 UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3639 (MATCH_MP_TAC (SET_RULE
3640 `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3642 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3646 (REWRITE_TAC[DISJOINT]);
3647 (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
3649 (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3650 (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, s3:real^3}`);
3651 (UP_ASM_TAC THEN SET_TAC[]);
3652 (REWRITE_TAC[COPLANAR_3]);
3653 (UP_ASM_TAC THEN MESON_TAC[]);
3654 (UP_ASM_TAC THEN SET_TAC[]);
3656 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3659 (REWRITE_TAC[DISJOINT]);
3660 (ASM_CASES_TAC `s3 IN {u0, u1:real^3}`);
3662 (UNDISCH_TAC `~coplanar {u0, u1, s3, m:real^3}`);
3663 (REWRITE_WITH `{u0, u1, s3, m} = {u0, u1, m:real^3}`);
3664 (UP_ASM_TAC THEN SET_TAC[]);
3665 (REWRITE_TAC[COPLANAR_3]);
3666 (UP_ASM_TAC THEN MESON_TAC[]);
3667 (UP_ASM_TAC THEN SET_TAC[]);
3671 (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
3672 (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 s3 m) =
3673 (if &1 < d \/ r < &0
3675 else azim u0 u1 s3 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);
3676 (NEW_GOAL `~collinear {u0:real^3, u1, m} /\ ~collinear {u0, u1, s3}`);
3678 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3679 (EXISTS_TAC `s3:real^3`);
3680 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3681 (ASM_REWRITE_TAC[]);
3682 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3683 (EXISTS_TAC `m:real^3`);
3684 (ASM_REWRITE_TAC[]);
3686 (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
3690 (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN
3691 UP_ASM_TAC THEN REAL_ARITH_TAC);
3692 (UP_ASM_TAC THEN MESON_TAC[]);
3694 (REWRITE_WITH `azim (u0:real^3) u1 s3 m = dihV u0 u1 s3 m`);
3695 (MATCH_MP_TAC AZIM_DIHV_SAME);
3696 (ASM_REWRITE_TAC[]);
3699 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3700 (EXISTS_TAC `m:real^3`);
3701 (ASM_REWRITE_TAC[]);
3702 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3703 (EXISTS_TAC `s3:real^3`);
3704 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
3705 (ASM_REWRITE_TAC[]);
3707 (REWRITE_TAC[dihX]);
3710 (UNDISCH_TAC `~NULLSET (X INTER D)`);
3712 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3713 (EXISTS_TAC `X:real^3->bool`);
3714 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
3715 (UP_ASM_TAC THEN MESON_TAC[]);
3719 (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
3720 (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
3723 initial_sublist [u0; u1] ul)`);
3725 (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
3726 (MATCH_MP_TAC SELECT_AX);
3727 (EXISTS_TAC `(2, vl:(real^3)list)`);
3729 (REWRITE_TAC[BETA_THM]);
3730 (REWRITE_TAC[IN; ARITH_RULE `2 <= 4`] THEN ASM_REWRITE_TAC[]);
3731 (REWRITE_WITH `initial_sublist [u0;u1:real^3] vl /\ LENGTH [u0;u1] = 1 + 1`);
3732 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3733 (ASM_REWRITE_TAC[]);
3735 (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
3736 (MATCH_MP_TAC Marchal_cells.BARV_3_EXPLICIT);
3737 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3738 (UP_ASM_TAC THEN STRIP_TAC);
3739 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3740 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3741 (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
3743 (NEW_GOAL `k' = 2 /\ mcell k' V ul = mcell 2 V vl`);
3744 (MATCH_MP_TAC Ajripqn.AJRIPQN);
3745 (ASM_REWRITE_TAC[]);
3746 (REWRITE_WITH `mcell k' V ul INTER mcell 2 V vl = X`);
3747 (REWRITE_TAC[ASSUME `X = mcell k V vl`; GSYM (ASSUME `X = mcell k' V ul`);
3751 (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE
3752 `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
3754 (UNDISCH_TAC `~NULLSET X` THEN UP_ASM_TAC THEN MESON_TAC[]);
3757 (REWRITE_TAC[dihu2]);
3758 (REWRITE_WITH `omega_list_n V ul 3 = s3`);
3761 (!k. 2 - 1 <= k /\ k <= 3
3762 ==> omega_list_n V ul k = omega_list_n V vl k)`);
3763 (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
3764 (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3,4}`]);
3766 (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3767 ASSUME `k = 2`; ASSUME `k' = 2`]);
3768 (REWRITE_WITH `mcell 2 V ul = X`);
3769 (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);
3770 (ASM_REWRITE_TAC[]);
3771 (UP_ASM_TAC THEN STRIP_TAC);
3772 (FIRST_ASSUM MATCH_MP_TAC);
3775 (REWRITE_WITH `mxi V ul = m`);
3777 (MATCH_MP_TAC MCELL_ID_MXI);
3778 (EXISTS_TAC `2` THEN EXISTS_TAC `2`);
3779 (ASM_REWRITE_TAC[SET_RULE `2 IN {2,3}`]);
3782 (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 1 vl)`);
3783 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3784 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3785 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
3786 CARD (set_of_list vl) = 3 + 1`);
3787 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3788 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3790 (ASM_REWRITE_TAC[HD]);
3792 (REWRITE_WITH `(HD ul):real^3 = HD (truncate_simplex 1 ul)`);
3793 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3794 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
3795 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
3796 CARD (set_of_list ul) = 3 + 1`);
3797 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3798 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3801 (REWRITE_WITH `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3802 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3803 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3807 (MESON_TAC[ASSUME `X = mcell k V vl`; ASSUME `X = mcell k' V ul`;
3808 ASSUME `k = 2`; ASSUME `k' = 2`]);
3809 (REWRITE_WITH `mcell 2 V ul = X`);
3810 (MESON_TAC[ASSUME `X = mcell k' V ul`; ASSUME `k' = 2`]);
3811 (ASM_REWRITE_TAC[]);
3813 (NEW_GOAL `initial_sublist [u0; u1:real^3] ul /\ LENGTH [u0; u1] = 1 + 1`);
3814 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
3815 (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
3816 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
3817 (ASM_REWRITE_TAC[]);
3819 (REWRITE_WITH `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
3820 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3821 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3822 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
3823 CARD (set_of_list ul) = 3 + 1`);
3824 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3825 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3828 (REWRITE_WITH `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
3829 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3830 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
3831 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
3832 CARD (set_of_list ul) = 3 + 1`);
3833 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
3834 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3836 (ASM_REWRITE_TAC[EL; HD; ARITH_RULE `1 = SUC 0`; TL]);
3837 (REWRITE_TAC[DIHV_SYM_2]);
3838 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
3840 (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
3841 (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
3842 (AP_THM_TAC THEN AP_TERM_TAC);
3844 `measurable (conic_cap u0 u1 r d) /\
3845 vol (conic_cap u0 u1 r d) =
3846 (if u1 = u0 \/ &1 <= d \/ r < &0
3848 else &2 / &3 * pi * (&1 - d) * r pow 3)`);
3849 (MATCH_MP_TAC VOLUME_CONIC_CAP);
3851 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3854 (UP_ASM_TAC THEN STRIP_TAC);
3855 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3857 (UP_ASM_TAC THEN UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);
3858 (UP_ASM_TAC THEN UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);
3859 (UP_ASM_TAC THEN MESON_TAC[]);
3861 (REWRITE_WITH `max d (--(&1)) = d`);
3862 (MATCH_MP_TAC (REAL_ARITH `&0 < d ==> max d (--(&1)) = d`));
3864 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
3866 (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *
3867 ((&2 * pi) / (&2 * pi))`);
3869 (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
3870 (MATCH_MP_TAC REAL_DIV_REFL);
3871 (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
3874 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[]);
3875 (UP_ASM_TAC THEN MESON_TAC[]);
3877 (* ========================================================================== *)
3880 (NEW_GOAL `azim (u0:real^3) u1 s3 m =
3881 (if azim u0 u1 m s3 = &0 then &0 else &2 * pi - azim u0 u1 m s3)`);
3882 (MATCH_MP_TAC AZIM_COMPL);
3885 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3886 (EXISTS_TAC `s3:real^3`);
3887 (ASM_REWRITE_TAC[]);
3888 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
3889 (EXISTS_TAC `m:real^3`);
3890 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
3891 (ASM_REWRITE_TAC[]);
3892 (UP_ASM_TAC THEN COND_CASES_TAC);
3894 (NEW_GOAL `(&0 < pi)`);
3895 (REWRITE_TAC[PI_POS]);
3896 (UNDISCH_TAC `~(azim (u0:real^3) u1 m s3 < pi)`);
3897 (ASM_REWRITE_TAC[]);
3898 (UP_ASM_TAC THEN MESON_TAC[]);
3901 (NEW_GOAL `azim (u0:real^3) u1 m s3 = pi`);
3902 (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3903 (UNDISCH_TAC `~coplanar {u0, u1, m, s3:real^3}`);
3904 (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
3905 (ASM_REWRITE_TAC[]);
3906 (UP_ASM_TAC THEN MESON_TAC[]);
3909 (* ========================================================================= *)
3911 (* ========================================================================= *)
3913 (ASM_CASES_TAC `k >= 4`);
3914 (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);
3915 (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);
3916 (MATCH_MP_TAC BARV_3_EXPLICIT);
3917 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
3918 (UP_ASM_TAC THEN STRIP_TAC);
3919 (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
3921 (REWRITE_WITH `u0 = v0:real^3`);
3922 (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);
3923 (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`;
3924 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
3925 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
3927 (REWRITE_WITH `u1 = v1:real^3`);
3928 (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);
3929 (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`;
3930 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3931 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
3932 (ASM_REWRITE_TAC[]);
3933 (UP_ASM_TAC THEN STRIP_TAC);
3935 (ABBREV_TAC `L = aff_ge{u0, u1} {u2, u3:real^3}`);
3937 (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
3939 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`;set_of_list]);
3943 (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
3945 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));
3946 (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
3947 (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
3948 A INTER B SUBSET C INTER B`));
3949 (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, u3}`);
3950 (REWRITE_TAC[DISJOINT]);
3951 (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));
3953 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
3954 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3955 (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);
3956 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list]);
3957 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3958 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
3959 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3960 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
3961 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
3962 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
3963 (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
3964 (UP_ASM_TAC THEN SET_TAC[]);
3965 (REWRITE_TAC[COPLANAR_3]);
3966 (NEW_GOAL `u3 IN {u0, u1:real^3}`);
3967 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3968 (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
3969 (UP_ASM_TAC THEN SET_TAC[]);
3970 (REWRITE_TAC[COPLANAR_3]);
3972 (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, u3:real^3}`; AFF_GE_2_2]);
3973 (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);
3975 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN
3976 EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
3977 (ASM_REWRITE_TAC[]);
3980 (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
3982 (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
3983 (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
3984 GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
3986 (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
3988 (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
3990 (NEW_GOAL `(?b1:real. b1 IN P2 /\ (!x. x IN P2 ==> b1 <= x))`);
3991 (FIRST_ASSUM MATCH_MP_TAC);
3992 (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
3993 (EXISTS_TAC `(f2:(real^3)list -> real) vl`);
3994 (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
3995 (EXISTS_TAC `vl:(real^3)list`);
3996 (ASM_REWRITE_TAC[]);
3997 (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
3998 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4000 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4001 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4002 (EXISTS_TAC `X INTER (C:real^3->bool)`);
4004 (ASM_REWRITE_TAC[]);
4005 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4006 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4007 (MATCH_MP_TAC (SET_RULE
4008 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4010 (MATCH_MP_TAC SUBSET_BALL);
4011 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4012 (MATCH_MP_TAC RCONE_GT_SUBSET);
4013 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4014 (FIRST_X_ASSUM CHOOSE_TAC);
4016 (NEW_GOAL `r2 = (@b. b IN P2 /\ (!x. x IN P2 ==> b <= x:real))`);
4020 (UP_ASM_TAC THEN REWRITE_TAC[]);
4021 (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
4022 (EXISTS_TAC `(f2:(real^3)list -> real) vl`);
4023 (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4024 (EXISTS_TAC `vl:(real^3)list`);
4025 (ASM_REWRITE_TAC[]);
4026 (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4027 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4029 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4030 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4031 (EXISTS_TAC `X INTER (C:real^3->bool)`);
4033 (ASM_REWRITE_TAC[]);
4034 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4035 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4036 (MATCH_MP_TAC (SET_RULE
4037 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4039 (MATCH_MP_TAC SUBSET_BALL);
4040 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4041 (MATCH_MP_TAC RCONE_GT_SUBSET);
4042 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4043 (UP_ASM_TAC THEN MESON_TAC[]);
4046 (ABBREV_TAC `Q1 = (\b:real. b IN P2 /\ (!x. x IN P2 ==> b <= x))`);
4047 (NEW_GOAL `(Q1:real->bool) r2`);
4048 (ASM_REWRITE_TAC[]);
4049 (MATCH_MP_TAC SELECT_AX);
4050 (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
4051 (ASM_REWRITE_TAC[]);
4052 (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
4053 (NEW_GOAL `r2 <= f2 (vl:(real^3)list)`);
4054 (FIRST_ASSUM MATCH_MP_TAC);
4055 (EXPAND_TAC "P2" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4056 (EXISTS_TAC `vl:(real^3)list`);
4057 (ASM_REWRITE_TAC[]);
4058 (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4059 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4061 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4062 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4063 (EXISTS_TAC `X INTER (C:real^3->bool)`);
4065 (ASM_REWRITE_TAC[]);
4066 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4067 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4068 (MATCH_MP_TAC (SET_RULE
4069 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4071 (MATCH_MP_TAC SUBSET_BALL);
4072 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4073 (MATCH_MP_TAC RCONE_GT_SUBSET);
4074 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4076 (UP_ASM_TAC THEN EXPAND_TAC "f2" THEN REWRITE_TAC[EL; HD; TL;
4077 ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`;
4078 ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
4079 (NEW_GOAL `!v. v IN affine hull {u1, u2, u3:real^3} ==> r2 <= dist (u0, v)`);
4081 (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, u3}) u0) <=
4082 dist (u0, v:real^3)`);
4083 (MATCH_MP_TAC CLOSEST_POINT_LE);
4084 (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
4085 (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4087 (NEW_GOAL `r <= dist (u0:real^3, x)`);
4088 (REWRITE_TAC[dist]);
4089 (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);
4090 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4091 (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);
4092 (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
4093 (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) =
4094 (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);
4095 (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 +
4096 t3 /(t2 + t3 + t4) % u2 +
4097 t4 /(t2 + t3 + t4) % u3`);
4098 (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % u3) = (t2 + t3 + t4) % (y:real^3)`);
4100 (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 + t3 / x % u2 + t4 / x % u3) =
4101 (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);
4102 (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
4103 (MATCH_MP_TAC REAL_DIV_REFL);
4104 (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
4107 (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);
4109 (NEW_GOAL `&1 < t2 + t3 + t4`);
4110 (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
4112 (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`);
4113 (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4114 (REWRITE_TAC[GSYM dist]);
4115 (NEW_GOAL `r2 <= dist (u0, y:real^3)`);
4116 (FIRST_ASSUM MATCH_MP_TAC);
4117 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4118 (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
4119 EXISTS_TAC `t4 / (t2 + t3 + t4)`);
4121 (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
4122 (MATCH_MP_TAC REAL_DIV_REFL);
4123 (UP_ASM_TAC THEN REAL_ARITH_TAC);
4124 (ASM_REWRITE_TAC[]);
4126 (NEW_GOAL `r2 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
4127 (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
4128 (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
4129 (MATCH_MP_TAC REAL_LE_MUL);
4130 (REWRITE_TAC[DIST_POS_LE]);
4131 (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4132 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4133 (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4134 (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4136 (* ========================================================================== *)
4138 (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
4140 (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
4141 (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
4142 GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
4144 (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
4146 (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);
4148 (NEW_GOAL `(?b1:real. b1 IN P4 /\ (!x. x IN P4 ==> x <= b1))`);
4149 (FIRST_ASSUM MATCH_MP_TAC);
4150 (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
4151 (EXISTS_TAC `(f4:(real^3)list -> real) vl`);
4152 (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4153 (EXISTS_TAC `vl:(real^3)list`);
4154 (ASM_REWRITE_TAC[]);
4155 (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4156 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4158 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4159 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4160 (EXISTS_TAC `X INTER (C:real^3->bool)`);
4162 (ASM_REWRITE_TAC[]);
4163 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4164 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4165 (MATCH_MP_TAC (SET_RULE
4166 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4168 (MATCH_MP_TAC SUBSET_BALL);
4169 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4170 (MATCH_MP_TAC RCONE_GT_SUBSET);
4171 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4172 (FIRST_X_ASSUM CHOOSE_TAC);
4174 (NEW_GOAL `d2 = (@b. b IN P4 /\ (!x. x IN P4 ==> x <= b:real))`);
4178 (UP_ASM_TAC THEN REWRITE_TAC[]);
4179 (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
4180 (EXISTS_TAC `(f4:(real^3)list -> real) vl`);
4181 (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4182 (EXISTS_TAC `vl:(real^3)list`);
4183 (ASM_REWRITE_TAC[]);
4184 (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4185 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4187 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4188 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4189 (EXISTS_TAC `X INTER (C:real^3->bool)`);
4191 (ASM_REWRITE_TAC[]);
4192 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4193 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4194 (MATCH_MP_TAC (SET_RULE
4195 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4197 (MATCH_MP_TAC SUBSET_BALL);
4198 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4199 (MATCH_MP_TAC RCONE_GT_SUBSET);
4200 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4201 (UP_ASM_TAC THEN MESON_TAC[]);
4204 (ABBREV_TAC `Q1 = (\b:real. b IN P4 /\ (!x. x IN P4 ==> x <= b))`);
4205 (NEW_GOAL `(Q1:real->bool) d2`);
4206 (ASM_REWRITE_TAC[]);
4207 (MATCH_MP_TAC SELECT_AX);
4208 (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
4209 (ASM_REWRITE_TAC[]);
4210 (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
4212 (NEW_GOAL `f4 (vl:(real^3)list) <= d2`);
4213 (FIRST_ASSUM MATCH_MP_TAC);
4214 (EXPAND_TAC "P4" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
4215 (EXISTS_TAC `vl:(real^3)list`);
4216 (ASM_REWRITE_TAC[]);
4217 (REWRITE_WITH `mcell 4 V [u0; u1; u2; u3] = X`);
4218 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4220 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4221 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4222 (EXISTS_TAC `X INTER (C:real^3->bool)`);
4224 (ASM_REWRITE_TAC[]);
4225 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4226 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4227 (MATCH_MP_TAC (SET_RULE
4228 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4230 (MATCH_MP_TAC SUBSET_BALL);
4231 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4232 (MATCH_MP_TAC RCONE_GT_SUBSET);
4233 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4235 (UP_ASM_TAC THEN EXPAND_TAC "f4");
4236 (REWRITE_TAC[EL; HD; TL;
4237 ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`;
4238 ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
4239 (ABBREV_TAC `xx = smallest_angle_line u2 u3 u0 u1`);
4241 (MP_TAC (ASSUME `smallest_angle_line u2 u3 u0 u1 = xx`));
4242 (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
4244 (\x:real^3. x IN convex hull {u2, u3} /\
4245 (!y. y IN convex hull {u2, u3}
4246 ==> ((y - u0) dot (u1 - u0)) /
4247 (norm (y - u0) * norm (u1 - u0)) <=
4248 ((x - u0) dot (u1 - u0)) /
4249 (norm (x - u0) * norm (u1 - u0))))`);
4250 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);
4251 (NEW_GOAL `(Q2:real^3->bool) xx`);
4252 (ONCE_ASM_REWRITE_TAC[]);
4253 (MATCH_MP_TAC SELECT_AX);
4256 (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
4258 (ASM_REWRITE_TAC[]);
4261 (UNDISCH_TAC `~NULLSET (X INTER D)`);
4263 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4264 (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4265 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list;ARITH_RULE `4 >= 4`]);
4266 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4268 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4270 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4271 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4272 (REWRITE_TAC[coplanar]);
4273 (UNDISCH_TAC `u0 IN convex hull {u2, u3:real^3}`);
4274 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
4275 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
4276 EXISTS_TAC `u3:real^3`);
4277 (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
4278 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4279 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4280 (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
4282 (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
4283 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
4284 (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4285 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4288 (UP_ASM_TAC THEN EXPAND_TAC "Q2");
4290 (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) /
4291 (norm (y - u0) * norm (u1 - u0)))`);
4293 (NEW_GOAL `d < (g:real^3->real) x`);
4296 `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
4297 d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);
4298 (MATCH_MP_TAC REAL_LT_RDIV_EQ);
4299 (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
4301 (MATCH_MP_TAC REAL_LE_MUL);
4302 (ASM_REWRITE_TAC[NORM_POS_LE]);
4303 (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);
4304 (ASM_REWRITE_TAC[]);
4305 (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = u0:real^3 <=>
4306 t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3 = (t1 + t2 + t3 + t4) % u0`);
4307 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4308 (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);
4311 (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
4312 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4313 (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4314 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);
4315 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4316 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4317 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4318 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4319 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4320 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
4321 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
4322 (REWRITE_TAC[affine_dependent]);
4323 (EXISTS_TAC `u1:real^3`);
4327 (NEW_GOAL `~(u1 IN {u0, u2, u3:real^3})`);
4329 (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
4330 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4331 (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
4332 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4;set_of_list]);
4333 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4334 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4335 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4336 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4337 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4338 (REWRITE_WITH `{u0, u1, u2, u3} = {u0:real^3,u2, u3}`);
4339 (UP_ASM_TAC THEN SET_TAC[]);
4340 (REWRITE_TAC[COPLANAR_3]);
4342 (REWRITE_WITH `{u0, u1, u2, u3} DELETE u1 = {u0, u2, u3:real^3}`);
4343 (UP_ASM_TAC THEN SET_TAC[]);
4344 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4345 (EXISTS_TAC `(t2 + t3 + t4) / t2`);
4346 (EXISTS_TAC `(-- t3) / t2`);
4347 (EXISTS_TAC `(-- t4) / t2`);
4350 (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);
4352 (MATCH_MP_TAC REAL_DIV_REFL);
4353 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4355 `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3:real^3 <=>
4356 u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % u3)`);
4358 (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % u3 =
4359 (t2 + t3 + t4) % u0:real^3`)]);
4360 (REWRITE_TAC[VECTOR_ARITH
4361 `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);
4362 (REWRITE_TAC[VECTOR_MUL_ASSOC]);
4363 (REWRITE_WITH `&1 / t2 * t2 = &1`);
4364 (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);
4365 (MATCH_MP_TAC REAL_DIV_REFL);
4366 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4369 (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);
4370 (ASM_REWRITE_TAC[]);
4372 (NEW_GOAL `g x <= (g:real^3->real) xx`);
4373 (NEW_GOAL `!y. y IN convex hull {u2 , u3:real^3} ==> g y <= g xx`);
4374 (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);
4375 (NEW_GOAL `&0 < (t3 + t4)`);
4376 (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0) ==> &0 < x`));
4378 (MATCH_MP_TAC REAL_LE_ADD);
4379 (ASM_REWRITE_TAC[]);
4381 (NEW_GOAL `t3 = &0 /\ t4 = &0`);
4382 (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN
4383 UP_ASM_TAC THEN REAL_ARITH_TAC);
4384 (UP_ASM_TAC THEN STRIP_TAC);
4387 (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);
4388 (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);
4389 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4390 (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));
4392 (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) -
4393 (t1 + t2 + t3 + t4) % u0:real^3`);
4394 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4395 (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH
4396 `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`;
4397 DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
4398 (MATCH_MP_TAC REAL_LE_MUL);
4399 (REWRITE_TAC[DOT_POS_LE]);
4400 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4401 (MATCH_MP_TAC REAL_LE_MUL);
4402 (REWRITE_TAC[DIST_POS_LE]);
4403 (MATCH_MP_TAC REAL_LE_MUL);
4404 (REWRITE_TAC[DIST_POS_LE]);
4405 (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);
4407 (UP_ASM_TAC THEN MESON_TAC[]);
4409 (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3:real^3`);
4410 (NEW_GOAL `(g:real^3->real) y <= g xx`);
4411 (FIRST_ASSUM MATCH_MP_TAC);
4412 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
4413 (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
4415 (MATCH_MP_TAC REAL_LE_DIV);
4416 (ASM_SIMP_TAC[REAL_LE_ADD]);
4417 (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);
4418 (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
4419 (MATCH_MP_TAC REAL_DIV_REFL);
4420 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4421 (ASM_REWRITE_TAC[]);
4423 (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 +
4424 t4 / (t1 + t3 + t4) % u3:real^3`);
4425 (NEW_GOAL `(g:real^3->real) y = g w`);
4428 (REWRITE_WITH `y:real^3 - u0 =
4429 &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);
4431 (REWRITE_TAC[VECTOR_ARITH
4432 `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
4433 &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=>
4434 (t3 + t4) / (t3 + t4) % u0 = u0`]);
4435 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4436 (MATCH_MP_TAC REAL_DIV_REFL);
4437 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4439 (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
4441 (REWRITE_WITH `w:real^3 - u0 =
4442 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0)`);
4444 (REWRITE_TAC[VECTOR_ARITH
4445 `(t1 / (t1 + t3 + t4) % u0 +
4446 t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
4447 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=>
4448 (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
4449 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4450 (MATCH_MP_TAC REAL_DIV_REFL);
4451 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`
4452 THEN REAL_ARITH_TAC);
4454 (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
4455 (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
4456 (REWRITE_TAC[REAL_ABS_REFL]);
4457 (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
4458 (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
4459 (REWRITE_TAC[REAL_ABS_REFL]);
4460 (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
4461 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`
4462 THEN REAL_ARITH_TAC);
4463 (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) =
4464 (a * x) / (a * (y * z))`]);
4466 `a1 = norm (t3 % u2 + t4 % u3 - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
4467 (NEW_GOAL `~(a1 = &0)`);
4468 (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0;
4469 VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
4472 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4473 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4474 (EXISTS_TAC `(X:real^3->bool)`);
4476 (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4477 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4478 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4479 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4480 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4481 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4482 (REWRITE_TAC[coplanar]);
4483 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
4484 EXISTS_TAC `u3:real^3`);
4485 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4486 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4487 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4488 (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)`
4489 THEN EXISTS_TAC `t4 / (t3 + t4)`);
4491 (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) =
4492 (t3 + t4) / (t3 + t4)`]);
4493 (MATCH_MP_TAC REAL_DIV_REFL);
4494 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4495 (ASM_REWRITE_TAC[VECTOR_ARITH
4496 `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 =
4497 (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
4498 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4499 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4500 (MATCH_MP_TAC REAL_DIV_REFL);
4501 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4505 (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
4506 (NEW_GOAL `&0 < &1 / (t3 + t4)`);
4507 (MATCH_MP_TAC REAL_LT_DIV);
4508 (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
4509 (UP_ASM_TAC THEN REAL_ARITH_TAC);
4512 `(&1 / (t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4513 (&1 / (t3 + t4) * a1) =
4514 ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
4515 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
4517 (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
4518 (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);
4519 (MATCH_MP_TAC REAL_LT_DIV);
4520 (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
4521 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4523 (UP_ASM_TAC THEN REAL_ARITH_TAC);
4526 `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0))) /
4527 (&1 / (t1 + t3 + t4) * a1) =
4528 ((t3 % u2 + t4 % u3 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
4529 (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
4530 MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
4532 (NEW_GOAL `(g:real^3->real) x <= g w`);
4536 `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
4537 ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
4538 ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <=
4539 ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
4540 (MATCH_MP_TAC RAT_LEMMA4);
4542 (MATCH_MP_TAC REAL_LT_MUL);
4543 (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
4545 (UNDISCH_TAC `~NULLSET (X INTER D)`);
4548 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4549 (EXISTS_TAC `(X:real^3->bool)`);
4551 (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4552 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4553 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4554 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4555 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4556 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4557 (REWRITE_TAC[coplanar]);
4558 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN
4559 EXISTS_TAC `u3:real^3`);
4560 (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
4561 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4562 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4563 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4564 (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2`
4565 THEN EXISTS_TAC `(--t4) / t2`);
4567 (REWRITE_TAC[REAL_ARITH
4568 `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
4569 (MATCH_MP_TAC REAL_DIV_REFL);
4570 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4571 (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
4572 (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4573 (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % u3:real^3 = t2 % u1`);
4574 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
4575 (ASM_REWRITE_TAC[VECTOR_ARITH
4576 `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 =
4577 (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
4578 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4579 (REWRITE_WITH `t2 / t2 = &1`);
4580 (MATCH_MP_TAC REAL_DIV_REFL);
4581 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4585 (MATCH_MP_TAC REAL_LT_MUL);
4586 (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
4587 (EXPAND_TAC "w" THEN STRIP_TAC);
4588 (UNDISCH_TAC `~NULLSET (X INTER D)`);
4591 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4592 (EXISTS_TAC `(X:real^3->bool)`);
4594 (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4595 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4596 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4597 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4598 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4599 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4600 (REWRITE_TAC[coplanar]);
4601 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
4602 EXISTS_TAC `u3:real^3`);
4603 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
4604 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
4605 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
4607 (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)`
4608 THEN EXISTS_TAC `t4 / (t3 + t4)`);
4610 (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) =
4611 (t3 + t4) / (t3 + t4)`]);
4612 (MATCH_MP_TAC REAL_DIV_REFL);
4613 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4614 (ASM_REWRITE_TAC[VECTOR_ARITH
4615 `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 =
4616 (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
4617 (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH
4618 `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 =
4619 (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4620 (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % u3) = u0 <=>
4621 t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0:real^3`);
4622 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4623 (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
4624 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN
4627 (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
4628 <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
4629 (STRIP_TAC THEN ASM_REWRITE_TAC[]);
4630 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
4631 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
4632 (MATCH_MP_TAC REAL_DIV_REFL);
4633 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
4637 (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
4638 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
4639 (REWRITE_TAC[VECTOR_ARITH
4640 `x % (t1 /x % u0 + t3 / x % u2 + t4 /x % u3) =
4641 (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4642 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4643 (MATCH_MP_TAC REAL_DIV_REFL);
4644 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4647 (ABBREV_TAC `t = t1 + t3 + t4`);
4648 (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 =
4649 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
4650 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4651 (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
4652 (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
4653 (REWRITE_TAC[VECTOR_ARITH
4654 `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
4655 (ABBREV_TAC `x1 = u1 - u0:real^3`);
4656 (ABBREV_TAC `x2 = w - u0:real^3`);
4658 (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 =
4659 t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
4660 (REWRITE_TAC[NORM_POW_2]);
4663 (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <=
4664 t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
4665 (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
4666 t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
4667 (MATCH_MP_TAC REAL_LE_MUL);
4668 (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
4669 (MATCH_MP_TAC REAL_LE_MUL);
4670 (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
4672 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4673 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
4676 `t2 * (x2 dot x1) * norm x1 * norm x1 + t * (x2 dot x1) * norm x2 * norm x1 <=
4677 (x2 dot x1) * norm (t2 % x1 + t % x2) * norm (x1:real^3)`);
4679 (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
4680 x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
4681 (MATCH_MP_TAC REAL_LE_MUL);
4683 (MATCH_MP_TAC REAL_LE_MUL);
4684 (REWRITE_TAC[NORM_POS_LE]);
4685 (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
4687 (NEW_GOAL `(g:real^3->real) x <= &0`);
4689 (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
4690 (MATCH_MP_TAC REAL_LE_DIV);
4691 (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
4693 (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
4694 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
4695 (REWRITE_TAC[VECTOR_ARITH
4696 `x % (t1 /x % u0 + t3 / x % u2 + t4 /x % u3) =
4697 (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
4699 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
4700 (MATCH_MP_TAC REAL_DIV_REFL);
4701 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
4705 (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
4706 (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 =
4707 (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
4708 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4709 (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 =
4710 t2 % x1 + t % x2:real^3`);
4711 (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
4712 THEN VECTOR_ARITH_TAC);
4713 (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
4714 (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
4715 (MATCH_MP_TAC REAL_LE_MUL);
4717 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
4718 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4719 (UP_ASM_TAC THEN REAL_ARITH_TAC);
4720 (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
4721 (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
4722 (MATCH_MP_TAC REAL_LE_MUL);
4724 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
4725 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4726 (REWRITE_TAC[DOT_POS_LE]);
4727 (REWRITE_TAC[DOT_LADD]);
4728 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4729 (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);
4730 (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);
4732 (UP_ASM_TAC THEN MESON_TAC[]);
4733 (UP_ASM_TAC THEN REAL_ARITH_TAC);
4735 (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
4736 (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
4737 (AP_THM_TAC THEN AP_TERM_TAC);
4738 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4739 (REWRITE_TAC[REAL_ABS_REFL]);
4740 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
4741 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
4742 (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
4743 (AP_THM_TAC THEN AP_TERM_TAC);
4744 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4745 (REWRITE_TAC[REAL_ABS_REFL]);
4746 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
4747 (REWRITE_TAC[GSYM NORM_MUL]);
4749 `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
4750 (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
4751 (REWRITE_TAC[NORM_TRIANGLE]);
4752 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4753 (UNDISCH_TAC `(g:real^3->real) y <= g xx`);
4754 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
4756 (NEW_GOAL `(g:real^3->real) xx <= d2`);
4757 (FIRST_ASSUM MATCH_MP_TAC);
4759 (EXPAND_TAC "g" THEN EXPAND_TAC "f4");
4760 (REWRITE_TAC[IN_ELIM_THM; IN]);
4761 (EXISTS_TAC `vl:(real^3)list`);
4762 (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`;
4763 TRUNCATE_SIMPLEX_EXPLICIT_1]);
4764 (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
4766 (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4767 (REWRITE_WITH `mcell 4 V vl = mcell k V vl`);
4768 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4769 (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);
4772 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4773 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4774 (EXISTS_TAC `X INTER (C:real^3->bool)`);
4776 (ASM_REWRITE_TAC[]);
4777 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
4778 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
4779 (MATCH_MP_TAC (SET_RULE
4780 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
4782 (MATCH_MP_TAC SUBSET_BALL);
4783 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
4784 (MATCH_MP_TAC RCONE_GT_SUBSET);
4785 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
4787 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");
4791 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4792 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4793 (EXISTS_TAC `(X:real^3->bool)`);
4795 (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4796 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4798 (UP_ASM_TAC THEN MESON_TAC[]);
4800 (* ========================================================================= *)
4802 (NEW_GOAL `~coplanar {u0, u1, u2, u3:real^3}`);
4804 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
4805 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4806 (EXISTS_TAC `X:real^3->bool`);
4808 (ASM_SIMP_TAC[mcell4; MCELL_EXPLICIT; set_of_list]);
4810 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4811 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
4812 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4813 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
4814 (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
4815 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4818 (ASM_CASES_TAC `azim u0 u1 u2 (u3:real^3) < pi`);
4819 (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 u3)`);
4820 (ASM_SIMP_TAC[WEDGE_LUNE]);
4821 (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d =
4822 conic_cap u0 u1 r d INTER L`);
4824 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
4825 (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER
4826 aff_gt {u0, u1} {u2, u3} DIFF conic_cap u0 u1 r d INTER L = {}`);
4828 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
4829 (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
4830 (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
4833 (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
4834 aff_gt {u0, u1} {u2, u3} UNION
4835 UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
4836 (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
4837 (REWRITE_TAC[Geomdetail.FINITE6]);
4838 (REWRITE_TAC[DISJOINT]);
4840 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
4842 (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4843 (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
4844 (UP_ASM_TAC THEN SET_TAC[]);
4845 (REWRITE_TAC[COPLANAR_3]);
4846 (UP_ASM_TAC THEN MESON_TAC[]);
4848 (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
4850 (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4851 (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
4852 (UP_ASM_TAC THEN SET_TAC[]);
4853 (REWRITE_TAC[COPLANAR_3]);
4854 (UP_ASM_TAC THEN MESON_TAC[]);
4855 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4857 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4859 `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
4861 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4863 `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);
4865 (MATCH_MP_TAC NEGLIGIBLE_UNION);
4868 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4869 (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
4871 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
4872 (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
4874 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
4875 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4876 (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);
4878 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
4879 (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);
4881 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
4882 (REWRITE_TAC[SET_RULE
4883 `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} =
4884 aff_ge {u0, u1} ({m, s3} DELETE s3)
4885 UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
4886 (MATCH_MP_TAC (SET_RULE
4887 `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
4889 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
4893 (REWRITE_TAC[DISJOINT]);
4894 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
4896 (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4897 (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u3:real^3}`);
4898 (UP_ASM_TAC THEN SET_TAC[]);
4899 (REWRITE_TAC[COPLANAR_3]);
4900 (UP_ASM_TAC THEN MESON_TAC[]);
4901 (UP_ASM_TAC THEN SET_TAC[]);
4903 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
4906 (REWRITE_TAC[DISJOINT]);
4907 (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
4909 (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
4910 (REWRITE_WITH `{u0, u1, u2, u3} = {u0, u1, u2:real^3}`);
4911 (UP_ASM_TAC THEN SET_TAC[]);
4912 (REWRITE_TAC[COPLANAR_3]);
4913 (UP_ASM_TAC THEN MESON_TAC[]);
4914 (UP_ASM_TAC THEN SET_TAC[]);
4918 (* begin the computation *)
4920 (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
4921 (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 u3) =
4922 (if &1 < d \/ r < &0
4924 else azim u0 u1 u2 u3 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
4925 (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);
4927 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4928 (EXISTS_TAC `u3:real^3`);
4929 (ASM_REWRITE_TAC[]);
4930 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4931 (EXISTS_TAC `u2:real^3`);
4932 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
4933 (ASM_REWRITE_TAC[]);
4935 (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
4938 (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN
4939 UP_ASM_TAC THEN REAL_ARITH_TAC);
4940 (UP_ASM_TAC THEN MESON_TAC[]);
4942 (REWRITE_WITH `azim (u0:real^3) u1 u2 u3 = dihV u0 u1 u2 u3`);
4943 (MATCH_MP_TAC AZIM_DIHV_SAME);
4944 (ASM_REWRITE_TAC[]);
4946 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4947 (EXISTS_TAC `u3:real^3`);
4948 (ASM_REWRITE_TAC[]);
4949 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
4950 (EXISTS_TAC `u2:real^3`);
4951 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
4952 (ASM_REWRITE_TAC[]);
4954 (REWRITE_TAC[dihX]);
4957 (UNDISCH_TAC `~NULLSET (X INTER D)`);
4959 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
4960 (EXISTS_TAC `X:real^3->bool`);
4961 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
4962 (UP_ASM_TAC THEN MESON_TAC[]);
4966 (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
4967 (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
4970 initial_sublist [u0; u1] ul)`);
4972 (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
4973 (MATCH_MP_TAC SELECT_AX);
4974 (EXISTS_TAC `(4, vl:(real^3)list)`);
4976 (REWRITE_TAC[BETA_THM]);
4977 (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);
4979 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4981 (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\
4982 LENGTH [u0;u1] = 1 + 1`);
4983 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
4984 (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4985 (ASM_REWRITE_TAC[]);
4986 (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
4987 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4988 (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
4990 (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);
4991 (MATCH_MP_TAC Ajripqn.AJRIPQN);
4992 (ASM_REWRITE_TAC[]);
4993 (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
4994 (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);
4995 (REWRITE_WITH `mcell 4 V vl = X`);
4996 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
4997 (SET_TAC[ASSUME `X = mcell k' V ul`]);
5000 (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE
5001 `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
5003 (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
5007 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5008 (UP_ASM_TAC THEN MESON_TAC[]);
5011 (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5012 (UP_ASM_TAC THEN MESON_TAC[]);
5015 (REWRITE_TAC[dihu4]);
5017 (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) =
5018 dihV u0 u1 u2 (u3:real^3)`);
5020 (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
5021 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5022 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5024 (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
5025 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5026 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5027 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5028 CARD (set_of_list ul) = 3 + 1`);
5029 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5030 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5033 (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
5034 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5035 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5036 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5037 CARD (set_of_list ul) = 3 + 1`);
5038 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5039 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5042 (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);
5044 {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
5045 convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} =
5046 convex hull {u0, u1,u2,u3:real^3}`);
5047 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5048 (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
5051 (UNDISCH_TAC `~NULLSET X`);
5053 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4;
5054 ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5056 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5057 (MATCH_MP_TAC BARV_3_EXPLICIT);
5058 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5059 (UP_ASM_TAC THEN STRIP_TAC);
5060 (ASM_REWRITE_TAC[set_of_list]);
5061 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5062 (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
5063 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5064 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5065 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5066 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5067 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5069 `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);
5070 (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`;
5071 ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5073 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5075 (UNDISCH_TAC `~NULLSET X`);
5077 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5079 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5080 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
5081 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5082 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5083 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5084 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5085 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5086 (ASM_REWRITE_TAC[]);
5087 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5089 (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);
5090 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5094 (UNDISCH_TAC `~NULLSET X`);
5096 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5097 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5098 (UP_ASM_TAC THEN MESON_TAC[]);
5100 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4;
5101 ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5103 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5104 (MATCH_MP_TAC BARV_3_EXPLICIT);
5105 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5106 (UP_ASM_TAC THEN STRIP_TAC);
5107 (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5108 (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5110 (UNDISCH_TAC `~NULLSET X`);
5112 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4;
5113 ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5116 (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);
5117 (UP_ASM_TAC THEN MESON_TAC[]);
5118 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5119 (UP_ASM_TAC THEN MESON_TAC[]);
5121 (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
5124 (ASM_CASES_TAC `EL 2 ul = u2:real^3`);
5125 (NEW_GOAL `EL 3 ul = u3:real^3`);
5126 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5128 (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);
5129 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5130 (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
5131 GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5132 ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);
5133 (ASM_REWRITE_TAC[]);
5135 (NEW_GOAL `EL 2 ul = u3:real^3`);
5136 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5138 (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);
5139 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5140 (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
5141 GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5142 ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);
5144 (NEW_GOAL `EL 3 ul = u2:real^3`);
5145 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5147 (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);
5148 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5149 (UNDISCH_TAC `~coplanar {u0,u1,u2,u3:real^3}` THEN REWRITE_TAC[
5150 GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5151 ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);
5152 (ASM_REWRITE_TAC[]);
5153 (REWRITE_TAC[DIHV_SYM_2]);
5155 (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
5156 (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
5157 (AP_THM_TAC THEN AP_TERM_TAC);
5160 `measurable (conic_cap u0 u1 r d) /\
5161 vol (conic_cap u0 u1 r d) =
5162 (if u1 = u0 \/ &1 <= d \/ r < &0
5164 else &2 / &3 * pi * (&1 - d) * r pow 3)`);
5165 (MATCH_MP_TAC VOLUME_CONIC_CAP);
5167 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5170 (UP_ASM_TAC THEN STRIP_TAC);
5171 (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
5172 (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5173 (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5174 (UP_ASM_TAC THEN MESON_TAC[]);
5175 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
5177 (REWRITE_WITH `max d (--(&1)) = d`);
5178 (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
5179 (REWRITE_TAC[REAL_NEG_LT0]);
5182 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5186 (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *
5187 ((&2 * pi) / (&2 * pi))`);
5189 (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
5190 (MATCH_MP_TAC REAL_DIV_REFL);
5191 (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
5194 (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
5196 (UP_ASM_TAC THEN MESON_TAC[]);
5198 (* ========================================================================= *)
5201 (ASM_CASES_TAC `azim u0 u1 u3 (u2:real^3) < pi`);
5202 (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
5203 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5205 (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u3 u2)`);
5206 (ASM_SIMP_TAC[WEDGE_LUNE]);
5207 (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d =
5208 conic_cap u0 u1 r d INTER L`);
5210 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
5212 (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER
5213 aff_gt {u0, u1} {u3, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);
5215 (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
5216 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
5217 (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
5218 (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
5220 (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
5222 (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, u3} =
5223 aff_gt {u0, u1} {u2, u3} UNION
5224 UNIONS {aff_ge {u0, u1} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
5225 (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
5226 (REWRITE_TAC[Geomdetail.FINITE6]);
5227 (REWRITE_TAC[DISJOINT]);
5229 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5231 (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5232 (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);
5233 (UP_ASM_TAC THEN SET_TAC[]);
5234 (REWRITE_TAC[COPLANAR_3]);
5235 (UP_ASM_TAC THEN MESON_TAC[]);
5237 (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
5239 (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5240 (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);
5241 (UP_ASM_TAC THEN SET_TAC[]);
5242 (REWRITE_TAC[COPLANAR_3]);
5243 (UP_ASM_TAC THEN MESON_TAC[]);
5244 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5246 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5248 `UNIONS {aff_ge {u0, u1:real^3} ({u2, u3} DELETE a) | a | a IN {u2, u3}}`);
5250 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5252 `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {u3}`);
5254 (MATCH_MP_TAC NEGLIGIBLE_UNION);
5257 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5258 (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
5260 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
5261 (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
5263 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
5264 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5265 (EXISTS_TAC `affine hull {u0, u1:real^3, u3}`);
5267 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
5268 (REWRITE_WITH `{u0,u1,u3:real^3} = {u0,u1} UNION {u3}`);
5270 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
5271 (REWRITE_TAC[SET_RULE
5272 `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} =
5273 aff_ge {u0, u1} ({m, s3} DELETE s3)
5274 UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
5275 (MATCH_MP_TAC (SET_RULE
5276 `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
5278 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
5282 (REWRITE_TAC[DISJOINT]);
5283 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5285 (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5286 (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u3:real^3}`);
5287 (UP_ASM_TAC THEN SET_TAC[]);
5288 (REWRITE_TAC[COPLANAR_3]);
5289 (UP_ASM_TAC THEN MESON_TAC[]);
5290 (UP_ASM_TAC THEN SET_TAC[]);
5292 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
5295 (REWRITE_TAC[DISJOINT]);
5296 (ASM_CASES_TAC `u3 IN {u0, u1:real^3}`);
5298 (UNDISCH_TAC `~coplanar {u0, u1, u3, u2:real^3}`);
5299 (REWRITE_WITH `{u0, u1, u3, u2} = {u0, u1, u2:real^3}`);
5300 (UP_ASM_TAC THEN SET_TAC[]);
5301 (REWRITE_TAC[COPLANAR_3]);
5302 (UP_ASM_TAC THEN MESON_TAC[]);
5303 (UP_ASM_TAC THEN SET_TAC[]);
5307 (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
5308 (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u3 u2) =
5309 (if &1 < d \/ r < &0
5311 else azim u0 u1 u3 u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
5312 (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, u3}`);
5314 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5315 (EXISTS_TAC `u3:real^3`);
5316 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5317 (ASM_REWRITE_TAC[]);
5318 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5319 (EXISTS_TAC `u2:real^3`);
5320 (ASM_REWRITE_TAC[]);
5322 (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
5326 (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN
5327 UP_ASM_TAC THEN REAL_ARITH_TAC);
5328 (UP_ASM_TAC THEN MESON_TAC[]);
5330 (REWRITE_WITH `azim (u0:real^3) u1 u3 u2 = dihV u0 u1 u3 u2`);
5331 (MATCH_MP_TAC AZIM_DIHV_SAME);
5332 (ASM_REWRITE_TAC[]);
5335 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5336 (EXISTS_TAC `u2:real^3`);
5337 (ASM_REWRITE_TAC[]);
5338 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5339 (EXISTS_TAC `u3:real^3`);
5340 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5341 (ASM_REWRITE_TAC[]);
5343 (REWRITE_TAC[dihX]);
5346 (UNDISCH_TAC `~NULLSET (X INTER D)`);
5348 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5349 (EXISTS_TAC `X:real^3->bool`);
5350 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
5351 (UP_ASM_TAC THEN MESON_TAC[]);
5355 (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
5356 (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
5359 initial_sublist [u0; u1] ul)`);
5361 (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
5362 (MATCH_MP_TAC SELECT_AX);
5363 (EXISTS_TAC `(4, vl:(real^3)list)`);
5365 (REWRITE_TAC[BETA_THM]);
5366 (REWRITE_TAC[IN; ARITH_RULE `4 <= 4`] THEN ASM_REWRITE_TAC[]);
5368 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5370 (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\
5371 LENGTH [u0;u1] = 1 + 1`);
5372 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5373 (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
5374 (ASM_REWRITE_TAC[]);
5375 (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5376 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
5377 (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
5379 (NEW_GOAL `k' = 4 /\ mcell k' V ul = mcell 4 V vl`);
5380 (MATCH_MP_TAC Ajripqn.AJRIPQN);
5381 (ASM_REWRITE_TAC[]);
5382 (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
5383 (REWRITE_WITH `mcell k' V ul INTER mcell 4 V vl = X`);
5384 (REWRITE_WITH `mcell 4 V vl = X`);
5385 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5386 (SET_TAC[ASSUME `X = mcell k' V ul`]);
5389 (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE
5390 `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
5392 (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
5396 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5397 (UP_ASM_TAC THEN MESON_TAC[]);
5400 (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5401 (UP_ASM_TAC THEN MESON_TAC[]);
5404 (REWRITE_TAC[dihu4]);
5406 (REWRITE_WITH `dihV (EL 0 (ul:(real^3)list)) (EL 1 ul) (EL 2 ul) (EL 3 ul) =
5407 dihV u0 u1 u2 (u3:real^3)`);
5409 (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
5410 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5411 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5413 (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
5414 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5415 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5416 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5417 CARD (set_of_list ul) = 3 + 1`);
5418 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5419 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5422 (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
5423 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5424 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5425 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5426 CARD (set_of_list ul) = 3 + 1`);
5427 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5428 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5431 (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3}`);
5433 {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} = {u0, u1,u2,u3:real^3} <=>
5434 convex hull {EL 0 ul, EL 1 ul, EL 2 ul, EL 3 ul} =
5435 convex hull {u0, u1,u2,u3:real^3}`);
5436 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5437 (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
5440 (UNDISCH_TAC `~NULLSET X`);
5442 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4;
5443 ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5445 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5446 (MATCH_MP_TAC BARV_3_EXPLICIT);
5447 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5448 (UP_ASM_TAC THEN STRIP_TAC);
5449 (ASM_REWRITE_TAC[set_of_list]);
5450 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5451 (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
5452 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5453 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5454 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5455 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5456 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5458 `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, (EL 3 ul):real^3}`);
5459 (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`;
5460 ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5462 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5464 (UNDISCH_TAC `~NULLSET X`);
5466 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5468 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5469 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
5470 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5471 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5472 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5473 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
5474 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
5475 (ASM_REWRITE_TAC[]);
5476 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5478 (REWRITE_WITH `convex hull {u0, u1, u2, u3:real^3} = X`);
5479 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5483 (UNDISCH_TAC `~NULLSET X`);
5485 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4; set_of_list]);
5486 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5487 (UP_ASM_TAC THEN MESON_TAC[]);
5489 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4;
5490 ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5492 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
5493 (MATCH_MP_TAC BARV_3_EXPLICIT);
5494 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5495 (UP_ASM_TAC THEN STRIP_TAC);
5496 (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
5497 (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
5499 (UNDISCH_TAC `~NULLSET X`);
5501 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; mcell4;
5502 ASSUME `X = mcell k' V ul`; ASSUME `k' = 4`]);
5505 (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[]);
5506 (UP_ASM_TAC THEN MESON_TAC[]);
5507 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
5508 (UP_ASM_TAC THEN MESON_TAC[]);
5510 (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
5513 (ASM_CASES_TAC `EL 2 ul = u2:real^3`);
5514 (NEW_GOAL `EL 3 ul = u3:real^3`);
5515 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5517 (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`);
5518 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5519 (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5521 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5523 GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5524 ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2:real^3}`; COPLANAR_3]);
5525 (ASM_REWRITE_TAC[]);
5527 (NEW_GOAL `EL 2 ul = u3:real^3`);
5528 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5530 (NEW_GOAL `{u0:real^3, u1, EL 2 ul, EL 3 ul} = {u0, u1, EL 3 ul}`);
5531 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5532 (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5534 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5537 GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5538 ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0,u1:real^3, EL 3 ul}`; COPLANAR_3]);
5539 (NEW_GOAL `EL 3 ul = u2:real^3`);
5540 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
5542 (NEW_GOAL `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`);
5543 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5544 (UNDISCH_TAC `~coplanar {u0,u1,u3,u2:real^3}`);
5546 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
5549 GSYM (ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u2, u3:real^3}`);
5550 ASSUME `{u0, u1, EL 2 ul, EL 3 ul} = {u0, u1, u3:real^3}`; COPLANAR_3]);
5551 (ASM_REWRITE_TAC[]);
5552 (REWRITE_TAC[DIHV_SYM_2]);
5554 (REWRITE_TAC[DIHV_SYM_2]);
5555 (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
5556 (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
5557 (AP_THM_TAC THEN AP_TERM_TAC);
5560 `measurable (conic_cap u0 u1 r d) /\
5561 vol (conic_cap u0 u1 r d) =
5562 (if u1 = u0 \/ &1 <= d \/ r < &0
5564 else &2 / &3 * pi * (&1 - d) * r pow 3)`);
5565 (MATCH_MP_TAC VOLUME_CONIC_CAP);
5567 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5570 (UP_ASM_TAC THEN STRIP_TAC);
5571 (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
5572 (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5573 (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5574 (UP_ASM_TAC THEN MESON_TAC[]);
5576 (REWRITE_WITH `max d (--(&1)) = d`);
5577 (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
5578 (REWRITE_TAC[REAL_NEG_LT0]);
5581 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
5585 (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *
5586 ((&2 * pi) / (&2 * pi))`);
5588 (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
5589 (MATCH_MP_TAC REAL_DIV_REFL);
5590 (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
5593 (UP_ASM_TAC THEN UNDISCH_TAC `k' = 4 /\ mcell k' V ul = mcell 4 V vl`
5595 (UP_ASM_TAC THEN MESON_TAC[]);
5597 (* ========================================================================== *)
5600 (NEW_GOAL `azim (u0:real^3) u1 u3 u2 =
5601 (if azim u0 u1 u2 u3 = &0 then &0 else &2 * pi - azim u0 u1 u2 u3)`);
5602 (MATCH_MP_TAC AZIM_COMPL);
5605 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5606 (EXISTS_TAC `u3:real^3`);
5607 (ASM_REWRITE_TAC[]);
5608 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
5609 (EXISTS_TAC `u2:real^3`);
5610 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
5611 (ASM_REWRITE_TAC[]);
5612 (UP_ASM_TAC THEN COND_CASES_TAC);
5614 (NEW_GOAL `(&0 < pi)`);
5615 (REWRITE_TAC[PI_POS]);
5616 (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 u3 < pi)`);
5617 (ASM_REWRITE_TAC[]);
5618 (UP_ASM_TAC THEN MESON_TAC[]);
5621 (NEW_GOAL `azim (u0:real^3) u1 u2 u3 = pi`);
5622 (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5623 (UNDISCH_TAC `~coplanar {u0, u1, u2, u3:real^3}`);
5624 (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
5625 (ASM_REWRITE_TAC[]);
5626 (UP_ASM_TAC THEN MESON_TAC[]);
5628 (* ========================================================================= *)
5630 (* ========================================================================= *)
5633 (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
5634 (NEW_GOAL `?u2 u3. vl = [u0; u1;u2;u3:real^3]`);
5635 (NEW_GOAL `?v0 v1 u2 u3. vl = [v0; v1;u2;u3:real^3]`);
5636 (MATCH_MP_TAC BARV_3_EXPLICIT);
5637 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5638 (UP_ASM_TAC THEN STRIP_TAC);
5639 (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
5641 (REWRITE_WITH `u0 = v0:real^3`);
5642 (REWRITE_WITH `v0:real^3 = HD (truncate_simplex 1 vl)`);
5643 (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`;
5644 TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
5645 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD]);
5647 (REWRITE_WITH `u1 = v1:real^3`);
5648 (REWRITE_WITH `v1:real^3 = HD (TL (truncate_simplex 1 vl))`);
5649 (REWRITE_TAC[ASSUME `vl = [v0;v1;u2;u3:real^3]`;
5650 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
5651 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
5652 (ASM_REWRITE_TAC[]);
5653 (UP_ASM_TAC THEN STRIP_TAC);
5655 (ABBREV_TAC `L = aff_ge{u0, u1} {u2, mxi V vl}`);
5657 (REWRITE_WITH `vol (X INTER D) = vol (L INTER D)`);
5659 (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2;
5660 mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5662 (ABBREV_TAC `m = mxi V vl`);
5663 (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);
5664 (EXPAND_TAC "m" THEN DEL_TAC THEN ASM_REWRITE_TAC[]);
5667 (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
5669 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER X SUBSET B INTER X`));
5670 (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
5671 (MATCH_MP_TAC (SET_RULE `(!x. x IN A /\ x IN B ==> x IN C) ==>
5672 A INTER B SUBSET C INTER B`));
5673 (NEW_GOAL `DISJOINT {u0,u1:real^3} {u2, m}`);
5674 (REWRITE_TAC[DISJOINT]);
5675 (MATCH_MP_TAC (MESON[] `(~A:bool ==> F) ==> A`));
5677 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5678 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5679 (EXISTS_TAC `X:real^3->bool` THEN REWRITE_TAC[SET_RULE `A INTER X SUBSET A`]);
5681 (ASM_SIMP_TAC[MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2;
5682 mcell3; set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
5683 (REWRITE_WITH `mxi V [u0; u1; u2; u3] = m`);
5684 (EXPAND_TAC "m" THEN REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
5685 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5686 (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
5687 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
5688 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
5689 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
5691 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
5692 (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
5693 (UP_ASM_TAC THEN SET_TAC[]);
5694 (REWRITE_TAC[COPLANAR_3]);
5695 (NEW_GOAL `m IN {u0, u1:real^3}`);
5696 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5697 (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
5698 (UP_ASM_TAC THEN SET_TAC[]);
5699 (REWRITE_TAC[COPLANAR_3]);
5701 (SIMP_TAC[ASSUME `DISJOINT {u0, u1} {u2, m:real^3}`; AFF_GE_2_2]);
5702 (REWRITE_TAC[CONVEX_HULL_4; IN; IN_ELIM_THM]);
5704 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN
5705 EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
5706 (ASM_REWRITE_TAC[]);
5709 (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
5711 (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
5712 (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5713 GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
5715 (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
5717 (REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
5719 (NEW_GOAL `(?b1:real. b1 IN P1 /\ (!x. x IN P1 ==> b1 <= x))`);
5720 (FIRST_ASSUM MATCH_MP_TAC);
5721 (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5722 (EXISTS_TAC `(f1:(real^3)list -> real) vl`);
5723 (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5724 (EXISTS_TAC `vl:(real^3)list`);
5725 (ASM_REWRITE_TAC[]);
5726 (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5727 (ASM_REWRITE_TAC[]);
5729 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5730 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5731 (EXISTS_TAC `X INTER (C:real^3->bool)`);
5733 (ASM_REWRITE_TAC[]);
5734 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5735 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5736 (MATCH_MP_TAC (SET_RULE
5737 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5739 (MATCH_MP_TAC SUBSET_BALL);
5740 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5741 (MATCH_MP_TAC RCONE_GT_SUBSET);
5742 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5743 (FIRST_X_ASSUM CHOOSE_TAC);
5745 (NEW_GOAL `r1 = (@b. b IN P1 /\ (!x. x IN P1 ==> b <= x:real))`);
5749 (UP_ASM_TAC THEN REWRITE_TAC[]);
5750 (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5751 (EXISTS_TAC `(f1:(real^3)list -> real) vl`);
5752 (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5753 (EXISTS_TAC `vl:(real^3)list`);
5754 (ASM_REWRITE_TAC[]);
5755 (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5758 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5759 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5760 (EXISTS_TAC `X INTER (C:real^3->bool)`);
5762 (ASM_REWRITE_TAC[]);
5763 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5764 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5765 (MATCH_MP_TAC (SET_RULE
5766 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5768 (MATCH_MP_TAC SUBSET_BALL);
5769 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5770 (MATCH_MP_TAC RCONE_GT_SUBSET);
5771 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5772 (UP_ASM_TAC THEN MESON_TAC[]);
5775 (ABBREV_TAC `Q1 = (\b:real. b IN P1 /\ (!x. x IN P1 ==> b <= x))`);
5776 (NEW_GOAL `(Q1:real->bool) r1`);
5777 (ASM_REWRITE_TAC[]);
5778 (MATCH_MP_TAC SELECT_AX);
5779 (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
5780 (ASM_REWRITE_TAC[]);
5781 (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
5782 (NEW_GOAL `r1 <= f1 (vl:(real^3)list)`);
5783 (FIRST_ASSUM MATCH_MP_TAC);
5784 (EXPAND_TAC "P1" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5785 (EXISTS_TAC `vl:(real^3)list`);
5786 (ASM_REWRITE_TAC[]);
5787 (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5788 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
5790 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5791 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5792 (EXISTS_TAC `X INTER (C:real^3->bool)`);
5794 (ASM_REWRITE_TAC[]);
5795 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5796 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5797 (MATCH_MP_TAC (SET_RULE
5798 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5800 (MATCH_MP_TAC SUBSET_BALL);
5801 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5802 (MATCH_MP_TAC RCONE_GT_SUBSET);
5803 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5805 (UP_ASM_TAC THEN EXPAND_TAC "f1" THEN REWRITE_TAC[EL; HD; TL;
5806 ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`;
5807 ASSUME `vl= [u0; u1; u2; u3:real^3]`]);
5808 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
5810 (REWRITE_TAC[ASSUME `vl = [u0;u1;u2;u3:real^3]`]);
5813 (NEW_GOAL `!v. v IN affine hull {u1, u2, m:real^3} ==> r1 <= dist (u0, v)`);
5815 (NEW_GOAL `dist (u0,closest_point (affine hull {u1, u2, m}) u0) <=
5816 dist (u0, v:real^3)`);
5817 (MATCH_MP_TAC CLOSEST_POINT_LE);
5818 (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
5819 (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5821 (NEW_GOAL `r <= dist (u0:real^3, x)`);
5822 (REWRITE_TAC[dist]);
5823 (REWRITE_WITH `u0:real^3 - x = (t1 + t2 + t3 + t4) % u0 - x`);
5824 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
5825 (REWRITE_TAC[VECTOR_ADD_RDISTRIB]);
5826 (ASM_REWRITE_TAC[VECTOR_ARITH `(t1 % u0 + t2 % u0 + t3 % u0 + t4 % u0) -
5827 (t1 % u0 + t2 % u1 + t3 % u2 + t4 % u3) =
5828 (t2 + t3 + t4) % u0 - (t2 % u1 + t3 % u2 + t4 % u3)`]);
5829 (ABBREV_TAC `y:real^3 = t2 /(t2 + t3 + t4) % u1 +
5830 t3 /(t2 + t3 + t4) % u2 +
5831 t4 /(t2 + t3 + t4) % m`);
5832 (REWRITE_WITH `(t2 % u1 + t3 % u2 + t4 % m) = (t2 + t3 + t4) % (y:real^3)`);
5834 (REWRITE_TAC[VECTOR_ARITH `x % (t2 / x % u1 + t3 / x % u2 + t4 / x % u3) =
5835 (x / x) % (t2 % u1 + t3 % u2 + t4 % u3)`]);
5836 (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
5837 (MATCH_MP_TAC REAL_DIV_REFL);
5838 (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
5841 (REWRITE_TAC[VECTOR_ARITH `a % x - a % y = a % (x - y)`; NORM_MUL]);
5843 (NEW_GOAL `&1 < t2 + t3 + t4`);
5844 (UNDISCH_TAC `t1 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`);
5846 (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`);
5847 (REWRITE_TAC[REAL_ABS_REFL] THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5848 (REWRITE_TAC[GSYM dist]);
5849 (NEW_GOAL `r1 <= dist (u0, y:real^3)`);
5850 (FIRST_ASSUM MATCH_MP_TAC);
5851 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
5852 (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN
5853 EXISTS_TAC `t4 / (t2 + t3 + t4)`);
5855 (REWRITE_TAC[REAL_ARITH `a / x + b / x + c / x = (a+b+c)/ x`]);
5856 (MATCH_MP_TAC REAL_DIV_REFL);
5857 (UP_ASM_TAC THEN REAL_ARITH_TAC);
5858 (ASM_REWRITE_TAC[]);
5860 (NEW_GOAL `r1 <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
5861 (NEW_GOAL `dist (u0,y) <= (t2 + t3 + t4) * dist (u0,y:real^3)`);
5862 (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
5863 (MATCH_MP_TAC REAL_LE_MUL);
5864 (REWRITE_TAC[DIST_POS_LE]);
5865 (DEL_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5866 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5867 (EXPAND_TAC "r" THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5868 (UNDISCH_TAC `dist (u0, x:real^3) < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5870 (* ========================================================================== *)
5872 (REWRITE_TAC[REAL_ARITH `&0 <= a <=> (a < &0 ==> F)`]);
5874 (UNDISCH_TAC `conic_cap (u0:real^3) u1 r d x`);
5875 (REWRITE_TAC[MESON[IN] `conic_cap u0 u1 r d x <=> x IN conic_cap u0 u1 r d`;
5876 GSYM (ASSUME `D = conic_cap (u0:real^3) u1 r d`)]);
5878 (REWRITE_TAC[IN_INTER; MESON[] `~(x:bool /\ y) <=> (~x \/ ~y)`]);
5880 (REWRITE_TAC[IN; IN_ELIM_THM; rcone_gt; rconesgn] THEN STRIP_TAC);
5882 (NEW_GOAL `(?b1:real. b1 IN P3 /\ (!x. x IN P3 ==> x <= b1))`);
5883 (FIRST_ASSUM MATCH_MP_TAC);
5884 (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5885 (EXISTS_TAC `(f3:(real^3)list -> real) vl`);
5886 (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5887 (EXISTS_TAC `vl:(real^3)list`);
5888 (ASM_REWRITE_TAC[]);
5889 (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5890 (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5892 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5893 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5894 (EXISTS_TAC `X INTER (C:real^3->bool)`);
5896 (ASM_REWRITE_TAC[]);
5897 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5898 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5899 (MATCH_MP_TAC (SET_RULE
5900 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5902 (MATCH_MP_TAC SUBSET_BALL);
5903 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5904 (MATCH_MP_TAC RCONE_GT_SUBSET);
5905 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5906 (FIRST_X_ASSUM CHOOSE_TAC);
5908 (NEW_GOAL `d1 = (@b. b IN P3 /\ (!x. x IN P3 ==> x <= b:real))`);
5912 (UP_ASM_TAC THEN REWRITE_TAC[]);
5913 (REWRITE_TAC[SET_RULE `~(X = {}) <=> (?x. x IN X)`]);
5914 (EXISTS_TAC `(f3:(real^3)list -> real) vl`);
5915 (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5916 (EXISTS_TAC `vl:(real^3)list`);
5917 (ASM_REWRITE_TAC[]);
5918 (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5919 (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5921 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5922 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5923 (EXISTS_TAC `X INTER (C:real^3->bool)`);
5925 (ASM_REWRITE_TAC[]);
5926 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5927 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5928 (MATCH_MP_TAC (SET_RULE
5929 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5931 (MATCH_MP_TAC SUBSET_BALL);
5932 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5933 (MATCH_MP_TAC RCONE_GT_SUBSET);
5934 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5935 (UP_ASM_TAC THEN MESON_TAC[]);
5938 (ABBREV_TAC `Q1 = (\b:real. b IN P3 /\ (!x. x IN P3 ==> x <= b))`);
5939 (NEW_GOAL `(Q1:real->bool) d1`);
5940 (ASM_REWRITE_TAC[]);
5941 (MATCH_MP_TAC SELECT_AX);
5942 (EXISTS_TAC `b1:real` THEN EXPAND_TAC "Q1");
5943 (ASM_REWRITE_TAC[]);
5944 (UP_ASM_TAC THEN EXPAND_TAC "Q1" THEN REPEAT STRIP_TAC);
5946 (NEW_GOAL `f3 (vl:(real^3)list) <= d1`);
5947 (FIRST_ASSUM MATCH_MP_TAC);
5948 (EXPAND_TAC "P3" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
5949 (EXISTS_TAC `vl:(real^3)list`);
5950 (ASM_REWRITE_TAC[]);
5951 (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
5952 (ASM_SIMP_TAC[MCELL_EXPLICIT]);
5954 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
5955 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5956 (EXISTS_TAC `X INTER (C:real^3->bool)`);
5958 (ASM_REWRITE_TAC[]);
5959 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
5960 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
5961 (MATCH_MP_TAC (SET_RULE
5962 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
5964 (MATCH_MP_TAC SUBSET_BALL);
5965 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
5966 (MATCH_MP_TAC RCONE_GT_SUBSET);
5967 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
5969 (UP_ASM_TAC THEN EXPAND_TAC "f3");
5970 (REWRITE_TAC[EL; HD; TL;
5971 ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; ASSUME `mxi V vl = m`;
5972 ASSUME `vl= [u0; u1; u2; u3:real^3]`] THEN STRIP_TAC);
5974 (ABBREV_TAC `xx = smallest_angle_line u2 m u0 u1`);
5976 (MP_TAC (ASSUME `smallest_angle_line u2 m u0 u1 = xx`));
5977 (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
5979 (\x:real^3. x IN convex hull {u2, m} /\
5980 (!y. y IN convex hull {u2, m}
5981 ==> ((y - u0) dot (u1 - u0)) /
5982 (norm (y - u0) * norm (u1 - u0)) <=
5983 ((x - u0) dot (u1 - u0)) /
5984 (norm (x - u0) * norm (u1 - u0))))`);
5985 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN STRIP_TAC);
5986 (NEW_GOAL `(Q2:real^3->bool) xx`);
5987 (ONCE_ASM_REWRITE_TAC[]);
5988 (MATCH_MP_TAC SELECT_AX);
5991 (MATCH_MP_TAC SMALLEST_ANGLE_LINE_EXISTS);
5993 (ASM_REWRITE_TAC[]);
5996 (UNDISCH_TAC `~NULLSET (X INTER D)`);
5998 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
5999 (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
6000 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;TRUNCATE_SIMPLEX_EXPLICIT_2;
6001 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6002 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6004 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6006 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6008 (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6010 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6011 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6012 (REWRITE_TAC[coplanar]);
6013 (UNDISCH_TAC `u0 IN convex hull {u2, m:real^3}`);
6014 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM] THEN STRIP_TAC);
6015 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
6016 EXISTS_TAC `m:real^3`);
6017 (MATCH_MP_TAC (SET_RULE `a IN s /\ b SUBSET s ==> (a INSERT b) SUBSET s`));
6018 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6019 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6020 (EXISTS_TAC `&0` THEN EXISTS_TAC `u:real` THEN EXISTS_TAC `v:real`);
6022 (UNDISCH_TAC `u + v = &1` THEN REAL_ARITH_TAC);
6023 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
6024 (ASM_REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6025 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6028 (UP_ASM_TAC THEN EXPAND_TAC "Q2");
6030 (ABBREV_TAC `g = (\y:real^3. ((y - u0) dot (u1 - u0)) /
6031 (norm (y - u0) * norm (u1 - u0)))`);
6033 (NEW_GOAL `d < (g:real^3->real) x`);
6036 `d < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0:real^3)) <=>
6037 d * (norm (x - u0) * norm (u1 - u0)) < (x - u0) dot (u1 - u0)`);
6038 (MATCH_MP_TAC REAL_LT_RDIV_EQ);
6039 (MATCH_MP_TAC (REAL_ARITH `&0 <= a /\ ~(a = &0) ==> &0 < a`));
6041 (MATCH_MP_TAC REAL_LE_MUL);
6042 (ASM_REWRITE_TAC[NORM_POS_LE]);
6043 (REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0; VECTOR_ARITH `x - y = vec 0 <=> x = y`]);
6044 (ASM_REWRITE_TAC[]);
6045 (REWRITE_WITH `t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = u0:real^3 <=>
6046 t1 % u0 + t2 % u1 + t3 % u2 + t4 % m = (t1 + t2 + t3 + t4) % u0`);
6047 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6048 (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + u = (t1 + t2) % u0 <=> u = t2 % u0`]);
6051 (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
6052 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6053 (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
6054 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list;
6055 TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6056 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6058 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6059 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6061 (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6062 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6063 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6064 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6065 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6066 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6067 (REWRITE_TAC[affine_dependent]);
6068 (EXISTS_TAC `u1:real^3`);
6072 (NEW_GOAL `~(u1 IN {u0, u2, m:real^3})`);
6074 (MP_TAC (ASSUME `~NULLSET (X INTER D)`) THEN REWRITE_TAC[]);
6075 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6076 (EXISTS_TAC `X:real^3->bool` THEN STRIP_TAC);
6077 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3;set_of_list;
6078 TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6079 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6081 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6082 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6083 (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6084 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6085 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6086 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6087 (REWRITE_WITH `{u0, u1, u2, m} = {u0:real^3,u2, m}`);
6088 (UP_ASM_TAC THEN SET_TAC[]);
6089 (REWRITE_TAC[COPLANAR_3]);
6091 (REWRITE_WITH `{u0, u1, u2, m} DELETE u1 = {u0, u2, m:real^3}`);
6092 (UP_ASM_TAC THEN SET_TAC[]);
6093 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6094 (EXISTS_TAC `(t2 + t3 + t4) / t2`);
6095 (EXISTS_TAC `(-- t3) / t2`);
6096 (EXISTS_TAC `(-- t4) / t2`);
6099 (REWRITE_WITH `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`);
6101 (MATCH_MP_TAC REAL_DIV_REFL);
6102 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6104 `u1 = (t2 + t3 + t4) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % m:real^3 <=>
6105 u1 = (&1 / t2) % ((t2 + t3 + t4) % u0 - t3 % u2 - t4 % m)`);
6107 (REWRITE_TAC[GSYM (ASSUME `t2 % u1 + t3 % u2 + t4 % m =
6108 (t2 + t3 + t4) % u0:real^3`)]);
6109 (REWRITE_TAC[VECTOR_ARITH
6110 `(t2 % u1 + t3 % u2 + t4 % u3) - t3 % u2 - t4 % u3 = t2 % u1`]);
6111 (REWRITE_TAC[VECTOR_MUL_ASSOC]);
6112 (REWRITE_WITH `&1 / t2 * t2 = &1`);
6113 (REWRITE_TAC[REAL_ARITH `&1 / t2 * t2 = t2 / t2`]);
6114 (MATCH_MP_TAC REAL_DIV_REFL);
6115 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6118 (REWRITE_TAC[REAL_ARITH `a * b * c < d <=> d > b * c * a`; GSYM dist]);
6119 (ASM_REWRITE_TAC[]);
6121 (NEW_GOAL `g x <= (g:real^3->real) xx`);
6122 (NEW_GOAL `!y. y IN convex hull {u2 , m:real^3} ==> g y <= g xx`);
6123 (EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]);
6124 (NEW_GOAL `&0 < (t3 + t4)`);
6125 (MATCH_MP_TAC (REAL_ARITH `(&0 <= x) /\ ~(x = &0) ==> &0 < x`));
6127 (MATCH_MP_TAC REAL_LE_ADD);
6128 (ASM_REWRITE_TAC[]);
6130 (NEW_GOAL `t3 = &0 /\ t4 = &0`);
6131 (UNDISCH_TAC `&0 <= t3` THEN UNDISCH_TAC `&0 <= t4` THEN
6132 UP_ASM_TAC THEN REAL_ARITH_TAC);
6133 (UP_ASM_TAC THEN STRIP_TAC);
6136 (UNDISCH_TAC `(x - u0) dot (u1 - u0:real^3) > dist (x,u0) * dist (u1,u0) * d`);
6137 (REWRITE_WITH `x = t1 % u0 + t2 % u1:real^3`);
6138 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6139 (MATCH_MP_TAC (REAL_ARITH `a <= &0 /\ &0 <= b ==> ~(a > b)`));
6141 (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 = (t1 % u0 + t2 % u1) -
6142 (t1 + t2 + t3 + t4) % u0:real^3`);
6143 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6144 (REWRITE_TAC[ASSUME `t3 = &0`; ASSUME `t4 = &0`; VECTOR_ARITH
6145 `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`;
6146 DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
6147 (MATCH_MP_TAC REAL_LE_MUL);
6148 (REWRITE_TAC[DOT_POS_LE]);
6149 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6150 (MATCH_MP_TAC REAL_LE_MUL);
6151 (REWRITE_TAC[DIST_POS_LE]);
6152 (MATCH_MP_TAC REAL_LE_MUL);
6153 (REWRITE_TAC[DIST_POS_LE]);
6154 (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c/\ c < &1`);
6156 (UP_ASM_TAC THEN MESON_TAC[]);
6158 (ABBREV_TAC `y = t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % m:real^3`);
6159 (NEW_GOAL `(g:real^3->real) y <= g xx`);
6160 (FIRST_ASSUM MATCH_MP_TAC);
6161 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
6162 (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
6164 (MATCH_MP_TAC REAL_LE_DIV);
6165 (ASM_SIMP_TAC[REAL_LE_ADD]);
6166 (ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV]);
6167 (REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
6168 (MATCH_MP_TAC REAL_DIV_REFL);
6169 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6170 (ASM_REWRITE_TAC[]);
6172 (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % u2 +
6173 t4 / (t1 + t3 + t4) % m:real^3`);
6174 (NEW_GOAL `(g:real^3->real) y = g w`);
6177 (REWRITE_WITH `y:real^3 - u0 =
6178 &1 / (t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);
6180 (REWRITE_TAC[VECTOR_ARITH
6181 `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
6182 &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=>
6183 (t3 + t4) / (t3 + t4) % u0 = u0`]);
6184 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6185 (MATCH_MP_TAC REAL_DIV_REFL);
6186 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6188 (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
6190 (REWRITE_WITH `w:real^3 - u0 =
6191 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % m - (t3 + t4) % u0)`);
6193 (REWRITE_TAC[VECTOR_ARITH
6194 `(t1 / (t1 + t3 + t4) % u0 +
6195 t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
6196 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=>
6197 (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
6198 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6199 (MATCH_MP_TAC REAL_DIV_REFL);
6200 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`
6201 THEN REAL_ARITH_TAC);
6203 (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
6204 (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
6205 (REWRITE_TAC[REAL_ABS_REFL]);
6206 (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
6207 (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
6208 (REWRITE_TAC[REAL_ABS_REFL]);
6209 (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
6210 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1`
6211 THEN REAL_ARITH_TAC);
6212 (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) =
6213 (a * x) / (a * (y * z))`]);
6215 `a1 = norm (t3 % u2 + t4 % m - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
6216 (NEW_GOAL `~(a1 = &0)`);
6217 (EXPAND_TAC "a1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0;
6218 VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
6221 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6222 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6223 (EXISTS_TAC `(X:real^3->bool)`);
6226 (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2;
6227 set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6228 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6230 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6232 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6233 (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6234 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6235 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6236 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6237 (REWRITE_TAC[coplanar]);
6238 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
6239 EXISTS_TAC `m:real^3`);
6240 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6241 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6242 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6243 (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)`
6244 THEN EXISTS_TAC `t4 / (t3 + t4)`);
6246 (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) =
6247 (t3 + t4) / (t3 + t4)`]);
6248 (MATCH_MP_TAC REAL_DIV_REFL);
6249 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6250 (ASM_REWRITE_TAC[VECTOR_ARITH
6251 `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 =
6252 (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
6253 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6254 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6255 (MATCH_MP_TAC REAL_DIV_REFL);
6256 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6260 (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
6261 (NEW_GOAL `&0 < &1 / (t3 + t4)`);
6262 (MATCH_MP_TAC REAL_LT_DIV);
6263 (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
6264 (UP_ASM_TAC THEN REAL_ARITH_TAC);
6267 `(&1 / (t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6268 (&1 / (t3 + t4) * a1) =
6269 ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
6270 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
6272 (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
6273 (NEW_GOAL `&0 < &1 / (t1 + t3 + t4)`);
6274 (MATCH_MP_TAC REAL_LT_DIV);
6275 (ASM_REWRITE_TAC[REAL_ARITH `&0 < &1`]);
6276 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6278 (UP_ASM_TAC THEN REAL_ARITH_TAC);
6281 `(&1 / (t1 + t3 + t4) * ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0))) /
6282 (&1 / (t1 + t3 + t4) * a1) =
6283 ((t3 % u2 + t4 % m - (t3 + t4) % u0) dot (u1 - u0:real^3)) / a1`);
6284 (UP_ASM_TAC THEN UNDISCH_TAC `~(a1 = &0)` THEN
6285 MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
6287 (NEW_GOAL `(g:real^3->real) x <= g w`);
6291 `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
6292 ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
6293 ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <=
6294 ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
6295 (MATCH_MP_TAC RAT_LEMMA4);
6297 (MATCH_MP_TAC REAL_LT_MUL);
6298 (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
6300 (UNDISCH_TAC `~NULLSET (X INTER D)`);
6303 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6304 (EXISTS_TAC `(X:real^3->bool)`);
6306 (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6307 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6308 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6310 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6311 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6312 (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6313 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6314 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6315 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6316 (REWRITE_TAC[coplanar]);
6317 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u2:real^3` THEN
6318 EXISTS_TAC `m:real^3`);
6319 (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
6320 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6321 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6322 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6323 (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2`
6324 THEN EXISTS_TAC `(--t4) / t2`);
6326 (REWRITE_TAC[REAL_ARITH
6327 `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
6328 (MATCH_MP_TAC REAL_DIV_REFL);
6329 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6330 (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
6331 (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6332 (NEW_GOAL `u0 - t1 % u0 - t3 % u2 - t4 % m:real^3 = t2 % u1`);
6333 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
6334 (ASM_REWRITE_TAC[VECTOR_ARITH
6335 `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 =
6336 (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
6337 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6338 (REWRITE_WITH `t2 / t2 = &1`);
6339 (MATCH_MP_TAC REAL_DIV_REFL);
6340 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6344 (MATCH_MP_TAC REAL_LT_MUL);
6345 (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
6346 (EXPAND_TAC "w" THEN STRIP_TAC);
6347 (UNDISCH_TAC `~NULLSET (X INTER D)`);
6350 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6351 (EXISTS_TAC `(X:real^3->bool)`);
6353 (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6354 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6355 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6357 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6358 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6359 (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6360 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6361 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6362 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6363 (REWRITE_TAC[coplanar]);
6364 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
6365 EXISTS_TAC `m:real^3`);
6366 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
6367 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
6368 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
6370 (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)`
6371 THEN EXISTS_TAC `t4 / (t3 + t4)`);
6373 (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) =
6374 (t3 + t4) / (t3 + t4)`]);
6375 (MATCH_MP_TAC REAL_DIV_REFL);
6376 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6377 (ASM_REWRITE_TAC[VECTOR_ARITH
6378 `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 =
6379 (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
6380 (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH
6381 `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 =
6382 (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6383 (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % u2 + t4 % m) = u0 <=>
6384 t1 % u0 + t3 % u2 + t4 % m = (t1 + t3 + t4) % u0:real^3`);
6385 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6386 (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
6387 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 +t3 + t4 = &1` THEN
6390 (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
6391 <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
6392 (STRIP_TAC THEN ASM_REWRITE_TAC[]);
6393 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
6394 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
6395 (MATCH_MP_TAC REAL_DIV_REFL);
6396 (UNDISCH_TAC `&0 < t3 + t4` THEN REAL_ARITH_TAC);
6400 (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
6401 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
6402 (REWRITE_TAC[VECTOR_ARITH
6403 `x % (t1 /x % u0 + t3 / x % u2 + t4 /x % u3) =
6404 (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6405 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6406 (MATCH_MP_TAC REAL_DIV_REFL);
6407 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6410 (ABBREV_TAC `t = t1 + t3 + t4`);
6411 (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 =
6412 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
6413 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6414 (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
6415 (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
6416 (REWRITE_TAC[VECTOR_ARITH
6417 `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
6418 (ABBREV_TAC `x1 = u1 - u0:real^3`);
6419 (ABBREV_TAC `x2 = w - u0:real^3`);
6421 (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 =
6422 t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
6423 (REWRITE_TAC[NORM_POW_2]);
6426 (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <=
6427 t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
6428 (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
6429 t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
6430 (MATCH_MP_TAC REAL_LE_MUL);
6431 (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
6432 (MATCH_MP_TAC REAL_LE_MUL);
6433 (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
6435 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6436 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
6439 `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)`);
6441 (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
6442 x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
6443 (MATCH_MP_TAC REAL_LE_MUL);
6445 (MATCH_MP_TAC REAL_LE_MUL);
6446 (REWRITE_TAC[NORM_POS_LE]);
6447 (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
6449 (NEW_GOAL `(g:real^3->real) x <= &0`);
6451 (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
6452 (MATCH_MP_TAC REAL_LE_DIV);
6453 (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
6455 (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
6456 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
6457 (REWRITE_TAC[VECTOR_ARITH
6458 `x % (t1 /x % u0 + t3 / x % u2 + t4 /x % u3) =
6459 (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
6461 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
6462 (MATCH_MP_TAC REAL_DIV_REFL);
6463 (UNDISCH_TAC `t2 < &0` THEN UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN
6467 (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
6468 (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 =
6469 (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
6470 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
6471 (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 =
6472 t2 % x1 + t % x2:real^3`);
6473 (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
6474 THEN VECTOR_ARITH_TAC);
6475 (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
6476 (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
6477 (MATCH_MP_TAC REAL_LE_MUL);
6479 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
6480 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6481 (UP_ASM_TAC THEN REAL_ARITH_TAC);
6482 (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
6483 (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
6484 (MATCH_MP_TAC REAL_LE_MUL);
6486 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
6487 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6488 (REWRITE_TAC[DOT_POS_LE]);
6489 (REWRITE_TAC[DOT_LADD]);
6490 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6491 (UP_ASM_TAC THEN UNDISCH_TAC `d < (g:real^3->real) x`);
6492 (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1`);
6494 (UP_ASM_TAC THEN MESON_TAC[]);
6495 (UP_ASM_TAC THEN REAL_ARITH_TAC);
6497 (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
6498 (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
6499 (AP_THM_TAC THEN AP_TERM_TAC);
6500 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6501 (REWRITE_TAC[REAL_ABS_REFL]);
6502 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
6503 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
6504 (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
6505 (AP_THM_TAC THEN AP_TERM_TAC);
6506 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6507 (REWRITE_TAC[REAL_ABS_REFL]);
6508 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
6509 (REWRITE_TAC[GSYM NORM_MUL]);
6511 `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
6512 (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
6513 (REWRITE_TAC[NORM_TRIANGLE]);
6514 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6515 (UNDISCH_TAC `(g:real^3->real) y <= g xx`);
6516 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6518 (NEW_GOAL `(g:real^3->real) xx <= d1`);
6519 (FIRST_ASSUM MATCH_MP_TAC);
6521 (EXPAND_TAC "g" THEN EXPAND_TAC "f3");
6522 (REWRITE_TAC[IN_ELIM_THM; IN]);
6523 (EXISTS_TAC `vl:(real^3)list`);
6524 (REWRITE_TAC[ASSUME `barV V 3 vl`; ASSUME `vl = [u0;u1;u2;u3:real^3]`;
6525 TRUNCATE_SIMPLEX_EXPLICIT_1]);
6527 (SIMP_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6528 (REWRITE_WITH `mcell 3 V vl = mcell k V vl`);
6530 (REWRITE_TAC[GSYM (ASSUME `X = mcell k V vl`)]);
6533 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6534 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6535 (EXISTS_TAC `X INTER (C:real^3->bool)`);
6537 (ASM_REWRITE_TAC[]);
6538 (MATCH_MP_TAC (SET_RULE `D SUBSET C ==> X INTER D SUBSET X INTER C`));
6539 (EXPAND_TAC "D" THEN EXPAND_TAC "C");
6540 (MATCH_MP_TAC (SET_RULE
6541 `A SUBSET B /\ C SUBSET D ==> A INTER C SUBSET B INTER D`));
6543 (MATCH_MP_TAC SUBSET_BALL);
6544 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
6545 (MATCH_MP_TAC RCONE_GT_SUBSET);
6546 (EXPAND_TAC "d" THEN REAL_ARITH_TAC);
6549 (SIMP_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
6550 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6552 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6554 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN EXPAND_TAC "d");
6558 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6559 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6560 (EXISTS_TAC `(X:real^3->bool)`);
6562 (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; TRUNCATE_SIMPLEX_EXPLICIT_2;
6563 set_of_list; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6564 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6566 (UP_ASM_TAC THEN MESON_TAC[]);
6568 (* ========================================================================= *)
6570 (ABBREV_TAC `m = mxi V vl`);
6571 (NEW_GOAL `~coplanar {u0, u1, u2, m:real^3}`);
6573 (UNDISCH_TAC `~NULLSET (X INTER D)` THEN REWRITE_TAC[]);
6574 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6575 (EXISTS_TAC `X:real^3->bool`);
6577 (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6579 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6580 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6581 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6583 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6585 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6586 (EXISTS_TAC `affine hull {u0, u1, u2, m:real^3}`);
6587 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6588 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6589 (ASM_REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6590 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6593 (ASM_CASES_TAC `azim u0 u1 u2 (m:real^3) < pi`);
6594 (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 u2 m)`);
6595 (ASM_SIMP_TAC[WEDGE_LUNE]);
6596 (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d =
6597 conic_cap u0 u1 r d INTER L`);
6599 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
6600 (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER
6601 aff_gt {u0, u1} {u2, m} DIFF conic_cap u0 u1 r d INTER L = {}`);
6603 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
6604 (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
6605 (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
6608 (REWRITE_WITH `aff_ge {u0, u1:real^3} {u2, m} =
6609 aff_gt {u0, u1} {u2, m} UNION
6610 UNIONS {aff_ge {u0, u1} ({u2, m} DELETE a) | a | a IN {u2, m}}`);
6611 (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
6612 (REWRITE_TAC[Geomdetail.FINITE6]);
6613 (REWRITE_TAC[DISJOINT]);
6615 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6617 (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6618 (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
6619 (UP_ASM_TAC THEN SET_TAC[]);
6620 (REWRITE_TAC[COPLANAR_3]);
6621 (UP_ASM_TAC THEN MESON_TAC[]);
6623 (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6625 (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6626 (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
6627 (UP_ASM_TAC THEN SET_TAC[]);
6628 (REWRITE_TAC[COPLANAR_3]);
6629 (UP_ASM_TAC THEN MESON_TAC[]);
6630 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6632 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6634 `UNIONS {aff_ge {u0, u1:real^3} ({u2, m} DELETE a) | a | a IN {u2, m}}`);
6636 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6638 `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);
6640 (MATCH_MP_TAC NEGLIGIBLE_UNION);
6643 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6644 (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
6646 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6647 (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
6649 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6650 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6651 (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
6653 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
6654 (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
6656 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
6657 (REWRITE_TAC[SET_RULE
6658 `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} =
6659 aff_ge {u0, u1} ({m, s3} DELETE s3)
6660 UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
6661 (MATCH_MP_TAC (SET_RULE
6662 `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
6664 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6668 (REWRITE_TAC[DISJOINT]);
6669 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
6671 (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6672 (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, m:real^3}`);
6673 (UP_ASM_TAC THEN SET_TAC[]);
6674 (REWRITE_TAC[COPLANAR_3]);
6675 (UP_ASM_TAC THEN MESON_TAC[]);
6676 (UP_ASM_TAC THEN SET_TAC[]);
6678 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
6681 (REWRITE_TAC[DISJOINT]);
6682 (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
6684 (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6685 (REWRITE_WITH `{u0, u1, u2, m} = {u0, u1, u2:real^3}`);
6686 (UP_ASM_TAC THEN SET_TAC[]);
6687 (REWRITE_TAC[COPLANAR_3]);
6688 (UP_ASM_TAC THEN MESON_TAC[]);
6689 (UP_ASM_TAC THEN SET_TAC[]);
6693 (* begin the computation *)
6695 (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
6696 (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 u2 m) =
6697 (if &1 < d \/ r < &0
6699 else azim u0 u1 u2 m / &3 * (&1 - max d (-- &1)) * r pow 3)`);
6700 (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);
6702 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6703 (EXISTS_TAC `m:real^3`);
6704 (ASM_REWRITE_TAC[]);
6705 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6706 (EXISTS_TAC `u2:real^3`);
6707 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6708 (ASM_REWRITE_TAC[]);
6709 (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
6713 (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN
6714 UP_ASM_TAC THEN REAL_ARITH_TAC);
6715 (UP_ASM_TAC THEN MESON_TAC[]);
6717 (REWRITE_WITH `azim (u0:real^3) u1 u2 m = dihV u0 u1 u2 m`);
6718 (MATCH_MP_TAC AZIM_DIHV_SAME);
6719 (ASM_REWRITE_TAC[]);
6721 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6722 (EXISTS_TAC `m:real^3`);
6723 (ASM_REWRITE_TAC[]);
6724 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
6725 (EXISTS_TAC `u2:real^3`);
6726 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6727 (ASM_REWRITE_TAC[]);
6729 (REWRITE_TAC[dihX]);
6732 (UNDISCH_TAC `~NULLSET (X INTER D)`);
6734 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6735 (EXISTS_TAC `X:real^3->bool`);
6736 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
6737 (UP_ASM_TAC THEN MESON_TAC[]);
6741 (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
6742 (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
6745 initial_sublist [u0; u1] ul)`);
6747 (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
6748 (MATCH_MP_TAC SELECT_AX);
6749 (EXISTS_TAC `(3, vl:(real^3)list)`);
6751 (REWRITE_TAC[BETA_THM]);
6752 (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);
6753 (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\
6754 LENGTH [u0;u1] = 1 + 1`);
6755 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6756 (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6757 (ASM_REWRITE_TAC[]);
6758 (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6759 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
6760 (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
6762 (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);
6763 (MATCH_MP_TAC Ajripqn.AJRIPQN);
6764 (ASM_REWRITE_TAC[]);
6765 (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
6766 (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);
6767 (REWRITE_WITH `mcell 3 V vl = X`);
6769 (SET_TAC[ASSUME `X = mcell k' V ul`]);
6772 (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE
6773 `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
6775 (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
6779 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
6780 (UP_ASM_TAC THEN MESON_TAC[]);
6783 (REWRITE_TAC[dihu3]);
6785 (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) =
6786 dihV u0 u1 u2 (m:real^3)`);
6788 (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
6789 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
6790 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
6792 (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
6793 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6794 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6795 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
6796 CARD (set_of_list ul) = 3 + 1`);
6797 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6798 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6801 (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
6802 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6803 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
6804 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
6805 CARD (set_of_list ul) = 3 + 1`);
6806 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6807 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6810 (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);
6812 {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
6813 convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} =
6814 convex hull {u0, u1,u2,m:real^3}`);
6815 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6816 (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
6819 (UNDISCH_TAC `~NULLSET X`);
6821 (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6823 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
6824 (MATCH_MP_TAC BARV_3_EXPLICIT);
6825 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6826 (UP_ASM_TAC THEN STRIP_TAC);
6827 (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2;
6828 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6829 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6830 (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
6831 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6832 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6833 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6834 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6835 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6836 (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);
6837 (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`;
6838 ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
6840 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6842 (UNDISCH_TAC `~NULLSET X`);
6844 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
6845 TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6847 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
6848 (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);
6849 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
6850 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
6851 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
6852 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
6853 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
6854 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6856 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6857 (ASM_REWRITE_TAC[]);
6859 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6861 (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);
6862 (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6864 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6865 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6866 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
6868 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
6871 (UNDISCH_TAC `~NULLSET X`);
6873 (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
6874 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6875 (UP_ASM_TAC THEN MESON_TAC[]);
6877 (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6879 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
6880 (MATCH_MP_TAC BARV_3_EXPLICIT);
6881 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6882 (UP_ASM_TAC THEN STRIP_TAC);
6883 (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
6884 TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
6885 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
6886 (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
6888 (UNDISCH_TAC `~NULLSET X`);
6890 (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
6891 (ASM_REWRITE_TAC[]);
6892 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
6893 (UP_ASM_TAC THEN MESON_TAC[]);
6895 (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
6897 (NEW_GOAL `mxi V ul = m`);
6899 (MATCH_MP_TAC MCELL_ID_MXI);
6900 (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
6901 (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);
6902 (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
6903 (ASM_REWRITE_TAC[]);
6904 (ASM_REWRITE_TAC[HD]);
6905 (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);
6906 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6907 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
6908 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
6909 CARD (set_of_list ul) = 3 + 1`);
6910 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
6911 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6913 (ASM_REWRITE_TAC[HD]);
6914 (ASM_REWRITE_TAC[]);
6917 (NEW_GOAL `EL 2 ul = u2:real^3`);
6918 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
6920 (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);
6921 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6922 (UNDISCH_TAC `~coplanar {u0,u1,u2,m:real^3}` THEN REWRITE_TAC[
6923 GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
6924 ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);
6925 (ASM_REWRITE_TAC[]);
6927 (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
6928 (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
6929 (AP_THM_TAC THEN AP_TERM_TAC);
6932 `measurable (conic_cap u0 u1 r d) /\
6933 vol (conic_cap u0 u1 r d) =
6934 (if u1 = u0 \/ &1 <= d \/ r < &0
6936 else &2 / &3 * pi * (&1 - d) * r pow 3)`);
6937 (MATCH_MP_TAC VOLUME_CONIC_CAP);
6939 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
6942 (UP_ASM_TAC THEN STRIP_TAC);
6943 (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
6944 (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6945 (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
6946 (UP_ASM_TAC THEN MESON_TAC[]);
6947 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
6949 (REWRITE_WITH `max d (--(&1)) = d`);
6950 (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
6951 (REWRITE_TAC[REAL_NEG_LT0]);
6954 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
6958 (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *
6959 ((&2 * pi) / (&2 * pi))`);
6961 (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
6962 (MATCH_MP_TAC REAL_DIV_REFL);
6963 (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
6966 (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
6968 (UP_ASM_TAC THEN MESON_TAC[]);
6970 (* ========================================================================= *)
6972 (ASM_CASES_TAC `azim u0 u1 m (u2:real^3) < pi`);
6973 (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
6974 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
6976 (REWRITE_WITH `vol (L INTER D) = vol (D INTER wedge u0 u1 m u2)`);
6977 (ASM_SIMP_TAC[WEDGE_LUNE]);
6978 (REWRITE_WITH `L INTER conic_cap (u0:real^3) u1 r d =
6979 conic_cap u0 u1 r d INTER L`);
6981 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
6983 (REWRITE_WITH `conic_cap (u0:real^3) u1 r d INTER
6984 aff_gt {u0, u1} {m, u2} DIFF conic_cap u0 u1 r d INTER L = {}`);
6986 (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
6987 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A DIFF C INTER B = {}`));
6988 (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
6989 (REWRITE_TAC[SET_RULE `A UNION {} = A`]);
6991 (REWRITE_TAC[SET_RULE `{a,b} = {b, a}`]);
6993 (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, u2} =
6994 aff_gt {u0, u1} {m, u2} UNION
6995 UNIONS {aff_ge {u0, u1} ({m, u2} DELETE a) | a | a IN {m, u2}}`);
6996 (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
6997 (REWRITE_TAC[Geomdetail.FINITE6]);
6998 (REWRITE_TAC[DISJOINT]);
7000 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
7002 (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
7003 (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);
7004 (UP_ASM_TAC THEN SET_TAC[]);
7005 (REWRITE_TAC[COPLANAR_3]);
7006 (UP_ASM_TAC THEN MESON_TAC[]);
7008 (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
7010 (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
7011 (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);
7012 (UP_ASM_TAC THEN SET_TAC[]);
7013 (REWRITE_TAC[COPLANAR_3]);
7014 (UP_ASM_TAC THEN MESON_TAC[]);
7015 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7017 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7019 `UNIONS {aff_ge {u0, u1:real^3} ({m, u2} DELETE a) | a | a IN {m, u2}}`);
7021 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7023 `aff_ge {u0, u1:real^3} {u2} UNION aff_ge {u0, u1:real^3} {m}`);
7025 (MATCH_MP_TAC NEGLIGIBLE_UNION);
7028 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7029 (EXISTS_TAC `affine hull {u0, u1:real^3, u2}`);
7031 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
7032 (REWRITE_WITH `{u0,u1,u2:real^3} = {u0,u1} UNION {u2}`);
7034 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
7035 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7036 (EXISTS_TAC `affine hull {u0, u1:real^3, m}`);
7038 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
7039 (REWRITE_WITH `{u0,u1,m:real^3} = {u0,u1} UNION {m}`);
7041 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
7042 (REWRITE_TAC[SET_RULE
7043 `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} =
7044 aff_ge {u0, u1} ({m, s3} DELETE s3)
7045 UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
7046 (MATCH_MP_TAC (SET_RULE
7047 `A SUBSET D /\ C SUBSET B ==> A UNION C SUBSET B UNION D`));
7049 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
7053 (REWRITE_TAC[DISJOINT]);
7054 (ASM_CASES_TAC `m IN {u0, u1:real^3}`);
7056 (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
7057 (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, u2:real^3}`);
7058 (UP_ASM_TAC THEN SET_TAC[]);
7059 (REWRITE_TAC[COPLANAR_3]);
7060 (UP_ASM_TAC THEN MESON_TAC[]);
7061 (UP_ASM_TAC THEN SET_TAC[]);
7063 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
7066 (REWRITE_TAC[DISJOINT]);
7067 (ASM_CASES_TAC `u2 IN {u0, u1:real^3}`);
7069 (UNDISCH_TAC `~coplanar {u0, u1, m, u2:real^3}`);
7070 (REWRITE_WITH `{u0, u1, m, u2} = {u0, u1, m:real^3}`);
7071 (UP_ASM_TAC THEN SET_TAC[]);
7072 (REWRITE_TAC[COPLANAR_3]);
7073 (UP_ASM_TAC THEN MESON_TAC[]);
7074 (UP_ASM_TAC THEN SET_TAC[]);
7078 (REWRITE_TAC[ASSUME `D = conic_cap (u0:real^3) u1 r d`]);
7079 (REWRITE_WITH `vol (conic_cap u0 u1 r d INTER wedge u0 u1 m u2) =
7080 (if &1 < d \/ r < &0
7082 else azim u0 u1 m u2 / &3 * (&1 - max d (-- &1)) * r pow 3)`);
7083 (NEW_GOAL `~collinear {u0:real^3, u1, u2} /\ ~collinear {u0, u1, m}`);
7085 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7086 (EXISTS_TAC `m:real^3`);
7087 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
7088 (ASM_REWRITE_TAC[]);
7089 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7090 (EXISTS_TAC `u2:real^3`);
7091 (ASM_REWRITE_TAC[]);
7093 (ASM_SIMP_TAC[VOLUME_CONIC_CAP_WEDGE]);
7097 (UNDISCH_TAC `&0 < r` THEN UNDISCH_TAC `d < &1` THEN
7098 UP_ASM_TAC THEN REAL_ARITH_TAC);
7099 (UP_ASM_TAC THEN MESON_TAC[]);
7101 (REWRITE_WITH `azim (u0:real^3) u1 m u2 = dihV u0 u1 m u2`);
7102 (MATCH_MP_TAC AZIM_DIHV_SAME);
7103 (ASM_REWRITE_TAC[]);
7106 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7107 (EXISTS_TAC `u2:real^3`);
7108 (ASM_REWRITE_TAC[]);
7109 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7110 (EXISTS_TAC `m:real^3`);
7111 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
7112 (ASM_REWRITE_TAC[]);
7114 (REWRITE_TAC[dihX]);
7117 (UNDISCH_TAC `~NULLSET (X INTER D)`);
7119 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7120 (EXISTS_TAC `X:real^3->bool`);
7121 (ASM_REWRITE_TAC[] THEN SET_TAC[]);
7122 (UP_ASM_TAC THEN MESON_TAC[]);
7126 (UP_ASM_TAC THEN REWRITE_TAC[cell_params_d]);
7127 (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
7130 initial_sublist [u0; u1] ul)`);
7132 (NEW_GOAL `(P:num#(real^3)list->bool) ((@) P)`);
7133 (MATCH_MP_TAC SELECT_AX);
7134 (EXISTS_TAC `(3, vl:(real^3)list)`);
7136 (REWRITE_TAC[BETA_THM]);
7137 (REWRITE_TAC[IN; ARITH_RULE `3 <= 4`] THEN ASM_REWRITE_TAC[]);
7139 (REWRITE_WITH `initial_sublist [u0;u1:real^3] [u0; u1; u2; u3] /\
7140 LENGTH [u0;u1] = 1 + 1`);
7141 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
7142 (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
7143 (ASM_REWRITE_TAC[]);
7144 (REWRITE_TAC[LENGTH] THEN ARITH_TAC);
7145 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
7146 (EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
7148 (NEW_GOAL `k' = 3 /\ mcell k' V ul = mcell 3 V vl`);
7149 (MATCH_MP_TAC Ajripqn.AJRIPQN);
7150 (ASM_REWRITE_TAC[]);
7151 (REWRITE_TAC[GSYM (ASSUME `vl = [u0; u1; u2; u3:real^3]`)]);
7152 (REWRITE_WITH `mcell k' V ul INTER mcell 3 V vl = X`);
7153 (REWRITE_WITH `mcell 3 V vl = X`);
7155 (SET_TAC[ASSUME `X = mcell k' V ul`]);
7158 (UNDISCH_TAC `k' <= 4` THEN REWRITE_TAC[ARITH_RULE
7159 `a <= 4 <=> a = 0 \/a = 1 \/ a = 2 \/ a = 3 \/ a = 4`] THEN SET_TAC[]);
7161 (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[]);
7165 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
7166 (UP_ASM_TAC THEN MESON_TAC[]);
7169 (REWRITE_TAC[dihu3]);
7171 (REWRITE_WITH `dihV (EL 0 ul) (EL 1 ul) (EL 2 ul) (mxi V ul) =
7172 dihV u0 u1 u2 (m:real^3)`);
7174 (NEW_GOAL `truncate_simplex 1 ul = [u0;u1:real^3] /\ 1 + 1 <= LENGTH ul`);
7175 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
7176 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
7178 (NEW_GOAL `EL 0 (ul:(real^3)list) = EL 0 (truncate_simplex 1 ul)`);
7179 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7180 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
7181 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
7182 CARD (set_of_list ul) = 3 + 1`);
7183 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7184 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7187 (NEW_GOAL `EL 1 (ul:(real^3)list) = EL 1 (truncate_simplex 1 ul)`);
7188 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7189 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
7190 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
7191 CARD (set_of_list ul) = 3 + 1`);
7192 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7193 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7196 (NEW_GOAL `{EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3}`);
7198 {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} = {u0, u1,u2,m:real^3} <=>
7199 convex hull {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul} =
7200 convex hull {u0, u1,u2,m:real^3}`);
7201 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7202 (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
7205 (UNDISCH_TAC `~NULLSET X`);
7207 (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7209 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
7210 (MATCH_MP_TAC BARV_3_EXPLICIT);
7211 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7212 (UP_ASM_TAC THEN STRIP_TAC);
7213 (ASM_REWRITE_TAC[set_of_list; TRUNCATE_SIMPLEX_EXPLICIT_2;
7214 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7215 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7216 (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
7217 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7218 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7219 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7220 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
7221 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
7222 (UNDISCH_TAC `affine_dependent {EL 0 ul, EL 1 ul, EL 2 ul, mxi V ul}`);
7223 (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`;
7224 ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
7226 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7228 (UNDISCH_TAC `~NULLSET X`);
7230 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7231 TRUNCATE_SIMPLEX_EXPLICIT_2; SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7233 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7234 (EXISTS_TAC `affine hull {u0, u1, u2, mxi V [u0; u1; u2; u3]}`);
7235 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7236 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7237 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7238 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
7239 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
7240 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
7242 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
7243 (ASM_REWRITE_TAC[]);
7245 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7247 (REWRITE_WITH `convex hull {u0, u1, u2, m:real^3} = X`);
7248 (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
7250 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7251 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7252 (REWRITE_WITH `mxi V [u0;u1;u2;u3] = m`);
7254 (REWRITE_TAC[ASSUME `vl = [u0; u1; u2; u3:real^3]`]);
7257 (UNDISCH_TAC `~NULLSET X`);
7259 (ASM_SIMP_TAC[mcell3; MCELL_EXPLICIT; set_of_list]);
7260 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7261 (UP_ASM_TAC THEN MESON_TAC[]);
7263 (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7265 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
7266 (MATCH_MP_TAC BARV_3_EXPLICIT);
7267 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7268 (UP_ASM_TAC THEN STRIP_TAC);
7269 (REWRITE_TAC[set_of_list; ASSUME `ul = [v0; v1; v2; v3:real^3]`;
7270 TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list;
7271 SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7272 (REWRITE_TAC[EL; HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`]);
7274 (UNDISCH_TAC `~NULLSET X`);
7276 (SIMP_TAC[MCELL_EXPLICIT; mcell3; ASSUME `X = mcell k' V ul`; ASSUME `k' = 3`]);
7277 (ASM_REWRITE_TAC[]);
7278 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7279 (UP_ASM_TAC THEN MESON_TAC[]);
7281 (UP_ASM_TAC THEN ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`]);
7283 (NEW_GOAL `mxi V ul = m`);
7285 (MATCH_MP_TAC MCELL_ID_MXI);
7286 (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
7287 (ASM_REWRITE_TAC[SET_RULE `3 IN {2, 3}`]);
7288 (REWRITE_WITH `mcell 3 V [u0; u1; u2; u3] = X`);
7289 (ASM_REWRITE_TAC[]);
7290 (ASM_REWRITE_TAC[HD]);
7291 (REWRITE_WITH `HD (ul) = (HD (truncate_simplex 1 ul)):real^3`);
7292 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7293 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
7294 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
7295 CARD (set_of_list ul) = 3 + 1`);
7296 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7297 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7299 (ASM_REWRITE_TAC[HD]);
7300 (ASM_REWRITE_TAC[]);
7303 (NEW_GOAL `EL 2 ul = u2:real^3`);
7304 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
7306 (NEW_GOAL `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`);
7307 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7308 (UNDISCH_TAC `~coplanar {u0,u1,m,u2:real^3}`);
7310 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
7311 (REWRITE_TAC[GSYM (ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, u2, m:real^3}`);
7312 ASSUME `{u0, u1, EL 2 ul, m} = {u0, u1, m:real^3}`; COPLANAR_3]);
7313 (ASM_REWRITE_TAC[]);
7314 (REWRITE_TAC[DIHV_SYM_2]);
7316 (REWRITE_TAC[REAL_ARITH `a / b * c * d pow 3 = (c/ b * d pow 3) * a`]);
7317 (REWRITE_TAC[REAL_ARITH `a * b / (&2 * c) = (a / (&2 * c)) * b`]);
7318 (AP_THM_TAC THEN AP_TERM_TAC);
7321 `measurable (conic_cap u0 u1 r d) /\
7322 vol (conic_cap u0 u1 r d) =
7323 (if u1 = u0 \/ &1 <= d \/ r < &0
7325 else &2 / &3 * pi * (&1 - d) * r pow 3)`);
7326 (MATCH_MP_TAC VOLUME_CONIC_CAP);
7328 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7331 (UP_ASM_TAC THEN STRIP_TAC);
7332 (UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN MESON_TAC[]);
7333 (UNDISCH_TAC `d < &1` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7334 (UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7335 (UP_ASM_TAC THEN MESON_TAC[]);
7336 (REWRITE_TAC[ARITH_RULE `SUC 0 = 1`]);
7338 (REWRITE_WITH `max d (--(&1)) = d`);
7339 (MATCH_MP_TAC (REAL_ARITH `&0 < d /\ --(&1) < &0 ==> max d (--(&1)) = d`));
7340 (REWRITE_TAC[REAL_NEG_LT0]);
7343 (UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7347 (&2 / &3 * pi * (&1 - d) * r pow 3) / (&2 * pi) = (&1 - d) / &3 * r pow 3 *
7348 ((&2 * pi) / (&2 * pi))`);
7350 (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
7351 (MATCH_MP_TAC REAL_DIV_REFL);
7352 (REWRITE_TAC[REAL_ENTIRE; PI_NZ; REAL_ARITH `~(&2 = &0)`]);
7355 (UP_ASM_TAC THEN UNDISCH_TAC `k' = 3 /\ mcell k' V ul = mcell 3 V vl`
7357 (UP_ASM_TAC THEN MESON_TAC[]);
7359 (* ========================================================================= *)
7362 (NEW_GOAL `azim (u0:real^3) u1 m u2 =
7363 (if azim u0 u1 u2 m = &0 then &0 else &2 * pi - azim u0 u1 u2 m)`);
7364 (MATCH_MP_TAC AZIM_COMPL);
7367 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7368 (EXISTS_TAC `m:real^3`);
7369 (ASM_REWRITE_TAC[]);
7370 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
7371 (EXISTS_TAC `u2:real^3`);
7372 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b, d, c}`]);
7373 (ASM_REWRITE_TAC[]);
7374 (UP_ASM_TAC THEN COND_CASES_TAC);
7376 (NEW_GOAL `(&0 < pi)`);
7377 (REWRITE_TAC[PI_POS]);
7378 (UNDISCH_TAC `~(azim (u0:real^3) u1 u2 m < pi)`);
7379 (ASM_REWRITE_TAC[]);
7380 (UP_ASM_TAC THEN MESON_TAC[]);
7383 (NEW_GOAL `azim (u0:real^3) u1 u2 m = pi`);
7384 (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7385 (UNDISCH_TAC `~coplanar {u0, u1, u2, m:real^3}`);
7386 (REWRITE_TAC[] THEN MATCH_MP_TAC AZIM_EQ_0_PI_IMP_COPLANAR);
7387 (ASM_REWRITE_TAC[]);
7388 (UP_ASM_TAC THEN MESON_TAC[]);
7390 (* ========================================================================= *)
7391 (* ========================================================================= *)
7393 (ABBREV_TAC `E = D INTER wedge_ge u0 u1 n1 n2`);
7395 `s = {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2}`);
7396 (NEW_GOAL `sum s (\t. vol (t INTER E)) = vol (E)`);
7397 (ABBREV_TAC `f = (\t:real^3->bool. t INTER E)`);
7398 (REWRITE_WITH `(\t. vol (t INTER E)) = (\x:real^3->bool. vol (f x))`);
7401 (REWRITE_WITH `sum s (\x:real^3->bool. vol (f x)) = vol (UNIONS (IMAGE f s))`);
7402 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7403 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_UNIONS_IMAGE);
7407 (MATCH_MP_TAC FINITE_SUBSET);
7408 (EXISTS_TAC `{X | mcell_set V X /\ edgeX V X e}`);
7410 (MATCH_MP_TAC FINITE_EDGE_X2);
7411 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7412 (ASM_REWRITE_TAC[]);
7416 (MATCH_MP_TAC MEASURABLE_INTER);
7418 (UP_ASM_TAC THEN EXPAND_TAC "s");
7419 (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7421 (ASM_SIMP_TAC[MEASURABLE_MCELL]);
7423 (REWRITE_TAC[ASSUME `D:real^3->bool = conic_cap u0 u1 r d`]);
7424 (REWRITE_TAC[MEASURABLE_CONIC_CAP_WEDGE_GE]);
7428 (UNDISCH_TAC `(x:real^3->bool) IN s` THEN
7429 UNDISCH_TAC `(y:real^3->bool) IN s` THEN EXPAND_TAC "s");
7430 (REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
7432 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7433 (EXISTS_TAC `x INTER (y:real^3->bool)`);
7434 (ASM_REWRITE_TAC[SET_RULE `(x INTER D) INTER y INTER D SUBSET x INTER y`]);
7435 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
7438 (NEW_GOAL `i' = i /\ mcell i' V ul' = mcell i V ul`);
7439 (MATCH_MP_TAC Ajripqn.AJRIPQN);
7440 (ASM_REWRITE_TAC[SET_RULE `i IN {0, 1, 2, 3, 4} <=>
7441 i = 0 \/ i = 1 \/ i = 2 \/ i = 3 \/ i = 4`]);
7442 (UNDISCH_TAC `i <= 4` THEN UNDISCH_TAC `i' <= 4` THEN ARITH_TAC);
7443 (UNDISCH_TAC `~(x = y:real^3->bool)` THEN ASM_REWRITE_TAC[]);
7446 (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
7449 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
7453 {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2} /\
7454 y = x INTER E} DIFF E = {}`);
7455 (REWRITE_TAC[SET_RULE `A DIFF B = {} <=> A SUBSET B`]);
7456 (REWRITE_TAC[UNIONS_SUBSET; IN; IN_ELIM_THM]);
7458 (REWRITE_TAC[SET_RULE `{} UNION A = A`]);
7460 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7461 (EXISTS_TAC `UNIONS {y | ?x. x IN {X | mcell_set V X /\ NULLSET (X INTER E) /\
7462 ~(X INTER E = {})} /\ y = x INTER E}`);
7464 (MATCH_MP_TAC NEGLIGIBLE_UNIONS);
7468 {X | mcell_set V X /\ NULLSET (X INTER E) /\ ~(X INTER E = {})} /\
7471 {X | mcell_set V X /\ NULLSET (X INTER E) /\ ~(X INTER E = {})} /\
7473 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
7474 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
7476 (MATCH_MP_TAC FINITE_SUBSET);
7477 (EXISTS_TAC `{X | X SUBSET ball (u0, &10) /\ mcell_set V X}`);
7479 (ASM_SIMP_TAC[FINITE_MCELL_SET_LEMMA_2]);
7480 (REWRITE_TAC[SUBSET; IN_BALL; IN; IN_ELIM_THM; mcell_set] THEN
7483 (NEW_GOAL `?v1:real^3. v1 IN x /\ v1 IN D`);
7484 (REWRITE_TAC[GSYM IN_INTER]);
7485 (UNDISCH_TAC `~(x:real^3->bool INTER E = {})` THEN EXPAND_TAC "E" THEN SET_TAC[]);
7486 (UP_ASM_TAC THEN STRIP_TAC);
7487 (NEW_GOAL `dist (u0, x') <= dist (u0, v1:real^3) + dist (v1, x')`);
7489 (NEW_GOAL `dist (u0, v1:real^3) < &1`);
7490 (REWRITE_TAC[GSYM IN_BALL]);
7491 (NEW_GOAL `D SUBSET ball (u0:real^3, &1)`);
7493 (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);
7494 (MATCH_MP_TAC SUBSET_BALL);
7495 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
7496 (UP_ASM_TAC THEN SET_TAC[]);
7497 (UP_ASM_TAC THEN UNDISCH_TAC `v1:real^3 IN D` THEN SET_TAC[]);
7498 (NEW_GOAL `dist (v1,x':real^3) < &8`);
7499 (REWRITE_TAC[GSYM IN_BALL]);
7501 (NEW_GOAL `x SUBSET ball (v1:real^3, &8)`);
7502 (ASM_REWRITE_TAC[]);
7503 (MATCH_MP_TAC MCELL_SUBSET_BALL8);
7504 (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN ASM_REWRITE_TAC[]);
7505 (UNDISCH_TAC `(x:real^3->bool) x'` THEN UP_ASM_TAC THEN SET_TAC[]);
7506 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7507 (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list`);
7508 (ASM_REWRITE_TAC[]);
7510 (REWRITE_TAC[IN; IN_ELIM_THM]);
7512 (REWRITE_TAC[ASSUME `t:real^3->bool = x INTER E`]);
7513 (ASM_REWRITE_TAC[]);
7515 (* ========================================================================= *)
7517 (REWRITE_TAC[SUBSET; IN_UNIONS]);
7520 (NEW_GOAL `?v:real^3. v IN V /\ x IN voronoi_closed V v`);
7521 (ASM_SIMP_TAC[TIWWFYQ]);
7522 (UP_ASM_TAC THEN STRIP_TAC);
7523 (UP_ASM_TAC THEN REWRITE_WITH
7524 `x IN voronoi_closed V v <=> (?vl. vl IN barV V 3 /\ x IN rogers V vl /\
7525 truncate_simplex 0 vl = [v])`);
7526 (ASM_SIMP_TAC[GLTVHUM]);
7527 (REWRITE_TAC[IN] THEN STRIP_TAC);
7528 (NEW_GOAL `?i. i <= 4 /\ x IN mcell i V vl`);
7529 (ASM_SIMP_TAC[IN;SLTSTLO1]);
7530 (UP_ASM_TAC THEN STRIP_TAC);
7532 (ABBREV_TAC `X = mcell i V vl`);
7533 (NEW_GOAL `~NULLSET (X INTER E) ==> F`);
7540 truncate_simplex 1 ul = [u0; u1]`);
7541 (FIRST_ASSUM MATCH_MP_TAC);
7543 (REWRITE_TAC[mcell_set; IN_ELIM_THM; IN]);
7544 (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7545 (ASM_REWRITE_TAC[]);
7547 (UNDISCH_TAC `~NULLSET (X INTER E)` THEN REWRITE_TAC[]);
7548 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7549 (EXISTS_TAC `X INTER (D:real^3->bool)`);
7551 (ASM_REWRITE_TAC[]);
7552 (EXPAND_TAC "E" THEN SET_TAC[]);
7553 (UP_ASM_TAC THEN STRIP_TAC);
7555 (MP_TAC (ASSUME `x IN
7559 {X | mcell_set V X /\
7561 (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7563 (REWRITE_TAC[IN_DIFF; MESON[] `~(A /\ ~B) <=> ~A \/ B`]);
7565 (REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM]);
7566 (EXISTS_TAC `X INTER (E:real^3->bool)`);
7569 (EXISTS_TAC `(X:real^3->bool)`);
7570 (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM] THEN STRIP_TAC);
7571 (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7572 (ASM_REWRITE_TAC[]);
7574 (REWRITE_TAC[edgeX; IN_ELIM_THM]);
7576 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7579 (NEW_GOAL `VX V X = V INTER X`);
7580 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7581 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `(if k < 4 then k else 4)`);
7582 (ASM_REWRITE_TAC[]);
7586 (NEW_GOAL `k >= 4`);
7587 (UP_ASM_TAC THEN ARITH_TAC);
7588 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7589 (UNDISCH_TAC `~NULLSET (X INTER E)` THEN ASM_REWRITE_TAC[]);
7590 (MESON_TAC[NEGLIGIBLE_SUBSET; SET_RULE `A INTER B SUBSET A`]);
7592 (NEW_GOAL `(V:real^3->bool) INTER X =
7593 set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7594 (REWRITE_WITH `X = mcell (if k < 4 then k else 4) V ul`);
7595 (ASM_REWRITE_TAC[]);
7598 (NEW_GOAL `k >= 4`);
7599 (UP_ASM_TAC THEN ARITH_TAC);
7600 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7602 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7603 (ASM_REWRITE_TAC[]);
7605 (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7607 (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7608 (REWRITE_WITH `mcell (if k < 4 then k else 4) V ul = X`);
7609 (ASM_REWRITE_TAC[]);
7612 (NEW_GOAL `k >= 4`);
7613 (UP_ASM_TAC THEN ARITH_TAC);
7614 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7616 (UNDISCH_TAC `~NULLSET (X INTER E)` THEN
7617 REWRITE_TAC[ASSUME `X = {}:real^3->bool`; SET_RULE `{} INTER x = {}`;
7619 (ASM_REWRITE_TAC[]);
7620 (NEW_GOAL `set_of_list (truncate_simplex 1 (ul:(real^3)list)) SUBSET
7621 set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7622 (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
7623 (REWRITE_WITH `LENGTH ul = 3 + 1 /\
7624 CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
7625 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7626 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7627 (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7628 (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`]);
7630 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `truncate_simplex 1 ul = [u0; u1:real^3]`;
7633 (ASM_REWRITE_TAC[]);
7635 (REWRITE_TAC[MESON[IN] `(X:real^3->bool) a <=> a IN X`]);
7636 (REWRITE_TAC[GSYM SUBSET]);
7638 (NEW_GOAL `X SUBSET wedge_ge u0 u1 n1 n2 \/ X SUBSET wedge_ge u0 u1 n2 n1`);
7639 (FIRST_ASSUM MATCH_MP_TAC);
7641 (REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7642 (EXISTS_TAC `k:num` THEN EXISTS_TAC `ul:(real^3)list` THEN ASM_REWRITE_TAC[]);
7644 (REWRITE_TAC[edgeX; IN; IN_ELIM_THM]);
7645 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
7647 (NEW_GOAL `VX V X = V INTER X`);
7648 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7649 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `(if k < 4 then k else 4)`);
7650 (ASM_REWRITE_TAC[]);
7654 (NEW_GOAL `k >= 4`);
7655 (UP_ASM_TAC THEN ARITH_TAC);
7656 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7657 (UNDISCH_TAC `~NULLSET (X INTER E)` THEN ASM_REWRITE_TAC[]);
7658 (MESON_TAC[NEGLIGIBLE_SUBSET; SET_RULE `A INTER B SUBSET A`]);
7660 (NEW_GOAL `(V:real^3->bool) INTER X =
7661 set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7662 (REWRITE_WITH `X = mcell (if k < 4 then k else 4) V ul`);
7663 (ASM_REWRITE_TAC[]);
7666 (NEW_GOAL `k >= 4`);
7667 (UP_ASM_TAC THEN ARITH_TAC);
7668 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7670 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7671 (ASM_REWRITE_TAC[]);
7673 (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7675 (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7676 (REWRITE_WITH `mcell (if k < 4 then k else 4) V ul = X`);
7677 (ASM_REWRITE_TAC[]);
7680 (NEW_GOAL `k >= 4`);
7681 (UP_ASM_TAC THEN ARITH_TAC);
7682 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`; ]);
7684 (UNDISCH_TAC `~NULLSET (X INTER E)` THEN
7685 REWRITE_TAC[ASSUME `X = {}:real^3->bool`; SET_RULE `{} INTER x = {}`;
7687 (ASM_REWRITE_TAC[]);
7688 (NEW_GOAL `set_of_list (truncate_simplex 1 (ul:(real^3)list)) SUBSET
7689 set_of_list (truncate_simplex ((if k < 4 then k else 4) - 1) ul)`);
7690 (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
7691 (REWRITE_WITH `LENGTH ul = 3 + 1 /\
7692 CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
7693 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7694 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7695 (UNDISCH_TAC `2 <= k` THEN ARITH_TAC);
7696 (REWRITE_TAC[MESON[IN] `(s:real^3->bool) u <=> u IN s`]);
7698 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `truncate_simplex 1 ul = [u0; u1:real^3]`;
7702 (UP_ASM_TAC THEN STRIP_TAC);
7705 `X INTER E SUBSET (wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1)`);
7706 (REWRITE_TAC[SUBSET_INTER]);
7708 (EXPAND_TAC "E" THEN SET_TAC[]);
7709 (UP_ASM_TAC THEN SET_TAC[]);
7710 (UNDISCH_TAC `~NULLSET (X INTER E)` THEN REWRITE_TAC[]);
7711 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7712 (EXISTS_TAC `wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1`);
7714 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7715 (EXISTS_TAC `aff_ge {u0,u1} {n1} UNION aff_ge {u0,u1} {n2:real^3}`);
7718 (MATCH_MP_TAC NEGLIGIBLE_UNION);
7720 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7721 (EXISTS_TAC `affine hull {u0,u1,n1:real^3}`);
7722 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
7723 (REWRITE_TAC[SET_RULE `{a,b,c} = {a,b} UNION {c}`;
7724 AFF_GE_SUBSET_AFFINE_HULL]);
7726 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7727 (EXISTS_TAC `affine hull {u0,u1,n2:real^3}`);
7728 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
7729 (REWRITE_TAC[SET_RULE `{a,b,c} = {a,b} UNION {c}`;
7730 AFF_GE_SUBSET_AFFINE_HULL]);
7732 (REWRITE_TAC[ASSUME `wedge_ge u0 u1 n1 n2 INTER wedge_ge u0 u1 n2 n1
7733 SUBSET aff_ge {u0, u1} {n1} UNION aff_ge {u0, u1:real^3} {n2}`]);
7734 (ASM_REWRITE_TAC[]);
7735 (UP_ASM_TAC THEN MESON_TAC[]);
7737 (NEW_GOAL `(x:real^3) IN E`);
7742 {X | mcell_set V X /\
7744 (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7745 y = x INTER E}` THEN SET_TAC[]);
7747 (REWRITE_TAC[MESON[IN] `(X INTER Y) a <=> a IN (X INTER Y)`]);
7748 (REWRITE_TAC[IN_INTER]);
7749 (ASM_REWRITE_TAC[]);
7751 (EXISTS_TAC `X INTER (E:real^3 ->bool)`);
7753 (REWRITE_TAC[IN_ELIM_THM]);
7754 (EXISTS_TAC `X:real^3->bool`);
7755 (ASM_REWRITE_TAC[mcell_set; IN_ELIM_THM]);
7756 (UP_ASM_TAC THEN REWRITE_TAC[IN] THEN REPEAT STRIP_TAC);
7757 (EXISTS_TAC `i:num` THEN EXISTS_TAC `vl:(real^3)list`);
7758 (ASM_REWRITE_TAC[]);
7759 (ASM_REWRITE_TAC[]);
7760 (NEW_GOAL `(x:real^3) IN X INTER E`);
7761 (REWRITE_TAC[IN_INTER]);
7762 (ASM_REWRITE_TAC[]);
7767 {X | mcell_set V X /\
7769 (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7770 y = x INTER E}` THEN SET_TAC[]);
7771 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7773 (REWRITE_TAC[MESON[IN] `(X INTER Y) a <=> a IN (X INTER Y)`]);
7774 (REWRITE_TAC[IN_INTER]);
7775 (ASM_REWRITE_TAC[]);
7780 {X | mcell_set V X /\
7782 (!x. x IN X ==> x IN wedge_ge u0 u1 n1 n2)} /\
7783 y = x INTER E}` THEN SET_TAC[]);
7786 REWRITE_WITH `sum s (\t. vol (t INTER E)) = sum s (\t. vol (t INTER D))`);
7787 (MATCH_MP_TAC SUM_EQ);
7788 (EXPAND_TAC "s" THEN REWRITE_TAC[IN; IN_ELIM_THM; BETA_THM] THEN
7791 (EXPAND_TAC "E" THEN UP_ASM_TAC THEN SET_TAC[]);
7794 (* ========================================================================= *)
7797 `t = {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2 /\
7798 ~NULLSET (X INTER D)}`);
7800 (REWRITE_WITH `sum s (\t. dihX V t (u0,u1)) =
7801 sum t (\t. dihX V t (u0,u1))`);
7802 (MATCH_MP_TAC SUM_SUPERSET);
7803 (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);
7806 (NEW_GOAL `NULLSET (x INTER D)`);
7807 (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );
7810 (NEW_GOAL `mcell_set V x /\ edgeX V x e`);
7812 `x IN {X | mcell_set V X /\ edgeX V X e /\ X SUBSET wedge_ge u0 u1 n1 n2}`);
7813 (REWRITE_TAC[IN; IN_ELIM_THM]);
7815 (UP_ASM_TAC THEN REWRITE_TAC[mcell_set_2; IN_ELIM_THM;IN] THEN STRIP_TAC);
7817 (NEW_GOAL `~NULLSET x`);
7818 (UP_ASM_TAC THEN REWRITE_TAC[edgeX; VX; IN_ELIM_THM]);
7819 (COND_CASES_TAC THEN REPEAT STRIP_TAC);
7820 (UNDISCH_TAC `{} (u:real^3)` THEN REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
7823 (NEW_GOAL `VX V x = V INTER (x:real^3->bool)`);
7824 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7825 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7826 (ASM_REWRITE_TAC[]);
7828 (NEW_GOAL `V INTER (x:real^3->bool) =
7829 set_of_list (truncate_simplex (i - 1) ul)`);
7830 (ASM_REWRITE_TAC[]);
7831 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7832 (ASM_REWRITE_TAC[]);
7834 (ASM_CASES_TAC `i = 0`);
7835 (NEW_GOAL `V INTER (x:real^3->bool) = {}`);
7836 (ASM_REWRITE_TAC[]);
7837 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7838 (ASM_REWRITE_TAC[]);
7840 (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM]);
7842 (UNDISCH_TAC `VX V x u` THEN ASM_REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
7844 (UP_ASM_TAC THEN MESON_TAC[]);
7845 (UP_ASM_TAC THEN ARITH_TAC);
7846 (REWRITE_TAC[GSYM (ASSUME `x = mcell i V ul`)] THEN STRIP_TAC);
7847 (UNDISCH_TAC `~NULLSET x` THEN REWRITE_TAC[ASSUME `x:real^3->bool = {}`;
7850 (NEW_GOAL `(u0:real^3) IN VX V x /\ u1 IN VX V x`);
7851 (UNDISCH_TAC `edgeX V x e` THEN REWRITE_TAC[edgeX; IN_ELIM_THM;
7852 ASSUME `e = {u0, u1:real^3}`]);
7854 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
7856 (* ========================================================================== *)
7859 (ASM_CASES_TAC `i <= 1`);
7860 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7861 (MATCH_MP_TAC BARV_3_EXPLICIT);
7862 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7863 (UP_ASM_TAC THEN STRIP_TAC);
7864 (NEW_GOAL `i - 1 = 0`);
7865 (UNDISCH_TAC `i <= 1` THEN ARITH_TAC);
7866 (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7867 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0; set_of_list]);
7868 (UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7870 (ASM_CASES_TAC `i = 3`);
7871 (NEW_GOAL `vol (x INTER D) > &0`);
7872 (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7873 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7874 (MATCH_MP_TAC BARV_3_EXPLICIT);
7875 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7876 (UP_ASM_TAC THEN STRIP_TAC);
7877 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; TRUNCATE_SIMPLEX_EXPLICIT_2;
7878 set_of_list; SET_RULE `{a,c,d} UNION {x} = {a,c,d,x}`]);
7880 (NEW_GOAL `i - 1 = 2`);
7881 (UNDISCH_TAC `i = 3` THEN ARITH_TAC);
7882 (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7883 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
7885 (NEW_GOAL `?v:real^3. {u0, u1, v} = {v0, v1, v2}`);
7886 (NEW_GOAL `?v:real^3. v IN {v0, v1, v2} DIFF {u0, u1}`);
7887 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7888 (REWRITE_WITH `{v0, v1, v2} DIFF {u0, u1:real^3} = {} <=>
7889 CARD ({v0, v1, v2} DIFF {u0, u1}) = 0`);
7890 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7891 (MATCH_MP_TAC CARD_EQ_0);
7892 (MATCH_MP_TAC FINITE_SUBSET);
7893 (EXISTS_TAC `{v0, v1, v2:real^3}`);
7894 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7895 (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7897 (NEW_GOAL `CARD {v0, v1, v2} = CARD ({v0, v1, v2} DIFF {u0, u1:real^3}) +
7899 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
7900 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7901 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2:real^3}) = 3`);
7902 (REWRITE_WITH `{v0, v1, v2:real^3} = set_of_list (truncate_simplex 2 ul)`);
7903 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
7904 (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
7905 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 2 + 1 /\
7906 CARD (set_of_list xl) = 2 + 1`);
7907 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7908 (EXISTS_TAC `V:real^3->bool` THEN STRIP_TAC);
7909 (ASM_REWRITE_TAC[]);
7910 (EXPAND_TAC "xl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
7911 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
7914 (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);
7915 (REWRITE_TAC[Geomdetail.CARD2]);
7916 (UP_ASM_TAC THEN ARITH_TAC);
7917 (UP_ASM_TAC THEN STRIP_TAC);
7918 (EXISTS_TAC `v:real^3`);
7919 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN
7920 UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
7921 (UP_ASM_TAC THEN STRIP_TAC);
7922 (NEW_GOAL `{v0, v1, v2, mxi V [v0; v1; v2; v3]} =
7923 {u0, u1, v, mxi V [v0; v1; v2; v3]}`);
7924 (UP_ASM_TAC THEN SET_TAC[]);
7925 (ASM_REWRITE_TAC[]);
7926 (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
7927 (ASM_REWRITE_TAC[]);
7929 (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
7930 (REWRITE_TAC[GSYM (ASSUME `{v0, v1, v2, mxi V [v0; v1; v2; v3]} =
7931 {u0, u1, v, mxi V [v0; v1; v2; v3]}`)] THEN STRIP_TAC);
7932 (UNDISCH_TAC `~NULLSET x`);
7933 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7934 TRUNCATE_SIMPLEX_EXPLICIT_2]);
7935 (REWRITE_TAC[SET_RULE `{a,b,c} UNION {d} = {a,b,c,d}`]);
7936 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
7937 (EXISTS_TAC `affine hull {v0, v1, v2, mxi V [v0; v1; v2; v3]}`);
7938 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
7939 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
7940 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
7941 (ASM_REWRITE_TAC[]);
7944 (UNDISCH_TAC `~NULLSET x`);
7945 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; set_of_list;
7946 TRUNCATE_SIMPLEX_EXPLICIT_2]);
7947 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
7948 (UP_ASM_TAC THEN MESON_TAC[]);
7950 (NEW_GOAL `vol (x INTER D) = &0`);
7951 (MATCH_MP_TAC MEASURE_EQ_0);
7952 (ASM_REWRITE_TAC[]);
7953 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7956 (* ========================================== *)
7958 (ASM_CASES_TAC `i = 4`);
7959 (NEW_GOAL `vol (x INTER D) > &0`);
7960 (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
7961 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
7962 (MATCH_MP_TAC BARV_3_EXPLICIT);
7963 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7964 (UP_ASM_TAC THEN STRIP_TAC);
7965 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`;
7968 (NEW_GOAL `i - 1 = 3`);
7969 (UNDISCH_TAC `i = 4` THEN ARITH_TAC);
7970 (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
7971 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; set_of_list]);
7974 (NEW_GOAL `?v w:real^3. {u0, u1, v, w} = {v0, v1, v2, v3}`);
7976 (NEW_GOAL `?v:real^3. v IN {v0, v1, v2, v3} DIFF {u0, u1}`);
7977 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
7978 (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1:real^3} = {} <=>
7979 CARD ({v0, v1, v2, v3} DIFF {u0, u1}) = 0`);
7980 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
7981 (MATCH_MP_TAC CARD_EQ_0);
7982 (MATCH_MP_TAC FINITE_SUBSET);
7983 (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);
7984 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
7985 (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
7987 (NEW_GOAL `CARD {v0, v1, v2, v3} =
7988 CARD ({v0, v1, v2, v3} DIFF {u0, u1:real^3}) + CARD {u0, u1}`);
7989 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
7990 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
7992 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);
7993 (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);
7994 (ASM_REWRITE_TAC[set_of_list]);
7995 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
7996 CARD (set_of_list ul) = 3 + 1`);
7997 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
7998 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7999 (NEW_GOAL `CARD {u0, u1:real^3} <= 2`);
8000 (REWRITE_TAC[Geomdetail.CARD2]);
8001 (UP_ASM_TAC THEN ARITH_TAC);
8002 (UP_ASM_TAC THEN STRIP_TAC);
8004 (NEW_GOAL `?w:real^3. w IN {v0, v1, v2, v3} DIFF {u0, u1, v}`);
8005 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
8006 (REWRITE_WITH `{v0, v1, v2, v3} DIFF {u0, u1, v:real^3} = {} <=>
8007 CARD ({v0, v1, v2, v3} DIFF {u0, u1, v}) = 0`);
8008 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
8009 (MATCH_MP_TAC CARD_EQ_0);
8010 (MATCH_MP_TAC FINITE_SUBSET);
8011 (EXISTS_TAC `{v0, v1, v2, v3:real^3}`);
8012 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
8013 (REWRITE_TAC[ARITH_RULE `~(a = 0) <=> 1 <= a`]);
8015 (NEW_GOAL `CARD ({v0, v1, v2, v3} DIFF {u0, u1,v:real^3}) =
8016 CARD {v0, v1, v2, v3} - CARD {u0,u1,v}`);
8017 (MATCH_MP_TAC CARD_DIFF);
8018 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
8019 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8020 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({v0, v1, v2, v3:real^3}) = 3 + 1`);
8021 (REWRITE_WITH `{v0, v1, v2, v3:real^3} = set_of_list ul`);
8022 (ASM_REWRITE_TAC[set_of_list]);
8023 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
8024 CARD (set_of_list ul) = 3 + 1`);
8025 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
8026 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
8027 (NEW_GOAL `CARD {u0, u1, v:real^3} <= 3`);
8028 (REWRITE_TAC[Geomdetail.CARD3]);
8029 (UP_ASM_TAC THEN ARITH_TAC);
8030 (UP_ASM_TAC THEN STRIP_TAC);
8032 (EXISTS_TAC `v:real^3` THEN EXISTS_TAC `w:real^3`);
8033 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN
8034 UNDISCH_TAC `~(u0 = u1:real^3)` THEN SET_TAC[]);
8035 (UP_ASM_TAC THEN STRIP_TAC);
8036 (REWRITE_TAC[GSYM (ASSUME `{u0:real^3, u1, v, w} = {v0, v1, v2, v3}`)]);
8037 (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
8038 (ASM_REWRITE_TAC[]);
8040 (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
8042 (UNDISCH_TAC `~NULLSET x`);
8043 (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`;
8044 ASSUME `x = mcell i V ul`; ASSUME `i = 4`;
8045 ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
8047 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
8048 (EXISTS_TAC `affine hull {v0, v1, v2, v3:real^3}`);
8049 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
8050 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
8051 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
8052 (ASM_REWRITE_TAC[]);
8053 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
8056 (UNDISCH_TAC `~NULLSET x`);
8057 (SIMP_TAC[MCELL_EXPLICIT; mcell4; set_of_list; ARITH_RULE `4 >= 4`;
8058 ASSUME `x = mcell i V ul`; ASSUME `i = 4`;
8059 ASSUME `ul = [v0; v1; v2; v3:real^3]`]);
8062 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
8063 (UP_ASM_TAC THEN MESON_TAC[]);
8064 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
8065 (UP_ASM_TAC THEN MESON_TAC[]);
8067 (NEW_GOAL `vol (x INTER D) = &0`);
8068 (MATCH_MP_TAC MEASURE_EQ_0);
8069 (ASM_REWRITE_TAC[]);
8070 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
8072 (* ========================================== *)
8075 (UNDISCH_TAC `i <= 4` THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC
8078 (NEW_GOAL `vol (x INTER D) > &0`);
8079 (ONCE_REWRITE_TAC[SET_RULE `a INTER b = b INTER a`]);
8080 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2 ;v3:real^3]`);
8081 (MATCH_MP_TAC BARV_3_EXPLICIT);
8082 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
8083 (UP_ASM_TAC THEN STRIP_TAC);
8084 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; TRUNCATE_SIMPLEX_EXPLICIT_1;
8085 set_of_list; HD; TL]);
8089 (NEW_GOAL `i - 1 = 1`);
8090 (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
8091 (UNDISCH_TAC `u0 IN VX V x /\ u1 IN VX V x`);
8092 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list]);
8094 (NEW_GOAL `{u0, u1} = {v0, v1:real^3}`);
8095 (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `~(u0 = u1:real^3)` THEN
8097 (REWRITE_TAC[SET_RULE `A INTER B INTER C INTER D =
8098 (A INTER (B INTER C)) INTER D`]);
8099 (REWRITE_WITH `rcone_ge v0 v1 a' INTER rcone_ge v1 v0 a' =
8100 rcone_ge u0 u1 a' INTER rcone_ge u1 (u0:real^3) a'`);
8101 (ASM_CASES_TAC `u0:real^3 = v0`);
8102 (NEW_GOAL `u1 = v1:real^3`);
8103 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8104 (ASM_REWRITE_TAC[]);
8105 (NEW_GOAL `u0 = v1:real^3`);
8106 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8107 (NEW_GOAL `u1 = v0:real^3`);
8108 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8109 (ASM_REWRITE_TAC[]);
8113 `conic_cap u0 u1 r d INTER rcone_ge u0 u1 a' INTER rcone_ge u1 u0 a' =
8114 conic_cap (u0:real^3) u1 r d`);
8115 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A INTER B = A`));
8117 (NEW_GOAL `conic_cap (u0:real^3) u1 r d SUBSET rcone_ge u0 u1 a'`);
8118 (REWRITE_TAC[conic_cap]);
8119 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET B`));
8120 (NEW_GOAL `rcone_gt u0 u1 d SUBSET rcone_gt (u0:real^3) u1 a'`);
8121 (MATCH_MP_TAC RCONE_GT_SUBSET);
8122 (EXPAND_TAC "d" THEN EXPAND_TAC "c");
8123 (MATCH_MP_TAC (REAL_ARITH `a = x ==> a <= max (max y x) (max z t)`));
8124 (EXPAND_TAC "a'" THEN REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);
8125 (NEW_GOAL `rcone_gt u0 u1 a' SUBSET rcone_ge (u0:real^3) u1 a'`);
8126 (REWRITE_TAC[RCONE_GT_SUBSET_RCONE_GE]);
8127 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8128 (REWRITE_TAC[SUBSET_INTER] THEN STRIP_TAC);
8129 (ASM_REWRITE_TAC[]);
8131 (REWRITE_TAC[SUBSET]);
8133 (MATCH_MP_TAC Marchal_cells_2_new.RCONEGE_INTER_VORONOI_CLOSED_IMP_RCONEGE);
8134 (EXISTS_TAC `V:real^3->bool`);
8135 (ASM_REWRITE_TAC[]);
8138 (REWRITE_WITH `a' = hl [u0; u1:real^3] / sqrt (&2)`);
8140 (REWRITE_TAC[HL; set_of_list] THEN ASM_REWRITE_TAC[]);
8141 (MATCH_MP_TAC REAL_LT_DIV);
8142 (REWRITE_TAC[HL_2]);
8144 (MATCH_MP_TAC REAL_LT_MUL);
8145 (REWRITE_TAC[REAL_ARITH `&0 < inv (&2)`]);
8146 (MATCH_MP_TAC DIST_POS_LT);
8147 (ASM_REWRITE_TAC[]);
8148 (MATCH_MP_TAC SQRT_POS_LT);
8151 (MATCH_MP_TAC REAL_DIV_LE_1_TACTICS);
8153 (MATCH_MP_TAC SQRT_POS_LT);
8155 (MATCH_MP_TAC (REAL_ARITH `a < b ==> a <= b`));
8156 (ASM_REWRITE_TAC[]);
8158 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8159 (NEW_GOAL `x':real^3 IN ball (u0, (&1))`);
8160 (UP_ASM_TAC THEN REWRITE_TAC[conic_cap;NORMBALL_BALL] THEN STRIP_TAC);
8161 (NEW_GOAL `ball (u0, r) SUBSET ball (u0:real^3, &1)`);
8162 (MATCH_MP_TAC SUBSET_BALL);
8165 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
8166 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL] THEN ONCE_REWRITE_TAC[DIST_SYM]
8168 (REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
8170 (ASM_CASES_TAC `u0 = w:real^3`);
8171 (ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
8172 (NEW_GOAL `&2 <= dist (u0, w:real^3)`);
8173 (UNDISCH_TAC `packing (V:real^3->bool)` THEN REWRITE_TAC[packing]);
8175 (FIRST_ASSUM MATCH_MP_TAC);
8176 (ASM_REWRITE_TAC[]);
8177 (UNDISCH_TAC `u0:real^3 IN V` THEN REWRITE_TAC[IN]);
8178 (NEW_GOAL `dist (x', u0) >= dist (u0, w) - dist (x', w:real^3)`);
8180 (UP_ASM_TAC THEN UP_ASM_TAC THEN DEL_TAC THEN DEL_TAC THEN UP_ASM_TAC
8181 THEN REAL_ARITH_TAC);
8182 (ABBREV_TAC `M = mxi V [v0; v1; v2; v3]`);
8183 (ABBREV_TAC `R = omega_list_n V [v0; v1; v2; v3] 3`);
8185 (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0:real^3,v1,M,R})
8186 <= vol (conic_cap u0 u1 r d INTER aff_ge {v0, v1} {M, R})`);
8187 (MATCH_MP_TAC MEASURE_SUBSET);
8189 (MATCH_MP_TAC MEASURABLE_INTER);
8190 (REWRITE_TAC[MEASURABLE_CONIC_CAP]);
8191 (MATCH_MP_TAC MEASURABLE_CONVEX_HULL);
8192 (MATCH_MP_TAC FINITE_IMP_BOUNDED);
8193 (REWRITE_TAC[Geomdetail.FINITE6]);
8195 (REWRITE_TAC[conic_cap; NORMBALL_BALL]);
8196 (ONCE_REWRITE_TAC[SET_RULE `(a INTER b) INTER c =
8197 (a INTER b) INTER (a INTER c)`]);
8198 (MATCH_MP_TAC MEASURABLE_INTER);
8199 (REWRITE_TAC[MEASURABLE_BALL_AFF_GE]);
8200 (REWRITE_TAC[GSYM conic_cap; GSYM NORMBALL_BALL; MEASURABLE_CONIC_CAP]);
8202 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> C INTER A SUBSET C INTER B`));
8203 (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
8207 (NEW_GOAL `vol (conic_cap u0 u1 r d INTER convex hull {v0, v1, M, R}) > &0`);
8208 (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);
8209 (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);
8210 (MATCH_MP_TAC CONIC_CAP_INTER_CONVEX_HULL_4_GT_0);
8211 (ASM_REWRITE_TAC[]);
8213 (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
8215 (UNDISCH_TAC `~NULLSET x`);
8216 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
8217 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
8219 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
8220 (EXISTS_TAC `aff_ge {v0, v1} {M, R:real^3}`);
8221 (REWRITE_TAC[SET_RULE `a INTER B INTER c SUBSET c`]);
8222 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
8223 (EXISTS_TAC `affine hull ({v0, v1} UNION {M, R:real^3})`);
8224 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL; SET_RULE
8225 `{a, b} UNION {c, d} = {a,b,c,d}`]);
8226 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
8227 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
8228 (REWRITE_WITH `{v0, v1, M, R} = {u0, u1, M, R:real^3}`);
8229 (UNDISCH_TAC `{u0, u1} = {v0, v1:real^3}` THEN SET_TAC[]);
8230 (ASM_REWRITE_TAC[]);
8231 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
8234 (UNDISCH_TAC `~NULLSET x`);
8235 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; set_of_list;
8236 TRUNCATE_SIMPLEX_EXPLICIT_1; HD; TL]);
8237 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
8238 (UP_ASM_TAC THEN MESON_TAC[]);
8240 (NEW_GOAL `vol (x INTER D) = &0`);
8241 (MATCH_MP_TAC MEASURE_EQ_0);
8242 (ASM_REWRITE_TAC[]);
8243 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
8244 (UP_ASM_TAC THEN MESON_TAC[]);
8246 (* ========================================== *)
8248 (REWRITE_WITH `sum s (\t. vol (t INTER D)) =
8249 sum t (\t. vol (t INTER D))`);
8250 (MATCH_MP_TAC SUM_SUPERSET);
8251 (EXPAND_TAC "s" THEN EXPAND_TAC "t" THEN REPEAT STRIP_TAC);
8253 (MATCH_MP_TAC MEASURE_EQ_0);
8254 (UP_ASM_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM] );
8257 (REWRITE_WITH `sum t (\t. vol (t INTER D)) =
8258 sum t (\t. vol D * dihX V t (u0,u1) / (&2 * pi))`);
8259 (MATCH_MP_TAC SUM_EQ);
8260 (EXPAND_TAC "t" THEN REWRITE_TAC[IN_ELIM_THM; IN] THEN REPEAT STRIP_TAC);
8263 (REWRITE_TAC[REAL_ARITH `a * b / c = (a / c) * b`]);
8264 (REWRITE_TAC[SUM_LMUL]);
8265 (ABBREV_TAC `R = sum t (\t. dihX V t (u0,u1))`);
8267 (REWRITE_WITH `vol E = vol D * azim u0 u1 n1 n2 / (&2 * pi)`);
8268 (EXPAND_TAC "E" THEN
8269 REWRITE_TAC[ASSUME `D:real^3->bool = conic_cap u0 u1 r d`]);
8270 (MATCH_MP_TAC VOLUME_CONIC_CAP_WEDGE_GE_VS_CONIC_CAP);
8272 (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
8273 (ASM_REWRITE_TAC[]);
8274 (ASM_REWRITE_TAC[]);
8275 (EXPAND_TAC "r" THEN REAL_ARITH_TAC);
8277 (UP_ASM_TAC THEN REWRITE_TAC[]);
8278 (NEW_GOAL `?a0 a1 a2. vl1 = [a0;a1;a2:real^3]`);
8279 (MATCH_MP_TAC Qzksykg.BARV_2_EXPLICIT);
8280 (EXISTS_TAC `V:real^3->bool` THEN
8281 ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl1 <=> vl1 IN barV V 2`]);
8282 (UP_ASM_TAC THEN STRIP_TAC);
8283 (REWRITE_WITH `{u0,u1,n1:real^3} = set_of_list vl1`);
8284 (ASM_REWRITE_TAC[set_of_list; EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
8285 (NEW_GOAL `{a0, a1:real^3} = {u0,u1}`);
8286 (REWRITE_TAC[GSYM (ASSUME `e = {u0,u1:real^3}`);
8287 GSYM (ASSUME `set_of_list (truncate_simplex 1 vl1) = e:real^3->bool`)]);
8288 (REWRITE_TAC[ASSUME `vl1 = [a0; a1; a2:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_1;
8290 (UP_ASM_TAC THEN SET_TAC[]);
8291 (MATCH_MP_TAC BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST);
8292 (EXISTS_TAC `V:real^3->bool` THEN
8293 ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl1 <=> vl1 IN barV V 2`]);
8296 (UP_ASM_TAC THEN REWRITE_TAC[]);
8297 (NEW_GOAL `?a0 a1 a2. vl2 = [a0;a1;a2:real^3]`);
8298 (MATCH_MP_TAC Qzksykg.BARV_2_EXPLICIT);
8299 (EXISTS_TAC `V:real^3->bool` THEN
8300 ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl2 <=> vl2 IN barV V 2`]);
8301 (UP_ASM_TAC THEN STRIP_TAC);
8302 (REWRITE_WITH `{u0,u1,n2:real^3} = set_of_list vl2`);
8303 (ASM_REWRITE_TAC[set_of_list; EL; HD; TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
8304 (NEW_GOAL `{a0, a1:real^3} = {u0,u1}`);
8305 (REWRITE_TAC[GSYM (ASSUME `e = {u0,u1:real^3}`);
8306 GSYM (ASSUME `set_of_list (truncate_simplex 1 vl2) = e:real^3->bool`)]);
8307 (REWRITE_TAC[ASSUME `vl2 = [a0; a1; a2:real^3]`; TRUNCATE_SIMPLEX_EXPLICIT_1;
8309 (UP_ASM_TAC THEN SET_TAC[]);
8310 (MATCH_MP_TAC BARV_2_IMP_NOT_COLLINEAR_SET_OF_LIST);
8311 (EXISTS_TAC `V:real^3->bool` THEN
8312 ASM_REWRITE_TAC[MESON[IN] `barV V 2 vl2 <=> vl2 IN barV V 2`]);
8314 (REWRITE_TAC[REAL_ARITH `a / b * c = (a * c) / b`]);
8316 `(vol D * R) / (&2 * pi) = vol D * azim u0 u1 n1 n2 / (&2 * pi) <=>
8317 (vol D * R) = (vol D * azim u0 u1 n1 n2 / (&2 * pi)) * (&2 * pi)`);
8318 (MATCH_MP_TAC REAL_EQ_LDIV_EQ);
8319 (MATCH_MP_TAC REAL_LT_MUL);
8320 (REWRITE_TAC[PI_POS]);
8322 (REWRITE_TAC[REAL_ARITH `(a * b / c) * c = (a * b) * c/c`]);
8323 (REWRITE_WITH `(&2 * pi) / (&2 * pi) = &1`);
8324 (MATCH_MP_TAC REAL_DIV_REFL);
8325 (MATCH_MP_TAC (REAL_ARITH `&0 < a ==> ~(a = &0)`));
8326 (MATCH_MP_TAC REAL_LT_MUL);
8327 (REWRITE_TAC[PI_POS]);
8329 (REWRITE_TAC[REAL_ARITH `a * x = (a * t) * &1 <=> a * (x - t) = &0`]);
8330 (REWRITE_TAC[REAL_ENTIRE]);
8333 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
8335 (NEW_GOAL `&0 < d`);
8336 (EXPAND_TAC "d" THEN UNDISCH_TAC `&0 < c /\ c < &1` THEN REAL_ARITH_TAC);
8337 (ASM_SIMP_TAC[VOLUME_CONIC_CAP]);
8340 (UNDISCH_TAC `d < &1` THEN UNDISCH_TAC `&0 < r` THEN UP_ASM_TAC
8341 THEN REAL_ARITH_TAC);
8342 (REWRITE_TAC[REAL_ARITH `&2 / &3 * a = &0 <=> a = &0`]);
8343 (REWRITE_TAC[REAL_ENTIRE]);
8344 (NEW_GOAL `~(pi = &0)`);
8345 (MP_TAC PI_POS THEN REAL_ARITH_TAC);
8346 (NEW_GOAL `~(&1 - d = &0)`);
8347 (UNDISCH_TAC `d < &1` THEN REAL_ARITH_TAC);
8348 (NEW_GOAL `~(r pow 3 = &0)`);
8349 (MATCH_MP_TAC REAL_POW_NZ);
8350 (UNDISCH_TAC `&0 < r` THEN REAL_ARITH_TAC);
8351 (ASM_REWRITE_TAC[]);
8352 (UP_ASM_TAC THEN MESON_TAC[]);
8353 (UP_ASM_TAC THEN REAL_ARITH_TAC)]);;
8355 (* ========================================================================= *)
8356 (* ========================================================================= *)