2 (* ========================================================================= *)
3 (* FLYSPECK - BOOK FORMALIZATION *)
5 (* Authour : VU KHAC KY *)
7 (* Chaper : Packing (Marchal Cells 3) *)
8 (* Date : May 14 2012 *)
9 (* ========================================================================= *)
11 module Marchal_cells_3 = 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;;
43 let TAKE_TAC = UP_ASM_TAC THEN REPEAT STRIP_TAC;;
44 (* ==================================================================== *)
47 let HD_IN_ROGERS = prove (
48 `!V ul. saturated V /\ packing V /\ barV V 3 ul ==> HD ul IN rogers V ul`,
50 ASM_SIMP_TAC[ROGERS_EXPLICIT] THEN
51 MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET THEN SET_TAC[]);;
53 (* ==================================================================== *)
56 let ROGERS_SUBSET_VORONOI_CLOSED = prove_by_refinement (
57 `!V ul. saturated V /\ packing V /\ barV V 3 ul ==>
58 rogers V ul SUBSET voronoi_closed V (HD ul)`,
60 (ASM_SIMP_TAC[ROGERS_EXPLICIT]);
61 (NEW_GOAL `voronoi_closed V (HD ul) =
62 convex hull (voronoi_closed V ((HD ul):real^3))`);
63 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
64 (REWRITE_TAC[CONVEX_HULL_EQ]);
65 (REWRITE_TAC[Packing3.CONVEX_VORONOI_CLOSED]);
66 (ONCE_ASM_REWRITE_TAC[]);
67 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET);
69 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
70 (MATCH_MP_TAC BARV_3_EXPLICIT);
71 (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
72 (UP_ASM_TAC THEN STRIP_TAC);
74 (REWRITE_TAC[GSYM OMEGA_LIST_N]);
75 (REWRITE_WITH `voronoi_closed V (omega_list_n V ul 0) =
76 voronoi_list V (truncate_simplex 0 ul)`);
77 (ASM_REWRITE_TAC[OMEGA_LIST_N; TRUNCATE_SIMPLEX_EXPLICIT_0; VORONOI_LIST;
78 VORONOI_SET; set_of_list; HD] THEN SET_TAC[]);
80 (NEW_GOAL `omega_list_n V ul 0 IN
81 voronoi_list V (truncate_simplex 0 ul)`);
82 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
83 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
84 (NEW_GOAL `omega_list_n V ul 1 IN
85 voronoi_list V (truncate_simplex 0 ul)`);
86 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
87 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
88 (NEW_GOAL `omega_list_n V ul 2 IN
89 voronoi_list V (truncate_simplex 0 ul)`);
90 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
91 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
92 (NEW_GOAL `omega_list_n V ul 3 IN
93 voronoi_list V (truncate_simplex 0 ul)`);
94 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
95 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
98 (* ==================================================================== *)
101 let HD_IN_MCELL = prove_by_refinement (
107 ~(X = {}) /\ ~(i = 0)
110 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
111 (MATCH_MP_TAC BARV_3_EXPLICIT);
112 (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
113 (UP_ASM_TAC THEN STRIP_TAC);
115 (ASM_REWRITE_TAC[HD]);
116 (ASM_CASES_TAC `i = 1`);
117 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell1]);
119 (ASM_SIMP_TAC[IN_DIFF;IN_INTER; HD; TL; IN_CBALL; DIST_REFL;
120 TRUNCATE_SIMPLEX_EXPLICIT_1; rcone_gt; rconesgn]);
122 (REWRITE_WITH `u0 = HD ul /\ [u0; u1; u2; u3:real^3] = ul`);
123 (ASM_REWRITE_TAC[HD]);
124 (MATCH_MP_TAC HD_IN_ROGERS);
126 (MATCH_MP_TAC SQRT_POS_LE);
128 (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM; VECTOR_ARITH
129 `(u0 - u0) dot (u1 - u0) = &0`; DIST_REFL]);
132 (NEW_GOAL `X:real^3->bool = {}`);
133 (REWRITE_TAC[ASSUME `X = mcell i V ul`; ASSUME `i = 1`; MCELL_EXPLICIT; mcell1]);
142 (ASM_CASES_TAC `i = 2`);
143 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2]);
146 (ASM_SIMP_TAC[IN_INTER; HD; TL; DIST_REFL;
147 TRUNCATE_SIMPLEX_EXPLICIT_1; rcone_ge; rconesgn; IN; IN_ELIM_THM]);
149 (REWRITE_TAC[VECTOR_ARITH `(u0 - u0) dot (u1 - u0) = &0`]);
151 (REWRITE_TAC[GSYM NORM_POW_2; GSYM dist; REAL_POW_2]);
152 (REWRITE_TAC[REAL_ARITH `a * a >= a * a * b <=> &0 <= a * a * (&1 - b)`]);
153 (MATCH_MP_TAC REAL_LE_MUL);
154 (REWRITE_TAC[DIST_POS_LE]);
155 (MATCH_MP_TAC REAL_LE_MUL);
156 (REWRITE_TAC[DIST_POS_LE]);
157 (ABBREV_TAC `s = hl (truncate_simplex 1 [u0; u1; u2; u3:real^3])`);
159 (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
160 (REWRITE_WITH `s / sqrt (&2) <= &1 <=> s <= &1 * sqrt (&2)`);
161 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
162 (MATCH_MP_TAC SQRT_POS_LT THEN REAL_ARITH_TAC);
163 (ASM_REAL_ARITH_TAC);
165 (REWRITE_WITH `[u0; u1; u2; u3:real^3] = ul`);
167 (ABBREV_TAC `m = mxi V ul`);
168 (ABBREV_TAC `s3 = omega_list_n V ul 3`);
169 (REWRITE_WITH `aff_ge {u0, u1:real^3} {m, s3} u0 <=>
170 u0 IN aff_ge {u0, u1} {m, s3}`);
172 (NEW_GOAL `u0 IN convex hull {u0,u1,m,s3:real^3}`);
173 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
175 (NEW_GOAL `convex hull {u0,u1,m,s3:real^3} SUBSET aff_ge {u0, u1} {m, s3}`);
176 (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
177 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
179 (NEW_GOAL `X:real^3->bool = {}`);
180 (REWRITE_TAC[ASSUME `X = mcell i V ul`; ASSUME `i = 2`; MCELL_EXPLICIT; mcell2]);
189 (ASM_CASES_TAC `i = 3`);
190 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3]);
192 (REWRITE_TAC[set_of_list;TRUNCATE_SIMPLEX_EXPLICIT_2]);
193 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
196 (NEW_GOAL `X:real^3->bool = {}`);
197 (REWRITE_TAC[ASSUME `X = mcell i V ul`; ASSUME `i = 3`; MCELL_EXPLICIT; mcell3]);
206 (ASM_CASES_TAC `i >= 4`);
207 (ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4]);
209 (REWRITE_TAC[set_of_list]);
210 (MATCH_MP_TAC IN_SET_IMP_IN_CONVEX_HULL_SET);
213 (NEW_GOAL `X:real^3->bool = {}`);
214 (SIMP_TAC[ASSUME `X = mcell i V ul`; ASSUME `i >= 4`; MCELL_EXPLICIT; mcell4]);
225 (ASM_MESON_TAC[])]);;
228 (* ==================================================================== *)
231 let FINITE_MCELL_SET_lemma1 = prove_by_refinement (
237 X SUBSET ball (vec 0, r) /\
239 ==> (!u. u IN set_of_list ul ==> u IN ball (vec 0, r + &6))`,
243 (ASM_CASES_TAC `i = 0`);
244 (UNDISCH_TAC `X = mcell i V ul`THEN ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
246 (NEW_GOAL `!s. s IN rogers V ul ==> dist (HD ul, s) < &2`);
248 (NEW_GOAL `rogers V ul SUBSET voronoi_closed V (HD ul)`);
249 (ASM_SIMP_TAC[ROGERS_SUBSET_VORONOI_CLOSED]);
250 (NEW_GOAL `s:real^3 IN voronoi_closed V (HD ul)`);
252 (UNDISCH_TAC `saturated (V:real^3->bool)`);
253 (REWRITE_TAC[saturated]);
255 (NEW_GOAL `?y. y IN V /\ dist (s, y:real^3) < &2`);
257 (UP_ASM_TAC THEN STRIP_TAC);
258 (UNDISCH_TAC `s:real^3 IN voronoi_closed V (HD ul)` THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
260 (NEW_GOAL `dist (s,HD ul) <= dist (s,y:real^3)`);
261 (FIRST_ASSUM MATCH_MP_TAC);
263 (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC);
264 (NEW_GOAL `?s. s:real^3 IN X`);
266 (UP_ASM_TAC THEN STRIP_TAC);
267 (NEW_GOAL `dist (HD ul, s:real^3) < &2`);
268 (FIRST_ASSUM MATCH_MP_TAC);
271 (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET ball (HD ul,&4)`);
272 (MATCH_MP_TAC BARV_3_IMP_FINITE_lemma2);
273 (EXISTS_TAC `V:real^3->bool`);
275 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
276 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
277 CARD (set_of_list ul) = 3 + 1`);
278 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
279 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
281 (NEW_GOAL `u:real^3 IN ball (HD ul, &4)`);
283 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
285 (NEW_GOAL `dist (vec 0,u) <= dist (vec 0, s) + dist (s, u:real^3)`);
286 (REWRITE_TAC[DIST_TRIANGLE]);
287 (NEW_GOAL `dist (s, u) <= dist (s, HD ul) + dist (HD ul, u:real^3)`);
288 (REWRITE_TAC[DIST_TRIANGLE]);
289 (NEW_GOAL `dist (vec 0,u) <=
290 dist (vec 0,s) + dist (s,HD ul) + dist (HD ul,u:real^3)`);
291 (ASM_REAL_ARITH_TAC);
292 (NEW_GOAL `dist (s:real^3, HD ul) < &2`);
293 (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REWRITE_TAC[]);
294 (NEW_GOAL `dist (vec 0,s:real^3) < r`);
295 (REWRITE_TAC[GSYM IN_BALL]);
297 (ASM_REAL_ARITH_TAC);
301 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
302 (MATCH_MP_TAC BARV_3_EXPLICIT);
303 (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
304 (UP_ASM_TAC THEN STRIP_TAC);
305 (NEW_GOAL `(HD ul):real^3 IN X`);
306 (MATCH_MP_TAC HD_IN_MCELL);
307 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i:num`);
309 (NEW_GOAL `(HD ul):real^3 IN ball (vec 0, r)`);
311 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL] THEN STRIP_TAC);
312 (NEW_GOAL `dist (vec 0,u) <= dist (vec 0,HD ul) + dist (HD ul, u:real^3)`);
313 (REWRITE_TAC[DIST_TRIANGLE]);
314 (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET ball (HD ul,&4)`);
315 (MATCH_MP_TAC BARV_3_IMP_FINITE_lemma2);
316 (EXISTS_TAC `V:real^3->bool`);
317 (ASM_REWRITE_TAC[HD; set_of_list]);
319 (NEW_GOAL `u:real^3 IN ball (HD ul, &4)`);
321 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
323 (ASM_REAL_ARITH_TAC)]);;
326 (* ==================================================================== *)
329 let FINITE_MCELL_SET_LEMMA_concl =
330 `!V r. packing V /\ saturated V ==>
331 FINITE {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}`;;
332 let FINITE_MCELL_SET_LEMMA = prove_by_refinement (
333 FINITE_MCELL_SET_LEMMA_concl,
336 (REWRITE_WITH `FINITE {X | X SUBSET ball (vec 0,r) /\ mcell_set V X} <=>
337 FINITE {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
338 (ASM_CASES_TAC `{} IN {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}`);
339 (REWRITE_WITH `{X | X SUBSET ball (vec 0,r) /\ mcell_set V X} =
340 {} INSERT {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
341 (ONCE_REWRITE_TAC[SET_RULE `A = B <=> B SUBSET A /\ A SUBSET B`]);
343 (REWRITE_TAC[INSERT_SUBSET]);
346 (REWRITE_TAC[SUBSET_INSERT_DELETE]);
347 (ONCE_REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN_DELETE] THEN REWRITE_TAC[IN_ELIM_THM]);
349 (REWRITE_TAC[FINITE_INSERT]);
350 (REWRITE_WITH `{X | X SUBSET ball (vec 0,r) /\ mcell_set V X} =
351 {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
352 (ONCE_REWRITE_TAC[SET_RULE `A = B <=> B SUBSET A /\ A SUBSET B`]);
355 (ONCE_REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN]
356 THEN REWRITE_TAC[IN_ELIM_THM]);
360 (NEW_GOAL `{} IN {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}`);
361 (ONCE_REWRITE_TAC[IN] THEN REWRITE_TAC[IN_ELIM_THM]);
366 `S = {X | X SUBSET ball (vec 0,r) /\ mcell_set V X /\ ~(X = {})}`);
367 (ABBREV_TAC `s1:(real^3->bool) = V INTER ball (vec 0, r + &6)`);
368 (ABBREV_TAC `s2 = {ul:(real^3)list | ?u0 u1 u2 u3.
373 ul = [u0; u1; u2; u3]}`);
374 (ABBREV_TAC `s3 = {(i:num, ul:(real^3)list) | i IN 0..4 /\ ul IN s2}`);
375 (NEW_GOAL`S SUBSET {X| ?t. t IN s3 /\ X = (\t. mcell (FST t) V (SND t)) t}`);
376 (EXPAND_TAC "S" THEN EXPAND_TAC "s3");
377 (ONCE_REWRITE_TAC[SUBSET] THEN ONCE_REWRITE_TAC[IN] THEN
378 REWRITE_TAC[IN_ELIM_THM; FST; SND; mcell_set]);
380 (EXISTS_TAC `((if i <= 4 then i else 4), ul:(real^3)list)`);
381 (ASM_REWRITE_TAC[FST;SND]);
383 (EXISTS_TAC `(if i <= 4 then i else 4)` THEN EXISTS_TAC `ul:(real^3)list`);
387 (ASM_REWRITE_TAC[IN_NUMSEG_0]);
388 (ASM_REWRITE_TAC[IN_NUMSEG_0] THEN ARITH_TAC);
390 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
391 (MATCH_MP_TAC BARV_3_EXPLICIT);
392 (EXISTS_TAC `V:real^3->bool` THEN ASM_SET_TAC[]);
393 (UP_ASM_TAC THEN STRIP_TAC THEN ONCE_REWRITE_TAC[IN]);
394 (REWRITE_TAC[IN_ELIM_THM]);
395 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
396 (EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
399 (NEW_GOAL `!u:real^3. u IN set_of_list ul ==> u IN s1`);
400 (EXPAND_TAC "s1" THEN REPEAT STRIP_TAC);
401 (REWRITE_TAC[IN_INTER]);
403 (NEW_GOAL `set_of_list ul SUBSET (V:real^3->bool)`);
404 (MATCH_MP_TAC Packing3.BARV_SUBSET);
405 (EXISTS_TAC `3` THEN ASM_MESON_TAC[IN]);
407 (NEW_GOAL `!u:real^3. u IN set_of_list ul ==> u IN ball (vec 0,r + &6)`);
408 (MATCH_MP_TAC FINITE_MCELL_SET_lemma1);
409 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i:num` THEN
410 EXISTS_TAC `x:real^3->bool`);
414 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
415 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
416 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
417 (FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
423 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`]);
424 (MATCH_MP_TAC FINITE_SUBSET);
426 (EXISTS_TAC `{X | ?t. t IN s3 /\ X = (\t. mcell (FST t) V (SND t)) t}`);
428 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
430 (MATCH_MP_TAC FINITE_PRODUCT);
431 (REWRITE_TAC[FINITE_NUMSEG]);
433 (MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
435 (MATCH_MP_TAC Packing3.KIUMVTC);
436 (ASM_REWRITE_TAC[])]);;
440 (* ==================================================================== *)
443 let CARD_BOUNDARY_INT_BALL_BOUND_1 = prove_by_refinement (
444 `!x k1 k2. &0 < k1 /\ &0 < k2 ==>
446 &(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= C * r pow 2)`,
448 (NEW_GOAL `?C. !r. k2 + sqrt (&3) <= r
450 (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
452 (MATCH_MP_TAC Vol1.bdt5_finiteness);
455 (ABBREV_TAC `D = &(CARD (int_ball x ((k2 + sqrt (&3)) + k1)))`);
456 (EXISTS_TAC `max C D`);
458 (ASM_CASES_TAC `k2 + sqrt (&3) <= r`);
460 `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= C * r pow 2`);
462 (NEW_GOAL `C * r pow 2 <= max C D * r pow 2`);
463 (REWRITE_TAC[REAL_ARITH `a * b <= c * b <=> &0 <= (c - a) * b`]);
464 (MATCH_MP_TAC REAL_LE_MUL);
465 (REWRITE_TAC[REAL_LE_POW_2]);
467 (ASM_REAL_ARITH_TAC);
469 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
470 &(CARD (int_ball x (r + k1)))`);
471 (REWRITE_TAC[REAL_OF_NUM_LE]);
472 (MATCH_MP_TAC CARD_SUBSET);
475 (REWRITE_TAC[Vol1.finite_int_ball]);
477 (NEW_GOAL `&(CARD (int_ball x (r + k1))) <= D * r pow 2`);
478 (NEW_GOAL `&(CARD (int_ball x (r + k1))) <= D`);
480 (REWRITE_TAC[REAL_OF_NUM_LE]);
481 (MATCH_MP_TAC CARD_SUBSET);
482 (REWRITE_TAC[Vol1.finite_int_ball; int_ball; Pack1.hinhcau_ball; SUBSET;
484 (REWRITE_TAC[IN; IN_ELIM_THM]);
487 (NEW_GOAL `r + k1 <= (k2 + sqrt (&3)) + k1`);
488 (ASM_REAL_ARITH_TAC);
489 (ASM_REAL_ARITH_TAC);
490 (NEW_GOAL `D <= D * r pow 2`);
491 (REWRITE_TAC[REAL_ARITH `a <= a * b <=> &0 <= a * (b - &1)`]);
492 (MATCH_MP_TAC REAL_LE_MUL);
494 (EXPAND_TAC "D" THEN REWRITE_TAC[REAL_OF_NUM_LE; LE_0]);
495 (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
496 (ONCE_REWRITE_TAC[REAL_ARITH `&1 = (&1) pow 2`]);
497 (REWRITE_WITH `(&1) pow 2 <= r pow 2 <=> &1 <= r`);
498 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC Collect_geom.POW2_COND_LT);
499 (ASM_REAL_ARITH_TAC);
500 (ASM_REAL_ARITH_TAC);
501 (ASM_REAL_ARITH_TAC);
502 (NEW_GOAL `D * r pow 2 <= max C D * r pow 2`);
503 (REWRITE_TAC[REAL_ARITH `a * b <= c * b <=> &0 <= (c - a) * b`]);
504 (MATCH_MP_TAC REAL_LE_MUL);
505 (REWRITE_TAC[REAL_LE_POW_2]);
507 (ASM_REAL_ARITH_TAC)]);;
509 (* ==================================================================== *)
511 (* The following is a simplified version of Vol1.bdt5_finiteness, Vol1.bdt7_finiteness *)
513 let CARD_BOUNDARY_INT_BALL_BOUND = prove_by_refinement (
516 &(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <= C * r pow 2)`,
518 (ASM_CASES_TAC `&0 < k1 /\ &0 < k2`);
519 (ASM_MESON_TAC[CARD_BOUNDARY_INT_BALL_BOUND_1]);
520 (ASM_CASES_TAC `&0 < k2`);
522 `(?C. !r. &1 <= r ==>
523 &(CARD (int_ball x (r + &1) DIFF int_ball x (r - k2))) <= C * r pow 2)`);
524 (MATCH_MP_TAC CARD_BOUNDARY_INT_BALL_BOUND_1);
525 (ASM_REAL_ARITH_TAC);
527 (EXISTS_TAC `C:real`);
529 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
530 &(CARD (int_ball x (r + &1) DIFF int_ball x (r - k2)))`);
531 (REWRITE_TAC[REAL_OF_NUM_LE]);
532 (MATCH_MP_TAC CARD_SUBSET);
533 (SIMP_TAC[FINITE_DIFF; Vol1.finite_int_ball]);
534 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A DIFF C SUBSET B DIFF C`));
535 (REWRITE_TAC[int_ball; Pack1.hinhcau_ball; SUBSET; IN_INTER; IN_BALL]);
536 (REWRITE_TAC[IN; IN_ELIM_THM]);
539 (NEW_GOAL `r + k1 <= r + &1`);
540 (ASM_REAL_ARITH_TAC);
541 (ASM_REAL_ARITH_TAC);
542 (NEW_GOAL `&(CARD (int_ball x (r + &1) DIFF int_ball x (r - k2))) <=
545 (ASM_REAL_ARITH_TAC);
547 (ASM_CASES_TAC `&0 < k1`);
549 `(?C. !r. &1 <= r ==>
550 &(CARD (int_ball x (r + k1) DIFF int_ball x (r - &1))) <= C * r pow 2)`);
551 (MATCH_MP_TAC CARD_BOUNDARY_INT_BALL_BOUND_1);
552 (ASM_REAL_ARITH_TAC);
554 (EXISTS_TAC `C:real`);
556 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
557 &(CARD (int_ball x (r + k1) DIFF int_ball x (r - &1)))`);
558 (REWRITE_TAC[REAL_OF_NUM_LE]);
559 (MATCH_MP_TAC CARD_SUBSET);
560 (SIMP_TAC[FINITE_DIFF; Vol1.finite_int_ball]);
561 (MATCH_MP_TAC (SET_RULE `B SUBSET A ==> C DIFF A SUBSET C DIFF B`));
562 (REWRITE_TAC[int_ball; Pack1.hinhcau_ball; SUBSET; IN_INTER; IN_BALL]);
563 (REWRITE_TAC[IN; IN_ELIM_THM]);
566 (NEW_GOAL `r - &1 <= r - k2`);
567 (ASM_REAL_ARITH_TAC);
568 (ASM_REAL_ARITH_TAC);
569 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - &1))) <=
572 (ASM_REAL_ARITH_TAC);
575 `(?C. !r. &1 <= r ==>
576 &(CARD (int_ball x (r + &1) DIFF int_ball x (r - &1))) <= C * r pow 2)`);
577 (MATCH_MP_TAC CARD_BOUNDARY_INT_BALL_BOUND_1);
578 (ASM_REAL_ARITH_TAC);
580 (EXISTS_TAC `C:real`);
582 (NEW_GOAL `&(CARD (int_ball x (r + k1) DIFF int_ball x (r - k2))) <=
583 &(CARD (int_ball x (r + &1) DIFF int_ball x (r - &1)))`);
584 (REWRITE_TAC[REAL_OF_NUM_LE]);
585 (MATCH_MP_TAC CARD_SUBSET);
586 (SIMP_TAC[FINITE_DIFF; Vol1.finite_int_ball]);
587 (REWRITE_TAC[IN_DIFF; int_ball; Pack1.hinhcau_ball; SUBSET; IN_INTER; IN_BALL]);
588 (REWRITE_TAC[IN; IN_ELIM_THM]);
591 (ASM_REAL_ARITH_TAC);
592 (NEW_GOAL `(!i. 1 <= i /\i <= 3 ==>integer (x'$i)) /\
593 dist (x:real^3,x') < r - k2`);
596 (ASM_REAL_ARITH_TAC);
598 (NEW_GOAL `&(CARD (int_ball x (r + &1) DIFF int_ball x (r - &1))) <=
601 (ASM_REAL_ARITH_TAC)]);;
603 (* ==================================================================== *)
606 let CARD_INJ_LE = prove_by_refinement (
607 `!s t f. FINITE s /\ FINITE t /\ INJ (f:A->B) s t ==>
609 [(REWRITE_TAC[INJ] THEN REPEAT STRIP_TAC);
610 (REWRITE_WITH `CARD s = CARD (IMAGE (f:A->B) s)`);
611 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC CARD_IMAGE_INJ);
613 (MATCH_MP_TAC CARD_SUBSET);
614 (ASM_REWRITE_TAC[IMAGE; SUBSET]);
615 (UNDISCH_TAC `!x. x IN s ==> (f:A->B) x IN t`);
616 (REWRITE_TAC[IN; IN_ELIM_THM]);
619 (* ==================================================================== *)
622 let BOUNDARY_VOLUME = prove_by_refinement (
625 vol (ball (p:real^3,r + k1) DIFF ball (p,r - k2)) <= C * r pow 2)`,
629 `C = &4 / &3 * pi * (&3 * abs (k1 + k2) + &3 * k1 pow 2 + abs (k1 pow 3 + k2 pow 3))`);
630 (ABBREV_TAC `D = vol (ball (p:real^3, abs (k1 + k2)))`);
631 (ABBREV_TAC `E = max C (D:real)`);
632 (EXISTS_TAC `max (E:real) (&0)`);
634 (ASM_CASES_TAC `r + k1 <= r - k2`);
635 (REWRITE_WITH `ball (p,r + k1) DIFF ball (p:real^3,r - k2) = {}`);
636 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> A DIFF B = {}`));
637 (REWRITE_TAC[SUBSET; IN_BALL] THEN REPEAT STRIP_TAC);
638 (ASM_REAL_ARITH_TAC);
639 (REWRITE_TAC[MEASURE_EMPTY]);
640 (NEW_GOAL `&0 * r pow 2 <= max E (&0) * r pow 2`);
641 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
642 (MATCH_MP_TAC REAL_LE_MUL);
643 (ASM_REWRITE_TAC[REAL_LE_POW_2] THEN REAL_ARITH_TAC);
644 (ASM_REAL_ARITH_TAC);
646 (REWRITE_WITH `vol (ball (p,r + k1) DIFF ball (p,r - k2)) =
647 vol (ball (p,r + k1)) - vol (ball (p,r - k2))`);
648 (MATCH_MP_TAC MEASURE_DIFF_SUBSET);
649 (REWRITE_TAC[MEASURABLE_BALL; SUBSET; IN_BALL] THEN ASM_REAL_ARITH_TAC);
650 (REWRITE_TAC[VOLUME_BALL]);
651 (ASM_CASES_TAC `&0 <= r - k2`);
652 (NEW_GOAL `&0 <= r + k1`);
653 (ASM_REAL_ARITH_TAC);
655 (NEW_GOAL `vol (ball (p,r + k1)) - vol (ball (p,r - k2)) <= C * r pow 2`);
656 (ASM_SIMP_TAC [VOLUME_BALL]);
658 (REWRITE_TAC[REAL_ARITH
659 `x * pi * a - x * pi * b <= (x * pi * c) * d <=>
660 &0 <= (x * pi) * (c * d - (a - b))`]);
661 (MATCH_MP_TAC REAL_LE_MUL);
662 (ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_DIV; PI_POS_LE; REAL_ARITH `&0 <= &3 /\ &0 <= &4`]);
663 (REWRITE_TAC[REAL_ARITH `(r + k1) pow 3 - (r - k2) pow 3 = &3 * (k1 + k2) *
664 r pow 2 + &3 * (k1 pow 2 - k2 pow 2) * r + (k1 pow 3 + k2 pow 3)`]);
665 (REWRITE_TAC[REAL_ADD_RDISTRIB]);
666 (NEW_GOAL `(&3 * abs (k1 + k2)) * r pow 2 >=
667 &3 * (k1 * r pow 2 + k2 * r pow 2)`);
668 (REWRITE_TAC[REAL_ARITH
669 `(&3 * abs (k1 + k2)) * r pow 2 >= &3 * (k1 * r pow 2 + k2 * r pow 2) <=>
670 &0 <= &3 * r pow 2 * (abs (k1 + k2) - (k1 + k2))`]);
671 (MATCH_MP_TAC REAL_LE_MUL);
672 (REWRITE_TAC[REAL_ARITH `&0 <= &3`]);
673 (MATCH_MP_TAC REAL_LE_MUL);
674 (REWRITE_TAC[REAL_LE_POW_2]);
677 (NEW_GOAL `(&3 * k1 pow 2) * r pow 2 >= &3 * (k1 pow 2 - k2 pow 2) * r`);
678 (NEW_GOAL `(&3 * k1 pow 2) * r pow 2 >= (&3 * k1 pow 2) * r`);
679 (REWRITE_TAC[REAL_ARITH `x * y pow 2 >= x * y <=> &0 <= x * y * (y - &1)`]);
680 (ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_POW_2; REAL_ARITH `&1 <= a ==> &0 <= a`;
681 REAL_ARITH `&1 <= a ==> &0 <= (a - &1)`; REAL_ARITH `&0 <= &3`]);
682 (NEW_GOAL `(&3 * k1 pow 2) * r >= &3 * (k1 pow 2 - k2 pow 2) * r`);
683 (REWRITE_TAC[REAL_ARITH `(&3 * x) * r >= &3 * (x - y) * r <=> &0 <= y * r`]);
684 (ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_POW_2; REAL_ARITH `&1 <= a ==> &0 <= a`]);
685 (ASM_REAL_ARITH_TAC);
688 (NEW_GOAL `abs (k1 pow 3 + k2 pow 3) * r pow 2 >= k1 pow 3 + k2 pow 3`);
689 (NEW_GOAL `abs (k1 pow 3 + k2 pow 3) * r pow 2 >=
690 abs (k1 pow 3 + k2 pow 3)`);
691 (REWRITE_TAC[REAL_ARITH `x * y pow 2 >= x <=> &0 <= x * (y pow 2 - &1)`]);
692 (MATCH_MP_TAC REAL_LE_MUL);
693 (REWRITE_TAC[REAL_ABS_POS]);
694 (REWRITE_TAC[REAL_ARITH `&0 <= a - &1 <=> &1 pow 2 <= a`]);
695 (REWRITE_WITH `&1 pow 2 <= r pow 2 <=> &1 <= r`);
696 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
697 (MATCH_MP_TAC Collect_geom.POW2_COND_LT);
698 (ASM_REAL_ARITH_TAC);
699 (ASM_REAL_ARITH_TAC);
700 (ASM_REAL_ARITH_TAC);
701 (ASM_REAL_ARITH_TAC);
704 (NEW_GOAL `C * r pow 2 <= max E (&0) * r pow 2`);
705 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
706 (MATCH_MP_TAC REAL_LE_MUL);
707 (ASM_REWRITE_TAC[REAL_LE_POW_2] THEN ASM_REAL_ARITH_TAC);
708 (ASM_REAL_ARITH_TAC);
711 (ASM_REAL_ARITH_TAC);
712 (NEW_GOAL `vol (ball (p,r + k1)) - vol (ball (p,r - k2)) <= D * r pow 2`);
713 (REWRITE_WITH `ball (p:real^3,r - k2) = {}`);
714 (REWRITE_TAC[SET_RULE `s = {} <=> (!x. x IN s ==> F)`]);
715 (REWRITE_TAC[IN_BALL] THEN GEN_TAC);
716 (MP_TAC (MESON[DIST_POS_LE] `&0 <= dist (p, x:real^3)`));
717 (ASM_REAL_ARITH_TAC);
719 (REWRITE_TAC[MEASURE_EMPTY; REAL_ARITH `a - &0 = a`]);
720 (NEW_GOAL `vol (ball (p,r + k1)) <= D`);
721 (EXPAND_TAC "D" THEN MATCH_MP_TAC MEASURE_SUBSET);
722 (REWRITE_TAC[MEASURABLE_BALL; SUBSET; IN_BALL]);
724 (ASM_REAL_ARITH_TAC);
725 (NEW_GOAL `D <= D * r pow 2`);
726 (REWRITE_TAC[REAL_ARITH `x <= x * y pow 2 <=> &0 <= x * (y pow 2 - &1)`]);
727 (MATCH_MP_TAC REAL_LE_MUL);
730 (MATCH_MP_TAC MEASURE_POS_LE);
731 (REWRITE_TAC[MEASURABLE_BALL]);
732 (REWRITE_TAC[REAL_ARITH `&0 <= a - &1 <=> &1 pow 2 <= a`]);
733 (REWRITE_WITH `&1 pow 2 <= r pow 2 <=> &1 <= r`);
734 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
735 (MATCH_MP_TAC Collect_geom.POW2_COND_LT);
736 (ASM_REAL_ARITH_TAC);
737 (ASM_REAL_ARITH_TAC);
738 (ASM_REAL_ARITH_TAC);
740 (NEW_GOAL `D * r pow 2 <= max E (&0) * r pow 2`);
741 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
742 (MATCH_MP_TAC REAL_LE_MUL);
743 (ASM_REWRITE_TAC[REAL_LE_POW_2] THEN ASM_REAL_ARITH_TAC);
744 (ASM_REAL_ARITH_TAC)]);;
746 (* ==================================================================== *)
749 let PACKING_BALL_BOUNDARY = prove_by_refinement (
750 `!V p:real^3 k1 k2. packing V ==>
752 ==> &(CARD (V INTER ball (p,r + k1) DIFF V INTER ball (p,r - k2)))
755 (NEW_GOAL `?C. (!r. &1 <= r ==>
756 vol (ball (p:real^3,r + k1 + &1) DIFF ball (p,r - (k2 + &1))) <=
758 (REWRITE_TAC[BOUNDARY_VOLUME]);
759 (UP_ASM_TAC THEN STRIP_TAC);
760 (EXISTS_TAC `C:real`);
763 `B = V INTER ball (p,r + k1) DIFF V INTER ball (p:real^3,r - k2)`);
764 (ABBREV_TAC `f = (\u:real^3. ball (u, &1))`);
765 (NEW_GOAL `FINITE (B:real^3->bool)`);
767 (MATCH_MP_TAC FINITE_SUBSET);
768 (EXISTS_TAC `V INTER ball (p:real^3,r + k1)`);
769 (ASM_SIMP_TAC[FINITE_PACK_LEMMA] THEN ASM_SET_TAC[]);
771 (NEW_GOAL `sum B (\u:real^3. vol (f u)) = &(CARD B) * &4 / &3 * pi`);
773 (SIMP_TAC[VOLUME_BALL; REAL_ARITH `&0 <= &1`]);
774 (ASM_SIMP_TAC [SUM_CONST]);
777 (NEW_GOAL `sum B (\u:real^3. vol (f u)) = vol (UNIONS (IMAGE f B))`);
778 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
779 (MATCH_MP_TAC MEASURE_DISJOINT_UNIONS_IMAGE);
780 (EXPAND_TAC "f" THEN REWRITE_TAC[MEASURABLE_BALL] THEN ASM_REWRITE_TAC[]);
781 (REWRITE_TAC[SET_RULE `DISJOINT s t <=> !x. ~(x IN s /\ x IN t)`]);
782 (REWRITE_TAC[IN_BALL]);
784 (UP_ASM_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[DIST_SYM] THEN STRIP_TAC);
785 (NEW_GOAL `dist (u, y) <= dist (u, x) + dist (x, y:real^3)`);
786 (REWRITE_TAC[DIST_TRIANGLE]);
787 (NEW_GOAL `&2 <= dist (u, y:real^3)`);
788 (UNDISCH_TAC `packing V` THEN REWRITE_TAC[packing] THEN STRIP_TAC);
789 (FIRST_ASSUM MATCH_MP_TAC);
791 (ASM_REAL_ARITH_TAC);
793 (NEW_GOAL `vol (UNIONS (IMAGE f (B:real^3->bool))) <=
794 vol (ball (p,r + k1 + &1) DIFF ball (p,r - (k2 + &1)))`);
795 (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
796 (MATCH_MP_TAC MEASURE_SUBSET);
798 (MATCH_MP_TAC MEASURABLE_UNIONS);
801 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
803 (REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
804 (ASM_REWRITE_TAC[MEASURABLE_BALL]);
806 (ASM_SIMP_TAC[MEASURABLE_DIFF; MEASURABLE_BALL]);
808 (REWRITE_TAC[SUBSET; IN_UNIONS; IN_BALL; IN_DIFF; IN_INTER]);
809 (REWRITE_TAC[IN_ELIM_THM; IN]);
811 (NEW_GOAL `dist (p, x) <= dist (p, x') + dist (x', x:real^3)`);
812 (REWRITE_TAC[DIST_TRIANGLE]);
813 (NEW_GOAL `dist (x',x:real^3) < &1`);
814 (UNDISCH_TAC `(t:real^3->bool) x`);
815 (ASM_REWRITE_TAC[ball; IN_ELIM_THM]);
816 (ASM_REAL_ARITH_TAC);
818 (NEW_GOAL `dist (p, x':real^3) < r - k2`);
819 (NEW_GOAL `dist (p, x') <= dist (p, x) + dist (x, x':real^3)`);
820 (REWRITE_TAC[DIST_TRIANGLE]);
821 (NEW_GOAL `dist (x,x':real^3) < &1`);
822 (ONCE_REWRITE_TAC[DIST_SYM]);
823 (UNDISCH_TAC `(t:real^3->bool) x`);
824 (ASM_REWRITE_TAC[ball; IN_ELIM_THM]);
825 (ASM_REAL_ARITH_TAC);
828 (NEW_GOAL `&(CARD (B:real^3->bool)) <= &(CARD B) * &4 / &3 * pi`);
829 (REWRITE_TAC [REAL_ARITH `a <= a * b <=> &0 <= a * (b - &1)`]);
830 (MATCH_MP_TAC REAL_LE_MUL);
831 (REWRITE_TAC[REAL_OF_NUM_LE; LE_0]);
832 (NEW_GOAL `#3.14159 < pi`);
833 (REWRITE_TAC[Flyspeck_constants.bounds]);
834 (ASM_REAL_ARITH_TAC);
835 (NEW_GOAL `vol (ball (p:real^3,r + k1 + &1) DIFF ball (p,r - (k2 + &1))) <=
838 (ASM_REAL_ARITH_TAC)]);;
840 (* ==================================================================== *)
843 let MCELL_SUBSET_BALL_4 = prove_by_refinement (
846 saturated V /\ mcell_set V X
847 ==> (?p. X SUBSET ball (p, &4))`,
848 [(REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
850 (ASM_CASES_TAC `X:real^3->bool = {}`);
851 (EXISTS_TAC `(vec 0):real^3`);
852 (ASM_MESON_TAC[EMPTY_SUBSET]);
855 (ASM_CASES_TAC `i = 0`);
856 (UNDISCH_TAC `X = mcell i V ul`THEN ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell0]);
858 (NEW_GOAL `!s. s IN rogers V ul ==> dist (HD ul, s) < &2`);
860 (NEW_GOAL `rogers V ul SUBSET voronoi_closed V (HD ul)`);
861 (ASM_SIMP_TAC[ROGERS_SUBSET_VORONOI_CLOSED]);
862 (NEW_GOAL `s:real^3 IN voronoi_closed V (HD ul)`);
864 (UNDISCH_TAC `saturated (V:real^3->bool)`);
865 (REWRITE_TAC[saturated]);
867 (NEW_GOAL `?y. y IN V /\ dist (s, y:real^3) < &2`);
869 (UP_ASM_TAC THEN STRIP_TAC);
870 (UNDISCH_TAC `s:real^3 IN voronoi_closed V (HD ul)` THEN REWRITE_TAC[voronoi_closed; IN; IN_ELIM_THM]);
872 (NEW_GOAL `dist (s,HD ul) <= dist (s,y:real^3)`);
873 (FIRST_ASSUM MATCH_MP_TAC);
875 (ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC);
876 (EXISTS_TAC `HD (ul:(real^3)list)`);
877 (REWRITE_TAC[SUBSET; IN_BALL]);
879 (NEW_GOAL `dist (HD ul, x:real^3) < &2`);
880 (FIRST_ASSUM MATCH_MP_TAC);
882 (ASM_REAL_ARITH_TAC);
885 (ASM_CASES_TAC `i = 4`);
886 (UNDISCH_TAC `X = mcell i V ul` THEN
887 ASM_SIMP_TAC[MCELL_EXPLICIT; mcell4; ARITH_RULE `4 >= 4`]);
890 (EXISTS_TAC `omega_list V ul`);
891 (NEW_GOAL `ball (omega_list V ul,&4) = convex hull (ball (omega_list V ul,&4))`);
892 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN REWRITE_TAC[CONVEX_HULL_EQ; CONVEX_BALL]);
893 (ONCE_ASM_REWRITE_TAC[]);
894 (MATCH_MP_TAC CONVEX_HULL_SUBSET);
895 (REWRITE_TAC[SUBSET; IN_BALL] THEN REPEAT STRIP_TAC);
896 (REWRITE_WITH `omega_list V ul = circumcenter (set_of_list ul)`);
897 (MATCH_MP_TAC Rogers.XNHPWAB1);
898 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
899 (REWRITE_WITH `dist (circumcenter (set_of_list ul),x:real^3) = hl ul`);
900 (NEW_GOAL `(!x:real^3. x IN set_of_list ul
901 ==> dist (circumcenter (set_of_list ul),x) = hl ul)`);
902 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
903 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
904 (FIRST_ASSUM MATCH_MP_TAC);
906 (NEW_GOAL `sqrt (&2) <= &2`);
907 (REWRITE_WITH `sqrt (&2) <= &2 <=> sqrt (&2) pow 2 <= &2 pow 2`);
908 (MATCH_MP_TAC Collect_geom.POW2_COND_LT);
909 (ASM_SIMP_TAC[SQRT_POS_LT; REAL_ARITH `&0 < &2`]);
910 (REWRITE_WITH `sqrt (&2) pow 2 = (&2)`);
911 (MATCH_MP_TAC SQRT_POW_2);
914 (ASM_REAL_ARITH_TAC);
920 (* Case i = 1 and i = 2 and i = 3 *)
922 (ABBREV_TAC `s = omega_list_n V ul (i - 1)`);
923 (EXISTS_TAC `s:real^3`);
924 (MATCH_MP_TAC (SET_RULE `(?x. A SUBSET x /\ x SUBSET B) ==> A SUBSET B`));
926 {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
929 (MATCH_MP_TAC Qzksykg.QZKSYKG2);
930 (ASM_REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4} <=> i=0\/i=1\/i=2\/i=3\/i=4`]);
932 (REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM; IN_BALL]);
934 (ABBREV_TAC `vl:(real^3)list = left_action_list p ul`);
935 (NEW_GOAL `rogers V vl SUBSET voronoi_closed V (HD vl)`);
936 (MATCH_MP_TAC ROGERS_SUBSET_VORONOI_CLOSED);
938 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
939 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN EXISTS_TAC `p:num->num`);
942 (ASM_REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4} <=> i=0\/i=1\/i=2\/i=3\/i=4`]);
946 (* -------------------------------------------------------------------------- *)
948 (NEW_GOAL `barV V 3 vl /\
949 (!j. i - 1 <= j /\ j <= 3
950 ==> omega_list_n V vl j = omega_list_n V ul j)`);
951 (ASM_CASES_TAC `i <= 1`);
952 (UNDISCH_TAC `p permutes 0..i - 1`);
953 (REWRITE_WITH `i - 1 = 0`);
955 (REWRITE_TAC[Packing3.PERMUTES_TRIVIAL]);
956 (STRIP_TAC THEN EXPAND_TAC "vl" THEN REWRITE_TAC[ASSUME `p = I:num->num`;
957 Packing3.LEFT_ACTION_LIST_I]);
960 (MATCH_MP_TAC Ynhyjit.YNHYJIT);
961 (EXISTS_TAC `p:num->num`);
965 (REWRITE_TAC[SET_RULE `i IN {2,3,4} <=> i = 2 \/ i = 3 \/ i = 4`]);
967 (UNDISCH_TAC `~(X = {}:real^3->bool)` THEN ASM_REWRITE_TAC[]);
969 (ASM_CASES_TAC `i = 2`);
970 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell2; ARITH_RULE `2 - 1 = 1`]);
974 (ASM_CASES_TAC `i = 3`);
975 (ASM_REWRITE_TAC[MCELL_EXPLICIT; mcell3; ARITH_RULE `3 - 1 = 2`]);
982 (UP_ASM_TAC THEN STRIP_TAC);
984 (NEW_GOAL `s IN voronoi_list V (truncate_simplex (i - 1) vl)`);
985 (REWRITE_WITH `s = omega_list_n V vl (i - 1)`);
987 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
988 (FIRST_ASSUM MATCH_MP_TAC);
990 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_IN_VORONOI_LIST);
992 (ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC);
994 (NEW_GOAL `s:real^3 IN voronoi_closed V (HD vl)`);
995 (NEW_GOAL `voronoi_list V (truncate_simplex (i - 1) vl) SUBSET
996 voronoi_closed V (HD vl)`);
997 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET]);
998 (NEW_GOAL `HD (vl:(real^3)list) IN
999 set_of_list (truncate_simplex (i - 1) vl)`);
1000 (NEW_GOAL `LENGTH (vl:(real^3)list) = 3 + 1 /\ CARD (set_of_list vl) = 3 + 1`);
1001 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1002 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1003 (REWRITE_WITH `HD (vl:(real^3)list) = HD (truncate_simplex (i - 1) vl)`);
1004 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1005 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1007 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
1008 (NEW_GOAL `?u0 u1 u2 u3. vl = [u0;u1;u2;u3:real^3]`);
1009 (MATCH_MP_TAC BARV_3_EXPLICIT);
1010 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1011 (UP_ASM_TAC THEN STRIP_TAC);
1013 (ASM_CASES_TAC `i = 1`);
1014 (ASM_REWRITE_TAC[ARITH_RULE `1 - 1 = 0`;
1015 TRUNCATE_SIMPLEX_EXPLICIT_0; LENGTH] THEN ARITH_TAC);
1016 (ASM_CASES_TAC `i = 2`);
1017 (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`;
1018 TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
1019 (ASM_CASES_TAC `i = 3`);
1020 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`;
1021 TRUNCATE_SIMPLEX_EXPLICIT_2; LENGTH] THEN ARITH_TAC);
1025 (UP_ASM_TAC THEN SET_TAC[]);
1028 (NEW_GOAL `dist (s, x:real^3) <= dist (s, HD vl) + dist (HD vl, x)`);
1029 (REWRITE_TAC[DIST_TRIANGLE]);
1030 (NEW_GOAL `dist (s:real^3, HD vl) < &2`);
1031 (ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL]);
1032 (NEW_GOAL `voronoi_closed V ((HD vl):real^3) SUBSET ball (HD vl,&2)`);
1033 (ASM_SIMP_TAC[Packing3.VORONOI_BALL2]);
1036 (NEW_GOAL `dist (HD vl, x:real^3) < &2`);
1037 (REWRITE_TAC[GSYM IN_BALL]);
1038 (NEW_GOAL `voronoi_closed V ((HD vl):real^3) SUBSET ball (HD vl,&2)`);
1039 (ASM_SIMP_TAC[Packing3.VORONOI_BALL2]);
1041 (ASM_REAL_ARITH_TAC)]);;
1043 (* ==================================================================== *)
1046 let HL_2 = prove_by_refinement (
1047 `!u v:real^3. hl [u; v] = inv (&2) * dist (u, v)`,
1048 [(REWRITE_TAC[HL; set_of_list; radV] THEN REPEAT GEN_TAC THEN
1049 MATCH_MP_TAC SELECT_UNIQUE THEN REPEAT STRIP_TAC THEN
1050 REWRITE_TAC[BETA_THM; CIRCUMCENTER_2; midpoint] THEN EQ_TAC);
1052 (REWRITE_WITH `y = dist (inv (&2) % (u + v),v:real^3)`);
1053 (FIRST_ASSUM MATCH_MP_TAC THEN
1054 REWRITE_TAC[MESON [IN] `{a, b} s <=> s IN {a, b}`] THEN SET_TAC[]);
1057 (NEW_GOAL `w = u \/ w = v:real^3`);
1058 (UP_ASM_TAC THEN REWRITE_TAC[MESON [IN] `{a, b} s <=> s IN {a, b}`] THEN SET_TAC[]);
1059 (UP_ASM_TAC THEN STRIP_TAC);
1060 (ASM_REWRITE_TAC[] THEN NORM_ARITH_TAC);
1061 (ASM_REWRITE_TAC[] THEN NORM_ARITH_TAC)]);;
1063 (* ==================================================================== *)
1066 let HL_LE_SQRT2_IMP_BARV_1 = prove_by_refinement (
1073 hl [u0;u1] < sqrt (&2) ==> barV V 1 [u0;u1:real^3]`,
1074 [(REPEAT STRIP_TAC);
1075 (REWRITE_TAC[BARV; LENGTH; ARITH_RULE `SUC (SUC 0) = 1 + 1`]);
1077 (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 1`);
1078 (NEW_GOAL `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 0 + 1`);
1079 (ASM_REWRITE_TAC[] THEN ARITH_TAC);
1080 (UP_ASM_TAC THEN REWRITE_WITH
1081 `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 0 + 1 <=>
1082 truncate_simplex 0 [u0;u1] = vl /\ 0 + 1 <= LENGTH [u0;u1:real^3]`);
1083 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1084 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
1085 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1087 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0]);
1088 (REWRITE_TAC[VORONOI_NONDG; VORONOI_LIST; VORONOI_SET; set_of_list; LENGTH;
1089 SET_RULE `INTERS {voronoi_closed V v | v IN {u0}} = voronoi_closed V u0`]);
1090 (ASM_SIMP_TAC[Packing3.AFF_DIM_VORONOI_CLOSED]);
1096 (ASM_CASES_TAC `LENGTH (vl:(real^3)list) = 2`);
1097 (NEW_GOAL `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 1 + 1`);
1098 (ASM_REWRITE_TAC[] THEN ARITH_TAC);
1099 (UP_ASM_TAC THEN REWRITE_WITH
1100 `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = 1 + 1 <=>
1101 truncate_simplex 1 [u0;u1] = vl /\ 1 + 1 <= LENGTH [u0;u1:real^3]`);
1102 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1103 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
1104 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1106 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1]);
1107 (REWRITE_TAC[VORONOI_NONDG]);
1108 (REWRITE_TAC[set_of_list; LENGTH]);
1114 `aff_dim (voronoi_list V [u0; u1:real^3]) =
1115 aff_dim (INTERS {bis (HD [u0; u1]) v | v | v IN set_of_list [u0; u1]})`);
1116 (MATCH_MP_TAC Rogers.YIFVQDV_lemma_aff_dim);
1117 (ASM_REWRITE_TAC[set_of_list; AFFINE_INDEPENDENT_2] THEN ASM_SET_TAC[]);
1118 (REWRITE_TAC[set_of_list; SET_RULE `a IN {b,c} <=> a =b \/ a = c`; HD]);
1119 (REWRITE_TAC[SET_RULE `INTERS {bis u0 v | v | v = u0 \/ v = u1} =
1120 bis u0 u0 INTER bis u0 u1`]);
1121 (REWRITE_WITH `!a:real^3. bis a a = (:real^3)`);
1122 (REWRITE_TAC[bis] THEN SET_TAC[]);
1123 (REWRITE_TAC[SET_RULE `(:real^3) INTER s = s`]);
1124 (MATCH_MP_TAC (ARITH_RULE `a = &2 ==> a + &(SUC(SUC 0)) = (&4):int`));
1125 (REWRITE_WITH `&2 = &(dimindex (:3)) - &1:int`);
1126 (REWRITE_TAC[DIMINDEX_3]);
1128 (REWRITE_TAC[Packing3.BIS_EQ_HYPERPLANE]);
1129 (MATCH_MP_TAC AFF_DIM_HYPERPLANE);
1130 (ASM_NORM_ARITH_TAC);
1133 (NEW_GOAL `initial_sublist vl [u0; u1:real^3] /\
1134 LENGTH vl = (LENGTH vl - 1) + 1`);
1135 (ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC);
1136 (UP_ASM_TAC THEN REWRITE_WITH
1137 `initial_sublist vl [u0; u1:real^3] /\ LENGTH vl = (LENGTH vl - 1) + 1 <=>
1138 truncate_simplex (LENGTH vl - 1) [u0;u1] = vl /\
1139 (LENGTH vl - 1) + 1 <= LENGTH [u0;u1:real^3]`);
1140 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1141 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
1142 (REWRITE_TAC[LENGTH]);
1145 (ASM_MESON_TAC[])]);;
1147 (* ==================================================================== *)
1150 let RCONE_GE_SUBSET = prove_by_refinement (
1151 `!a b u0:real^N u1. a <= b ==> rcone_ge u0 u1 b SUBSET rcone_ge u0 u1 a`,
1152 [(REPEAT STRIP_TAC);
1153 (REWRITE_TAC[rcone_ge; rconesgn; SUBSET; IN; IN_ELIM_THM]);
1156 `&0 <= dist (x,u0:real^N) * dist (u1,u0) * b - dist (x,u0) * dist (u1,u0) * a`);
1157 (REWRITE_TAC[REAL_ARITH `x * y * b - x * y * a = x * y * (b - a)`]);
1158 (MATCH_MP_TAC REAL_LE_MUL);
1159 (REWRITE_TAC[DIST_POS_LE]);
1160 (MATCH_MP_TAC REAL_LE_MUL);
1161 (REWRITE_TAC[DIST_POS_LE]);
1162 (ASM_REAL_ARITH_TAC);
1163 (ASM_REAL_ARITH_TAC)]);;
1165 (* ==================================================================== *)
1168 let RCONE_GT_SUBSET = prove_by_refinement (
1169 `!a b u0:real^N u1. a <= b ==> rcone_gt u0 u1 b SUBSET rcone_gt u0 u1 a`,
1170 [(REPEAT STRIP_TAC);
1171 (REWRITE_TAC[rcone_gt; rconesgn; SUBSET; IN; IN_ELIM_THM]);
1174 `&0 <= dist (x,u0:real^N) * dist (u1,u0) * b - dist (x,u0) * dist (u1,u0) * a`);
1175 (REWRITE_TAC[REAL_ARITH `x * y * b - x * y * a = x * y * (b - a)`]);
1176 (MATCH_MP_TAC REAL_LE_MUL);
1177 (REWRITE_TAC[DIST_POS_LE]);
1178 (MATCH_MP_TAC REAL_LE_MUL);
1179 (REWRITE_TAC[DIST_POS_LE]);
1180 (ASM_REAL_ARITH_TAC);
1181 (ASM_REAL_ARITH_TAC)]);;
1183 (* ===================================================================== *)
1184 (* The following lemmas are in the svn 126 of HOL *)
1185 (* To be done by John Harrison *)
1186 (* ===================================================================== *)
1187 (* ==================================================================== *)
1190 let BOUNDED_SING = prove
1192 REWRITE_TAC[BOUNDED_INSERT; BOUNDED_EMPTY]);;
1194 let SUBSPACE_BOUNDED_EQ_TRIVIAL = prove
1195 (`!s:real^N->bool. subspace s ==> (bounded s <=> s = {vec 0})`,
1196 REPEAT STRIP_TAC THEN EQ_TAC THEN SIMP_TAC[BOUNDED_SING] THEN
1197 ONCE_REWRITE_TAC[GSYM CONTRAPOS_THM] THEN
1198 DISCH_THEN(MP_TAC o MATCH_MP (SET_RULE
1199 `~(s = {a}) ==> a IN s ==> ?b. b IN s /\ ~(b = a)`)) THEN
1200 ASM_SIMP_TAC[SUBSPACE_0] THEN
1201 DISCH_THEN(X_CHOOSE_THEN `v:real^N` STRIP_ASSUME_TAC) THEN
1202 REWRITE_TAC[bounded; NOT_EXISTS_THM] THEN X_GEN_TAC `B:real` THEN
1203 DISCH_THEN(MP_TAC o SPEC `(B + &1) / norm v % v:real^N`) THEN
1204 ASM_SIMP_TAC[SUBSPACE_MUL; NORM_MUL; REAL_ABS_DIV; REAL_ABS_NORM] THEN
1205 ASM_SIMP_TAC[REAL_DIV_RMUL; NORM_EQ_0] THEN REAL_ARITH_TAC);;
1207 let AFFINE_BOUNDED_EQ_TRIVIAL = prove
1209 affine s ==> (bounded s <=> s = {} \/ ?a. s = {a})`,
1210 GEN_TAC THEN ASM_CASES_TAC `s:real^N->bool = {}` THEN
1211 ASM_REWRITE_TAC[BOUNDED_EMPTY] THEN
1212 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM MEMBER_NOT_EMPTY]) THEN
1213 DISCH_THEN(X_CHOOSE_THEN `b:real^N` MP_TAC) THEN
1214 GEOM_ORIGIN_TAC `b:real^N` THEN SIMP_TAC[AFFINE_EQ_SUBSPACE] THEN
1215 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[SUBSPACE_BOUNDED_EQ_TRIVIAL] THEN
1216 FIRST_ASSUM(MP_TAC o MATCH_MP SUBSPACE_0) THEN SET_TAC[]);;
1218 let AFFINE_BOUNDED_EQ_LOWDIM = prove
1220 affine s ==> (bounded s <=> aff_dim s <= &0)`,
1221 SIMP_TAC[AFF_DIM_GE; INT_ARITH
1222 `--(&1):int <= x ==> (x <= &0 <=> x = --(&1) \/ x = &0)`] THEN
1223 SIMP_TAC[AFF_DIM_EQ_0; AFF_DIM_EQ_MINUS1; AFFINE_BOUNDED_EQ_TRIVIAL]);;
1225 let BOUNDED_HYPERPLANE_EQ_TRIVIAL = prove
1226 (`!a b. bounded {x:real^N | a dot x = b} <=>
1227 if a = vec 0 then ~(b = &0) else dimindex(:N) = 1`,
1228 REPEAT GEN_TAC THEN ASM_CASES_TAC `a:real^N = vec 0` THEN
1229 ASM_REWRITE_TAC[DOT_LZERO] THENL
1230 [ASM_CASES_TAC `b = &0` THEN
1231 ASM_REWRITE_TAC[EMPTY_GSPEC; BOUNDED_EMPTY] THEN
1232 REWRITE_TAC[NOT_BOUNDED_UNIV; SET_RULE `{x | T} = UNIV`];
1233 ASM_SIMP_TAC[AFFINE_BOUNDED_EQ_LOWDIM; AFF_DIM_HYPERPLANE;
1234 AFFINE_HYPERPLANE] THEN
1235 REWRITE_TAC[INT_ARITH `a - &1:int <= &0 <=> a <= &1`; INT_OF_NUM_LE] THEN
1236 MATCH_MP_TAC(ARITH_RULE `1 <= n ==> (n <= 1 <=> n = 1)`) THEN
1237 REWRITE_TAC[DIMINDEX_GE_1]]);;
1239 let UNBOUNDED_HYPERPLANE = prove
1240 (`!a b. ~(a = vec 0) ==> ~(bounded {x:real^3 | a dot x = b})`,
1241 SIMP_TAC[BOUNDED_HYPERPLANE_EQ_TRIVIAL; DIMINDEX_3; ARITH]);;
1243 (* ==================================================================== *)
1246 let DIHV_SYM_2 = prove
1247 (`!x y z t:real^3. dihV x y z t = dihV x y t z`,
1248 REWRITE_TAC[dihV] THEN
1249 REPEAT STRIP_TAC THEN REPEAT LET_TAC THEN
1250 ASM_REWRITE_TAC[arcV; DOT_SYM; REAL_ARITH `a * b = b * a`]);;
1252 (* ==================================================================== *)
1255 let REAL_DIV_LE_1_TACTICS = prove_by_refinement (
1256 `!m n. &0 < n /\ m <= n ==> m / n <= &1`,
1257 [(REPEAT STRIP_TAC);
1258 (REWRITE_WITH `m / n <= &1 <=> m <= &1 * n`);
1259 (MATCH_MP_TAC REAL_LE_LDIV_EQ);
1260 (ASM_REWRITE_TAC[]);
1261 (ASM_REAL_ARITH_TAC)]);;
1263 (* ==================================================================== *)
1266 let REAL_DIV_GE_1_TACTICS = prove_by_refinement (
1267 `!m n. &0 < n /\ n <= m ==> &1 <= m / n`,
1268 [(REPEAT STRIP_TAC);
1269 (REWRITE_WITH `&1 <= m / n <=> &1 * n <= m`);
1270 (MATCH_MP_TAC REAL_LE_RDIV_EQ);
1271 (ASM_REWRITE_TAC[]);
1272 (ASM_REAL_ARITH_TAC)]);;
1274 (* ==================================================================== *)
1277 let REAL_DIV_LT_1_TACTICS = prove_by_refinement (
1278 `!m n. &0 < n /\ m < n ==> m / n < &1`,
1279 [(REPEAT STRIP_TAC);
1280 (REWRITE_WITH `m / n < &1 <=> m < &1 * n`);
1281 (MATCH_MP_TAC REAL_LT_LDIV_EQ);
1282 (ASM_REWRITE_TAC[]);
1283 (ASM_REAL_ARITH_TAC)]);;
1285 (* ==================================================================== *)
1288 let REAL_DIV_GT_1_TACTICS = prove_by_refinement (
1289 `!m n. &0 < n /\ n < m ==> &1 < m / n`,
1290 [(REPEAT STRIP_TAC);
1291 (REWRITE_WITH `&1 < m / n <=> &1 * n < m`);
1292 (MATCH_MP_TAC REAL_LT_RDIV_EQ);
1293 (ASM_REWRITE_TAC[]);
1294 (ASM_REAL_ARITH_TAC)]);;
1297 (* ==================================================================== *)
1298 (* The following lemmas help to prove that the *)
1299 (* definition of dihX is well-defined *)
1300 (* ==================================================================== *)
1301 (* ==================================================================== *)
1304 let MCELL_ID_OMEGA_LIST_N = prove_by_refinement (
1305 `!V i j ul vl. packing V /\ saturated V /\ barV V 3 ul /\ barV V 3 vl /\
1306 (mcell i V ul = mcell j V vl) /\
1307 ~(negligible (mcell i V ul)) /\
1310 (i = j) /\ (!k. i - 1 <= k /\ k <= 3
1311 ==> omega_list_n V ul k = omega_list_n V vl k)`,
1312 [(REPEAT GEN_TAC THEN STRIP_TAC);
1313 (NEW_GOAL `i = j /\ mcell i V ul = mcell j V vl`);
1314 (MATCH_MP_TAC Ajripqn.AJRIPQN);
1315 (ASM_REWRITE_TAC[SET_RULE `a INTER a = a` ]);
1321 (UP_ASM_TAC THEN STRIP_TAC);
1323 (ASM_REWRITE_TAC[]);
1325 (ASM_CASES_TAC `i = 4`);
1329 (ASM_REWRITE_TAC[]);
1331 (REWRITE_WITH `omega_list_n V ul 3 = omega_list V ul`);
1332 (REWRITE_TAC[OMEGA_LIST]);
1333 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1334 CARD (set_of_list ul) = 3 + 1`);
1335 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1336 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1337 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
1339 (REWRITE_WITH `omega_list_n V vl 3 = omega_list V vl`);
1340 (REWRITE_TAC[OMEGA_LIST]);
1341 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1342 CARD (set_of_list vl) = 3 + 1`);
1343 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1344 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1345 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
1347 (REWRITE_WITH `omega_list V ul = circumcenter (set_of_list ul)`);
1348 (MATCH_MP_TAC Rogers.XNHPWAB1);
1349 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
1350 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
1352 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1353 (SIMP_TAC[ASSUME `i = 4`; MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1358 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1360 (REWRITE_WITH `omega_list V vl = circumcenter (set_of_list vl)`);
1361 (MATCH_MP_TAC Rogers.XNHPWAB1);
1362 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
1363 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
1365 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1366 (ASM_REWRITE_TAC[]);
1367 (REWRITE_WITH `j = 4`);
1369 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1374 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1377 (REWRITE_WITH `set_of_list ul = set_of_list (vl:(real^3)list) <=>
1378 convex hull (set_of_list ul) = convex hull (set_of_list vl)`);
1379 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1380 (MATCH_MP_TAC Packing3.CONVEX_HULL_EQ_EQ_SET_EQ);
1383 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
1384 (MATCH_MP_TAC BARV_3_EXPLICIT);
1385 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1386 (UP_ASM_TAC THEN STRIP_TAC);
1387 (ASM_REWRITE_TAC[set_of_list] THEN STRIP_TAC);
1388 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1389 (REWRITE_TAC[ASSUME `i = 4`]);
1390 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1392 (ASM_REWRITE_TAC[set_of_list]);
1393 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1394 (MATCH_MP_TAC COPLANAR_SUBSET);
1395 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
1396 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1397 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
1398 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
1399 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
1400 (ASM_REWRITE_TAC[]);
1401 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1403 (NEW_GOAL `?u0 u1 u2 u3. vl = [u0;u1;u2;u3:real^3]`);
1404 (MATCH_MP_TAC BARV_3_EXPLICIT);
1405 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1406 (UP_ASM_TAC THEN STRIP_TAC);
1407 (ASM_REWRITE_TAC[set_of_list] THEN STRIP_TAC);
1408 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1409 (REWRITE_TAC[ASSUME `mcell i V ul = mcell j V vl`]);
1410 (REWRITE_WITH `j = 4`);
1412 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1414 (ASM_REWRITE_TAC[set_of_list]);
1415 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1416 (MATCH_MP_TAC COPLANAR_SUBSET);
1417 (EXISTS_TAC `affine hull {u0, u1, u2, u3:real^3}`);
1418 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
1419 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR]);
1420 (MATCH_MP_TAC Rogers.AFF_DIM_LE_2_IMP_COPLANAR);
1421 (MATCH_MP_TAC Njiutiu.AFF_DEPENDENT_AFF_DIM_4);
1422 (ASM_REWRITE_TAC[]);
1423 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1425 (MP_TAC (ASSUME `mcell i V ul = mcell j V vl`));
1426 (REWRITE_WITH `j = 4 /\ i = 4`);
1428 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1434 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1435 (ASM_REWRITE_TAC[]);
1436 (REWRITE_WITH `j = 4 /\ i = 4`);
1438 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1443 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1447 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1448 (REWRITE_WITH `j = 4 /\ i = 4`);
1450 (SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;mcell4]);
1455 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1458 (* Finish the case i = 4 *)
1459 (* ========================================================================= *)
1460 (NEW_GOAL `mcell i V ul SUBSET
1461 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
1462 (MATCH_MP_TAC Qzksykg.QZKSYKG2);
1463 (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1465 (ABBREV_TAC `X = mcell i V ul`);
1467 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1} = X`);
1469 (NEW_GOAL `~negligible (X INTER
1470 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1})`);
1471 (ASM_REWRITE_TAC[]);
1473 (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1474 (NEW_GOAL `!s:(real^3->bool)->bool.
1475 ~negligible (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~negligible t)`);
1476 (MESON_TAC[NEGLIGIBLE_UNIONS]);
1477 (REWRITE_TAC[SET_RULE
1478 `{X INTER x | x IN {rogers V (left_action_list p ul) | p permutes 0..i - 1}} =
1479 {X INTER rogers V (left_action_list p ul) | p permutes 0..i - 1}`]);
1481 `S = {X INTER rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
1484 (NEW_GOAL `(?t. t IN (S:(real^3->bool)->bool) /\ ~negligible t)`);
1485 (FIRST_ASSUM MATCH_MP_TAC);
1486 (ASM_REWRITE_TAC[]);
1488 (ABBREV_TAC `f = (\p. X INTER rogers V (left_action_list p ul))`);
1490 `{X INTER rogers V (left_action_list p ul) | p permutes 0..i - 1} =
1491 {f p | p permutes 0..i-1}`);
1492 (EXPAND_TAC "f" THEN REFL_TAC);
1493 (ONCE_REWRITE_TAC[SET_RULE `{f x | P x} = {f x | x IN {x | P x}}`]);
1495 (REWRITE_TAC[SET_RULE `{f p | p IN {x | x permutes 0..i - 1} } =
1496 {y | ?p. p IN {x | x permutes 0..i - 1} /\ y = f p}`]);
1497 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1498 (MATCH_MP_TAC FINITE_PERMUTATIONS);
1499 (REWRITE_TAC[FINITE_NUMSEG]);
1500 (UP_ASM_TAC THEN EXPAND_TAC "S" THEN REWRITE_TAC[IN; IN_ELIM_THM]
1505 (NEW_GOAL `mcell j V vl SUBSET
1506 UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
1507 (MATCH_MP_TAC Qzksykg.QZKSYKG2);
1508 (ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
1510 UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
1513 UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1} = t`);
1515 (NEW_GOAL `~negligible (t INTER
1516 UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1})`);
1517 (ASM_REWRITE_TAC[]);
1519 (UP_ASM_TAC THEN REWRITE_TAC[INTER_UNIONS]);
1520 (REWRITE_TAC[SET_RULE
1521 `{t INTER x | x IN {rogers V (left_action_list q vl) | q permutes 0..j - 1}} =
1522 {t INTER rogers V (left_action_list q vl) | q permutes 0..j - 1}`]);
1524 (NEW_GOAL `!s:(real^3->bool)->bool.
1525 ~negligible (UNIONS s) /\ FINITE s ==> (?t. t IN s /\ ~negligible t)`);
1526 (MESON_TAC[NEGLIGIBLE_UNIONS]);
1528 `R = {t INTER rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
1531 (NEW_GOAL `(?r. r IN (R:(real^3->bool)->bool) /\ ~negligible r)`);
1532 (FIRST_ASSUM MATCH_MP_TAC);
1533 (ASM_REWRITE_TAC[]);
1535 (ABBREV_TAC `f = (\q. t INTER rogers V (left_action_list q vl))`);
1537 `{t INTER rogers V (left_action_list q vl) | q permutes 0..j - 1} =
1538 {f q | q permutes 0..j - 1}`);
1539 (EXPAND_TAC "f" THEN REFL_TAC);
1540 (ONCE_REWRITE_TAC[SET_RULE `{f x | P x} = {f x | x IN {x | P x}}`]);
1542 (REWRITE_TAC[SET_RULE `{f q | q IN {x | x permutes 0..j - 1} } =
1543 {y | ?q. q IN {x | x permutes 0..j - 1} /\ y = f q}`]);
1544 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
1545 (MATCH_MP_TAC FINITE_PERMUTATIONS);
1546 (REWRITE_TAC[FINITE_NUMSEG]);
1547 (UP_ASM_TAC THEN EXPAND_TAC "R" THEN REWRITE_TAC[IN; IN_ELIM_THM]
1550 `rogers V (left_action_list p ul) = rogers V (left_action_list q vl)`);
1551 (MATCH_MP_TAC (MESON[] `(~A ==> F) ==> A`));
1553 (NEW_GOAL `coplanar (rogers V (left_action_list p ul) INTER
1554 rogers V (left_action_list q vl))`);
1555 (MATCH_MP_TAC Rogers.DUUNHOR);
1556 (ASM_REWRITE_TAC[IN]);
1559 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
1560 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
1561 (EXISTS_TAC `p:num->num`);
1562 (ASM_REWRITE_TAC[]);
1565 (REWRITE_TAC[GSYM (ASSUME `X = mcell j V vl`)]);
1567 (UNDISCH_TAC `~NULLSET X`);
1568 (REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
1570 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
1571 (EXISTS_TAC `vl:(real^3)list` THEN EXISTS_TAC `j:num`);
1572 (EXISTS_TAC `q:num->num`);
1573 (ASM_REWRITE_TAC[]);
1576 (REWRITE_TAC[GSYM (ASSUME `X = mcell j V vl`)]);
1578 (UNDISCH_TAC `~NULLSET X`);
1579 (REWRITE_TAC[ASSUME `X:real^3->bool = {}`; NEGLIGIBLE_EMPTY]);
1580 (UNDISCH_TAC `~NULLSET r`);
1582 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1583 (EXISTS_TAC `rogers V (left_action_list p ul) INTER
1584 rogers V (left_action_list q vl)`);
1586 (ASM_SIMP_TAC[COPLANAR_IMP_NEGLIGIBLE]);
1588 (ABBREV_TAC `xl:(real^3)list = (left_action_list p ul)`);
1589 (ABBREV_TAC `yl:(real^3)list = (left_action_list q vl)`);
1592 (NEW_GOAL `barV V 3 xl /\
1593 (!k. i - 1 <= k /\ k <= 3
1594 ==> omega_list_n V xl k = omega_list_n V ul k)`);
1595 (MATCH_MP_TAC Ynhyjit.YNHYJIT);
1596 (EXISTS_TAC `p:num->num`);
1597 (ASM_REWRITE_TAC[]);
1599 (ASM_CASES_TAC `j = 2`);
1600 (UNDISCH_TAC `~NULLSET X`);
1601 (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = X`); ASSUME `i = j:num`;
1602 MCELL_EXPLICIT; mcell2; ASSUME `j = 2`]);
1605 (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`]);
1606 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1610 (UNDISCH_TAC `~NULLSET X`);
1611 (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = X`); ASSUME `i = j:num`;
1612 MCELL_EXPLICIT; mcell3; ASSUME `j = 3`]);
1615 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1616 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1619 (NEW_GOAL `barV V 3 yl /\
1620 (!k. j - 1 <= k /\ k <= 3
1621 ==> omega_list_n V yl k = omega_list_n V vl k)`);
1622 (MATCH_MP_TAC Ynhyjit.YNHYJIT);
1623 (EXISTS_TAC `q:num->num`);
1624 (ASM_REWRITE_TAC[]);
1626 (ASM_CASES_TAC `j = 2`);
1627 (UNDISCH_TAC `~NULLSET X`);
1628 (REWRITE_TAC[ASSUME `X = mcell j V vl`; MCELL_EXPLICIT; mcell2; ASSUME `j = 2`]);
1631 (ASM_REWRITE_TAC[ARITH_RULE `2 - 1 = 1`]);
1632 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1636 (UNDISCH_TAC `~NULLSET X`);
1637 (REWRITE_TAC[ASSUME `X = mcell j V vl`; MCELL_EXPLICIT; mcell3; ASSUME `j = 3`]);
1640 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1641 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1644 (NEW_GOAL `!k. 0 <= k /\ k <= 3
1645 ==> omega_list_n V xl k = omega_list_n V yl k`);
1646 (MATCH_MP_TAC Njiutiu.NJIUTIU);
1647 (ASM_REWRITE_TAC[]);
1648 (NEW_GOAL `aff_dim (rogers V yl) <= &(dimindex (:3))`);
1649 (REWRITE_TAC[AFF_DIM_LE_UNIV]);
1650 (UP_ASM_TAC THEN REWRITE_TAC[DIMINDEX_3]);
1652 (NEW_GOAL `~(aff_dim (rogers V yl) <= &2)`);
1654 (UNDISCH_TAC `~NULLSET r` THEN REWRITE_TAC[]);
1655 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
1656 (EXISTS_TAC `rogers V yl`);
1658 (MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
1659 (ASM_SIMP_TAC[Rogers.AFF_DIM_LE_2_IMP_COPLANAR]);
1661 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
1663 `(!k. j - 1 <= k /\ k <= 3 ==> omega_list_n V xl k = omega_list_n V yl k)`);
1665 (FIRST_ASSUM MATCH_MP_TAC);
1666 (ASM_REWRITE_TAC[]);
1667 (NEW_GOAL `j = 2 \/ j = 3 \/ j = 4`);
1670 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
1671 (ASM_MESON_TAC[])]);;
1673 (* ==================================================================== *)
1676 let MCELL_ID_MXI = prove_by_refinement (
1683 mcell i V ul = mcell j V vl /\
1684 ~NULLSET (mcell i V ul) /\
1687 ==> mxi V ul = mxi V vl`,
1688 [(REPEAT STRIP_TAC);
1690 (!k. i - 1 <= k /\ k <= 3
1691 ==> omega_list_n V ul k = omega_list_n V vl k)`);
1692 (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
1693 (ASM_REWRITE_TAC[]);
1695 (UP_ASM_TAC THEN STRIP_TAC);
1697 (ASM_CASES_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) >= sqrt (&2)`);
1698 (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
1700 (REWRITE_WITH `mxi V ul = omega_list_n V ul 2`);
1701 (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
1702 (ASM_REWRITE_TAC[]);
1707 (REWRITE_WITH `mxi V vl = omega_list_n V vl 2`);
1708 (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
1709 (ASM_REWRITE_TAC[]);
1714 (FIRST_ASSUM MATCH_MP_TAC);
1715 (NEW_GOAL `i = 2 \/ i = 3`);
1719 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
1722 (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
1723 (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
1725 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
1726 set_of_list (truncate_simplex (i - 1) vl)`);
1727 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
1728 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1729 (NEW_GOAL `i = 2 \/ i = 3`);
1731 (ASM_REWRITE_TAC[]);
1735 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1736 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1737 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
1738 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1739 (NEW_GOAL `i = 2 \/ i = 3`);
1741 (ASM_REWRITE_TAC[]);
1745 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1746 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1750 (NEW_GOAL `hl (xl:(real^3)list) <= dist (omega_list V xl, HD xl)`);
1751 (MATCH_MP_TAC Rogers.WAUFCHE1);
1752 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "xl");
1753 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1754 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1756 (NEW_GOAL `hl yl = dist (omega_list V yl, HD yl)`);
1757 (MATCH_MP_TAC Rogers.WAUFCHE2);
1758 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
1759 (EXPAND_TAC "yl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1760 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1762 (NEW_GOAL `omega_list V xl = omega_list V yl`);
1763 (REWRITE_TAC[OMEGA_LIST]);
1764 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
1765 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1766 (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
1768 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1769 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1770 CARD (set_of_list ul) = 3 + 1`);
1771 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1772 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1774 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1775 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1776 CARD (set_of_list vl) = 3 + 1`);
1777 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1778 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1780 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1781 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1783 `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
1784 truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
1785 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
1787 `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
1788 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1789 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1790 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1791 CARD (set_of_list ul) = 3 + 1`);
1792 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1793 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1797 `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
1798 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1799 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1800 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1801 CARD (set_of_list vl) = 3 + 1`);
1802 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1803 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1806 (FIRST_ASSUM MATCH_MP_TAC);
1807 (NEW_GOAL `i = 2 \/ i = 3`);
1810 (NEW_GOAL `HD (xl:(real^3)list) = HD yl`);
1811 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1812 (REWRITE_WITH `HD (truncate_simplex 2 ul) = (HD ul):real^3`);
1813 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1814 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1815 CARD (set_of_list ul) = 3 + 1`);
1816 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1817 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1820 (REWRITE_WITH `HD (truncate_simplex 2 vl) = (HD vl):real^3`);
1821 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1822 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1823 CARD (set_of_list vl) = 3 + 1`);
1824 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1825 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1827 (ASM_REWRITE_TAC[]);
1828 (NEW_GOAL `hl (yl:(real^3)list) = dist (omega_list V xl, HD xl)`);
1829 (ASM_REWRITE_TAC[]);
1830 (ASM_REAL_ARITH_TAC);
1833 (* ======================================================================= *)
1835 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
1837 (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
1839 (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
1840 (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
1842 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
1843 set_of_list (truncate_simplex (i - 1) vl)`);
1844 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
1845 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1846 (NEW_GOAL `i = 2 \/ i = 3`);
1848 (ASM_REWRITE_TAC[]);
1852 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1853 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1854 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
1855 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
1856 (NEW_GOAL `i = 2 \/ i = 3`);
1858 (ASM_REWRITE_TAC[]);
1862 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1863 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1867 (NEW_GOAL `hl (yl:(real^3)list) <= dist (omega_list V yl, HD yl)`);
1868 (MATCH_MP_TAC Rogers.WAUFCHE1);
1869 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "yl");
1870 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1871 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1873 (NEW_GOAL `hl xl = dist (omega_list V xl, HD xl)`);
1874 (MATCH_MP_TAC Rogers.WAUFCHE2);
1875 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
1876 (EXPAND_TAC "xl" THEN MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
1877 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
1879 (NEW_GOAL `omega_list V xl = omega_list V yl`);
1880 (REWRITE_TAC[OMEGA_LIST]);
1881 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
1882 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1883 (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
1885 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1886 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1887 CARD (set_of_list ul) = 3 + 1`);
1888 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1889 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1891 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
1892 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1893 CARD (set_of_list vl) = 3 + 1`);
1894 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1895 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1897 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
1898 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1900 `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
1901 truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
1902 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
1904 `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
1905 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1906 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1907 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1908 CARD (set_of_list ul) = 3 + 1`);
1909 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1910 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1914 `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
1915 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
1916 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
1917 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1918 CARD (set_of_list vl) = 3 + 1`);
1919 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1920 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1923 (FIRST_ASSUM MATCH_MP_TAC);
1924 (NEW_GOAL `i = 2 \/ i = 3`);
1928 (NEW_GOAL `HD (xl:(real^3)list) = HD yl`);
1929 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
1930 (REWRITE_WITH `HD (truncate_simplex 2 ul) = (HD ul):real^3`);
1931 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1932 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
1933 CARD (set_of_list ul) = 3 + 1`);
1934 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1935 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1938 (REWRITE_WITH `HD (truncate_simplex 2 vl) = (HD vl):real^3`);
1939 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
1940 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
1941 CARD (set_of_list vl) = 3 + 1`);
1942 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
1943 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
1945 (ASM_REWRITE_TAC[]);
1947 (NEW_GOAL `hl (xl:(real^3)list) = dist (omega_list V yl, HD yl)`);
1948 (ASM_REWRITE_TAC[]);
1949 (ASM_REAL_ARITH_TAC);
1951 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
1954 (* ======================================================================= *)
1956 (NEW_GOAL `sqrt (&2) <= hl (ul:(real^3)list)`);
1957 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1958 (ASM_CASES_TAC `i = 2`);
1959 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 2`; mcell2]);
1962 (ASM_REWRITE_TAC[]);
1963 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1966 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 3`; mcell3]);
1969 (ASM_REWRITE_TAC[]);
1970 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1972 (NEW_GOAL `sqrt (&2) <= hl (vl:(real^3)list)`);
1973 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
1974 (ASM_REWRITE_TAC[]);
1975 (ASM_CASES_TAC `j = 2`);
1976 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 2`; mcell2]);
1979 (ASM_REWRITE_TAC[]);
1980 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1983 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 3`; mcell3]);
1986 (ASM_REWRITE_TAC[]);
1987 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
1989 (ABBREV_TAC `s2 = omega_list_n V ul 2`);
1990 (ABBREV_TAC `s3 = omega_list_n V ul 3`);
1991 (NEW_GOAL `s2 = omega_list_n V vl 2`);
1992 (EXPAND_TAC "s2" THEN FIRST_ASSUM MATCH_MP_TAC);
1993 (NEW_GOAL `i = 2 \/ i = 3`);
1996 (NEW_GOAL `s3 = omega_list_n V vl 3`);
1997 (EXPAND_TAC "s3" THEN FIRST_ASSUM MATCH_MP_TAC);
1998 (NEW_GOAL `i = 2 \/ i = 3`);
2001 (ABBREV_TAC `u0:real^3 = HD ul`);
2003 (NEW_GOAL `?s. between s (s2,s3) /\
2004 dist (u0,s) = sqrt (&2) /\
2006 (EXPAND_TAC "s2" THEN EXPAND_TAC "s3");
2007 (MATCH_MP_TAC MXI_EXPLICIT);
2008 (NEW_GOAL `?v0 u1 u2 u3. ul = [v0;u1;u2;u3:real^3]`);
2009 (MATCH_MP_TAC BARV_3_EXPLICIT);
2010 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2011 (UP_ASM_TAC THEN STRIP_TAC);
2012 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
2013 EXISTS_TAC `u3:real^3`);
2014 (ASM_REWRITE_TAC[]);
2015 (REWRITE_WITH `v0:real^3 = HD ul`);
2016 (REWRITE_TAC[ASSUME `ul = [v0;u1;u2;u3:real^3]`; HD]);
2017 (ASM_REWRITE_TAC[]);
2018 (UP_ASM_TAC THEN STRIP_TAC);
2020 (NEW_GOAL `?t. between t (s2,s3) /\
2021 dist (u0,t) = sqrt (&2) /\
2023 (ASM_REWRITE_TAC[]);
2024 (MATCH_MP_TAC MXI_EXPLICIT);
2025 (NEW_GOAL `?v0 u1 u2 u3. vl = [v0;u1;u2;u3:real^3]`);
2026 (MATCH_MP_TAC BARV_3_EXPLICIT);
2027 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2028 (UP_ASM_TAC THEN STRIP_TAC);
2029 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
2030 EXISTS_TAC `u3:real^3`);
2031 (ASM_REWRITE_TAC[HD]);
2032 (UP_ASM_TAC THEN STRIP_TAC);
2033 (ASM_REWRITE_TAC[]);
2035 (NEW_GOAL `!n. between n (s2, s3:real^3) ==>
2036 dist (u0, n) pow 2 = dist (s2, n) pow 2 + dist (u0, s2) pow 2`);
2038 (REWRITE_TAC[dist]);
2039 (MATCH_MP_TAC PYTHAGORAS);
2040 (REWRITE_TAC[orthogonal]);
2041 (ABBREV_TAC `zl = truncate_simplex 2 (ul:(real^3)list)`);
2042 (REWRITE_WITH `s2:real^3 = circumcenter (set_of_list zl)`);
2043 (REWRITE_WITH `s2 = omega_list V zl`);
2044 (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
2045 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2046 (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
2047 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2048 CARD (set_of_list ul) = 3 + 1`);
2049 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2050 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2052 (MATCH_MP_TAC Rogers.XNHPWAB1);
2053 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
2055 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2056 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2057 (MATCH_MP_TAC Rogers.MHFTTZN4);
2058 (EXISTS_TAC `V:real^3->bool`);
2061 (ASM_REWRITE_TAC[]);
2063 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2064 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2066 (NEW_GOAL `s2 IN voronoi_list V zl`);
2067 (REWRITE_WITH `s2 = omega_list V zl`);
2068 (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
2069 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2070 (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
2071 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2072 CARD (set_of_list ul) = 3 + 1`);
2073 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2074 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2076 (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
2079 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2080 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2082 (NEW_GOAL `s3 IN voronoi_list V zl`);
2083 (EXPAND_TAC "s3" THEN EXPAND_TAC "zl");
2084 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
2085 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3 /\ 3 <= 3`]);
2086 (NEW_GOAL `affine hull {s2, s3} SUBSET affine hull voronoi_list V zl`);
2087 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
2089 (NEW_GOAL `n IN affine hull {s2, s3:real^3}`);
2090 (NEW_GOAL `convex hull {s2,s3} SUBSET affine hull {s2,s3:real^3}`);
2091 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2092 (NEW_GOAL `n IN convex hull {s2, s3:real^3}`);
2093 (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
2094 (ASM_REWRITE_TAC[]);
2098 (MATCH_MP_TAC Marchal_cells_2_new.IN_AFFINE_KY_LEMMA1);
2099 (REWRITE_WITH `u0:real^3 = HD zl`);
2100 (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
2101 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2102 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2103 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2104 CARD (set_of_list ul) = 3 + 1`);
2105 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2106 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2108 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
2110 (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\
2111 CARD (set_of_list zl) = 2 + 1`);
2112 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2113 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2115 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2116 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2119 (NEW_GOAL `dist (u0,s) pow 2 = dist (s2,s:real^3) pow 2 + dist (u0,s2) pow 2`);
2121 (NEW_GOAL `dist (u0,t) pow 2 = dist (s2,t:real^3) pow 2 + dist (u0,s2) pow 2`);
2123 (NEW_GOAL `dist (s2, s:real^3) = dist (s2, t)`);
2124 (REWRITE_TAC[DIST_EQ]);
2125 (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
2127 (UNDISCH_TAC `between s (s2, s3:real^3)` THEN
2128 UNDISCH_TAC `between t (s2, s3:real^3)`);
2129 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
2131 (UNDISCH_TAC `dist (s2,s) = dist (s2,t:real^3)`);
2132 (REWRITE_TAC[dist;ASSUME `s = u' % s2 + v' % s3:real^3`;
2133 ASSUME `t = u % s2 + v % s3:real^3` ]);
2134 (REWRITE_WITH `s2 - (u' % s2 + v' % s3) =
2135 (u' + v') % s2 - (u' % s2 + v' % s3:real^3)`);
2136 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
2137 (REWRITE_WITH `s2 - (u % s2 + v % s3) =
2138 (u + v) % s2 - (u % s2 + v % s3:real^3)`);
2139 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
2140 (REWRITE_TAC[VECTOR_ARITH `(u + v) % s - (u % s + v % t) = v % (s - t)`]);
2141 (REWRITE_TAC[NORM_MUL]);
2142 (REWRITE_WITH `abs v = v /\ abs v' = v'`);
2143 (ASM_SIMP_TAC[REAL_ABS_REFL]);
2144 (REWRITE_TAC[REAL_ARITH `a * b = c * b <=> (a - c) * b = &0`;REAL_ENTIRE]);
2146 (REWRITE_WITH `v = v':real /\ u = u':real`);
2147 (ASM_REAL_ARITH_TAC);
2148 (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0]);
2149 (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`] THEN STRIP_TAC);
2151 (NEW_GOAL `hl (ul:(real^3)list) <= dist (s3,u0:real^3)`);
2152 (REWRITE_WITH `s3 = omega_list V ul /\ u0 = HD ul`);
2154 (REWRITE_TAC[GSYM (ASSUME `omega_list_n V ul 3 = s3`); OMEGA_LIST]);
2155 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2156 CARD (set_of_list ul) = 3 + 1`);
2157 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2158 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2159 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
2160 (ASM_REWRITE_TAC[]);
2161 (MATCH_MP_TAC Rogers.WAUFCHE1);
2162 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
2163 (ABBREV_TAC `zl:(real^3)list = truncate_simplex 2 ul`);
2164 (NEW_GOAL `hl (zl:(real^3)list) = dist (s3, u0:real^3)`);
2167 (REWRITE_WITH `s3 = omega_list V zl /\ u0 = HD zl`);
2169 (REWRITE_TAC[GSYM (ASSUME `s2:real^3 = s3`); OMEGA_LIST]);
2172 (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\
2173 CARD (set_of_list zl) = 2 + 1`);
2174 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2175 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2177 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2178 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2179 (REWRITE_TAC[ARITH_RULE `(2 + 1) - 1 = 2`]);
2182 (REWRITE_WITH `truncate_simplex 2 (ul:(real^3)list) =
2183 truncate_simplex (2 + 0) (ul:(real^3)list)`);
2184 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
2185 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
2186 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2187 CARD (set_of_list ul) = 3 + 1`);
2188 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2189 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2192 (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
2193 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2194 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
2195 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2196 CARD (set_of_list ul) = 3 + 1`);
2197 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2198 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2200 (MATCH_MP_TAC Rogers.WAUFCHE2);
2201 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
2203 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
2204 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
2205 (ASM_REAL_ARITH_TAC);
2206 (ASM_MESON_TAC[])]);;
2209 (* ==================================================================== *)
2212 let AFFINE_HULL_3_INSERT = prove_by_refinement (
2214 a IN affine hull S ==> affine hull (a INSERT S) = affine hull S`,
2215 [(REPEAT STRIP_TAC);
2216 (MATCH_MP_TAC AFFINE_HULLS_EQ);
2217 (ASM_REWRITE_TAC[SET_SUBSET_AFFINE_HULL; INSERT_SUBSET]);
2218 (MATCH_MP_TAC (SET_RULE `a:real^3 INSERT s SUBSET t ==> s SUBSET t`));
2219 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL])]);;
2221 (* ==================================================================== *)
2224 let FINITE_EDGE_X2 = prove_by_refinement (
2225 `!(V:real^3->bool) e:real^3->bool u0 u1.
2226 packing V /\ saturated V /\ e = {u0, u1} ==>
2227 FINITE {X | mcell_set V X /\ edgeX V X e}`,
2228 [(REPEAT STRIP_TAC);
2229 (MATCH_MP_TAC FINITE_SUBSET);
2230 (EXISTS_TAC `{X | mcell_set V X /\ edgeX V X e /\ ~(X = {})} UNION {{}}`);
2232 (ONCE_REWRITE_TAC[SET_RULE `A /\ B <=> B /\ A`]);
2234 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; IN_UNION]);
2236 (ASM_REWRITE_TAC[MESON[IN] `{{}} x <=> x IN {{}}`;
2237 SET_RULE `x IN {a} <=> x = a`]);
2239 (REWRITE_TAC [FINITE_UNION; FINITE_SING]);
2241 (MATCH_MP_TAC FINITE_SUBSET);
2242 (ABBREV_TAC `f = (\(i, ul). mcell i V ul)`);
2243 (ABBREV_TAC `s = V INTER ball (u0:real^3, &4)`);
2244 (ABBREV_TAC `S = {y | ?v0 v1 v2 v3:real^3.
2249 y = [v0; v1; v2; v3]}`);
2250 (ABBREV_TAC `S1 = {i, (ul:(real^3)list) | i IN 0..4 /\ ul IN S}`);
2251 (EXISTS_TAC `{(f:num#(real^3)list->real^3->bool) x | x IN S1}`);
2253 (REWRITE_TAC[SET_RULE `{f x |x IN s } = {y | ?x. x IN s /\ y = f x}`]);
2254 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
2256 (MATCH_MP_TAC FINITE_PRODUCT);
2257 (REWRITE_TAC[FINITE_NUMSEG]);
2259 (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA);
2261 (MATCH_MP_TAC Pack2.KIUMVTC THEN ASM_SIMP_TAC[]);
2263 (EXPAND_TAC "f" THEN REWRITE_TAC[SUBSET; IN; IN_ELIM_THM; mcell_set_2]);
2265 (EXISTS_TAC `(i:num, ul:(real^3)list)`);
2266 (ASM_REWRITE_TAC[]);
2267 (EXPAND_TAC "S1" THEN REWRITE_TAC[IN_ELIM_THM]);
2268 (EXISTS_TAC `i:num` THEN EXISTS_TAC `ul:(real^3)list`);
2269 (ASM_REWRITE_TAC[IN_NUMSEG_0]);
2270 (EXPAND_TAC "S" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
2271 (NEW_GOAL `?v0 v1 v2 v3. ul = [v0; v1; v2; v3:real^3]`);
2272 (MATCH_MP_TAC BARV_3_EXPLICIT);
2273 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2274 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
2275 (EXISTS_TAC `v0:real^3` THEN EXISTS_TAC `v1:real^3` THEN
2276 EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
2277 (ASM_REWRITE_TAC[]);
2278 (NEW_GOAL `set_of_list ul SUBSET (s:real^3->bool)`);
2280 (REWRITE_TAC[SUBSET_INTER]);
2282 (MATCH_MP_TAC Packing3.BARV_SUBSET);
2283 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
2284 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2285 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2287 (NEW_GOAL `~NULLSET x`);
2288 (UNDISCH_TAC `edgeX V x e`);
2289 (REWRITE_TAC[edgeX; IN_ELIM_THM; VX]);
2292 (UNDISCH_TAC `{ } (u:real^3)`);
2293 (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
2296 (NEW_GOAL `VX V x = V INTER x`);
2297 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
2298 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
2299 (ASM_REWRITE_TAC[]);
2301 (NEW_GOAL `V INTER (x:real^3->bool) =
2302 set_of_list (truncate_simplex (i - 1) ul)`);
2303 (ASM_REWRITE_TAC[]);
2304 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
2305 (REWRITE_TAC[GSYM (ASSUME `ul = [v0;v1;v2;v3:real^3]`);
2306 GSYM (ASSUME `x = mcell i V ul`)]);
2307 (ASM_REWRITE_TAC[]);
2308 (ASM_CASES_TAC `i = 0`);
2310 (UNDISCH_TAC `edgeX V x e`);
2311 (REWRITE_TAC[edgeX; IN_ELIM_THM]);
2312 (REWRITE_WITH `VX V x = {}`);
2313 (ASM_REWRITE_TAC[]);
2314 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
2315 (ASM_REWRITE_TAC[]);
2318 (UNDISCH_TAC `{ } (u:real^3)`);
2319 (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
2321 (UP_ASM_TAC THEN ARITH_TAC);
2323 (NEW_GOAL `u0 IN VX V x`);
2324 (UNDISCH_TAC `edgeX V x e`);
2325 (REWRITE_TAC[edgeX; IN_ELIM_THM; ASSUME `e = {u0, u1:real^3}`; IN]);
2328 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
2330 (REWRITE_TAC[GSYM (ASSUME `ul = [v0; v1; v2; v3:real^3]`)]);
2332 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) ul) SUBSET
2333 set_of_list (ul:(real^3)list)`);
2334 (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
2335 (ASM_REWRITE_TAC[LENGTH] THEN ASM_ARITH_TAC);
2337 (REWRITE_TAC[MESON[IN] `(s:real^3->bool) v <=> v IN s`]);
2338 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[])]);;
2341 (* ==================================================================== *)
2344 let CONTINUOUS_ON_LIFT_DOT2 = prove
2345 (`!f:real^M->real^N g s.
2346 f continuous_on s /\ g continuous_on s
2347 ==> (\x. lift(f x dot g x)) continuous_on s`,
2349 SUBGOAL_THEN `bilinear (\x y:real^N. lift(x dot y))` MP_TAC THENL
2350 [REWRITE_TAC[bilinear; linear; DOT_LADD; DOT_RADD; DOT_LMUL; DOT_RMUL] THEN
2351 REWRITE_TAC[LIFT_ADD; LIFT_CMUL];
2352 REWRITE_TAC[GSYM IMP_CONJ_ALT; GSYM CONJ_ASSOC] THEN
2353 DISCH_THEN(MP_TAC o MATCH_MP BILINEAR_CONTINUOUS_ON_COMPOSE) THEN
2356 let LIFT_MUL_CONTINUOUS_ON = prove
2357 (`!f:real^N->real g s.
2358 lift o f continuous_on s /\ lift o g continuous_on s ==>
2359 lift o (\x. f x * g x) continuous_on s`,
2360 REWRITE_TAC[o_DEF; LIFT_CMUL] THEN
2361 REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
2362 ASM_REWRITE_TAC[o_DEF]);;
2364 let LIFT_DIV_CONTINUOUS_ON = prove
2365 (`!f:real^N->real g s.
2366 lift o f continuous_on s /\ lift o g continuous_on s /\
2367 (!x. x IN s ==> ~(g x = &0))==>
2368 lift o (\x. f x / g x) continuous_on s`,
2369 REWRITE_TAC[o_DEF; LIFT_CMUL; real_div] THEN
2370 REPEAT STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_MUL THEN
2371 ASM_REWRITE_TAC[o_DEF] THEN
2372 MATCH_MP_TAC(REWRITE_RULE[o_DEF] CONTINUOUS_ON_INV) THEN
2373 ASM_REWRITE_TAC[]);;
2375 let LIFT_DOT_CONTINUOUS_ON = prove
2377 (lift o ((\x. (x - a) dot b))) continuous_on s`,
2378 REPEAT GEN_TAC THEN REWRITE_TAC[o_DEF] THEN
2379 MATCH_MP_TAC CONTINUOUS_ON_LIFT_DOT2 THEN
2380 ASM_SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID]);;
2382 let LIFT_NORM_CONTINUOUS_ON = prove
2384 (lift o ((\x. norm (x - a)))) continuous_on s`,
2385 REPEAT GEN_TAC THEN REWRITE_TAC[o_DEF] THEN
2386 MATCH_MP_TAC CONTINUOUS_ON_LIFT_NORM_COMPOSE THEN
2387 ASM_SIMP_TAC[CONTINUOUS_ON_SUB; CONTINUOUS_ON_CONST; CONTINUOUS_ON_ID]);;
2389 (* ==================================================================== *)
2392 let aff_ge_alt = new_definition
2393 `aff_ge_alt s t (v:real^3) <=>
2394 (?f q. FINITE q /\ q SUBSET t /\ v = lin_combo (s UNION q) f /\
2395 (!w. q w ==> &0 <= f w) /\
2396 sum (s UNION q) f = &1)`;;
2398 let smallest_angle_set = new_definition
2400 smallest_angle_set s u0 u1 =
2401 (@x. x IN s /\ (!y. y IN s ==>
2402 ((y - u0) dot (u1 - u0)) /
2403 (norm (y - u0) * norm (u1 - u0)) <=
2404 ((x - u0) dot (u1 - u0)) /
2405 (norm (x - u0) * norm (u1 - u0))))`;;
2407 let smallest_angle_line = new_definition
2409 smallest_angle_line a b c d = smallest_angle_set (convex hull {a, b}) c d`;;
2411 let SMALLEST_ANGLE_LINE_EXISTS = prove_by_refinement (
2412 `!a b u0 u1. ~(u0 = u1) /\ ~(u0 IN convex hull {a, b}) ==>
2413 (?x. (x IN convex hull {a, b:real^3} /\
2414 (!y. y IN convex hull {a, b} ==>
2415 ((y - u0) dot (u1 - u0)) /
2416 (norm (y - u0) * norm (u1 - u0)) <=
2417 ((x - u0) dot (u1 - u0)) /
2418 (norm (x - u0) * norm (u1 - u0)))))`,
2419 [(REPEAT STRIP_TAC);
2420 (ABBREV_TAC `f = (\x:real^3. ((x - u0) dot (u1 - u0)) /
2421 (norm (x - u0) * norm (u1 - u0)))`);
2423 (REWRITE_WITH `!y:real^3.
2424 ((y - u0) dot (u1 - u0)) / (norm (y - u0) * norm (u1 - u0)) = f y`);
2425 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
2426 (MATCH_MP_TAC CONTINUOUS_ATTAINS_SUP);
2428 (MATCH_MP_TAC FINITE_IMP_COMPACT_CONVEX_HULL);
2429 (REWRITE_TAC[Geomdetail.FINITE6]);
2431 (REWRITE_TAC[CONVEX_HULL_EQ_EMPTY] THEN SET_TAC[]);
2432 (ABBREV_TAC `f1 = (\x. (x - u0) dot (u1 - u0:real^3))`);
2433 (ABBREV_TAC `f2 = (\x. norm (x - u0) * norm (u1 - u0:real^3))`);
2434 (REWRITE_WITH `f = (\x:real^3. f1 x / f2 x)`);
2435 (EXPAND_TAC "f" THEN EXPAND_TAC "f1" THEN EXPAND_TAC "f2");
2437 (MATCH_MP_TAC LIFT_DIV_CONTINUOUS_ON);
2441 (REWRITE_TAC[LIFT_DOT_CONTINUOUS_ON]);
2442 (ABBREV_TAC `f3 = (\x:real^3. norm (u1 - u0:real^3))`);
2443 (ABBREV_TAC `f4 = (\x:real^3. norm (x - u0:real^3))`);
2444 (REWRITE_WITH `f2 = (\x:real^3. f4 x * f3 x)`);
2445 (EXPAND_TAC "f2" THEN EXPAND_TAC "f3" THEN EXPAND_TAC "f4");
2447 (MATCH_MP_TAC LIFT_MUL_CONTINUOUS_ON);
2448 (EXPAND_TAC "f3" THEN EXPAND_TAC "f4");
2449 (REWRITE_TAC[LIFT_NORM_CONTINUOUS_ON]);
2450 (REWRITE_TAC[o_DEF; CONTINUOUS_ON_CONST]);
2451 (UP_ASM_TAC THEN EXPAND_TAC "f2" THEN REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0]);
2452 (ASM_REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> b = a`]);
2454 (ASM_MESON_TAC[])]);;
2456 (* ==================================================================== *)
2459 let SMALLEST_ANGLE_IN_CONVEX_HULL = prove_by_refinement (
2461 ~(p = q) /\ ~(p IN convex hull {m,n}) /\ x = smallest_angle_line m n p q
2462 ==> x IN convex hull {m, n}`,
2463 [(REPEAT STRIP_TAC);
2464 (UP_ASM_TAC THEN REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2466 (ABBREV_TAC `X = (\x:real^3. x IN convex hull {m, n} /\
2467 (!y. y IN convex hull {m, n}
2468 ==> ((y - p) dot (q - p)) / (norm (y - p) * norm (q - p)) <=
2469 ((x - p) dot (q - p)) / (norm (x - p) * norm (q - p))))`);
2470 (NEW_GOAL `(X:real^3->bool) x`);
2471 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SELECT_AX);
2472 (EXPAND_TAC "X" THEN ASM_SIMP_TAC[SMALLEST_ANGLE_LINE_EXISTS]);
2473 (UP_ASM_TAC THEN EXPAND_TAC "X" THEN MESON_TAC[])]);;
2475 (* ==================================================================== *)
2478 let SMALLEST_ANGLE_LINE_PROPERTY = prove_by_refinement (
2481 ~(u0 IN convex hull {m,n}) /\
2482 x = smallest_angle_line m n u0 u1 /\
2483 y IN convex hull {m, n}
2484 ==> ((y - u0) dot (u1 - u0)) /
2485 (norm (y - u0) * norm (u1 - u0)) <=
2486 ((x - u0) dot (u1 - u0)) /
2487 (norm (x - u0) * norm (u1 - u0))`,
2488 [(REPEAT STRIP_TAC);
2489 (UNDISCH_TAC `x = smallest_angle_line m n u0 u1`);
2490 (REWRITE_TAC[smallest_angle_line; smallest_angle_set]);
2493 (\x:real^3. x IN convex hull {m, n} /\
2494 (!y. y IN convex hull {m, n}
2495 ==> ((y - u0) dot (u1 - u0)) / (norm (y - u0) * norm (u1 - u0)) <=
2496 ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0))))`);
2497 (NEW_GOAL `(X:real^3->bool) x`);
2498 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SELECT_AX);
2499 (EXPAND_TAC "X" THEN ASM_SIMP_TAC[SMALLEST_ANGLE_LINE_EXISTS]);
2500 (UP_ASM_TAC THEN EXPAND_TAC "X" THEN ASM_MESON_TAC[])]);;
2502 (* ==================================================================== *)
2505 let MCELL_SUBSET_BALL8_1 = prove_by_refinement (
2507 i<= 4 /\ packing V /\ saturated V /\ barV V 3 ul /\ v IN mcell i V ul ==>
2508 mcell i V ul SUBSET ball (v, &8)`,
2509 [(REPEAT STRIP_TAC);
2510 (NEW_GOAL `mcell i V ul SUBSET
2511 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
2512 (MATCH_MP_TAC Qzksykg.QZKSYKG2);
2513 (ASM_REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4}<=> i =0\/i=1\/i=2\/i=3\/i=4`]);
2515 (NEW_GOAL `UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}
2516 SUBSET UNIONS {voronoi_closed V s | s IN set_of_list ul}`);
2517 (REWRITE_TAC[SUBSET; IN_UNIONS; IN;IN_ELIM_THM] THEN REPEAT STRIP_TAC);
2518 (EXISTS_TAC `voronoi_closed V ((HD (left_action_list p ul)):real^3)`);
2520 (EXISTS_TAC `(HD (left_action_list p ul)):real^3`);
2521 (REWRITE_TAC[MESON[IN] `(a:real^3->bool) s <=> s IN a`]);
2523 `set_of_list (ul:(real^3)list) = set_of_list (left_action_list p ul)`);
2524 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
2525 (ASM_CASES_TAC `i = 4`);
2526 (MATCH_MP_TAC Packing3.SET_OF_LIST_LEFT_ACTION_LIST);
2527 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2528 CARD (set_of_list ul) = 3 + 1`);
2529 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2530 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2531 (ASM_MESON_TAC[ARITH_RULE `3 + 1 = 4`]);
2533 (ASM_CASES_TAC `i = 3`);
2534 (MATCH_MP_TAC Marchal_cells_2_new.SET_OF_LIST_LEFT_ACTION_LIST_2);
2535 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2536 CARD (set_of_list ul) = 3 + 1`);
2537 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2538 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2539 (ASM_MESON_TAC[ARITH_RULE `(3 + 1) - 2 = 3 - 1 /\ 2 <= 3 + 1`]);
2541 (ASM_CASES_TAC `i = 2`);
2542 (MATCH_MP_TAC Marchal_cells_2_new.SET_OF_LIST_LEFT_ACTION_LIST_3);
2543 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2544 CARD (set_of_list ul) = 3 + 1`);
2545 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2546 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2547 (ASM_MESON_TAC[ARITH_RULE `(3 + 1) - 3 = 2 - 1 /\ 3 <= 3 + 1`]);
2549 (NEW_GOAL `i <= 1`);
2551 (NEW_GOAL `p permutes 0..0`);
2552 (ASM_MESON_TAC[ARITH_RULE `i <= 1 ==> i - 1 = 0`]);
2553 (UP_ASM_TAC THEN REWRITE_TAC[Packing3.PERMUTES_TRIVIAL] THEN STRIP_TAC);
2554 (ASM_REWRITE_TAC[Packing3.LEFT_ACTION_LIST_I]);
2555 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
2556 (REWRITE_TAC[Packing3.LENGTH_LEFT_ACTION_LIST]);
2557 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
2558 CARD (set_of_list ul) = 3 + 1`);
2559 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
2560 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
2563 (UP_ASM_TAC THEN REWRITE_TAC[MESON[IN] `(a:real^3->bool) s <=> s IN a`]);
2564 (ASM_REWRITE_TAC[]);
2565 (NEW_GOAL `rogers V (left_action_list p ul) SUBSET
2566 voronoi_closed V (HD (left_action_list p ul))`);
2567 (MATCH_MP_TAC ROGERS_SUBSET_VORONOI_CLOSED);
2568 (ASM_REWRITE_TAC[]);
2569 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
2570 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN
2571 EXISTS_TAC `p:num->num`);
2572 (ASM_REWRITE_TAC[]);
2574 (REWRITE_TAC[SET_RULE `i IN {0,1,2,3,4} <=> i=0\/i=1\/i=2\/i=3\/i=4`]);
2576 (UNDISCH_TAC `v IN mcell i V ul` THEN SET_TAC[]);
2577 (UP_ASM_TAC THEN SET_TAC[]);
2579 (NEW_GOAL `UNIONS {voronoi_closed V s | s IN set_of_list ul} SUBSET
2580 UNIONS {ball (s:real^3, &2) | s IN set_of_list ul}`);
2581 (NEW_GOAL `!s:real^3. voronoi_closed V s SUBSET ball (s, &2)`);
2582 (ASM_SIMP_TAC[Packing3.VORONOI_BALL2]);
2583 (UP_ASM_TAC THEN SET_TAC[]);
2585 (NEW_GOAL `mcell i V ul SUBSET UNIONS {ball (s,&2) | s IN set_of_list ul}`);
2587 UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
2589 UNIONS {voronoi_closed V (s:real^3) | s IN set_of_list ul}`);
2590 (ABBREV_TAC `s3 = UNIONS {ball (s:real^3,&2) | s IN set_of_list ul}`);
2591 (DEL_TAC THEN DEL_TAC THEN DEL_TAC);
2592 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
2593 (UP_ASM_TAC THEN REWRITE_TAC[SUBSET; IN_UNIONS; IN; IN_ELIM_THM; IN_BALL]);
2595 (NEW_GOAL `?t. (?s. set_of_list ul s /\ t = ball (s:real^3,&2)) /\ t x`);
2597 (UP_ASM_TAC THEN STRIP_TAC);
2598 (NEW_GOAL `dist (s, x:real^3) < &2`);
2599 (REWRITE_TAC[GSYM IN_BALL]);
2600 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
2602 (NEW_GOAL `?t. (?s. set_of_list ul s /\ t = ball (s:real^3,&2)) /\ t v`);
2603 (FIRST_ASSUM MATCH_MP_TAC);
2605 (UP_ASM_TAC THEN STRIP_TAC);
2606 (NEW_GOAL `dist (s', v:real^3) < &2`);
2607 (REWRITE_TAC[GSYM IN_BALL]);
2608 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
2610 (NEW_GOAL `dist (v, x:real^3) <= dist (s', v) + dist (s', s) + dist (s, x)`);
2612 (NEW_GOAL `dist (s', s:real^3) < &4`);
2613 (REWRITE_TAC[GSYM IN_BALL]);
2615 (NEW_GOAL `set_of_list ul SUBSET ball (s':real^3,&4)`);
2616 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
2617 (EXISTS_TAC `V:real^3->bool`);
2618 (ASM_REWRITE_TAC[IN]);
2620 (ASM_REAL_ARITH_TAC)]);;
2622 (* ==================================================================== *)
2625 let MCELL_SUBSET_BALL8 = prove_by_refinement (
2627 packing V /\ saturated V /\ barV V 3 ul /\ v IN mcell i V ul ==>
2628 mcell i V ul SUBSET ball (v, &8)`,
2629 [(REPEAT STRIP_TAC);
2630 (ASM_CASES_TAC `i <= 4`);
2631 (ASM_SIMP_TAC[MCELL_SUBSET_BALL8_1]);
2632 (UNDISCH_TAC `v IN mcell i V ul`);
2633 (REWRITE_WITH `mcell i V ul = mcell 4 V ul`);
2634 (ASM_SIMP_TAC[MCELL_EXPLICIT; ARITH_RULE `4 >= 4`;
2635 ARITH_RULE `~(i <= 4)==>i >= 4`]);
2637 (ASM_SIMP_TAC[MCELL_SUBSET_BALL8_1; ARITH_RULE `4 <= 4`])]);;
2639 (* ==================================================================== *)
2642 let FINITE_MCELL_SET_LEMMA_2 = prove_by_refinement (
2644 packing V /\ saturated V
2645 ==> FINITE {X | X SUBSET ball (s,r) /\ mcell_set V X}`,
2646 [(REPEAT STRIP_TAC);
2647 (MATCH_MP_TAC FINITE_SUBSET);
2648 (EXISTS_TAC `{X | X SUBSET ball (vec 0,norm (s:real^3) + r) /\
2651 (ASM_SIMP_TAC[FINITE_MCELL_SET_LEMMA]);
2652 (REWRITE_TAC[IN; SUBSET; IN_BALL; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
2653 (NEW_GOAL `dist (vec 0, x') <= norm s + dist (s, x':real^3)`);
2655 (NEW_GOAL `dist (s, x':real^3) < r`);
2657 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
2658 (ASM_REWRITE_TAC[])]);;
2660 (* ==================================================================== *)
2663 let CONIC_CAP_WEDGE_EQ_0 =prove_by_refinement (
2664 `!v0 v1 a r w1 w2. a < &1 /\ &0 < r /\
2665 vol (conic_cap v0 v1 r a INTER wedge v0 v1 w1 w2) = &0 ==>
2666 coplanar {v0,v1,w1, w2:real^3}`,
2667 [(REPEAT STRIP_TAC);
2668 (MATCH_MP_TAC (MESON[] `(~A==> F) ==> A`) THEN STRIP_TAC);
2669 (NEW_GOAL `~collinear {v0, v1, w1:real^3}`);
2670 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2671 (EXISTS_TAC `w2:real^3` THEN ASM_REWRITE_TAC[]);
2672 (NEW_GOAL `~collinear {v0, v1, w2:real^3}`);
2673 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2674 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`] THEN
2675 EXISTS_TAC `w1:real^3` THEN ASM_REWRITE_TAC[]);
2677 (NEW_GOAL `vol (conic_cap v0 v1 r a INTER wedge v0 v1 w1 (w2:real^3)) =
2678 (if &1 < a \/ r < &0
2680 else azim v0 v1 w1 w2 / &3 * (&1 - max a (-- &1)) * r pow 3)`);
2681 (ASM_MESON_TAC[VOLUME_CONIC_CAP_WEDGE]);
2682 (UP_ASM_TAC THEN COND_CASES_TAC);
2683 (STRIP_TAC THEN ASM_REAL_ARITH_TAC);
2684 (ASM_REWRITE_TAC[REAL_ARITH `&0 = a <=> a = &0`;
2685 REAL_ENTIRE; REAL_ARITH `a / &3 = &0 <=> a = &0`]);
2686 (REWRITE_TAC[REAL_ARITH `&1 - max a (-- &1) = &0 <=> a = &1`]);
2688 (UNDISCH_TAC `~coplanar {v0, v1, w1, w2:real^3}`);
2689 (ASM_SIMP_TAC[AZIM_EQ_0_PI_IMP_COPLANAR]);
2690 (ASM_REAL_ARITH_TAC);
2691 (UP_ASM_TAC THEN REWRITE_TAC[] THEN MATCH_MP_TAC REAL_POW_NZ);
2692 (ASM_REAL_ARITH_TAC)]);;
2694 (* ==================================================================== *)
2697 let CONIC_CAP_AFF_GT_EQ_0 =prove_by_refinement (
2698 `!v0 v1 a r w1 w2. a < &1 /\ &0 < r /\
2699 vol (conic_cap v0 v1 r a INTER aff_gt {v0, v1} {w1, w2}) = &0 ==>
2700 coplanar {v0,v1,w1, w2:real^3}`,
2701 [(REPEAT STRIP_TAC);
2702 (MATCH_MP_TAC (MESON[] `(~A==> F) ==> A`) THEN STRIP_TAC);
2703 (NEW_GOAL `~collinear {v0, v1, w1:real^3}`);
2704 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2705 (EXISTS_TAC `w2:real^3` THEN ASM_REWRITE_TAC[]);
2706 (NEW_GOAL `~collinear {v0, v1, w2:real^3}`);
2707 (MATCH_MP_TAC NOT_COPLANAR_NOT_COLLINEAR);
2708 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`] THEN
2709 EXISTS_TAC `w1:real^3` THEN ASM_REWRITE_TAC[]);
2710 (ASM_CASES_TAC `azim v0 v1 w1 (w2:real^3) < pi`);
2711 (NEW_GOAL `wedge v0 v1 w1 w2 = aff_gt {v0, v1} {w1, w2:real^3}`);
2712 (ASM_MESON_TAC[WEDGE_LUNE]);
2713 (ASM_MESON_TAC[ CONIC_CAP_WEDGE_EQ_0]);
2715 (ASM_CASES_TAC `azim v0 v1 w1 (w2:real^3) > pi`);
2716 (NEW_GOAL `azim v0 v1 w2 (w1:real^3) =
2717 (if azim v0 v1 w1 w2 = &0 then &0 else &2 * pi - azim v0 v1 w1 w2)`);
2718 (MATCH_MP_TAC AZIM_COMPL);
2719 (ASM_REWRITE_TAC[]);
2720 (UP_ASM_TAC THEN COND_CASES_TAC);
2721 (UNDISCH_TAC `azim v0 v1 w1 (w2:real^3) > pi` THEN ASM_REWRITE_TAC[]);
2722 (MESON_TAC[PI_POS_LE; REAL_ARITH `&0 > a <=> ~(&0 <= a)`]);
2724 (NEW_GOAL `azim v0 v1 w2 (w1:real^3) < pi`);
2725 (ASM_REAL_ARITH_TAC);
2727 (NEW_GOAL `wedge v0 v1 w2 w1 = aff_gt {v0, v1} {w1, w2:real^3}`);
2728 (REWRITE_WITH `{w1, w2:real^3} = {w2, w1}`);
2731 (UNDISCH_TAC `~coplanar {v0, v1, w1, w2:real^3}`);
2733 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
2734 (ASM_MESON_TAC[WEDGE_LUNE]);
2736 (UNDISCH_TAC `~coplanar {v0, v1, w1, w2:real^3}`);
2738 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {a,b,d,c}`]);
2739 (ASM_MESON_TAC[ CONIC_CAP_WEDGE_EQ_0]);
2741 (NEW_GOAL `azim v0 v1 w1 (w2:real^3) = pi`);
2742 (ASM_REAL_ARITH_TAC);
2743 (ASM_MESON_TAC[AZIM_EQ_0_PI_IMP_COPLANAR])]);;
2745 (* ==================================================================== *)
2748 let CONIC_CAP_INTER_CONVEX_HULL_4_GT_0 = prove_by_refinement (
2749 `!u0:real^3 u1 w1 w2 r a.
2750 &0 < r /\ a < &1 /\ &0 <= a /\ ~coplanar {u0, u1, w1, w2} ==>
2751 vol (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2}) > &0`,
2752 [(REPEAT STRIP_TAC);
2753 (NEW_GOAL `measurable
2754 (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2:real^3})`);
2755 (MATCH_MP_TAC MEASURABLE_INTER);
2756 (REWRITE_TAC[MEASURABLE_CONIC_CAP; MEASURABLE_CONVEX_HULL]);
2757 (SIMP_TAC[MEASURABLE_CONVEX_HULL;FINITE_IMP_BOUNDED;Geomdetail.FINITE6]);
2758 (REWRITE_TAC[REAL_ARITH `a > &0 <=> &0 <= a /\ ~(a = &0)`]);
2759 (ASM_SIMP_TAC[MEASURE_POS_LE]);
2761 `vol (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2}) = &0 <=>
2762 NULLSET (conic_cap u0 u1 r a INTER convex hull {u0, u1, w1, w2})`);
2763 (ASM_SIMP_TAC[MEASURABLE_MEASURE_EQ_0]);
2766 (NEW_GOAL `~(u0 = u1:real^3)`);
2768 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}` THEN REWRITE_TAC[]);
2769 (REWRITE_WITH `{u0, u1, w1, w2} = {u1:real^3, w1, w2}`);
2771 (ASM_REWRITE_TAC[COPLANAR_3]);
2773 (NEW_GOAL `?r1 a1. &0 < r1 /\ a1 < &1 /\
2774 conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1} {w1, w2:real^3} =
2775 conic_cap u0 u1 r1 a1 INTER convex hull {u0, u1,w1, w2} /\
2776 conic_cap u0 u1 r1 a1 SUBSET conic_cap u0 u1 r a`);
2777 (ABBREV_TAC `s = closest_point (affine hull {u1, w1, w2:real^3}) u0`);
2778 (ABBREV_TAC `r2 = dist (u0:real^3, s)`);
2779 (ABBREV_TAC `r1 = min r2 r`);
2780 (ABBREV_TAC `s2 = smallest_angle_line w1 (w2:real^3) u0 u1`);
2782 `a2 = ((s2 - u0:real^3) dot (u1 - u0)) /(norm (s2 - u0) * norm (u1 - u0))`);
2783 (ABBREV_TAC `a1 = max a2 a`);
2784 (EXISTS_TAC `r1:real` THEN EXISTS_TAC `a1:real`);
2785 (NEW_GOAL `&0 < r1 /\ a1 < &1`);
2786 (EXPAND_TAC "r1" THEN EXPAND_TAC "a1");
2787 (REWRITE_TAC[REAL_ARITH `&0 < min a b <=> &0 < a /\ &0 < b`;
2788 REAL_ARITH `max a b < &1 <=> a < &1 /\ b < &1`;]);
2789 (ASM_REWRITE_TAC[]);
2792 (MATCH_MP_TAC DIST_POS_LT);
2795 (NEW_GOAL `u0 IN affine hull {u1, w1, w2:real^3}`);
2796 (ASM_REWRITE_TAC[]);
2797 (DEL_TAC THEN EXPAND_TAC "s");
2798 (MATCH_MP_TAC CLOSEST_POINT_IN_SET);
2799 (REWRITE_TAC[CLOSED_AFFINE_HULL; AFFINE_HULL_EQ_EMPTY] THEN SET_TAC[]);
2800 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2802 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2803 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
2804 affine hull {u1:real^3, w1, w2}`);
2805 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2806 (ASM_REWRITE_TAC[]);
2807 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR; COPLANAR_3]);
2810 (MATCH_MP_TAC REAL_DIV_LT_1_TACTICS);
2812 (NEW_GOAL `s2 IN convex hull {w1, w2:real^3}`);
2813 (MATCH_MP_TAC SMALLEST_ANGLE_IN_CONVEX_HULL);
2814 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
2815 (ASM_REWRITE_TAC[]);
2817 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2819 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2820 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
2821 affine hull {u1:real^3, w1, w2}`);
2822 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2823 (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2824 (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {w1, w2:real^3}`);
2825 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2826 (NEW_GOAL `affine hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2827 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
2831 (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
2833 (NEW_GOAL `~(s2 = u0:real^3)`);
2835 (UNDISCH_TAC `s2 IN convex hull {w1, w2:real^3}` THEN ASM_REWRITE_TAC[]);
2837 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2839 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2840 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
2841 affine hull {u1:real^3, w1, w2}`);
2842 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2843 (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2844 (NEW_GOAL `convex hull {w1, w2} SUBSET affine hull {w1, w2:real^3}`);
2845 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
2846 (NEW_GOAL `affine hull {w1, w2} SUBSET affine hull {u1, w1, w2:real^3}`);
2847 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
2851 (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
2854 (MATCH_MP_TAC REAL_LT_MUL);
2855 (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2857 (REWRITE_TAC[REAL_ARITH `a < b <=> (a <= b) /\ ~(a = b)`]);
2859 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
2860 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ_EQ]);
2864 (ABBREV_TAC `t1 = norm (s2 - u0:real^3)`);
2865 (ABBREV_TAC `t2 = norm (u1 - u0:real^3)`);
2866 (NEW_GOAL `~(t2 = &0)`);
2867 (EXPAND_TAC "t2" THEN REWRITE_TAC[NORM_EQ_0;
2868 VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
2869 (ASM_REWRITE_TAC[]);
2871 (NEW_GOAL `s2 = t1 / t2 % u1 + (t2 - t1) / t2 % u0:real^3`);
2872 (REWRITE_TAC[VECTOR_ARITH `t1 / t2 % u1 + (t2 - t1) / t2 % u0:real^3 =
2873 &1 / t2 % (t1 % u1 + (t2 - t1) % u0)`]);
2874 (REWRITE_WITH `t1 % u1 + (t2 - t1) % u0 = t2 % (s2:real^3)`);
2875 (UNDISCH_TAC `t1 % (u1 - u0) = t2 % (s2 - u0:real^3)` THEN VECTOR_ARITH_TAC);
2876 (REWRITE_TAC[VECTOR_ARITH `&1 / t2 % t2 % s2 = (t2 / t2) % s2`]);
2877 (REWRITE_WITH `t2 / t2 = &1`);
2878 (ASM_SIMP_TAC[REAL_DIV_REFL]);
2880 (UNDISCH_TAC `s2 IN convex hull {w1, w2:real^3}`);
2881 (ASM_REWRITE_TAC[IN; CONVEX_HULL_2; IN_ELIM_THM]);
2883 (ABBREV_TAC `t = t1 / t2`);
2884 (ABBREV_TAC `t' = (t1 - t2) / t2`);
2886 (NEW_GOAL `u1 IN affine hull {u0, w1, w2:real^3}`);
2887 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
2888 (EXISTS_TAC `t'/ t` THEN EXISTS_TAC `u / t` THEN EXISTS_TAC `v / t`);
2890 (ASM_REWRITE_TAC[REAL_ARITH `a / t + b/ t + c / t = (a + b + c) / t `]);
2891 (REWRITE_WITH `t' + &1 = t`);
2892 (EXPAND_TAC "t'" THEN EXPAND_TAC "t");
2893 (NEW_GOAL `t2 / t2 = &1`);
2894 (ASM_SIMP_TAC[REAL_DIV_REFL]);
2895 (UP_ASM_TAC THEN REAL_ARITH_TAC);
2896 (MATCH_MP_TAC REAL_DIV_REFL);
2898 (ONCE_REWRITE_TAC[REAL_ARITH `a / b = a * (&1 / b)`]);
2899 (REWRITE_TAC[REAL_ENTIRE]);
2900 (REWRITE_WITH `~(t1 = &0)`);
2901 (EXPAND_TAC "t1" THEN REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH
2902 `a - b = vec 0 <=> a = b`] THEN ASM_REWRITE_TAC[]);
2903 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
2904 (ASM_REWRITE_TAC[]);
2905 (REWRITE_TAC[VECTOR_ARITH `t' / t % u0 + u / t % w1 + v / t % w2 =
2906 &1 / t % (t' % u0 + u % w1 + v % w2)`]);
2907 (REWRITE_WITH `t' % u0 + u % w1 + v % w2 = t % u1:real^3`);
2909 (UNDISCH_TAC `t % u1 + (t2 - t1) / t2 % u0 = u % w1 + v % w2:real^3`
2910 THEN VECTOR_ARITH_TAC);
2911 (REWRITE_TAC[VECTOR_ARITH `&1 / t % t % u = t / t % u`]);
2912 (REWRITE_WITH `t / t = &1`);
2913 (MATCH_MP_TAC REAL_DIV_REFL);
2915 (ONCE_REWRITE_TAC[REAL_ARITH `a / b = a * (&1 / b)`]);
2916 (REWRITE_TAC[REAL_ENTIRE]);
2917 (REWRITE_WITH `~(t1 = &0)`);
2918 (EXPAND_TAC "t1" THEN REWRITE_TAC[NORM_EQ_0; VECTOR_ARITH
2919 `a - b = vec 0 <=> a = b`] THEN ASM_REWRITE_TAC[]);
2920 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
2921 (ASM_REWRITE_TAC[]);
2924 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2926 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
2927 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
2929 (REWRITE_WITH `affine hull {u1, u0, w1, w2} =
2930 affine hull {u0:real^3, w1, w2}`);
2931 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
2932 (ASM_REWRITE_TAC[]);
2933 (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
2935 (NEW_GOAL `conic_cap (u0:real^3) u1 r1 a1 SUBSET conic_cap u0 u1 r a`);
2936 (REWRITE_TAC[conic_cap; NORMBALL_BALL] THEN MATCH_MP_TAC
2937 (SET_RULE `a SUBSET b /\ c SUBSET d ==> a INTER c SUBSET b INTER d`));
2939 (MATCH_MP_TAC SUBSET_BALL);
2940 (EXPAND_TAC "r1" THEN REAL_ARITH_TAC);
2941 (MATCH_MP_TAC RCONE_GT_SUBSET);
2942 (EXPAND_TAC "a1" THEN REAL_ARITH_TAC);
2944 (ASM_REWRITE_TAC[]);
2946 (REWRITE_TAC[SET_RULE `b = a <=> a SUBSET b /\ b SUBSET a`]);
2948 (MATCH_MP_TAC (SET_RULE `a SUBSET b ==> x INTER a SUBSET x INTER b`));
2949 (REWRITE_TAC[Marchal_cells_2_new.CONVEX_HULL_4_SUBSET_AFF_GE_2_2]);
2950 (REWRITE_TAC[SUBSET; IN_INTER]);
2952 (ASM_REWRITE_TAC[]);
2955 (NEW_GOAL `DISJOINT {u0, u1:real^3} {w1, w2}`);
2956 (REWRITE_TAC[DISJOINT]);
2957 (ASM_CASES_TAC `w1 IN {u0, u1:real^3}`);
2959 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2960 (REWRITE_WITH `{u0, u1, w1, w2:real^3} = {u0, u1, w2:real^3}`);
2961 (UP_ASM_TAC THEN SET_TAC[]);
2962 (REWRITE_TAC[COPLANAR_3]);
2963 (UP_ASM_TAC THEN SET_TAC[]);
2964 (ASM_CASES_TAC `w2 IN {u0, u1:real^3}`);
2966 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
2967 (REWRITE_WITH `{u0, u1, w1, w2:real^3} = {u0, u1, w1:real^3}`);
2968 (UP_ASM_TAC THEN SET_TAC[]);
2969 (REWRITE_TAC[COPLANAR_3]);
2970 (UP_ASM_TAC THEN SET_TAC[]);
2973 (ASM_SIMP_TAC[Marchal_cells_2_new.AFF_GE_2_2; CONVEX_HULL_4; IN; IN_ELIM_THM]);
2975 (EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN
2976 EXISTS_TAC `t3:real` THEN EXISTS_TAC `t4:real`);
2977 (ASM_REWRITE_TAC[]);
2980 (REWRITE_TAC[REAL_ARITH `&0 <= t <=> ~(t < &0)`] THEN STRIP_TAC);
2981 (NEW_GOAL `!x. x IN affine hull {u1, w1, w2} ==>
2982 dist (u0,s:real^3) <= dist (u0,x:real^3)`);
2983 (REPEAT STRIP_TAC THEN EXPAND_TAC "s");
2984 (MATCH_MP_TAC CLOSEST_POINT_LE);
2985 (ASM_REWRITE_TAC[CLOSED_AFFINE_HULL]);
2987 (NEW_GOAL `&1 < t2 + t3+ t4`);
2988 (ASM_REAL_ARITH_TAC);
2989 (NEW_GOAL `~(t2 + t3+ t4 = &0)`);
2990 (ASM_REAL_ARITH_TAC);
2992 (ABBREV_TAC `y = t2 / (t2 + t3 + t4) % u1 + t3 / (t2 + t3 + t4) % w1 +
2993 t4 / (t2 + t3 + t4) % w2:real^3`);
2994 (NEW_GOAL `x = t1 % u0 + (t2 + t3 + t4) % (y:real^3)`);
2995 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "y");
2996 (REWRITE_TAC[VECTOR_ARITH
2997 `t1 % u0 + t2 % u1 + t3 % w1 + t4 % w2 =
2998 t1 % u0 + t % (t2 / t % u1 + t3 / t % w1 + t4 / t % w2) <=>
2999 t2 % u1 + t3 % w1 + t4 % w2 = t / t % (t2 % u1 + t3 % w1 + t4 % w2)`]);
3000 (REWRITE_WITH `(t2 + t3 + t4) / (t2 + t3 + t4) = &1`);
3001 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3004 (NEW_GOAL `y IN affine hull {u1, w1, w2:real^3}`);
3005 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3006 (EXISTS_TAC `t2 / (t2 + t3 + t4)` THEN
3007 EXISTS_TAC `t3 / (t2 + t3 + t4)` THEN EXISTS_TAC `t4 / (t2 + t3 + t4)`);
3008 (ASM_REWRITE_TAC[REAL_ARITH `a/x + b/ x + c/ x = (a+b+c) / x`]);
3009 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3011 (NEW_GOAL `dist (u0, s:real^3) <= dist (u0, y:real^3)`);
3013 (NEW_GOAL `dist (u0, s) <= dist (u0, x:real^3)`);
3014 (REWRITE_TAC[ASSUME `x = t1 % u0 + (t2 + t3 + t4) % y:real^3`; dist]);
3015 (REWRITE_WITH `u0 - (t1 % u0 + (t2 + t3 + t4) % y) =
3016 (t1 + t2 + t3 + t4) % u0 - (t1 % u0 + (t2 + t3 + t4) % y:real^3)`);
3017 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3018 (REWRITE_TAC[VECTOR_ARITH
3019 `(t1 + t) % u0 - (t1 % u0 + t % y) = t % (u0 - y)`; NORM_MUL]);
3020 (REWRITE_WITH `abs (t2 + t3 + t4) = t2 + t3 + t4`);
3021 (REWRITE_TAC[REAL_ABS_REFL] THEN ASM_REAL_ARITH_TAC);
3022 (REWRITE_TAC[GSYM dist]);
3023 (NEW_GOAL `dist (u0, y:real^3) <= (t2 + t3 + t4) * dist (u0, y)`);
3024 (REWRITE_TAC[REAL_ARITH `a <= b * a <=> &0 <= (b - &1) * a`]);
3025 (MATCH_MP_TAC REAL_LE_MUL);
3026 (REWRITE_TAC[DIST_POS_LE]);
3027 (ASM_REAL_ARITH_TAC);
3028 (ASM_REAL_ARITH_TAC);
3030 (NEW_GOAL `x IN ball (u0:real^3, r1)`);
3031 (UNDISCH_TAC `x IN conic_cap u0 (u1:real^3) r1 a1`);
3032 (REWRITE_TAC[conic_cap; NORMBALL_BALL] THEN SET_TAC[]);
3033 (UP_ASM_TAC THEN REWRITE_TAC[IN_BALL]);
3034 (EXPAND_TAC "r1" THEN EXPAND_TAC "r2");
3035 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3038 (* ========================================================================= *)
3041 (REWRITE_TAC[REAL_ARITH `&0 <= t <=> ~(t < &0)`] THEN STRIP_TAC);
3042 (NEW_GOAL `!y. y IN convex hull {w1, w2:real^3}
3043 ==> ((y - u0) dot (u1 - u0)) / (norm (y - u0) * norm (u1 - u0)) <=
3044 ((s2 - u0) dot (u1 - u0)) / (norm (s2 - u0) * norm (u1 - u0))`);
3046 (MATCH_MP_TAC SMALLEST_ANGLE_LINE_PROPERTY);
3047 (EXISTS_TAC `w1:real^3` THEN EXISTS_TAC `w2:real^3`);
3048 (ASM_REWRITE_TAC[]);
3051 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3053 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3054 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
3055 affine hull {u1:real^3, w1, w2}`);
3056 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
3057 (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3058 (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {w1, w2}`);
3059 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3060 (NEW_GOAL `affine hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3061 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA THEN SET_TAC[]);
3064 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR; COPLANAR_3]);
3066 (NEW_GOAL `~(t3+ t4 = &0)`);
3068 (NEW_GOAL `t3 = &0 /\ t4 = &0`);
3069 (ASM_REAL_ARITH_TAC);
3071 (NEW_GOAL `x = t1 % u0 + t2 % u1:real^3`);
3072 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3073 (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a1`);
3074 (UNDISCH_TAC `x:real^3 IN conic_cap u0 u1 r1 a1`);
3075 (REWRITE_TAC[conic_cap] THEN SET_TAC[conic_cap]);
3076 (UP_ASM_TAC THEN REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM] THEN STRIP_TAC);
3078 (NEW_GOAL `(x - u0) dot (u1 - u0:real^3) <= &0`);
3079 (REWRITE_TAC[ASSUME `x = t1 % u0 + t2 % u1:real^3`]);
3080 (REWRITE_WITH `(t1 % u0 + t2 % u1) - u0 =
3081 (t1 % u0 + t2 % u1) - (t1 + t2 + t3 + t4) % u0:real^3`);
3082 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3083 (REWRITE_TAC[ASSUME `t3 = &0 /\ t4 = &0`; VECTOR_ARITH
3084 `(t1 % u0 + t2 % u1) - (t1 + t2 + &0 + &0) % u0 = t2 % (u1 - u0)`; DOT_LMUL;
3085 REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
3086 (MATCH_MP_TAC REAL_LE_MUL);
3087 (REWRITE_TAC[DOT_POS_LE] THEN ASM_REAL_ARITH_TAC);
3088 (NEW_GOAL `&0 <= dist (x,u0) * dist (u1,u0:real^3) * a1`);
3089 (MATCH_MP_TAC REAL_LE_MUL);
3090 (REWRITE_TAC[DIST_POS_LE]);
3091 (MATCH_MP_TAC REAL_LE_MUL);
3092 (REWRITE_TAC[DIST_POS_LE]);
3093 (ASM_REAL_ARITH_TAC);
3094 (ASM_REAL_ARITH_TAC);
3096 (ABBREV_TAC `y = t3 / (t3 + t4) % w1 + t4 / (t3 + t4) % w2:real^3`);
3097 (NEW_GOAL `x = t1 % u0 + t2 % u1 + (t3 + t4) % (y:real^3)`);
3098 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "y");
3099 (REWRITE_TAC[VECTOR_ARITH
3100 `t1 % u0 + t2 % u1 + t3 % w1 + t4 % w2 =
3101 t1 % u0 + t2 % u1 + t % (t3 / t % w1 + t4 / t % w2) <=>
3102 t3 % w1 + t4 % w2 = t / t % (t3 % w1 + t4 % w2)`]);
3103 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3104 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3107 (NEW_GOAL `y IN convex hull {w1, w2:real^3}`);
3108 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
3109 (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
3110 (ASM_REWRITE_TAC[REAL_ARITH `a / x + b / x = (a + b) / x`]);
3112 (MATCH_MP_TAC REAL_LE_DIV);
3113 (ASM_REAL_ARITH_TAC);
3114 (MATCH_MP_TAC REAL_LE_DIV);
3115 (ASM_REAL_ARITH_TAC);
3116 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3118 (ABBREV_TAC `f = (\y:real^3.
3119 ((y - u0) dot (u1 - u0)) / (norm (y - u0:real^3) * norm (u1 - u0)))`);
3121 (NEW_GOAL `a1 < (f:real^3->real) x`);
3122 (NEW_GOAL `x:real^3 IN rcone_gt u0 u1 a1`);
3123 (UNDISCH_TAC `x:real^3 IN conic_cap u0 u1 r1 a1` THEN
3124 REWRITE_TAC[conic_cap] THEN SET_TAC[]);
3125 (UP_ASM_TAC THEN REWRITE_TAC[rcone_gt; rconesgn; IN; IN_ELIM_THM; dist]);
3126 (STRIP_TAC THEN EXPAND_TAC "f");
3128 `a1 < ((x - u0) dot (u1 - u0)) / (norm (x - u0) * norm (u1 - u0)) <=>
3129 a1 * (norm (x - u0) * norm (u1 - u0)) < ((x - u0:real^3) dot (u1 - u0))`);
3130 (MATCH_MP_TAC REAL_LT_RDIV_EQ);
3131 (MATCH_MP_TAC REAL_LT_MUL);
3132 (REWRITE_TAC[NORM_POS_LE; REAL_ARITH `a < b <=> (a <= b) /\ ~(b = a)`]);
3133 (SIMP_TAC[NORM_EQ_0; VECTOR_ARITH `a - b = vec 0 <=> a = b`]);
3134 (ASM_REWRITE_TAC[]);
3136 (NEW_GOAL `u1 IN affine hull {u0, w1, w2:real^3}`);
3137 (REWRITE_TAC[IN; IN_ELIM_THM; AFFINE_HULL_3]);
3139 (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2`
3140 THEN EXISTS_TAC `(--t4) / t2`);
3142 (REWRITE_TAC[REAL_ARITH
3143 `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
3144 (MATCH_MP_TAC REAL_DIV_REFL);
3145 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3146 (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
3147 (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3148 (NEW_GOAL `u0 - t1 % u0 - t3 % w1 - t4 % w2:real^3 = t2 % u1`);
3149 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
3150 (ASM_REWRITE_TAC[VECTOR_ARITH
3151 `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 =
3152 (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
3153 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
3154 (REWRITE_WITH `t2 / t2 = &1`);
3155 (MATCH_MP_TAC REAL_DIV_REFL);
3156 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3159 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3161 (ONCE_REWRITE_TAC[SET_RULE `{a,b,c,d} = {b,a,c,d}`]);
3162 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3163 (REWRITE_WITH `affine hull {u1, u0, w1, w2} =
3164 affine hull {u0:real^3, w1, w2}`);
3165 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
3166 (ASM_REWRITE_TAC[]);
3167 (REWRITE_TAC[COPLANAR_3; COPLANAR_AFFINE_HULL_COPLANAR]);
3168 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3170 (NEW_GOAL `(f:real^3->real) y <= f s2`);
3174 (NEW_GOAL `&1 < t1 + t3+ t4`);
3175 (ASM_REAL_ARITH_TAC);
3176 (NEW_GOAL `~(t1 + t3+ t4 = &0)`);
3177 (ASM_REAL_ARITH_TAC);
3179 (ABBREV_TAC `w = t1 / (t1 + t3 + t4) % u0 + t3 / (t1 + t3 + t4) % w1 +
3180 t4 / (t1 + t3 + t4) % w2:real^3`);
3182 (NEW_GOAL `(f:real^3->real) y = f w`);
3185 (REWRITE_WITH `y:real^3 - u0 =
3186 &1 / (t3 + t4) % (t3 % w1 + t4 % w2 - (t3 + t4) % u0)`);
3188 (REWRITE_TAC[VECTOR_ARITH
3189 `(t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3) - u0 =
3190 &1 / (t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=>
3191 (t3 + t4) / (t3 + t4) % u0 = u0`]);
3192 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3193 (MATCH_MP_TAC REAL_DIV_REFL);
3194 (ASM_REWRITE_TAC[]);
3196 (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
3198 (REWRITE_WITH `w:real^3 - u0 =
3199 &1 / (t1 + t3 + t4) % (t3 % w1 + t4 % w2 - (t3 + t4) % u0)`);
3201 (REWRITE_TAC[VECTOR_ARITH
3202 `(t1 / (t1 + t3 + t4) % u0 +
3203 t3 / (t1 + t3 + t4) % u2 + t4 / (t1 + t3 + t4) % u3) - u0 =
3204 &1 / (t1 + t3 + t4) % (t3 % u2 + t4 % u3 - (t3 + t4) % u0) <=>
3205 (t1 + t3 + t4) / (t1 + t3 + t4) % u0 = u0`]);
3206 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
3207 (MATCH_MP_TAC REAL_DIV_REFL);
3208 (ASM_REWRITE_TAC[]);
3210 (REWRITE_TAC[NORM_MUL; DOT_LMUL]);
3211 (REWRITE_WITH `abs (&1 / (t3 + t4)) = &1 / (t3 + t4)`);
3212 (REWRITE_TAC[REAL_ABS_REFL]);
3213 (ASM_SIMP_TAC[REAL_LE_DIV;REAL_LE_ADD; REAL_ARITH `&0 <= &1`]);
3214 (REWRITE_WITH `abs (&1 / (t1 + t3 + t4)) = &1 / (t1 + t3 + t4)`);
3215 (REWRITE_TAC[REAL_ABS_REFL]);
3216 (MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_ARITH `&0 <= &1`]);
3217 (ASM_REAL_ARITH_TAC);
3219 (REWRITE_TAC[REAL_ARITH `(a * x) / ((a * y) * z) =
3220 (a * x) / (a * (y * z))`]);
3222 `b1 = norm (t3 % w1 + t4 % w2 - (t3 + t4) % u0) * norm (u1 - u0:real^3)`);
3223 (NEW_GOAL `~(b1 = &0)`);
3224 (EXPAND_TAC "b1" THEN ASM_REWRITE_TAC[REAL_ENTIRE; NORM_EQ_0;
3225 VECTOR_ARITH `(a - b = vec 0 <=> a = b)/\(a + b-c = vec 0 <=> a + b = c)`]);
3228 (NEW_GOAL `u0 IN convex hull {w1, w2:real^3}`);
3229 (REWRITE_TAC[CONVEX_HULL_2; IN; IN_ELIM_THM]);
3230 (EXISTS_TAC `t3 / (t3 + t4)` THEN EXISTS_TAC `t4 / (t3 + t4)`);
3232 (MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC);
3233 (MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC);
3234 (ASM_SIMP_TAC[REAL_DIV_REFL; REAL_ARITH `a / x + b / x = (a + b) / x`]);
3235 (SIMP_TAC[VECTOR_ARITH `a/ x % u + b/ x % v = &1/ x % (a % u + b % v)`]);
3236 (REWRITE_TAC[ASSUME `t3 % w1 + t4 % w2 = (t3 + t4) % u0:real^3`; VECTOR_ARITH
3237 `&1 / a % (a % b) = (a / a) % b`]);
3238 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3239 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3242 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3244 (ONCE_REWRITE_TAC[GSYM COPLANAR_AFFINE_HULL_COPLANAR]);
3245 (REWRITE_WITH `affine hull {u0, u1, w1, w2} =
3246 affine hull {u1:real^3, w1, w2}`);
3247 (MATCH_MP_TAC AFFINE_HULL_3_INSERT);
3248 (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3249 (NEW_GOAL `convex hull {w1, w2:real^3} SUBSET affine hull {w1, w2}`);
3250 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
3251 (NEW_GOAL `affine hull {w1, w2:real^3} SUBSET affine hull {u1,w1, w2}`);
3252 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA THEN SET_TAC[]);
3255 (REWRITE_TAC[COPLANAR_AFFINE_HULL_COPLANAR; COPLANAR_3]);
3257 (NEW_GOAL `~(&1 / (t3 + t4) = &0)`);
3258 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
3259 (ASM_REWRITE_TAC[]);
3262 `(&1 / (t3 + t4) * ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0))) /
3263 (&1 / (t3 + t4) * b1) =
3264 ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / b1`);
3265 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
3267 (NEW_GOAL `~(&1 / (t1 + t3 + t4) = &0)`);
3268 (MATCH_MP_TAC Trigonometry2.NOT_EQ0_IMP_NEITHER_INVERT);
3269 (ASM_REWRITE_TAC[]);
3272 `(&1 / (t1 + t3 + t4) * ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0))) /
3273 (&1 / (t1 + t3 + t4) * b1) =
3274 ((t3 % w1 + t4 % w2 - (t3 + t4) % u0) dot (u1 - u0:real^3)) / b1`);
3275 (UP_ASM_TAC THEN UNDISCH_TAC `~(b1 = &0)` THEN
3276 MESON_TAC[Trigonometry1.REAL_DIV_MUL2]);
3278 (NEW_GOAL `(f:real^3->real) x <= f w`);
3282 `((x - u0) dot (u1 - u0:real^3)) / (norm (x - u0) * norm (u1 - u0)) <=
3283 ((w - u0) dot (u1 - u0)) / (norm (w - u0) * norm (u1 - u0)) <=>
3284 ((x - u0) dot (u1 - u0)) * (norm (w - u0) * norm (u1 - u0)) <=
3285 ((w - u0) dot (u1 - u0)) * (norm (x - u0) * norm (u1 - u0))`);
3286 (MATCH_MP_TAC RAT_LEMMA4);
3288 (MATCH_MP_TAC REAL_LT_MUL);
3289 (ASM_REWRITE_TAC[NORM_POS_LT; VECTOR_ARITH `x - b = vec 0 <=> x = b`]);
3292 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}` THEN REWRITE_TAC[]);
3293 (REWRITE_TAC[coplanar]);
3294 (EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `w1:real^3` THEN
3295 EXISTS_TAC `w2:real^3`);
3296 (ONCE_REWRITE_TAC[SET_RULE `{u0, u1, u2, u3} = {u1, u0, u2, u3}`]);
3297 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
3298 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
3299 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3300 (EXISTS_TAC `(t2 + t3 + t4) / t2` THEN EXISTS_TAC `(--t3) / t2`
3301 THEN EXISTS_TAC `(--t4) / t2`);
3303 (REWRITE_TAC[REAL_ARITH
3304 `(t2 + t3 + t4) / t2 + --t3 / t2 + --t4 / t2 = t2 / t2`]);
3305 (MATCH_MP_TAC REAL_DIV_REFL);
3306 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3307 (REWRITE_WITH `(t2 + t3 + t4) = &1 - t1`);
3308 (UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3309 (NEW_GOAL `u0 - t1 % u0 - t3 % w1 - t4 % w2:real^3 = t2 % u1`);
3310 (UP_ASM_TAC THEN VECTOR_ARITH_TAC);
3311 (ASM_REWRITE_TAC[VECTOR_ARITH
3312 `(&1 - t1) / t2 % u0 + --t3 / t2 % u2 + --t4 / t2 % u3 =
3313 (&1 / t2) % (u0 - t1 % u0 - t3 % u2 - t4 % u3)`]);
3314 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
3315 (REWRITE_WITH `t2 / t2 = &1`);
3316 (MATCH_MP_TAC REAL_DIV_REFL);
3317 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3320 (MATCH_MP_TAC REAL_LT_MUL);
3321 (REWRITE_TAC[REAL_ARITH `&0 < a <=> (&0 <= a) /\ ~(a = &0)`]);
3322 (REWRITE_TAC[NORM_POS_LE; NORM_EQ_0; VECTOR_ARITH `x - y= vec 0 <=>x = y`]);
3325 (EXPAND_TAC "w" THEN STRIP_TAC);
3326 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3327 (REWRITE_TAC[coplanar]);
3328 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `w1:real^3` THEN
3329 EXISTS_TAC `w2:real^3`);
3330 (MATCH_MP_TAC (SET_RULE `u0 IN S /\ b SUBSET S ==> (u0 INSERT b) SUBSET S`));
3331 (REWRITE_TAC[SET_SUBSET_AFFINE_HULL]);
3332 (REWRITE_TAC[AFFINE_HULL_3; IN; IN_ELIM_THM]);
3334 (EXISTS_TAC `&0` THEN EXISTS_TAC `t3 / (t3 + t4)`
3335 THEN EXISTS_TAC `t4 / (t3 + t4)`);
3337 (REWRITE_TAC[REAL_ARITH `&0 + t3 / (t3 + t4) + t4 / (t3 + t4) =
3338 (t3 + t4) / (t3 + t4)`]);
3339 (MATCH_MP_TAC REAL_DIV_REFL);
3340 (ASM_REWRITE_TAC[]);
3341 (ASM_REWRITE_TAC[VECTOR_ARITH
3342 `&0 % u1 + t3 / (t3 + t4) % u2 + t4 / (t3 + t4) % u3 =
3343 (&1 / (t3 + t4)) % (t3 % u2 + t4 % u3)`]);
3344 (UP_ASM_TAC THEN REWRITE_TAC[VECTOR_ARITH
3345 `t1 / x % u0 + t3 / x % u2 + t4 / x % u3 =
3346 (&1 / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
3347 (REWRITE_WITH `&1 / (t1 + t3 + t4) % (t1 % u0 + t3 % w1 + t4 % w2) = u0 <=>
3348 t1 % u0 + t3 % w1 + t4 % w2 = (t1 + t3 + t4) % u0:real^3`);
3349 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3350 (MATCH_MP_TAC Collect_geom.CHANGE_SIDE);
3351 (ASM_REWRITE_TAC[]);
3353 (REWRITE_TAC[VECTOR_ARITH `t1 % u0 + t3 % u2 + t4 % u3 = (t1 + t3 + t4) % u0
3354 <=> t3 % u2 + t4 % u3 = (t3 + t4) % u0`]);
3355 (STRIP_TAC THEN ASM_REWRITE_TAC[]);
3356 (REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH `&1 / a * a = a / a`]);
3357 (REWRITE_WITH `(t3 + t4) / (t3 + t4) = &1`);
3358 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3360 (ASM_REWRITE_TAC[]);
3362 (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
3363 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
3364 (REWRITE_TAC[VECTOR_ARITH
3365 `x % (t1 /x % u0 + t3 / x % u2 + t4 /x % u3) =
3366 (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
3367 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
3368 (ASM_SIMP_TAC[REAL_DIV_REFL]);
3370 (ABBREV_TAC `t = t1 + t3 + t4`);
3371 (REWRITE_WITH `(t2 % u1 + t % w) - u0:real^3 =
3372 (t2 % u1 + t % w) - (t1 + t2 + t3 + t4) % u0`);
3373 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3374 (REWRITE_WITH `t1 + t2 + t3 + t4 = t2 + t:real`);
3375 (EXPAND_TAC "t" THEN REAL_ARITH_TAC);
3376 (REWRITE_TAC[VECTOR_ARITH
3377 `(t2 % u1 + t % w) - (t2 + t) % u0 = t2 % (u1 - u0) + t % (w - u0)`]);
3378 (ABBREV_TAC `x1 = u1 - u0:real^3`);
3379 (ABBREV_TAC `x2 = w - u0:real^3`);
3381 (REWRITE_WITH `(t2 % x1 + t % x2) dot x1 =
3382 t2 * norm x1 pow 2 + t * x2 dot (x1:real^3)`);
3383 (REWRITE_TAC[NORM_POW_2]);
3386 (NEW_GOAL `t2 * norm x1 pow 2 * norm x2 * norm x1 <=
3387 t2 * (x2 dot x1) * norm x1 * norm (x1:real^3)`);
3388 (REWRITE_TAC[REAL_POW_2; REAL_ARITH `t2 * (x1 * x1) * x2 * x1 <=
3389 t2 * x3 * x1 * x1 <=> &0 <= (x1 pow 2) * (--t2) * (x2 * x1 - x3)`]);
3390 (MATCH_MP_TAC REAL_LE_MUL);
3391 (ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE]);
3392 (MATCH_MP_TAC REAL_LE_MUL);
3393 (REWRITE_TAC[REAL_ARITH `&0 <= a - b <=> b <= a`]);
3395 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3396 (REWRITE_TAC[NORM_CAUCHY_SCHWARZ]);
3399 `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)`);
3401 (REWRITE_TAC[REAL_ARITH `t2 * x3 * x1 * x1 + t * x3 * x2 * x1 <=
3402 x3 * x4 * x1 <=> &0 <= (x1 * x3) * (x4 - t2 * x1 - t * x2)`]);
3403 (MATCH_MP_TAC REAL_LE_MUL);
3405 (MATCH_MP_TAC REAL_LE_MUL);
3406 (REWRITE_TAC[NORM_POS_LE]);
3407 (ASM_CASES_TAC `x2 dot (x1:real^3) < &0`);
3409 (NEW_GOAL `(f:real^3->real) x <= &0`);
3411 (REWRITE_TAC[REAL_ARITH `a / b <= &0 <=> &0 <= (--a) / b`]);
3412 (MATCH_MP_TAC REAL_LE_DIV);
3413 (SIMP_TAC[NORM_POS_LE; REAL_LE_MUL]);
3415 (REWRITE_WITH `x = t2 % u1 + (t1 + t3 + t4) % w:real^3`);
3416 (ASM_REWRITE_TAC[] THEN EXPAND_TAC "w");
3417 (REWRITE_TAC[VECTOR_ARITH
3418 `x % (t1 /x % u0 + t3 / x % u2 + t4 /x % u3) =
3419 (x / x) % (t1 % u0 + t3 % u2 + t4 % u3)`]);
3421 (REWRITE_WITH `(t1 + t3 + t4) / (t1 + t3 + t4) = &1`);
3422 (MATCH_MP_TAC REAL_DIV_REFL);
3423 (ASM_REWRITE_TAC[]);
3426 (REWRITE_TAC[REAL_ARITH `&0 <= --a <=> a <= &0`]);
3427 (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - u0:real^3 =
3428 (t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0`);
3429 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
3430 (REWRITE_WITH `(t2 % u1 + (t1 + t3 + t4) % w) - (t1 + t2 + t3 + t4) % u0 =
3431 t2 % x1 + t % x2:real^3`);
3432 (EXPAND_TAC "x1" THEN EXPAND_TAC "x2" THEN EXPAND_TAC "t"
3433 THEN VECTOR_ARITH_TAC);
3434 (NEW_GOAL `t % x2 dot (x1:real^3) <= &0`);
3435 (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= a * (--b)`]);
3436 (MATCH_MP_TAC REAL_LE_MUL);
3438 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
3439 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3440 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3441 (NEW_GOAL `t2 % x1 dot (x1:real^3) <= &0`);
3442 (REWRITE_TAC[DOT_LMUL; REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`]);
3443 (MATCH_MP_TAC REAL_LE_MUL);
3445 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
3446 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3447 (REWRITE_TAC[DOT_POS_LE]);
3448 (REWRITE_TAC[DOT_LADD]);
3449 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3451 (UP_ASM_TAC THEN UNDISCH_TAC `a1 < (f:real^3->real) x`);
3452 (EXPAND_TAC "a1" THEN UNDISCH_TAC `&0 <= a` THEN REAL_ARITH_TAC);
3453 (UP_ASM_TAC THEN MESON_TAC[]);
3454 (UP_ASM_TAC THEN REAL_ARITH_TAC);
3456 (REWRITE_TAC [REAL_ARITH `&0 <= a - b * d - c <=> c <= a + (--b) * d`]);
3457 (REWRITE_WITH `t * norm (x2:real^3) = abs t * norm x2`);
3458 (AP_THM_TAC THEN AP_TERM_TAC);
3459 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3460 (REWRITE_TAC[REAL_ABS_REFL]);
3461 (EXPAND_TAC "t" THEN UNDISCH_TAC `t2 < &0` THEN
3462 UNDISCH_TAC `t1 + t2 + t3 + t4 = &1` THEN REAL_ARITH_TAC);
3463 (REWRITE_WITH `(--t2) * norm (x1:real^3) = abs (--t2) * norm x1`);
3464 (AP_THM_TAC THEN AP_TERM_TAC);
3465 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
3466 (REWRITE_TAC[REAL_ABS_REFL]);
3467 (UNDISCH_TAC `t2 < &0` THEN REAL_ARITH_TAC);
3468 (REWRITE_TAC[GSYM NORM_MUL]);
3470 `norm (t % x2:real^3) = norm ((t2 % x1 + t % x2) + (--t2 % x1))`);
3471 (AP_TERM_TAC THEN VECTOR_ARITH_TAC);
3472 (REWRITE_TAC[NORM_TRIANGLE]);
3473 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3475 (NEW_GOAL `(f:real^3->real) x <= f s2`);
3476 (UNDISCH_TAC `(f:real^3->real) y <= f s2`);
3477 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
3479 (NEW_GOAL `(f:real^3->real) s2 <= a1`);
3481 (ASM_REWRITE_TAC[]);
3482 (EXPAND_TAC "a1" THEN REAL_ARITH_TAC);
3484 (UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC `a1 < (f:real^3->real) x`);
3487 (UP_ASM_TAC THEN STRIP_TAC);
3489 (* ========================================================================= *)
3492 `NULLSET (conic_cap u0 u1 r1 a1 INTER aff_ge {u0:real^3, u1} {w1, w2})`);
3493 (ASM_REWRITE_TAC[]);
3494 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3495 (EXISTS_TAC `conic_cap u0 u1 r a INTER convex hull {u0:real^3, u1, w1, w2}`);
3496 (ASM_REWRITE_TAC[]);
3497 (UP_ASM_TAC THEN SET_TAC[]);
3498 (NEW_GOAL `vol (conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1} {w1, w2}) = &0`);
3499 (ASM_SIMP_TAC[MEASURE_EQ_0]);
3501 (UP_ASM_TAC THEN REWRITE_WITH
3502 `vol (conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1} {w1, w2}) =
3503 vol (conic_cap u0 u1 r1 a1 INTER aff_gt {u0, u1} {w1, w2})`);
3504 (MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
3505 (REWRITE_WITH `conic_cap u0 u1 r1 a1 INTER aff_gt {u0, u1} {w1, w2} DIFF
3506 conic_cap u0 u1 r1 a1 INTER aff_ge {u0, u1:real^3} {w1, w2} =
3508 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> (C INTER A) DIFF (C INTER B) = {}`));
3509 (REWRITE_TAC[AFF_GT_SUBSET_AFF_GE]);
3510 (REWRITE_TAC[SET_RULE `a UNION {} = a`]);
3512 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3513 (EXISTS_TAC `aff_ge {u0, u1:real^3} {w1, w2} DIFF
3514 aff_gt {u0, u1} {w1, w2}`);
3515 (REWRITE_TAC[SET_RULE `A INTER B DIFF A INTER C SUBSET B DIFF C`]);
3517 (REWRITE_WITH `aff_ge {u0, u1:real^3} {w1, w2} =
3518 aff_gt {u0, u1} {w1, w2} UNION
3519 UNIONS {aff_ge {u0, u1} ({w1, w2} DELETE a) | a | a IN {w1, w2}}`);
3520 (MATCH_MP_TAC AFF_GE_AFF_GT_DECOMP);
3521 (REWRITE_TAC[Geomdetail.FINITE6]);
3522 (REWRITE_TAC[DISJOINT]);
3524 (ASM_CASES_TAC `w1 IN {u0, u1:real^3}`);
3526 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3527 (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w2:real^3}`);
3528 (UP_ASM_TAC THEN SET_TAC[]);
3529 (REWRITE_TAC[COPLANAR_3]);
3530 (UP_ASM_TAC THEN MESON_TAC[]);
3532 (ASM_CASES_TAC `w2 IN {u0, u1:real^3}`);
3534 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3535 (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w1:real^3}`);
3536 (UP_ASM_TAC THEN SET_TAC[]);
3537 (REWRITE_TAC[COPLANAR_3]);
3538 (UP_ASM_TAC THEN MESON_TAC[]);
3539 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3543 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3545 `UNIONS {aff_ge {u0, u1:real^3} ({w1, w2} DELETE a) | a | a IN {w1, w2}}`);
3547 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3550 `aff_ge {u0, u1:real^3} {w1} UNION aff_ge {u0, u1:real^3} {w2}`);
3552 (MATCH_MP_TAC NEGLIGIBLE_UNION);
3555 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3556 (EXISTS_TAC `affine hull {u0, u1:real^3, w1}`);
3558 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3559 (REWRITE_WITH `{u0,u1,w1:real^3} = {u0,u1} UNION {w1}`);
3561 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3562 (MATCH_MP_TAC NEGLIGIBLE_SUBSET);
3563 (EXISTS_TAC `affine hull {u0, u1:real^3, w2}`);
3565 (REWRITE_TAC[NEGLIGIBLE_AFFINE_HULL_3]);
3566 (REWRITE_WITH `{u0,u1,w2:real^3} = {u0,u1} UNION {w2}`);
3568 (REWRITE_TAC[AFF_GE_SUBSET_AFFINE_HULL]);
3569 (REWRITE_TAC[SET_RULE
3570 `UNIONS {aff_ge {u0, u1} ({m, s3} DELETE a) | a | a IN {m, s3}} =
3571 aff_ge {u0, u1} ({m, s3} DELETE s3)
3572 UNION aff_ge {u0, u1} ({m, s3} DELETE m)`]);
3573 (MATCH_MP_TAC (SET_RULE
3574 `A SUBSET B /\ C SUBSET D ==> A UNION C SUBSET B UNION D`));
3576 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3580 (REWRITE_TAC[DISJOINT]);
3581 (ASM_CASES_TAC `w1 IN {u0, u1:real^3}`);
3583 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3584 (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w2:real^3}`);
3585 (UP_ASM_TAC THEN SET_TAC[]);
3586 (REWRITE_TAC[COPLANAR_3]);
3587 (UP_ASM_TAC THEN MESON_TAC[]);
3588 (UP_ASM_TAC THEN SET_TAC[]);
3590 (MATCH_MP_TAC AFF_GE_MONO_RIGHT);
3593 (REWRITE_TAC[DISJOINT]);
3594 (ASM_CASES_TAC `w2 IN {u0, u1:real^3}`);
3596 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}`);
3597 (REWRITE_WITH `{u0, u1, w1, w2} = {u0, u1, w1:real^3}`);
3598 (UP_ASM_TAC THEN SET_TAC[]);
3599 (REWRITE_TAC[COPLANAR_3]);
3600 (UP_ASM_TAC THEN MESON_TAC[]);
3601 (UP_ASM_TAC THEN SET_TAC[]);
3605 (UNDISCH_TAC `~coplanar {u0, u1, w1, w2:real^3}` THEN REWRITE_TAC[]);
3606 (MATCH_MP_TAC CONIC_CAP_AFF_GT_EQ_0);
3607 (EXISTS_TAC `a1:real` THEN EXISTS_TAC `r1:real`);
3608 (ASM_REWRITE_TAC[])]);;
3610 (* ==================================================================== *)
3613 let MEASURABLE_BALL_AFF_GE = prove
3614 (`!z r s t. measurable(ball(z,r) INTER aff_ge s t)`,
3615 MESON_TAC[MEASURABLE_CONVEX; CONVEX_INTER; CONVEX_AFF_GE; CONVEX_BALL;
3616 BOUNDED_INTER; BOUNDED_BALL]);;
3618 (* ==================================================================== *)
3619 (* Currently added lemmas *)
3622 let FINITE_LIST_KY_LEMMA_2 = prove
3630 REWRITE_TAC[SET_RULE
3631 `{y | ?u0 u1. u0 IN s /\ u1 IN s /\ y = [u0; u1]} =
3632 {[u0;u1] | u0 IN s /\ u1 IN s}`] THEN
3634 (GEN_TAC THEN DISCH_TAC THEN
3635 MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]));;
3637 let FINITE_SET_PRODUCT_KY_LEMMA = prove (
3639 FINITE s ==> FINITE {{u0, u1:A} | u0 IN s /\ u1 IN s}`,
3641 (GEN_TAC THEN DISCH_TAC THEN
3642 MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]));;
3645 (* ==================================================================== *)
3646 (* Lemma 38: BETA_PAIR_THM - formal proof by TCHales *)
3648 let pre_beta = prove_by_refinement
3649 (`!g u' v'. (?f. (!u v. f { u, v } = (g:A->A->B) u v)) ==>
3650 ((\ { u, v}. g u v) {u',v'} = g u' v')`,
3651 [REWRITE_TAC[GABS_DEF;GEQ_DEF];
3655 let WELLDEFINED_FUNCTION_2 = prove_by_refinement(
3656 `(?f:C->D. (!x:A y:B. f(s x y) = t x y)) <=>
3657 (!x x' y y'. (s x y = s x' y') ==> t x y = t x' y')`,
3658 [ MATCH_MP_TAC EQ_TRANS ;
3659 EXISTS_TAC `?f:C->D. !z. !x:A y:B. (s x y = z) ==> f z = t x y`;
3662 REWRITE_TAC[GSYM SKOLEM_THM];
3665 let well_defined_unordered_pair = prove_by_refinement
3666 (`(?f. (!u v. f { u, v} = (g:A->A->B) u v)) <=>
3667 (! u v. g u v = g v u)`,
3668 [REWRITE_TAC[WELLDEFINED_FUNCTION_2];
3669 NEW_GOAL `!u v x' y'.
3670 {u,v} = {x',y'} <=> (u:A = x' /\ v = y')\/ (u = y' /\ v = x')`;
3675 let BETA_PAIR_THM = prove_by_refinement(
3676 `!g u' v'. (!u v. (g:A->A->B) u v = g v u) ==>
3677 ((\ { u, v}. g u v) {u',v'} = g u' v')`,
3679 MATCH_MP_TAC pre_beta;
3680 REWRITE_TAC[well_defined_unordered_pair];
3681 ASM_REWRITE_TAC[]]);;
3683 (* ==================================================================== *)
3686 let DIHX_RANGE = prove_by_refinement (
3687 `!V X u v. &0 <= dihX V X (u,v) /\ dihX V X (u,v) <= pi`,
3688 [(REWRITE_TAC[dihX] THEN REPEAT GEN_TAC);
3690 (REWRITE_TAC[PI_POS_LE; REAL_ARITH `a <= a`]);
3691 (REPEAT LET_TAC THEN COND_CASES_TAC);
3692 (REWRITE_TAC[dihu2; DIHV_RANGE]);
3694 (REWRITE_TAC[dihu3; DIHV_RANGE]);
3696 (REWRITE_TAC[dihu4; DIHV_RANGE]);
3697 (REWRITE_TAC[PI_POS_LE; REAL_ARITH `a <= a`])]);;
3699 let DIHX_LE_PI = prove (`!V X u v. dihX V X (u,v) <= pi`,
3700 MESON_TAC[DIHX_RANGE]);;
3702 (* ==================================================================== *)
3705 let BOUNDED_VOLUME_MCELL = prove_by_refinement (
3706 `!V. ?c. !X. saturated V /\ packing V /\ mcell_set V X ==> vol X <= c`,
3708 (ASM_CASES_TAC `saturated V /\ packing V`);
3709 (EXISTS_TAC `&4 / &3 * pi * &8 pow 3`);
3711 (UP_ASM_TAC THEN REWRITE_TAC[mcell_set_2; IN_ELIM_THM; IN]);
3713 (ASM_CASES_TAC `X:real^3->bool = {}`);
3714 (REWRITE_TAC[MEASURE_EMPTY; ASSUME `X:real^3->bool = {}`]);
3715 (REWRITE_TAC[REAL_ARITH `&0 <= &4 / &3 * pi * &8 pow 3 <=> &0 <= pi`]);
3716 (REWRITE_TAC[PI_POS_LE]);
3717 (UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `~(x = {}) <=> (?v. v IN x)`]);
3719 (NEW_GOAL `vol X <= vol (ball (v, &8))`);
3720 (MATCH_MP_TAC MEASURE_SUBSET);
3722 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MEASURABLE_MCELL);
3723 (ASM_REWRITE_TAC[]);
3724 (REWRITE_TAC[MEASURABLE_BALL]);
3725 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MCELL_SUBSET_BALL8);
3726 (ASM_REWRITE_TAC[]);
3727 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
3728 (UP_ASM_TAC THEN SIMP_TAC[VOLUME_BALL; REAL_ARITH `&0 <= &8`]);
3730 (REPEAT STRIP_TAC THEN ASM_MESON_TAC[])]);;
3732 (* ==================================================================== *)
3735 let LEFT_ACTION_LIST_2_EXISTS = prove_by_refinement (
3736 `!u0 u1 u2 x y z d:A.
3737 CARD {u0, u1, u2, d} = 4 /\ {x, y, z} = {u0, u1, u2}
3738 ==> (?p. p permutes 0..2 /\
3739 [x; y; z; d] = left_action_list p [u0; u1; u2; d])`,
3740 [(REPEAT STRIP_TAC);
3741 (REWRITE_TAC[left_action_list; LENGTH; TABLE_4;
3742 ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
3743 (NEW_GOAL `{u0, u1, u2:A} =
3744 {EL 0 [u0;u1;u2;d] , EL 1 [u0;u1;u2;d], EL 2 [u0;u1;u2;d]}`);
3745 (REWRITE_TAC[EL; HD; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`; TL]);
3746 (NEW_GOAL `{x, y, z:A} =
3747 {EL 0 [u0;u1;u2;d] , EL 1 [u0;u1;u2;d], EL 2 [u0;u1;u2;d]}`);
3748 (ASM_REWRITE_TAC[]);
3749 (NEW_GOAL `?i1. i1 IN {0,1,2} /\ EL i1 [u0;u1;u2;d] = x:A`);
3750 (UP_ASM_TAC THEN SET_TAC[]);
3751 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3752 (NEW_GOAL `?i2. i2 IN {0,1,2} /\ EL i2 [u0;u1;u2;d] = y:A`);
3753 (UP_ASM_TAC THEN SET_TAC[]);
3754 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3755 (NEW_GOAL `?i3. i3 IN {0,1,2} /\ EL i3 [u0;u1;u2;d] = z:A`);
3756 (UP_ASM_TAC THEN SET_TAC[]);
3757 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3759 (NEW_GOAL `~(i1 = i2) /\ ~(i1 = i3) /\ ~(i2 = i3:num)`);
3761 (NEW_GOAL `{u0,u1,u2,d:A} = {x, z,d}`);
3763 (UNDISCH_TAC `CARD {u0,u1,u2,d:A} = 4` THEN ASM_REWRITE_TAC[]);
3764 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3765 (NEW_GOAL `{u0,u1,u2,d:A} = {x, y,d}`);
3767 (UNDISCH_TAC `CARD {u0,u1,u2,d:A} = 4` THEN ASM_REWRITE_TAC[]);
3768 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3769 (NEW_GOAL `{u0,u1,u2,d:A} = {x, y,d}`);
3771 (UNDISCH_TAC `CARD {u0,u1,u2,d:A} = 4` THEN ASM_REWRITE_TAC[]);
3772 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3773 (SWITCH_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REPEAT STRIP_TAC);
3775 (NEW_GOAL `{i1, i2, i3} = {0,1,2}`);
3778 (ABBREV_TAC `p = (\i:num. if i = i1 then 0
3779 else if i = i2 then 1
3780 else if i = i3 then 2
3782 (NEW_GOAL `p i1 = 0 /\ p i2 = 1 /\ p (i3:num) = 2`);
3785 (EXISTS_TAC `p:num->num`);
3786 (NEW_GOAL `p permutes 0..2`);
3788 (REWRITE_TAC[permutes; EXISTS_UNIQUE; IN_NUMSEG_0;
3789 ARITH_RULE `a <= 2 <=> a = 0 \/ a = 1 \/ a = 2`;
3790 SET_RULE `x = 0 \/ x = 1 \/ x = 2 <=> x IN {0,1,2}`]);
3791 (NEW_GOAL `(!x. ~(x IN {0, 1, 2}) ==> p x = x)`);
3801 (ASM_REWRITE_TAC[]);
3804 (ASM_CASES_TAC `y' = 0`);
3805 (EXISTS_TAC `i1:num`);
3806 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
3807 (ASM_CASES_TAC `y'' = i2:num`);
3809 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
3812 (ASM_CASES_TAC `y'' = i3:num`);
3814 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
3817 (ASM_CASES_TAC `~(y'' IN {0,1,2})`);
3819 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_SIMP_TAC[]);
3820 (UP_ASM_TAC THEN SET_TAC[]);
3824 (ASM_CASES_TAC `y' = 1`);
3825 (EXISTS_TAC `i2:num`);
3826 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
3827 (ASM_CASES_TAC `y'' = i1:num`);
3829 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
3832 (ASM_CASES_TAC `y'' = i3:num`);
3834 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
3837 (ASM_CASES_TAC `~(y'' IN {0,1,2})`);
3839 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_SIMP_TAC[]);
3840 (UP_ASM_TAC THEN SET_TAC[]);
3844 (ASM_CASES_TAC `y' = 2`);
3845 (EXISTS_TAC `i3:num`);
3846 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
3847 (ASM_CASES_TAC `y'' = i2:num`);
3849 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
3852 (ASM_CASES_TAC `y'' = i1:num`);
3854 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
3857 (ASM_CASES_TAC `~(y'' IN {0,1,2})`);
3859 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_SIMP_TAC[]);
3860 (UP_ASM_TAC THEN SET_TAC[]);
3864 (NEW_GOAL `~(y' IN {0,1,2})`);
3865 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
3866 (EXISTS_TAC `y':num`);
3867 (ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC);
3869 (ASM_CASES_TAC `y'' = i1:num`);
3871 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
3873 (ASM_CASES_TAC `y'' = i2:num`);
3875 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
3877 (ASM_CASES_TAC `y'' = i3:num`);
3879 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
3882 (NEW_GOAL `(p:num->num) y'' = y''`);
3883 (FIRST_ASSUM MATCH_MP_TAC);
3887 (REWRITE_WITH `inverse (p:num->num) 0 = i1 /\
3888 inverse p 1 = i2 /\ inverse p 2 = i3`);
3889 (UP_ASM_TAC THEN MESON_TAC[PERMUTES_INVERSE_EQ;
3890 ASSUME `(p:num->num) i1 = 0 /\ p i2 = 1 /\ p i3 = 2`]);
3891 (ASM_REWRITE_TAC[]);
3892 (REWRITE_WITH `inverse (p:num->num) 3 = 3`);
3893 (NEW_GOAL `p 3 = 3`);
3894 (MP_TAC (ASSUME `p permutes 0..2`) THEN REWRITE_TAC[permutes]);
3896 (FIRST_ASSUM MATCH_MP_TAC);
3897 (REWRITE_TAC[IN_NUMSEG_0] THEN ARITH_TAC);
3898 (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[PERMUTES_INVERSE_EQ]);
3899 (REWRITE_TAC[EL;HD; TL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`])]);;
3901 (* ==================================================================== *)
3903 let LEFT_ACTION_LIST_3_EXISTS = prove_by_refinement (
3904 `!u0 u1 u2 u3 x y z t:A.
3905 CARD {u0, u1, u2, u3} = 4 /\ {x, y, z, t} = {u0, u1, u2, u3}
3906 ==> (?p. p permutes 0..3 /\
3907 [x; y; z; t] = left_action_list p [u0; u1; u2; u3])`,
3908 [(REPEAT STRIP_TAC);
3909 (REWRITE_TAC[left_action_list; LENGTH; TABLE_4;
3910 ARITH_RULE `SUC (SUC (SUC (SUC 0))) = 4`]);
3911 (NEW_GOAL `{u0, u1, u2, u3:A} = {EL 0 [u0;u1;u2;u3], EL 1 [u0;u1;u2;u3],
3912 EL 2 [u0;u1;u2;u3], EL 3 [u0;u1;u2;u3]}`);
3913 (REWRITE_TAC[EL; HD; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; TL]);
3914 (NEW_GOAL `{x, y, z, t:A} = {EL 0 [u0;u1;u2;u3], EL 1 [u0;u1;u2;u3],
3915 EL 2 [u0;u1;u2;u3], EL 3 [u0;u1;u2;u3]}`);
3916 (ASM_REWRITE_TAC[]);
3917 (NEW_GOAL `?i1. i1 IN {0,1,2,3} /\ EL i1 [u0;u1;u2;u3] = x:A`);
3918 (UP_ASM_TAC THEN SET_TAC[]);
3919 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3920 (NEW_GOAL `?i2. i2 IN {0,1,2,3} /\ EL i2 [u0;u1;u2;u3] = y:A`);
3921 (UP_ASM_TAC THEN SET_TAC[]);
3922 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3923 (NEW_GOAL `?i3. i3 IN {0,1,2,3} /\ EL i3 [u0;u1;u2;u3] = z:A`);
3924 (UP_ASM_TAC THEN SET_TAC[]);
3925 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3926 (NEW_GOAL `?i4. i4 IN {0,1,2,3} /\ EL i4 [u0;u1;u2;u3] = t:A`);
3927 (UP_ASM_TAC THEN SET_TAC[]);
3928 (FIRST_X_ASSUM CHOOSE_TAC THEN SWITCH_TAC);
3930 (NEW_GOAL `~(i1 = i2) /\ ~(i1 = i3) /\ ~(i1 = i4:num) /\ ~(i2 = i3) /\
3931 ~(i2 = i4) /\ ~(i3 = i4)`);
3934 (NEW_GOAL `x = y:A`);
3936 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, z,t}`);
3937 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3939 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3940 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, z, t:A}`]);
3941 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3943 (NEW_GOAL `x = z:A`);
3945 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, y,t}`);
3946 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3948 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3949 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, y, t:A}`]);
3950 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3952 (NEW_GOAL `x = t:A`);
3954 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, y, z}`);
3955 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3957 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3958 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, y, z:A}`]);
3959 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3961 (NEW_GOAL `y = z:A`);
3963 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, z,t}`);
3964 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3966 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3967 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, z, t:A}`]);
3968 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3970 (NEW_GOAL `y = t:A`);
3972 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, z,t}`);
3973 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3975 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3976 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, z, t:A}`]);
3977 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3979 (NEW_GOAL `z = t:A`);
3981 (NEW_GOAL `{u0,u1,u2,u3:A} = {x, y,t}`);
3982 (UNDISCH_TAC `{x, y, z, t:A} = {u0, u1, u2, u3}` THEN UP_ASM_TAC
3984 (UNDISCH_TAC `CARD {u0,u1,u2,u3:A} = 4` THEN
3985 REWRITE_TAC[ASSUME `{u0, u1, u2, u3} = {x, y, t:A}`]);
3986 (MESON_TAC[Geomdetail.CARD3; ARITH_RULE `a <= 3 ==> ~(a = 4)`]);
3988 (SWITCH_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN REPEAT STRIP_TAC);
3990 (NEW_GOAL `{i1, i2, i3,i4} = {0,1,2,3}`);
3991 (REWRITE_TAC[SET_EQ_LEMMA]);
3996 (ABBREV_TAC `p = (\i:num. if i = i1 then 0
3997 else if i = i2 then 1
3998 else if i = i3 then 2
3999 else if i = i4 then 3
4001 (NEW_GOAL `p i1 = 0 /\ p i2 = 1 /\ p (i3:num) = 2 /\ p i4 = 3`);
4006 (EXPAND_TAC "p" THEN COND_CASES_TAC);
4025 (EXISTS_TAC `p:num->num`);
4026 (NEW_GOAL `p permutes 0..3`);
4028 (REWRITE_TAC[permutes; EXISTS_UNIQUE; IN_NUMSEG_0;
4029 ARITH_RULE `a <= 3 <=> a = 0 \/ a = 1 \/ a = 2 \/ a = 3`;
4030 SET_RULE `x = 0 \/ x = 1 \/ x = 2 \/ x = 3 <=> x IN {0,1,2,3}`]);
4031 (NEW_GOAL `(!x. ~(x IN {0, 1, 2, 3}) ==> p x = x)`);
4036 (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4040 (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4044 (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4048 (UNDISCH_TAC `~(x' IN {0, 1, 2, 3})` THEN ASM_REWRITE_TAC[]);
4052 (ASM_REWRITE_TAC[]);
4055 (ASM_CASES_TAC `y' = 0`);
4056 (EXISTS_TAC `i1:num`);
4057 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4058 (ASM_CASES_TAC `y'' = i2:num`);
4060 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
4063 (ASM_CASES_TAC `y'' = i3:num`);
4065 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
4069 (ASM_CASES_TAC `y'' = i4:num`);
4071 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_REWRITE_TAC[]);
4075 (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4077 (UNDISCH_TAC `(p:num->num) y'' = 0` THEN ASM_SIMP_TAC[]);
4078 (UP_ASM_TAC THEN SET_TAC[]);
4080 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4081 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4083 (ASM_CASES_TAC `y' = 1`);
4084 (EXISTS_TAC `i2:num`);
4085 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4086 (ASM_CASES_TAC `y'' = i1:num`);
4088 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
4091 (ASM_CASES_TAC `y'' = i3:num`);
4093 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
4096 (ASM_CASES_TAC `y'' = i4:num`);
4098 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_REWRITE_TAC[]);
4101 (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4103 (UNDISCH_TAC `(p:num->num) y'' = 1` THEN ASM_SIMP_TAC[]);
4104 (UP_ASM_TAC THEN SET_TAC[]);
4106 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4107 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4110 (ASM_CASES_TAC `y' = 2`);
4111 (EXISTS_TAC `i3:num`);
4112 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4113 (ASM_CASES_TAC `y'' = i1:num`);
4115 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
4118 (ASM_CASES_TAC `y'' = i2:num`);
4120 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
4123 (ASM_CASES_TAC `y'' = i4:num`);
4125 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_REWRITE_TAC[]);
4128 (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4130 (UNDISCH_TAC `(p:num->num) y'' = 2` THEN ASM_SIMP_TAC[]);
4131 (UP_ASM_TAC THEN SET_TAC[]);
4133 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4134 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4136 (ASM_CASES_TAC `y' = 3`);
4137 (EXISTS_TAC `i4:num`);
4138 (ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC);
4139 (ASM_CASES_TAC `y'' = i1:num`);
4141 (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_REWRITE_TAC[]);
4144 (ASM_CASES_TAC `y'' = i2:num`);
4146 (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_REWRITE_TAC[]);
4149 (ASM_CASES_TAC `y'' = i3:num`);
4151 (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_REWRITE_TAC[]);
4154 (ASM_CASES_TAC `~(y'' IN {0,1,2,3})`);
4156 (UNDISCH_TAC `(p:num->num) y'' = 3` THEN ASM_SIMP_TAC[]);
4157 (UP_ASM_TAC THEN SET_TAC[]);
4159 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4160 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4162 (NEW_GOAL `~(y' IN {0,1,2,3})`);
4163 (REPLICATE_TAC 4 UP_ASM_TAC THEN SET_TAC[]);
4164 (EXISTS_TAC `y':num`);
4165 (ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC);
4167 (ASM_CASES_TAC `y'' = i1:num`);
4169 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4171 (ASM_CASES_TAC `y'' = i2:num`);
4173 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4175 (ASM_CASES_TAC `y'' = i3:num`);
4177 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4179 (ASM_CASES_TAC `y'' = i4:num`);
4181 (UNDISCH_TAC `(p:num->num) y'' = y'` THEN ASM_REWRITE_TAC[]);
4184 (NEW_GOAL `(p:num->num) y'' = y''`);
4185 (FIRST_ASSUM MATCH_MP_TAC);
4186 (REPLICATE_TAC 4 UP_ASM_TAC THEN REWRITE_TAC[] THEN
4187 UNDISCH_TAC `{i1,i2,i3,i4} = {0,1,2,3}` THEN SET_TAC[]);
4190 (REWRITE_WITH `inverse (p:num->num) 0 = i1 /\ inverse p 3 = i4 /\
4191 inverse p 1 = i2 /\ inverse p 2 = i3`);
4192 (UP_ASM_TAC THEN MESON_TAC[PERMUTES_INVERSE_EQ;
4193 ASSUME `(p:num->num) i1 = 0 /\ p i2 = 1 /\ p i3 = 2 /\ p i4 = 3`]);
4194 (ASM_REWRITE_TAC[])]);;
4197 (* ==================================================================== *)
4200 let lmfun_bounded = prove_by_refinement (
4201 `!h. &0 <= h ==> lmfun h <= h0 / (h0 - &1)`,
4202 [(REPEAT STRIP_TAC THEN REWRITE_TAC[lmfun] THEN COND_CASES_TAC);
4203 (REWRITE_TAC[REAL_ARITH `(h0 - h) / (h0 - &1) <= h0 / (h0 - &1) <=>
4204 &0 <= h / (h0 - &1)`]);
4205 (MATCH_MP_TAC REAL_LE_DIV);
4206 (REWRITE_TAC[h0] THEN ASM_REAL_ARITH_TAC);
4207 (MATCH_MP_TAC REAL_LE_DIV);
4208 (REWRITE_TAC[h0] THEN REAL_ARITH_TAC)]);;
4210 (* ==================================================================== *)
4213 let lmfun_pos_le = prove_by_refinement (
4214 `!h. &0 <= lmfun h`,
4215 [(REPEAT STRIP_TAC THEN REWRITE_TAC[lmfun] THEN COND_CASES_TAC);
4216 (MATCH_MP_TAC REAL_LE_DIV);
4218 (ASM_REAL_ARITH_TAC);
4219 (ASM_REWRITE_TAC[h0] THEN REAL_ARITH_TAC);
4220 (REAL_ARITH_TAC)]);;
4222 (* ==================================================================== *)
4224 let BARV_CARD_LEMMA = prove (
4226 packing V /\ barV V k ul ==> CARD (set_of_list ul) = k + 1`,
4227 MESON_TAC[Rogers.BARV_IMP_LENGTH_EQ_CARD]);;
4229 let BARV_LENGTH_LEMMA = prove (
4231 packing V /\ barV V k ul ==> LENGTH ul = k + 1`,
4232 MESON_TAC[Rogers.BARV_IMP_LENGTH_EQ_CARD]);;
4234 (* ==================================================================== *)
4237 let MCELL_ID_MXI_2 = prove_by_refinement (
4243 mcell i V ul = mcell j V vl /\
4244 ~NULLSET (mcell i V ul) /\
4247 ==> mxi V ul = mxi V vl`,
4248 [(REPEAT STRIP_TAC);
4250 (!k. i - 1 <= k /\ k <= 3
4251 ==> omega_list_n V ul k = omega_list_n V vl k)`);
4252 (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
4253 (ASM_REWRITE_TAC[]);
4255 (UP_ASM_TAC THEN STRIP_TAC);
4257 (ASM_CASES_TAC `hl (truncate_simplex 2 (ul:(real^3)list)) >= sqrt (&2)`);
4258 (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
4260 (REWRITE_WITH `mxi V ul = omega_list_n V ul 2`);
4261 (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
4262 (ASM_REWRITE_TAC[]);
4267 (REWRITE_WITH `mxi V vl = omega_list_n V vl 2`);
4268 (REWRITE_TAC[mxi] THEN COND_CASES_TAC);
4269 (ASM_REWRITE_TAC[]);
4274 (FIRST_ASSUM MATCH_MP_TAC);
4275 (NEW_GOAL `i = 2 \/ i = 3`);
4279 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
4282 (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
4283 (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
4285 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
4286 set_of_list (truncate_simplex (i - 1) vl)`);
4287 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
4288 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4289 (NEW_GOAL `i = 2 \/ i = 3`);
4291 (ASM_REWRITE_TAC[]);
4295 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4296 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4297 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
4298 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4299 (NEW_GOAL `i = 2 \/ i = 3`);
4301 (ASM_REWRITE_TAC[]);
4305 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4306 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4310 (NEW_GOAL `hl (xl:(real^3)list) <= dist (omega_list V xl, HD xl)`);
4311 (MATCH_MP_TAC Rogers.WAUFCHE1);
4312 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "xl");
4313 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4314 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4316 (NEW_GOAL `!w:real^3. w IN set_of_list yl
4317 ==> dist (circumcenter (set_of_list yl),w) = hl yl`);
4318 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
4319 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
4321 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4322 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4323 (UP_ASM_TAC THEN REWRITE_WITH `circumcenter (set_of_list yl) =
4324 omega_list V (yl:(real^3)list)`);
4325 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4326 (MATCH_MP_TAC Rogers.XNHPWAB1);
4327 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4329 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4330 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4333 (NEW_GOAL `hl yl = dist (omega_list V yl, HD xl)`);
4334 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4335 (FIRST_ASSUM MATCH_MP_TAC);
4336 (NEW_GOAL `HD (xl:(real^3)list) = HD (truncate_simplex (i - 1) ul)`);
4337 (REWRITE_WITH `HD (xl:(real^3)list) = HD ul`);
4339 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4340 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4341 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4342 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4344 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4345 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4346 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4347 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4348 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4349 (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE
4350 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4352 (ASM_REWRITE_TAC[]);
4353 (NEW_GOAL `HD (xl:(real^3)list) IN
4354 set_of_list (truncate_simplex (i - 1) ul)`);
4355 (REWRITE_TAC[ASSUME `HD (xl:(real^3)list) =
4356 HD (truncate_simplex (i - 1) ul)`]);
4357 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4358 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i - 1`);
4359 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4360 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4361 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4362 `x IN {2,3} <=> x = 2 \/ x = 3`] THEN ARITH_TAC);
4364 (NEW_GOAL `set_of_list (truncate_simplex (j - 1) vl) SUBSET
4365 set_of_list (yl:(real^3)list)`);
4367 (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
4368 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4369 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4370 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4371 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4372 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4374 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4377 (NEW_GOAL `omega_list V xl = omega_list V yl`);
4378 (REWRITE_TAC[OMEGA_LIST]);
4379 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
4380 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4381 (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
4383 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4384 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4385 CARD (set_of_list ul) = 3 + 1`);
4386 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4387 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4389 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4390 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
4391 CARD (set_of_list vl) = 3 + 1`);
4392 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4393 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4395 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
4396 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4398 `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
4399 truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
4400 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
4402 `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
4403 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4404 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4405 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4406 CARD (set_of_list ul) = 3 + 1`);
4407 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4408 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4412 `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
4413 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4414 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4415 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
4416 CARD (set_of_list vl) = 3 + 1`);
4417 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4418 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4421 (FIRST_ASSUM MATCH_MP_TAC);
4422 (NEW_GOAL `i = 2 \/ i = 3`);
4426 (ASM_REWRITE_TAC[]);
4427 (NEW_GOAL `hl (yl:(real^3)list) = dist (omega_list V xl, HD xl)`);
4428 (ASM_REWRITE_TAC[]);
4429 (ASM_REAL_ARITH_TAC);
4432 (* ======================================================================= *)
4434 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
4436 (ASM_CASES_TAC `hl (truncate_simplex 2 (vl:(real^3)list)) >= sqrt (&2)`);
4438 (ABBREV_TAC `xl = truncate_simplex 2 (ul:(real^3)list)`);
4439 (ABBREV_TAC `yl = truncate_simplex 2 (vl:(real^3)list)`);
4441 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
4442 set_of_list (truncate_simplex (i - 1) vl)`);
4443 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
4444 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4445 (NEW_GOAL `i = 2 \/ i = 3`);
4447 (ASM_REWRITE_TAC[]);
4451 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4452 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4453 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
4454 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4455 (NEW_GOAL `i = 2 \/ i = 3`);
4457 (ASM_REWRITE_TAC[]);
4461 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4462 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4466 (NEW_GOAL `hl (yl:(real^3)list) <= dist (omega_list V yl, HD yl)`);
4467 (MATCH_MP_TAC Rogers.WAUFCHE1);
4468 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN] THEN EXPAND_TAC "yl");
4469 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4470 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4472 (NEW_GOAL `!w:real^3. w IN set_of_list xl
4473 ==> dist (circumcenter (set_of_list xl),w) = hl xl`);
4474 (MATCH_MP_TAC Rogers.HL_PROPERTIES);
4475 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2` THEN ASM_REWRITE_TAC[]);
4477 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4478 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4479 (UP_ASM_TAC THEN REWRITE_WITH `circumcenter (set_of_list xl) =
4480 omega_list V (xl:(real^3)list)`);
4481 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4482 (MATCH_MP_TAC Rogers.XNHPWAB1);
4483 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4485 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4486 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4489 (NEW_GOAL `hl xl = dist (omega_list V xl, HD yl)`);
4490 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4491 (FIRST_ASSUM MATCH_MP_TAC);
4492 (NEW_GOAL `HD (yl:(real^3)list) = HD (truncate_simplex (i - 1) vl)`);
4493 (REWRITE_WITH `HD (yl:(real^3)list) = HD vl`);
4495 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4496 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4497 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4498 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4500 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4501 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4502 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4503 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4504 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4505 (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE
4506 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4509 (NEW_GOAL `HD (yl:(real^3)list) IN
4510 set_of_list (truncate_simplex (i - 1) vl)`);
4511 (REWRITE_TAC[ASSUME `HD (yl:(real^3)list) =
4512 HD (truncate_simplex (i - 1) vl)`]);
4513 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4514 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i - 1`);
4515 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4516 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4517 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4518 `x IN {2,3} <=> x = 2 \/ x = 3`] THEN ARITH_TAC);
4520 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) vl) SUBSET
4521 set_of_list (xl:(real^3)list)`);
4523 (REWRITE_TAC[GSYM (ASSUME
4524 `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
4525 set_of_list (truncate_simplex (i - 1) vl)`)]);
4526 (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
4527 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4528 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4529 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4530 (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE
4531 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4533 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4536 (NEW_GOAL `omega_list V xl = omega_list V yl`);
4537 (REWRITE_TAC[OMEGA_LIST]);
4538 (REWRITE_WITH `LENGTH (xl:(real^3)list) = 3 /\ LENGTH (yl:(real^3)list) = 3`);
4539 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4540 (REWRITE_TAC[ARITH_RULE `3 = 2 + 1`]);
4542 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4543 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4544 CARD (set_of_list ul) = 3 + 1`);
4545 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4546 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4548 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
4549 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
4550 CARD (set_of_list vl) = 3 + 1`);
4551 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4552 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4554 (REWRITE_TAC[ARITH_RULE `3 - 1 = 2`]);
4555 (EXPAND_TAC "xl" THEN EXPAND_TAC "yl");
4557 `truncate_simplex 2 ul = truncate_simplex (2 + 0) (ul:(real^3)list) /\
4558 truncate_simplex 2 vl = truncate_simplex (2 + 0) (vl:(real^3)list)`);
4559 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
4561 `omega_list_n V (truncate_simplex (2 + 0) ul) 2 = omega_list_n V ul 2`);
4562 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4563 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4564 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4565 CARD (set_of_list ul) = 3 + 1`);
4566 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4567 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4571 `omega_list_n V (truncate_simplex (2 + 0) vl) 2 = omega_list_n V vl 2`);
4572 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4573 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4574 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1 /\
4575 CARD (set_of_list vl) = 3 + 1`);
4576 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4577 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4580 (FIRST_ASSUM MATCH_MP_TAC);
4581 (NEW_GOAL `i = 2 \/ i = 3`);
4585 (NEW_GOAL `hl (xl:(real^3)list) = dist (omega_list V yl, HD yl)`);
4586 (ASM_REWRITE_TAC[]);
4587 (ASM_REAL_ARITH_TAC);
4589 (UP_ASM_TAC THEN REWRITE_TAC[REAL_ARITH `~(a >= b) <=> a < b`]);
4592 (* ======================================================================= *)
4594 (NEW_GOAL `sqrt (&2) <= hl (ul:(real^3)list)`);
4595 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4596 (ASM_CASES_TAC `i = 2`);
4597 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 2`; mcell2]);
4600 (ASM_REWRITE_TAC[]);
4601 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4604 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `i = 3`; mcell3]);
4607 (ASM_REWRITE_TAC[]);
4608 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4610 (NEW_GOAL `sqrt (&2) <= hl (vl:(real^3)list)`);
4611 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4612 (ASM_REWRITE_TAC[]);
4613 (ASM_CASES_TAC `j = 2`);
4614 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 2`; mcell2]);
4617 (ASM_REWRITE_TAC[]);
4618 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4621 (REWRITE_TAC[MCELL_EXPLICIT; ASSUME `j = 3`; mcell3]);
4624 (ASM_REWRITE_TAC[]);
4625 (REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4627 (ABBREV_TAC `s2 = omega_list_n V ul 2`);
4628 (ABBREV_TAC `s3 = omega_list_n V ul 3`);
4629 (NEW_GOAL `s2 = omega_list_n V vl 2`);
4630 (EXPAND_TAC "s2" THEN FIRST_ASSUM MATCH_MP_TAC);
4631 (NEW_GOAL `i = 2 \/ i = 3`);
4634 (NEW_GOAL `s3 = omega_list_n V vl 3`);
4635 (EXPAND_TAC "s3" THEN FIRST_ASSUM MATCH_MP_TAC);
4636 (NEW_GOAL `i = 2 \/ i = 3`);
4639 (ABBREV_TAC `u0:real^3 = HD ul`);
4641 (NEW_GOAL `?s. between s (s2,s3) /\
4642 dist (u0,s) = sqrt (&2) /\
4644 (EXPAND_TAC "s2" THEN EXPAND_TAC "s3");
4645 (MATCH_MP_TAC MXI_EXPLICIT);
4646 (NEW_GOAL `?v0 u1 u2 u3. ul = [v0;u1;u2;u3:real^3]`);
4647 (MATCH_MP_TAC BARV_3_EXPLICIT);
4648 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4649 (UP_ASM_TAC THEN STRIP_TAC);
4650 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
4651 EXISTS_TAC `u3:real^3`);
4652 (ASM_REWRITE_TAC[]);
4653 (REWRITE_WITH `v0:real^3 = HD ul`);
4654 (REWRITE_TAC[ASSUME `ul = [v0;u1;u2;u3:real^3]`; HD]);
4655 (ASM_REWRITE_TAC[]);
4656 (UP_ASM_TAC THEN STRIP_TAC);
4657 (ABBREV_TAC `v0:real^3 = HD vl`);
4659 (NEW_GOAL `?t. between t (s2,s3) /\
4660 dist (v0,t) = sqrt (&2) /\
4662 (ASM_REWRITE_TAC[]);
4664 (MATCH_MP_TAC MXI_EXPLICIT);
4665 (NEW_GOAL `?w0 u1 u2 u3. vl = [w0;u1;u2;u3:real^3]`);
4666 (MATCH_MP_TAC BARV_3_EXPLICIT);
4667 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4668 (UP_ASM_TAC THEN STRIP_TAC);
4669 (EXISTS_TAC `u1:real^3` THEN EXISTS_TAC `u2:real^3` THEN
4670 EXISTS_TAC `u3:real^3`);
4671 (ASM_REWRITE_TAC[HD]);
4673 (REWRITE_TAC[ASSUME `vl = [w0;u1;u2;u3:real^3]`; HD]);
4674 (UP_ASM_TAC THEN STRIP_TAC);
4676 (NEW_GOAL `dist (u0:real^3, t) = sqrt (&2)`);
4677 (NEW_GOAL `(t:real^3) IN voronoi_list V (truncate_simplex 2 vl)`);
4678 (NEW_GOAL `s2 IN voronoi_list V (truncate_simplex 2 vl)`);
4679 (ASM_REWRITE_TAC[]);
4680 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4681 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4682 (NEW_GOAL `s3 IN voronoi_list V (truncate_simplex 2 vl)`);
4683 (ASM_REWRITE_TAC[]);
4684 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4685 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC);
4686 (NEW_GOAL `convex hull {s2, s3:real^3} SUBSET
4687 convex hull (voronoi_list V (truncate_simplex 2 vl))`);
4688 (MATCH_MP_TAC Marchal_cells.CONVEX_HULL_SUBSET THEN ASM_SET_TAC[]);
4689 (UP_ASM_TAC THEN REWRITE_WITH
4690 `convex hull voronoi_list V (truncate_simplex 2 vl) =
4691 voronoi_list V (truncate_simplex 2 vl)`);
4692 (REWRITE_TAC[CONVEX_HULL_EQ; CONVEX_VORONOI_LIST]);
4694 (NEW_GOAL `t IN convex hull {s2, s3:real^3}`);
4695 (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
4696 (ASM_REWRITE_TAC[]);
4697 (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
4699 (NEW_GOAL `u0:real^3 IN set_of_list (truncate_simplex 2 vl)`);
4702 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)) =
4703 set_of_list (truncate_simplex (i - 1) vl)`);
4704 (NEW_GOAL `V INTER mcell i V ul = set_of_list (truncate_simplex (i - 1) ul)`);
4705 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4706 (NEW_GOAL `i = 2 \/ i = 3`);
4708 (ASM_REWRITE_TAC[]);
4712 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4713 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4714 (NEW_GOAL `V INTER mcell j V vl = set_of_list (truncate_simplex (j - 1) vl)`);
4715 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
4716 (NEW_GOAL `i = 2 \/ i = 3`);
4718 (ASM_REWRITE_TAC[]);
4722 (UNDISCH_TAC `~NULLSET (mcell i V ul)`);
4723 (ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
4726 (NEW_GOAL `HD (ul:(real^3)list) = HD (truncate_simplex (i - 1) ul)`);
4727 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4728 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4729 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
4730 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4731 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4732 (UNDISCH_TAC `i IN {2,3}` THEN REWRITE_TAC[SET_RULE
4733 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4736 (NEW_GOAL `HD (ul:(real^3)list) IN
4737 set_of_list (truncate_simplex (i - 1) ul)`);
4738 (REWRITE_TAC[ASSUME `HD (ul:(real^3)list) =
4739 HD (truncate_simplex (i - 1) ul)`]);
4740 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4741 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `i - 1`);
4742 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4743 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4744 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4745 `x IN {2,3} <=> x = 2 \/ x = 3`] THEN ARITH_TAC);
4746 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4747 (NEW_GOAL `set_of_list (truncate_simplex (j - 1) vl) SUBSET
4748 set_of_list (truncate_simplex 2 (vl:(real^3)list))`);
4749 (MATCH_MP_TAC Rogers.TRUNCATE_SIMPLEX_SUBSET);
4750 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4751 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4752 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4753 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4754 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4756 (UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
4760 (NEW_GOAL `v0:real^3 IN set_of_list (truncate_simplex 2 vl)`);
4762 (REWRITE_WITH `(HD vl):real^3 = HD (truncate_simplex 2 vl)`);
4763 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4764 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4765 (REWRITE_WITH `LENGTH (vl:(real^3)list) = 3 + 1`);
4766 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
4767 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4768 (UNDISCH_TAC `j IN {2,3}` THEN REWRITE_TAC[SET_RULE
4769 `x IN {2,3} <=> x = 2 \/ x = 3`]);
4771 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4772 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `2`);
4773 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4774 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4777 (NEW_GOAL `t:real^3 IN voronoi_closed V u0`);
4778 (UNDISCH_TAC `t:real^3 IN voronoi_list V (truncate_simplex 2 vl)`);
4779 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET;]);
4781 (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM; voronoi_closed]);
4783 (NEW_GOAL `dist (u0:real^3, t) <= dist (v0:real^3, t)`);
4784 (ONCE_REWRITE_TAC[DIST_SYM]);
4785 (FIRST_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "v0");
4786 (REWRITE_TAC[MESON[IN] `(V:real^3->bool) s <=> s IN V`]);
4787 (NEW_GOAL `HD (vl:(real^3)list) IN set_of_list vl`);
4788 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4789 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4790 (NEW_GOAL `set_of_list (vl:(real^3)list) SUBSET V`);
4791 (MATCH_MP_TAC Packing3.BARV_SUBSET);
4792 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4795 (NEW_GOAL `t:real^3 IN voronoi_closed V v0`);
4796 (UNDISCH_TAC `t:real^3 IN voronoi_list V (truncate_simplex 2 vl)`);
4797 (REWRITE_TAC[VORONOI_LIST; VORONOI_SET;]);
4799 (UP_ASM_TAC THEN REWRITE_TAC[IN; IN_ELIM_THM; voronoi_closed]);
4801 (NEW_GOAL `dist (v0:real^3, t) <= dist (u0:real^3, t)`);
4802 (ONCE_REWRITE_TAC[DIST_SYM]);
4803 (FIRST_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "u0");
4804 (REWRITE_TAC[MESON[IN] `(V:real^3->bool) s <=> s IN V`]);
4805 (NEW_GOAL `HD (ul:(real^3)list) IN set_of_list ul`);
4806 (MATCH_MP_TAC Packing3.BARV_IMP_HD_IN_SET_OF_LIST);
4807 (EXISTS_TAC `V:real^3->bool` THEN EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4808 (NEW_GOAL `set_of_list (ul:(real^3)list) SUBSET V`);
4809 (MATCH_MP_TAC Packing3.BARV_SUBSET);
4810 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
4812 (ASM_REAL_ARITH_TAC);
4814 (ASM_REWRITE_TAC[]);
4816 (NEW_GOAL `!n. between n (s2, s3:real^3) ==>
4817 dist (u0, n) pow 2 = dist (s2, n) pow 2 + dist (u0, s2) pow 2`);
4819 (REWRITE_TAC[dist]);
4820 (MATCH_MP_TAC PYTHAGORAS);
4821 (REWRITE_TAC[orthogonal]);
4822 (ABBREV_TAC `zl = truncate_simplex 2 (ul:(real^3)list)`);
4823 (REWRITE_WITH `s2:real^3 = circumcenter (set_of_list zl)`);
4824 (REWRITE_WITH `s2 = omega_list V zl`);
4825 (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
4826 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4827 (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
4828 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4829 CARD (set_of_list ul) = 3 + 1`);
4830 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4831 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4833 (MATCH_MP_TAC Rogers.XNHPWAB1);
4834 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4836 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4837 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4838 (MATCH_MP_TAC Rogers.MHFTTZN4);
4839 (EXISTS_TAC `V:real^3->bool`);
4842 (ASM_REWRITE_TAC[]);
4844 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4845 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4847 (NEW_GOAL `s2 IN voronoi_list V zl`);
4848 (REWRITE_WITH `s2 = omega_list V zl`);
4849 (EXPAND_TAC "s2" THEN EXPAND_TAC "zl");
4850 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4851 (MATCH_MP_TAC Packing3.OMEGA_LIST_LEMMA);
4852 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4853 CARD (set_of_list ul) = 3 + 1`);
4854 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4855 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4857 (MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
4860 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4861 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4863 (NEW_GOAL `s3 IN voronoi_list V zl`);
4864 (EXPAND_TAC "s3" THEN EXPAND_TAC "zl");
4865 (MATCH_MP_TAC Rogers.OMEGA_LIST_N_IN_VORONOI_LIST_GEN);
4866 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3 /\ 3 <= 3`]);
4867 (NEW_GOAL `affine hull {s2, s3} SUBSET affine hull voronoi_list V zl`);
4868 (MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA);
4870 (NEW_GOAL `n IN affine hull {s2, s3:real^3}`);
4871 (NEW_GOAL `convex hull {s2,s3} SUBSET affine hull {s2,s3:real^3}`);
4872 (REWRITE_TAC[CONVEX_HULL_SUBSET_AFFINE_HULL]);
4873 (NEW_GOAL `n IN convex hull {s2, s3:real^3}`);
4874 (REWRITE_TAC[GSYM BETWEEN_IN_CONVEX_HULL]);
4875 (ASM_REWRITE_TAC[]);
4879 (MATCH_MP_TAC Marchal_cells_2_new.IN_AFFINE_KY_LEMMA1);
4880 (REWRITE_WITH `u0:real^3 = HD zl`);
4881 (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
4882 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4883 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4884 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4885 CARD (set_of_list ul) = 3 + 1`);
4886 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4887 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4889 (MATCH_MP_TAC Packing3.HD_IN_SET_OF_LIST);
4891 (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\
4892 CARD (set_of_list zl) = 2 + 1`);
4893 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4894 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4896 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4897 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4900 (NEW_GOAL `dist (u0,s) pow 2 = dist (s2,s:real^3) pow 2 + dist (u0,s2) pow 2`);
4902 (NEW_GOAL `dist (u0,t) pow 2 = dist (s2,t:real^3) pow 2 + dist (u0,s2) pow 2`);
4904 (NEW_GOAL `dist (s2, s:real^3) = dist (s2, t)`);
4905 (REWRITE_TAC[DIST_EQ]);
4906 (UP_ASM_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);
4908 (UNDISCH_TAC `between s (s2, s3:real^3)` THEN
4909 UNDISCH_TAC `between t (s2, s3:real^3)`);
4910 (REWRITE_TAC[BETWEEN_IN_CONVEX_HULL; CONVEX_HULL_2; IN; IN_ELIM_THM]);
4912 (UNDISCH_TAC `dist (s2,s) = dist (s2,t:real^3)`);
4913 (REWRITE_TAC[dist;ASSUME `s = u' % s2 + v' % s3:real^3`;
4914 ASSUME `t = u % s2 + v % s3:real^3` ]);
4915 (REWRITE_WITH `s2 - (u' % s2 + v' % s3) =
4916 (u' + v') % s2 - (u' % s2 + v' % s3:real^3)`);
4917 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4918 (REWRITE_WITH `s2 - (u % s2 + v % s3) =
4919 (u + v) % s2 - (u % s2 + v % s3:real^3)`);
4920 (ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC);
4921 (REWRITE_TAC[VECTOR_ARITH `(u + v) % s - (u % s + v % t) = v % (s - t)`]);
4922 (REWRITE_TAC[NORM_MUL]);
4923 (REWRITE_WITH `abs v = v /\ abs v' = v'`);
4924 (ASM_SIMP_TAC[REAL_ABS_REFL]);
4925 (REWRITE_TAC[REAL_ARITH `a * b = c * b <=> (a - c) * b = &0`;REAL_ENTIRE]);
4928 (REWRITE_WITH `v = v':real /\ u = u':real`);
4929 (ASM_REAL_ARITH_TAC);
4930 (UP_ASM_TAC THEN REWRITE_TAC[NORM_EQ_0]);
4931 (REWRITE_TAC[VECTOR_ARITH `a - b = vec 0 <=> a = b`] THEN STRIP_TAC);
4933 (NEW_GOAL `hl (ul:(real^3)list) <= dist (s3,u0:real^3)`);
4934 (REWRITE_WITH `s3 = omega_list V ul /\ u0 = HD ul`);
4936 (REWRITE_TAC[GSYM (ASSUME `omega_list_n V ul 3 = s3`); OMEGA_LIST]);
4937 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4938 CARD (set_of_list ul) = 3 + 1`);
4939 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4940 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4941 (REWRITE_TAC[ARITH_RULE `(3 + 1) - 1 = 3`]);
4942 (ASM_REWRITE_TAC[]);
4943 (MATCH_MP_TAC Rogers.WAUFCHE1);
4944 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[IN]);
4945 (ABBREV_TAC `zl:(real^3)list = truncate_simplex 2 ul`);
4946 (NEW_GOAL `hl (zl:(real^3)list) = dist (s3, u0:real^3)`);
4948 (REWRITE_WITH `s3 = omega_list V zl /\ u0 = HD zl`);
4950 (REWRITE_TAC[GSYM (ASSUME `s2:real^3 = s3`); OMEGA_LIST]);
4953 (REWRITE_WITH `LENGTH (zl:(real^3)list) = 2 + 1 /\
4954 CARD (set_of_list zl) = 2 + 1`);
4955 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4956 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4958 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4959 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4960 (REWRITE_TAC[ARITH_RULE `(2 + 1) - 1 = 2`]);
4963 (REWRITE_WITH `truncate_simplex 2 (ul:(real^3)list) =
4964 truncate_simplex (2 + 0) (ul:(real^3)list)`);
4965 (REWRITE_TAC[ARITH_RULE `2 + 0 = 2`]);
4966 (MATCH_MP_TAC Packing3.OMEGA_LIST_N_LEMMA);
4967 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4968 CARD (set_of_list ul) = 3 + 1`);
4969 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4970 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4973 (EXPAND_TAC "zl" THEN EXPAND_TAC "u0");
4974 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
4975 (MATCH_MP_TAC Packing3.HD_TRUNCATE_SIMPLEX);
4976 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
4977 CARD (set_of_list ul) = 3 + 1`);
4978 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
4979 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
4981 (MATCH_MP_TAC Rogers.WAUFCHE2);
4982 (EXISTS_TAC `2` THEN ASM_REWRITE_TAC[IN]);
4984 (MATCH_MP_TAC Packing3.TRUNCATE_SIMPLEX_BARV);
4985 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[ARITH_RULE `2 <= 3`]);
4986 (ASM_REAL_ARITH_TAC);
4987 (ASM_MESON_TAC[])]);;
4989 (* ==================================================================== *)
4992 let DIHV_SYM_3 = prove_by_refinement (
4994 {a,b:real^3} = {c,d} /\ {x,y} = {z,t} ==>
4995 dihV a b x y = dihV c d z t`,
4996 [(REWRITE_TAC[SET_RULE `{a,b} = {c,d} <=>
4997 (a = c /\ b = d) \/ (a = d /\ b = c)`]);
4999 (ASM_REWRITE_TAC[]);
5000 (ASM_REWRITE_TAC[DIHV_SYM_2]);
5001 (ASM_REWRITE_TAC[DIHV_SYM_2; DIHV_SYM]);
5002 (ASM_REWRITE_TAC[DIHV_SYM_2; DIHV_SYM])]);;
5004 (* ==================================================================== *)
5007 let DIHX_SYM = prove_by_refinement (
5009 packing V /\ saturated V /\ mcell_set V X /\ {u, v} IN edgeX V X
5010 ==> dihX V X (u,v) = dihX V X (v,u)`,
5011 [(REPEAT STRIP_TAC);
5012 (REWRITE_TAC[dihX]);
5016 (UP_ASM_TAC THEN MESON_TAC[]);
5018 (UP_ASM_TAC THEN MESON_TAC[]);
5019 (DEL_TAC THEN REWRITE_TAC[cell_params_d] THEN REPEAT LET_TAC);
5021 (UNDISCH_TAC `{u, v} IN edgeX V X` THEN REWRITE_TAC[edgeX; IN;IN_ELIM_THM]);
5022 (REWRITE_WITH `VX V X = V INTER X`);
5023 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
5024 (ASM_REWRITE_TAC[]);
5025 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set;IN_ELIM_THM;IN]);
5028 (MP_TAC (ASSUME `(V INTER X) (u':real^3)`) THEN
5029 MP_TAC (ASSUME `(V INTER X) (v':real^3)`));
5030 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set_2;IN_ELIM_THM;IN]);
5032 (REWRITE_TAC[ASSUME `X = mcell i V ul''`]);
5033 (REWRITE_WITH `(V INTER mcell i V ul'') = set_of_list (truncate_simplex (i-1) ul'')`);
5034 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5035 (ASM_REWRITE_TAC[]);
5036 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`)]);
5038 (REWRITE_TAC[ARITH_RULE `1 <= i <=> ~(i = 0)`]);
5040 (MP_TAC (ASSUME `(V INTER X) (u':real^3)`));
5041 (REWRITE_WITH `V INTER X:real^3->bool = {}`);
5042 (ASM_REWRITE_TAC[]);
5043 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
5044 (ASM_REWRITE_TAC[]);
5045 (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`]);
5047 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5049 (ASM_CASES_TAC `i <= 1`);
5050 (NEW_GOAL `?w0 w1 w2 w3. ul'' = [w0;w1;w2;w3:real^3]`);
5051 (MATCH_MP_TAC BARV_3_EXPLICIT);
5052 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5053 (UP_ASM_TAC THEN STRIP_TAC);
5054 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5055 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5056 (NEW_GOAL `i - 1 = 0`);
5057 (UNDISCH_TAC `i <= 1` THEN ARITH_TAC);
5058 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0; set_of_list;
5059 MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5060 (REWRITE_TAC[SET_RULE `a IN {b} <=> a = b`]);
5061 (UNDISCH_TAC `~(u' = v':real^3)`);
5063 (UP_ASM_TAC THEN REWRITE_TAC[ARITH_RULE `~(i <= 1) <=> 2 <= i`]
5066 (* ========================================================================== *)
5068 (NEW_GOAL `?p. p permutes 0..i - 1 /\
5069 initial_sublist [u:real^3; v] (left_action_list p ul'')`);
5070 (NEW_GOAL `?w0 w1 w2 w3. ul'' = [w0;w1;w2;w3:real^3]`);
5071 (MATCH_MP_TAC BARV_3_EXPLICIT);
5072 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5073 (UP_ASM_TAC THEN STRIP_TAC);
5075 (ASM_CASES_TAC `i = 2`);
5076 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5077 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5078 (NEW_GOAL `i - 1 = 1`);
5079 (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
5080 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list;
5081 MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5083 (ASM_CASES_TAC `u = w0:real^3`);
5084 (NEW_GOAL `v = w1:real^3`);
5085 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
5086 `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}`
5088 (EXISTS_TAC `I:num->num`);
5089 (ASM_REWRITE_TAC[PERMUTES_I; Packing3.LEFT_ACTION_LIST_I]);
5090 (REWRITE_WITH `initial_sublist [w0; w1] [w0; w1; w2; w3] /\
5091 LENGTH [w0;w1:real^3] = 1 + 1`);
5092 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5093 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5094 (NEW_GOAL `v = w0:real^3 /\ u = w1:real^3`);
5095 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
5096 `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}`
5098 (ASM_REWRITE_TAC[]);
5099 (NEW_GOAL `?p. p permutes 0..1 /\
5100 [w1; w0; w2; w3:real^3] = left_action_list p ul''`);
5101 (MATCH_MP_TAC Qzksykg.TWO_REARRANGEMENT_LEMMA);
5102 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5103 (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC);
5104 (EXISTS_TAC `p:num->num` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[GSYM
5105 (ASSUME `[w1; w0; w2; w3] = left_action_list p [w0; w1; w2; w3:real^3]`)]);
5106 (REWRITE_WITH `initial_sublist [w1; w0] [w1; w0; w2; w3] /\
5107 LENGTH [w1;w0:real^3] = 1 + 1`);
5108 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5109 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5111 (ASM_CASES_TAC `i = 3`);
5112 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5113 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5114 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2;
5115 set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5118 (NEW_GOAL `u IN {w0, w1, w2} /\ v IN {w0, w1, w2:real^3} /\ ~(u = v)`);
5120 (UP_ASM_TAC THEN STRIP_TAC);
5122 (NEW_GOAL `?a. {u,v, a} = {w0, w1, w2:real^3}`);
5123 (NEW_GOAL `?w:real^3. w IN {w0, w1, w2} DIFF {u, v}`);
5124 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5125 (REWRITE_WITH `{w0, w1, w2} DIFF {u, v:real^3} = {} <=>
5126 CARD ({w0, w1, w2} DIFF {u, v}) = 0`);
5127 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5128 (MATCH_MP_TAC CARD_EQ_0);
5129 (MATCH_MP_TAC FINITE_SUBSET);
5130 (EXISTS_TAC `{w0, w1, w2:real^3}`);
5131 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5133 (NEW_GOAL `CARD {w0, w1, w2} = CARD ({w0, w1, w2} DIFF {u, v:real^3}) +
5135 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5136 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5137 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2:real^3}) = 3`);
5138 (ASM_CASES_TAC `CARD {w0,w1,w2:real^3} <= 2`);
5140 (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} = 4`);
5141 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5142 (ASM_REWRITE_TAC[set_of_list]);
5143 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5144 CARD (set_of_list ul'') = 3 + 1`);
5145 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5146 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5148 (UP_ASM_TAC THEN REWRITE_WITH `CARD {w0, w1, w2, w3} =
5149 CARD {w3, w0,w1,w2:real^3}`);
5150 (AP_TERM_TAC THEN SET_TAC[]);
5151 (NEW_GOAL `CARD ({w3, w0, w1, w2}) <= SUC (CARD {w0, w1, w2:real^3})`);
5152 (SIMP_TAC[Geomdetail.CARD_CLAUSES_IMP; Geomdetail.FINITE6]);
5153 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5155 (NEW_GOAL `CARD {w0, w1, w2:real^3} <= 3`);
5156 (REWRITE_TAC[Geomdetail.CARD3]);
5157 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5159 (SUBGOAL_THEN `CARD {u,v:real^3} <= 2` MP_TAC);
5160 (REWRITE_TAC[Geomdetail.CARD2]);
5162 (UP_ASM_TAC THEN STRIP_TAC);
5163 (EXISTS_TAC `w:real^3`);
5164 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5165 (UP_ASM_TAC THEN STRIP_TAC);
5167 (NEW_GOAL `?p. p permutes 0..2 /\
5168 [u; v; a; w3] = left_action_list p [w0; w1; w2; w3:real^3]`);
5169 (MATCH_MP_TAC LEFT_ACTION_LIST_2_EXISTS);
5170 (ASM_REWRITE_TAC[]);
5172 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5173 (ASM_REWRITE_TAC[set_of_list]);
5174 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5175 CARD (set_of_list ul'') = 3 + 1`);
5176 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5177 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5179 (UP_ASM_TAC THEN STRIP_TAC);
5181 (EXISTS_TAC `p:num->num`);
5182 (ASM_REWRITE_TAC[]);
5183 (REWRITE_TAC[GSYM (ASSUME `[u; v; a; w3:real^3] =
5184 left_action_list p [w0; w1; w2; w3]`)]);
5185 (REWRITE_WITH `initial_sublist [u; v] [u; v; a; w3] /\
5186 LENGTH [u; v:real^3] = 1 + 1`);
5187 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5188 TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5192 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5193 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5194 (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3;
5195 set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5198 (NEW_GOAL `u IN {w0, w1, w2, w3} /\ v IN {w0, w1, w2, w3:real^3} /\
5201 (UP_ASM_TAC THEN STRIP_TAC);
5203 (NEW_GOAL `?a b. {u,v,a,b} = {w0, w1, w2, w3:real^3}`);
5205 (NEW_GOAL `?w:real^3. w IN {w0, w1, w2, w3} DIFF {u, v}`);
5206 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5207 (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v:real^3} = {} <=>
5208 CARD ({w0, w1, w2, w3} DIFF {u, v}) = 0`);
5209 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5210 (MATCH_MP_TAC CARD_EQ_0);
5211 (MATCH_MP_TAC FINITE_SUBSET);
5212 (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5213 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5215 (NEW_GOAL `CARD {w0, w1, w2, w3} =
5216 CARD ({w0, w1, w2, w3} DIFF {u, v:real^3}) + CARD {u, v}`);
5217 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5218 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5220 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5221 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5222 (ASM_REWRITE_TAC[set_of_list]);
5223 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5224 CARD (set_of_list ul'') = 3 + 1`);
5225 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5226 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5227 (NEW_GOAL `CARD {u, v:real^3} <= 2`);
5228 (REWRITE_TAC[Geomdetail.CARD2]);
5229 (UP_ASM_TAC THEN ARITH_TAC);
5230 (UP_ASM_TAC THEN STRIP_TAC);
5232 (NEW_GOAL `?m:real^3. m IN {w0, w1, w2, w3} DIFF {u, v, w}`);
5233 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5234 (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v, w:real^3} = {} <=>
5235 CARD ({w0, w1, w2, w3} DIFF {u, v, w}) = 0`);
5236 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5237 (MATCH_MP_TAC CARD_EQ_0);
5238 (MATCH_MP_TAC FINITE_SUBSET);
5239 (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5240 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5242 (NEW_GOAL `CARD ({w0, w1, w2, w3} DIFF {u,v,w:real^3}) =
5243 CARD {w0, w1, w2, w3} - CARD {u,v,w}`);
5244 (MATCH_MP_TAC CARD_DIFF);
5245 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5247 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5248 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5249 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5250 (ASM_REWRITE_TAC[set_of_list]);
5251 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5252 CARD (set_of_list ul'') = 3 + 1`);
5253 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5254 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5255 (NEW_GOAL `CARD {u, v, w:real^3} <= 3`);
5256 (REWRITE_TAC[Geomdetail.CARD3]);
5257 (UP_ASM_TAC THEN ARITH_TAC);
5258 (UP_ASM_TAC THEN STRIP_TAC);
5260 (EXISTS_TAC `w:real^3` THEN EXISTS_TAC `m:real^3`);
5261 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN
5262 UP_ASM_TAC THEN SET_TAC[]);
5263 (UP_ASM_TAC THEN STRIP_TAC);
5265 (NEW_GOAL `?p. p permutes 0..3 /\
5266 [u; v; a; b] = left_action_list p [w0; w1; w2; w3:real^3]`);
5267 (MATCH_MP_TAC LEFT_ACTION_LIST_3_EXISTS);
5268 (ASM_REWRITE_TAC[]);
5270 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5271 (ASM_REWRITE_TAC[set_of_list]);
5272 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5273 CARD (set_of_list ul'') = 3 + 1`);
5274 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5275 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5277 (UP_ASM_TAC THEN STRIP_TAC);
5279 (EXISTS_TAC `p:num->num`);
5280 (ASM_REWRITE_TAC[]);
5281 (REWRITE_TAC[GSYM (ASSUME `[u; v; a; b:real^3] =
5282 left_action_list p [w0; w1; w2; w3]`)]);
5283 (REWRITE_WITH `initial_sublist [u; v] [u; v; a; b] /\
5284 LENGTH [u; v:real^3] = 1 + 1`);
5285 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5286 TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5287 (UP_ASM_TAC THEN STRIP_TAC);
5289 (* ========================================================================== *)
5291 (NEW_GOAL `?q. q permutes 0..i - 1 /\
5292 initial_sublist [v:real^3; u] (left_action_list q ul'')`);
5293 (NEW_GOAL `?w0 w1 w2 w3. ul'' = [w0;w1;w2;w3:real^3]`);
5294 (MATCH_MP_TAC BARV_3_EXPLICIT);
5295 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5296 (UP_ASM_TAC THEN STRIP_TAC);
5298 (ASM_CASES_TAC `i = 2`);
5299 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5300 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5301 (NEW_GOAL `i - 1 = 1`);
5302 (UNDISCH_TAC `i = 2` THEN ARITH_TAC);
5303 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; set_of_list;
5304 MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5306 (ASM_CASES_TAC `v = w0:real^3`);
5307 (NEW_GOAL `u = w1:real^3`);
5308 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
5309 `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}`
5311 (EXISTS_TAC `I:num->num`);
5312 (ASM_REWRITE_TAC[PERMUTES_I; Packing3.LEFT_ACTION_LIST_I]);
5313 (REWRITE_WITH `initial_sublist [w0; w1] [w0; w1; w2; w3] /\
5314 LENGTH [w0;w1:real^3] = 1 + 1`);
5315 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5316 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5317 (NEW_GOAL `u = w0:real^3 /\ v = w1:real^3`);
5318 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UNDISCH_TAC
5319 `~(u' = v':real^3)` THEN UNDISCH_TAC `{u,v} = {u',v':real^3}`
5321 (ASM_REWRITE_TAC[]);
5322 (NEW_GOAL `?q. q permutes 0..1 /\
5323 [w1; w0; w2; w3:real^3] = left_action_list q ul''`);
5324 (MATCH_MP_TAC Qzksykg.TWO_REARRANGEMENT_LEMMA);
5325 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5326 (UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC);
5327 (EXISTS_TAC `q:num->num` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[GSYM
5328 (ASSUME `[w1; w0; w2; w3] = left_action_list q [w0; w1; w2; w3:real^3]`)]);
5329 (REWRITE_WITH `initial_sublist [w1; w0] [w1; w0; w2; w3] /\
5330 LENGTH [w1;w0:real^3] = 1 + 1`);
5331 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5332 (REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_1; LENGTH] THEN ARITH_TAC);
5334 (ASM_CASES_TAC `i = 3`);
5335 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5336 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5337 (ASM_REWRITE_TAC[ARITH_RULE `3 - 1 = 2`; TRUNCATE_SIMPLEX_EXPLICIT_2;
5338 set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5341 (NEW_GOAL `u IN {w0, w1, w2} /\ v IN {w0, w1, w2:real^3} /\ ~(u = v)`);
5343 (UP_ASM_TAC THEN STRIP_TAC);
5345 (NEW_GOAL `?a. {u,v, a} = {w0, w1, w2:real^3}`);
5346 (NEW_GOAL `?w:real^3. w IN {w0, w1, w2} DIFF {u, v}`);
5347 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5348 (REWRITE_WITH `{w0, w1, w2} DIFF {u, v:real^3} = {} <=>
5349 CARD ({w0, w1, w2} DIFF {u, v}) = 0`);
5350 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5351 (MATCH_MP_TAC CARD_EQ_0);
5352 (MATCH_MP_TAC FINITE_SUBSET);
5353 (EXISTS_TAC `{w0, w1, w2:real^3}`);
5354 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5356 (NEW_GOAL `CARD {w0, w1, w2} = CARD ({w0, w1, w2} DIFF {u, v:real^3}) +
5358 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5359 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5360 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2:real^3}) = 3`);
5361 (ASM_CASES_TAC `CARD {w0,w1,w2:real^3} <= 2`);
5363 (NEW_GOAL `CARD {w0, w1, w2, w3:real^3} = 4`);
5364 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5365 (ASM_REWRITE_TAC[set_of_list]);
5366 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5367 CARD (set_of_list ul'') = 3 + 1`);
5368 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5369 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5371 (UP_ASM_TAC THEN REWRITE_WITH `CARD {w0, w1, w2, w3} =
5372 CARD {w3, w0,w1,w2:real^3}`);
5373 (AP_TERM_TAC THEN SET_TAC[]);
5374 (NEW_GOAL `CARD ({w3, w0, w1, w2}) <= SUC (CARD {w0, w1, w2:real^3})`);
5375 (SIMP_TAC[Geomdetail.CARD_CLAUSES_IMP; Geomdetail.FINITE6]);
5376 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5378 (NEW_GOAL `CARD {w0, w1, w2:real^3} <= 3`);
5379 (REWRITE_TAC[Geomdetail.CARD3]);
5380 (UP_ASM_TAC THEN UP_ASM_TAC THEN ARITH_TAC);
5382 (SUBGOAL_THEN `CARD {u,v:real^3} <= 2` MP_TAC);
5383 (REWRITE_TAC[Geomdetail.CARD2]);
5385 (UP_ASM_TAC THEN STRIP_TAC);
5386 (EXISTS_TAC `w:real^3`);
5387 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5388 (UP_ASM_TAC THEN STRIP_TAC);
5389 (UP_ASM_TAC THEN REWRITE_WITH `{u,v,a} = {v, u, a:real^3}`);
5393 (NEW_GOAL `?q. q permutes 0..2 /\
5394 [v; u; a; w3] = left_action_list q [w0; w1; w2; w3:real^3]`);
5395 (MATCH_MP_TAC LEFT_ACTION_LIST_2_EXISTS);
5396 (ASM_REWRITE_TAC[]);
5398 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5399 (ASM_REWRITE_TAC[set_of_list]);
5400 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5401 CARD (set_of_list ul'') = 3 + 1`);
5402 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5403 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5405 (UP_ASM_TAC THEN STRIP_TAC);
5407 (EXISTS_TAC `q:num->num`);
5408 (ASM_REWRITE_TAC[]);
5409 (REWRITE_TAC[GSYM (ASSUME `[v; u; a; w3:real^3] =
5410 left_action_list q [w0; w1; w2; w3]`)]);
5411 (REWRITE_WITH `initial_sublist [v; u] [v; u; a; w3] /\
5412 LENGTH [v; u:real^3] = 1 + 1`);
5413 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5414 TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5418 (UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (v':real^3)` THEN
5419 UNDISCH_TAC `set_of_list (truncate_simplex (i - 1) ul'') (u':real^3)`);
5420 (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`; TRUNCATE_SIMPLEX_EXPLICIT_3;
5421 set_of_list; MESON[IN] `(A:real^3->bool) b <=> b IN A`]);
5424 (NEW_GOAL `u IN {w0, w1, w2, w3} /\ v IN {w0, w1, w2, w3:real^3} /\
5427 (UP_ASM_TAC THEN STRIP_TAC);
5429 (NEW_GOAL `?a b. {u,v,a,b} = {w0, w1, w2, w3:real^3}`);
5431 (NEW_GOAL `?w:real^3. w IN {w0, w1, w2, w3} DIFF {u, v}`);
5432 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5433 (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v:real^3} = {} <=>
5434 CARD ({w0, w1, w2, w3} DIFF {u, v}) = 0`);
5435 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5436 (MATCH_MP_TAC CARD_EQ_0);
5437 (MATCH_MP_TAC FINITE_SUBSET);
5438 (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5439 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5441 (NEW_GOAL `CARD {w0, w1, w2, w3} =
5442 CARD ({w0, w1, w2, w3} DIFF {u, v:real^3}) + CARD {u, v}`);
5443 (MATCH_MP_TAC Hypermap.CARD_MINUS_DIFF_TWO_SET);
5444 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5446 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5447 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5448 (ASM_REWRITE_TAC[set_of_list]);
5449 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5450 CARD (set_of_list ul'') = 3 + 1`);
5451 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5452 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5453 (NEW_GOAL `CARD {u, v:real^3} <= 2`);
5454 (REWRITE_TAC[Geomdetail.CARD2]);
5455 (UP_ASM_TAC THEN ARITH_TAC);
5456 (UP_ASM_TAC THEN STRIP_TAC);
5458 (NEW_GOAL `?m:real^3. m IN {w0, w1, w2, w3} DIFF {u, v, w}`);
5459 (REWRITE_TAC[SET_RULE `(?x. x IN s) <=> ~(s = {})`]);
5460 (REWRITE_WITH `{w0, w1, w2, w3} DIFF {u, v, w:real^3} = {} <=>
5461 CARD ({w0, w1, w2, w3} DIFF {u, v, w}) = 0`);
5462 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5463 (MATCH_MP_TAC CARD_EQ_0);
5464 (MATCH_MP_TAC FINITE_SUBSET);
5465 (EXISTS_TAC `{w0, w1, w2, w3:real^3}`);
5466 (REWRITE_TAC[Geomdetail.FINITE6] THEN SET_TAC[]);
5468 (NEW_GOAL `CARD ({w0, w1, w2, w3} DIFF {u,v,w:real^3}) =
5469 CARD {w0, w1, w2, w3} - CARD {u,v,w}`);
5470 (MATCH_MP_TAC CARD_DIFF);
5471 (ASM_REWRITE_TAC[Geomdetail.FINITE6]);
5473 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
5474 (UP_ASM_TAC THEN REWRITE_WITH `CARD ({w0, w1, w2, w3:real^3}) = 3 + 1`);
5475 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5476 (ASM_REWRITE_TAC[set_of_list]);
5477 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5478 CARD (set_of_list ul'') = 3 + 1`);
5479 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5480 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5481 (NEW_GOAL `CARD {u, v, w:real^3} <= 3`);
5482 (REWRITE_TAC[Geomdetail.CARD3]);
5483 (UP_ASM_TAC THEN ARITH_TAC);
5484 (UP_ASM_TAC THEN STRIP_TAC);
5486 (EXISTS_TAC `w:real^3` THEN EXISTS_TAC `m:real^3`);
5487 (UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN UP_ASM_TAC THEN
5488 UP_ASM_TAC THEN SET_TAC[]);
5489 (UP_ASM_TAC THEN STRIP_TAC);
5490 (UP_ASM_TAC THEN REWRITE_WITH `{u,v,a,b} = {v, u, a, b:real^3}`);
5494 (NEW_GOAL `?q. q permutes 0..3 /\
5495 [v; u; a; b] = left_action_list q [w0; w1; w2; w3:real^3]`);
5496 (MATCH_MP_TAC LEFT_ACTION_LIST_3_EXISTS);
5497 (ASM_REWRITE_TAC[]);
5499 (REWRITE_WITH `{w0, w1, w2, w3:real^3} = set_of_list ul''`);
5500 (ASM_REWRITE_TAC[set_of_list]);
5501 (REWRITE_WITH `LENGTH (ul'':(real^3)list) = 3 + 1 /\
5502 CARD (set_of_list ul'') = 3 + 1`);
5503 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5504 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5506 (UP_ASM_TAC THEN STRIP_TAC);
5508 (EXISTS_TAC `q:num->num`);
5509 (ASM_REWRITE_TAC[]);
5510 (REWRITE_TAC[GSYM (ASSUME `[v; u; a; b:real^3] =
5511 left_action_list q [w0; w1; w2; w3]`)]);
5512 (REWRITE_WITH `initial_sublist [v; u] [v; u; a; b] /\
5513 LENGTH [v; u:real^3] = 1 + 1`);
5514 (REWRITE_TAC[GSYM Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST; LENGTH;
5515 TRUNCATE_SIMPLEX_EXPLICIT_1] THEN ARITH_TAC);
5516 (UP_ASM_TAC THEN STRIP_TAC);
5518 (* ========================================================================= *)
5520 (ABBREV_TAC `P = (\(k, ul). k <= 4 /\
5523 initial_sublist [v; u] ul)`);
5524 (NEW_GOAL `(P:num#(real^3)list->bool) (k, ul)`);
5525 (REWRITE_TAC[GSYM (ASSUME `(@) (P:num#(real^3)list->bool) = k,ul`)]);
5526 (MATCH_MP_TAC SELECT_AX);
5528 (EXISTS_TAC `(i:num, left_action_list q (ul'':(real^3)list))`);
5529 (EXPAND_TAC "P" THEN REWRITE_TAC[BETA_THM]);
5530 (ASM_REWRITE_TAC[IN]);
5532 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
5533 (EXISTS_TAC `ul'':(real^3)list`);
5534 (EXISTS_TAC `i:num` THEN EXISTS_TAC `q:num->num`);
5535 (ASM_REWRITE_TAC[]);
5537 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5538 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`)]);
5539 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5540 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5541 (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
5542 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5545 (ABBREV_TAC `Q = (\(k, ul). k <= 4 /\
5548 initial_sublist [u; v] ul)`);
5549 (NEW_GOAL `(Q:num#(real^3)list->bool) (k', ul')`);
5550 (REWRITE_TAC[GSYM (ASSUME `(@) (Q:num#(real^3)list->bool) = k',ul'`)]);
5551 (MATCH_MP_TAC SELECT_AX);
5553 (EXISTS_TAC `(i:num, left_action_list p (ul'':(real^3)list))`);
5554 (EXPAND_TAC "Q" THEN REWRITE_TAC[BETA_THM]);
5555 (ASM_REWRITE_TAC[IN]);
5557 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
5558 (EXISTS_TAC `ul'':(real^3)list`);
5559 (EXISTS_TAC `i:num` THEN EXISTS_TAC `p:num->num`);
5560 (ASM_REWRITE_TAC[]);
5562 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5563 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`)]);
5564 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5565 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5566 (MATCH_MP_TAC Rvfxzbu.RVFXZBU);
5567 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5569 (UP_ASM_TAC THEN EXPAND_TAC "Q" THEN REWRITE_TAC[] THEN DEL_TAC);
5570 (UP_ASM_TAC THEN EXPAND_TAC "P" THEN REWRITE_TAC[IN] THEN DEL_TAC);
5573 (NEW_GOAL `i = k:num`);
5574 (REWRITE_WITH `i = k /\ mcell i V ul'' = mcell k V ul`);
5575 (MATCH_MP_TAC Ajripqn.AJRIPQN);
5576 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5577 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`);
5578 GSYM (ASSUME `X = mcell k V ul`); SET_RULE `a INTER a = a`]);
5579 (ASM_REWRITE_TAC[]);
5581 (NEW_GOAL `i = k':num`);
5582 (REWRITE_WITH `i = k' /\ mcell i V ul'' = mcell k' V ul'`);
5583 (MATCH_MP_TAC Ajripqn.AJRIPQN);
5584 (ASM_REWRITE_TAC[GSYM Ajripqn.UP_TO_4_KY_LEMMA]);
5585 (REWRITE_TAC[GSYM (ASSUME `X = mcell i V ul''`); GSYM (ASSUME `i = k:num`);
5586 GSYM (ASSUME `X = mcell k' V ul'`); SET_RULE `a INTER a = a`]);
5587 (ASM_REWRITE_TAC[]);
5589 (NEW_GOAL `i = k /\ (!k. i - 1 <= k /\ k <= 3
5590 ==> omega_list_n V ul k = omega_list_n V ul' k)`);
5591 (MATCH_MP_TAC MCELL_ID_OMEGA_LIST_N);
5592 (ASM_REWRITE_TAC[]);
5597 (REWRITE_TAC[SET_RULE `a IN {m,n,p} <=> a = m \/ a = n \/ a = p`]);
5599 (UP_ASM_TAC THEN STRIP_TAC);
5601 (REWRITE_WITH `k' = k:num`);
5604 (ASM_CASES_TAC `i < 4`);
5605 (NEW_GOAL `mxi V ul' = mxi V ul`);
5606 (MATCH_MP_TAC MCELL_ID_MXI_2);
5607 (EXISTS_TAC `k':num` THEN EXISTS_TAC `k:num`);
5608 (ASM_REWRITE_TAC[]);
5609 (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul'`)]);
5610 (REWRITE_TAC[ASSUME `X = mcell k V ul`; ASSUME `~NULLSET X`]);
5611 (REWRITE_TAC[SET_RULE `a IN {b,c} <=> a = b \/ a = c`]);
5614 (NEW_GOAL `HD ul = HD [v; u:real^3]`);
5615 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5616 (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5617 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5619 (NEW_GOAL `HD ul' = HD [u; v:real^3]`);
5620 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5621 (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5622 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5624 (NEW_GOAL `EL 1 ul = EL 1 ([v; u:real^3])`);
5625 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5626 (REWRITE_WITH `[v; u:real^3] = truncate_simplex 1 ul`);
5627 (REWRITE_WITH `truncate_simplex 1 ul = [v;u:real^3] /\ 1 + 1 <= LENGTH ul`);
5628 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5629 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5630 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5631 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5632 CARD (set_of_list ul) = 3 + 1`);
5633 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5634 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5637 (NEW_GOAL `EL 1 ul' = EL 1 ([u; v:real^3])`);
5638 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5639 (REWRITE_WITH `[u; v:real^3] = truncate_simplex 1 ul'`);
5640 (REWRITE_WITH `truncate_simplex 1 ul' =[u;v:real^3] /\ 1 + 1 <= LENGTH ul'`);
5641 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5642 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5643 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5644 (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1 /\
5645 CARD (set_of_list ul') = 3 + 1`);
5646 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5647 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5652 (REWRITE_TAC[dihu2]);
5653 (REWRITE_WITH `omega_list_n V ul 3 = omega_list_n V ul' 3`);
5654 (FIRST_ASSUM MATCH_MP_TAC);
5656 (ASM_REWRITE_TAC[EL; HD; TL; ARITH_RULE `1 = SUC 0`; DIHV_SYM]);
5657 (UP_ASM_TAC THEN MESON_TAC[]);
5660 (UP_ASM_TAC THEN MESON_TAC[]);
5662 (DEL_TAC THEN DEL_TAC);
5663 (REWRITE_TAC[dihu3]);
5664 (ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `1 = SUC 0`]);
5666 (REWRITE_WITH `EL 2 ul' = EL 2 (ul:(real^3)list)`);
5667 (NEW_GOAL `set_of_list (truncate_simplex 2 (ul:(real^3)list)) =
5668 set_of_list (truncate_simplex 2 ul')`);
5669 (REWRITE_TAC[ARITH_RULE `2 = 3 - 1`]);
5670 (REWRITE_WITH `set_of_list (truncate_simplex (3 - 1) ul) =
5671 (V:real^3->bool) INTER X`);
5672 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5673 (REWRITE_TAC[ASSUME `X = mcell k V ul`; ASSUME `k = 3`]);
5674 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5675 (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5676 (REWRITE_TAC[GSYM (ASSUME `X = mcell k V ul`); GSYM (ASSUME `k = 3`)]);
5677 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5678 (REWRITE_TAC[ASSUME `X = mcell k' V ul'`]);
5679 (REWRITE_WITH `k' = 3`);
5681 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5682 (ASM_REWRITE_TAC[ARITH_RULE `1 <= 3 /\ 3 <= 4`]);
5683 (REWRITE_WITH `3 = k'`);
5685 (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul'`)]);
5686 (UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5688 (NEW_GOAL `?y0 y1 y2 y3. ul = [y0;y1;y2;y3:real^3]`);
5689 (MATCH_MP_TAC BARV_3_EXPLICIT);
5690 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5691 (UP_ASM_TAC THEN STRIP_TAC);
5692 (NEW_GOAL `?z0 z1 z2 z3. ul' = [z0;z1;z2;z3:real^3]`);
5693 (MATCH_MP_TAC BARV_3_EXPLICIT);
5694 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5695 (UP_ASM_TAC THEN STRIP_TAC);
5696 (UNDISCH_TAC `EL 1 ul = EL 1 [v; u:real^3]` THEN
5697 UNDISCH_TAC `HD ul = HD [v; u:real^3]`
5698 THEN ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
5701 (UNDISCH_TAC `EL 1 ul' = EL 1 [u; v:real^3]` THEN
5702 UNDISCH_TAC `HD ul' = HD [u; v:real^3]`
5703 THEN ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `2 = SUC 1 /\ 1 = SUC 0`]);
5705 (UNDISCH_TAC `set_of_list (truncate_simplex 2 (ul:(real^3)list)) =
5706 set_of_list (truncate_simplex 2 ul')`);
5707 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_2; set_of_list]);
5708 (NEW_GOAL `~(y2 IN {u, v:real^3})`);
5710 (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) <= 3`);
5711 (ASM_REWRITE_TAC[set_of_list]);
5712 (REWRITE_WITH ` {v, u, y2, y3} = {v,u, y3:real^3}`);
5714 (REWRITE_TAC[Geomdetail.CARD3]);
5715 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5716 (MATCH_MP_TAC BARV_CARD_LEMMA);
5717 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5719 (UP_ASM_TAC THEN SET_TAC[]);
5721 (REWRITE_TAC[DIHV_SYM]);
5722 (UP_ASM_TAC THEN MESON_TAC[]);
5733 (UP_ASM_TAC THEN MESON_TAC[]);
5737 (UP_ASM_TAC THEN MESON_TAC[]);
5747 (REWRITE_TAC[dihu4]);
5749 (* ========================================================================= *)
5750 (MATCH_MP_TAC DIHV_SYM_3);
5753 (NEW_GOAL `HD ul = HD [v; u:real^3]`);
5754 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5755 (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5756 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5758 (NEW_GOAL `HD ul' = HD [u; v:real^3]`);
5759 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5760 (MATCH_MP_TAC Packing3.HD_INITIAL_SUBLIST);
5761 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5763 (NEW_GOAL `EL 1 ul = EL 1 ([v; u:real^3])`);
5764 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5765 (REWRITE_WITH `[v; u:real^3] = truncate_simplex 1 ul`);
5766 (REWRITE_WITH `truncate_simplex 1 ul = [v;u:real^3] /\ 1 + 1 <= LENGTH ul`);
5767 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5768 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5769 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5770 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1 /\
5771 CARD (set_of_list ul) = 3 + 1`);
5772 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5773 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5776 (NEW_GOAL `EL 1 ul' = EL 1 ([u; v:real^3])`);
5777 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5778 (REWRITE_WITH `[u; v:real^3] = truncate_simplex 1 ul'`);
5779 (REWRITE_WITH `truncate_simplex 1 ul' =[u;v:real^3] /\ 1 + 1 <= LENGTH ul'`);
5780 (REWRITE_TAC[Packing3.TRUNCATE_SIMPLEX_INITIAL_SUBLIST]);
5781 (ASM_REWRITE_TAC[LENGTH] THEN ARITH_TAC);
5782 (MATCH_MP_TAC Packing3.EL_TRUNCATE_SIMPLEX);
5783 (REWRITE_WITH `LENGTH (ul':(real^3)list) = 3 + 1 /\
5784 CARD (set_of_list ul') = 3 + 1`);
5785 (MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
5786 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5789 (NEW_GOAL `?y0 y1 y2 y3. ul = [y0;y1;y2;y3:real^3]`);
5790 (MATCH_MP_TAC BARV_3_EXPLICIT);
5791 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5792 (UP_ASM_TAC THEN STRIP_TAC);
5793 (NEW_GOAL `?z0 z1 z2 z3. ul' = [z0;z1;z2;z3:real^3]`);
5794 (MATCH_MP_TAC BARV_3_EXPLICIT);
5795 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5796 (UP_ASM_TAC THEN STRIP_TAC);
5797 (UNDISCH_TAC `EL 1 ul = EL 1 [v; u:real^3]` THEN
5798 UNDISCH_TAC `HD ul = HD [v; u:real^3]` THEN
5799 UNDISCH_TAC `EL 1 ul' = EL 1 [u; v:real^3]` THEN
5800 UNDISCH_TAC `HD ul' = HD [u; v:real^3]` THEN
5801 ASM_REWRITE_TAC[EL;HD;TL; ARITH_RULE `3 = SUC 2 /\2 = SUC 1 /\ 1 = SUC 0`]);
5805 (NEW_GOAL `~(z2 IN {u,v:real^3})`);
5807 (NEW_GOAL `CARD (set_of_list (ul':(real^3)list)) <= 3`);
5808 (ASM_REWRITE_TAC[set_of_list]);
5809 (REWRITE_WITH `{u, v, z2, z3} = {v,u, z3:real^3}`);
5811 (REWRITE_TAC[Geomdetail.CARD3]);
5812 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul':(real^3)list)) = 3 + 1`);
5813 (MATCH_MP_TAC BARV_CARD_LEMMA);
5814 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5817 (NEW_GOAL `~(z3 IN {u,v:real^3})`);
5819 (NEW_GOAL `CARD (set_of_list (ul':(real^3)list)) <= 3`);
5820 (ASM_REWRITE_TAC[set_of_list]);
5821 (REWRITE_WITH `{u, v, z2, z3} = {v,u, z2:real^3}`);
5823 (REWRITE_TAC[Geomdetail.CARD3]);
5824 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul':(real^3)list)) = 3 + 1`);
5825 (MATCH_MP_TAC BARV_CARD_LEMMA);
5826 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5830 (NEW_GOAL `~(y2 IN {u,v:real^3})`);
5832 (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) <= 3`);
5833 (ASM_REWRITE_TAC[set_of_list]);
5834 (REWRITE_WITH `{v, u, y2, y3} = {v,u, y3:real^3}`);
5836 (REWRITE_TAC[Geomdetail.CARD3]);
5837 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5838 (MATCH_MP_TAC BARV_CARD_LEMMA);
5839 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5842 (NEW_GOAL `~(y3 IN {u,v:real^3})`);
5844 (NEW_GOAL `CARD (set_of_list (ul:(real^3)list)) <= 3`);
5845 (ASM_REWRITE_TAC[set_of_list]);
5846 (REWRITE_WITH `{v, u, y2, y3} = {v,u, y2:real^3}`);
5848 (REWRITE_TAC[Geomdetail.CARD3]);
5849 (UP_ASM_TAC THEN REWRITE_WITH`CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
5850 (MATCH_MP_TAC BARV_CARD_LEMMA);
5851 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
5854 (NEW_GOAL `set_of_list (truncate_simplex 3 (ul:(real^3)list)) =
5855 set_of_list (truncate_simplex 3 ul')`);
5856 (REWRITE_WITH `set_of_list (truncate_simplex 3 (ul:(real^3)list)) =
5858 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
5859 (REWRITE_TAC[ASSUME `X = mcell k V ul`; ASSUME `k = 4`; ARITH_RULE `3 = 4 - 1`]);
5860 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5861 (REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
5862 (REWRITE_TAC[GSYM (ASSUME `X = mcell k V ul`); GSYM (ASSUME `k = 4`)]);
5864 (ASM_REWRITE_TAC[]);
5865 (ASM_REWRITE_TAC[]);
5866 (ASM_REWRITE_TAC[]);
5867 (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5868 (REWRITE_TAC[ASSUME `X = mcell k' V ul'`]);
5869 (REWRITE_WITH `k' = 4`);
5871 (REWRITE_TAC[ARITH_RULE `3 = 4 - 1`]);
5872 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
5873 (REWRITE_TAC[ARITH_RULE `1 <= 4 /\ 4 <= 4`]);
5874 (REWRITE_WITH `4 = k'`);
5876 (REWRITE_TAC[GSYM (ASSUME `X = mcell k' V ul'`)]);
5878 (ASM_REWRITE_TAC[]);
5879 (ASM_REWRITE_TAC[]);
5880 (ASM_REWRITE_TAC[]);
5881 (UP_ASM_TAC THEN UNDISCH_TAC `~NULLSET X` THEN MESON_TAC[NEGLIGIBLE_EMPTY]);
5883 (ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_3; set_of_list]);
5886 (UP_ASM_TAC THEN MESON_TAC[]);
5888 (UP_ASM_TAC THEN MESON_TAC[]);
5890 (UP_ASM_TAC THEN MESON_TAC[]);
5892 (UP_ASM_TAC THEN MESON_TAC[]);
5895 (* ==================================================================== *)
5898 let gammaY = new_definition
5901 (\({u, v}). if {u, v} IN edgeX V X
5902 then dihX V X (u,v) * f (hl [u; v])
5905 let gamma_y_lmfun_bound = prove_by_refinement (
5906 `!V. packing V /\ saturated V
5907 ==> (?d. !X e. mcell_set V X /\ edgeX V X e ==> gammaY V X lmfun e <= d)`,
5908 [(REPEAT STRIP_TAC);
5909 (EXISTS_TAC `pi * h0 / (h0 - &1)`);
5911 (ABBREV_TAC `f = (\u v. if {u, v} IN edgeX V X
5912 then dihX V X (u,v) * lmfun (hl [u; v])
5914 (REWRITE_WITH `gammaY V X lmfun = (\({u, v}). f u v)`);
5915 (EXPAND_TAC "f" THEN REWRITE_TAC[gammaY]);
5917 (NEW_GOAL `!u v. (f:real^3->real^3->real) u v = f v u`);
5918 (EXPAND_TAC "f" THEN REWRITE_TAC[BETA_THM]);
5919 (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
5920 (REPEAT GEN_TAC THEN COND_CASES_TAC);
5922 (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
5923 (MATCH_MP_TAC DIHX_SYM);
5924 (ASM_REWRITE_TAC[]);
5925 (UP_ASM_TAC THEN MESON_TAC[]);
5927 (UP_ASM_TAC THEN MESON_TAC[]);
5930 (UNDISCH_TAC `edgeX V X e` THEN REWRITE_TAC[IN;IN_ELIM_THM; edgeX]);
5932 (ASM_REWRITE_TAC[]);
5934 (REWRITE_WITH `(\({u, v}). f u v) {u, v} =
5935 (f:real^3->real^3->real) u v`);
5936 (MATCH_MP_TAC BETA_PAIR_THM);
5937 (ASM_REWRITE_TAC[]);
5942 (NEW_GOAL `dihX V X (u,v) * lmfun (hl [u;v]) <= pi * lmfun (hl [u;v])`);
5943 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
5944 (MATCH_MP_TAC REAL_LE_MUL);
5945 (REWRITE_TAC[lmfun_pos_le; REAL_ARITH `&0 <= a - b <=> b <= a`; DIHX_LE_PI]);
5947 (NEW_GOAL `pi * lmfun (hl [u:real^3;v]) <= pi * h0 / (h0 - &1)`);
5948 (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= (y - x) * a`]);
5949 (MATCH_MP_TAC REAL_LE_MUL);
5950 (REWRITE_TAC[PI_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
5951 (MATCH_MP_TAC lmfun_bounded);
5952 (REWRITE_TAC[HL_2; REAL_ARITH `&0 <= inv (&2) * x <=> &0 <= x`; DIST_POS_LE]);
5953 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
5954 (MATCH_MP_TAC REAL_LE_MUL);
5955 (REWRITE_TAC[PI_POS_LE]);
5956 (MATCH_MP_TAC REAL_LE_DIV);
5957 (REWRITE_TAC[h0] THEN REAL_ARITH_TAC)]);;
5959 (* ==================================================================== *)
5962 let BETA_SET_2_THM = prove
5963 (`!g:(A->bool)->B u0 v0. (\({u, v}). g {u, v}) {u0, v0} = g {u0, v0}`,
5964 GEN_TAC THEN REWRITE_TAC[GABS_DEF;GEQ_DEF] THEN
5965 CONV_TAC SELECT_CONV THEN EXISTS_TAC `g:(A->bool)->B` THEN
5968 (* ==================================================================== *)
5970 (* Formal proof by John Harrison *)
5972 let SUM_PAIR_2_SET = prove
5973 (`!f s:real^N->bool d.
5975 ==> sum {(m,n) | m IN s /\ n IN s /\ ~(m = n) /\ dist(m,n) <= d}
5976 (\(m,n). f {m, n}) = &2 *
5977 sum {{m, n} | m IN s /\ n IN s /\ ~(m = n) /\ dist(m,n) <= d} f`,
5978 REPEAT STRIP_TAC THEN MP_TAC(ISPECL
5979 [`\(m:real^N,n). {m,n}`;`(\(m,n). f {m,n}):real^N#real^N->real`;
5980 `{(m,n) | m IN s /\ n IN s /\ ~(m:real^N = n) /\ dist(m,n) <= d}`;
5981 `{{m,n} | m IN s /\ n IN s /\ ~(m:real^N = n) /\ dist(m,n) <= d}`]
5985 [ONCE_REWRITE_TAC[SET_RULE
5986 `m IN s /\ n IN s /\ P m n <=>
5987 m IN s /\ n IN {n | n IN s /\ P m n}`] THEN
5988 MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN
5989 ASM_SIMP_TAC[FINITE_RESTRICT];
5990 REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; FORALL_IN_GSPEC] THEN SET_TAC[]];
5991 DISCH_THEN(SUBST1_TAC o SYM) THEN REWRITE_TAC[GSYM SUM_LMUL] THEN
5992 MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[FORALL_IN_GSPEC] THEN
5993 MAP_EVERY X_GEN_TAC [`m:real^N`; `n:real^N`] THEN STRIP_TAC THEN
5994 MATCH_MP_TAC EQ_TRANS THEN
5995 EXISTS_TAC `sum {(m:real^N,n), (n,m)} (\(m,n). f {m,n})` THEN
5997 [AP_THM_TAC THEN AP_TERM_TAC THEN GEN_REWRITE_TAC I [EXTENSION] THEN
5998 REWRITE_TAC[FORALL_PAIR_THM] THEN
5999 REWRITE_TAC[IN_ELIM_THM; PAIR_EQ; IN_INSERT; NOT_IN_EMPTY;
6000 SET_RULE `{a,b} = {c,d} <=> a = c /\ b = d \/ a = d /\ b = c`] THEN
6001 ASM_MESON_TAC[DIST_SYM];
6002 SIMP_TAC[SUM_CLAUSES; FINITE_INSERT; FINITE_EMPTY] THEN
6003 ASM_REWRITE_TAC[IN_SING; NOT_IN_EMPTY; PAIR_EQ; REAL_ADD_RID] THEN
6004 REWRITE_TAC[INSERT_AC] THEN REAL_ARITH_TAC]]);;
6006 (* ==================================================================== *)
6009 open Flyspeck_constants;;
6011 let H0_LT_SQRT2 = prove_by_refinement (`h0 < sqrt (&2)`,
6012 [REWRITE_TAC[h0; GSYM sqrt2];
6013 NEW_GOAL `#1.414213 < sqrt2`;
6014 REWRITE_TAC[bounds];
6015 ASM_REAL_ARITH_TAC]);;
6017 (* ==================================================================== *)
6020 let gamma_y_pos_le = prove_by_refinement (
6021 `!V X e. packing V /\ saturated V /\ mcell_set V X /\ edgeX V X e
6022 ==> &0 <= gammaY V X lmfun e`,
6023 [(REPEAT STRIP_TAC);
6024 (REWRITE_TAC[gammaY]);
6025 (NEW_GOAL `?u v. (VX V X u /\ VX V X v /\ ~(u = v)) /\ e = {u, v}`);
6026 (UP_ASM_TAC THEN REWRITE_TAC[edgeX; IN_ELIM_THM]);
6027 (UP_ASM_TAC THEN STRIP_TAC);
6028 (ASM_REWRITE_TAC[]);
6029 (ABBREV_TAC `f = (\u v. if {u, v} IN edgeX V X
6030 then dihX V X (u,v) * lmfun (hl [u; v])
6032 (REWRITE_WITH `(\({u, v}). if {u, v} IN edgeX V X
6033 then dihX V X (u,v) * lmfun (hl [u; v])
6034 else &0) = (\({u, v}). f u v)`);
6035 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
6036 (REWRITE_WITH `(\({u:real^3, v}). f u v) {u, v} = (f:real^3->real^3->real) u v`);
6037 (MATCH_MP_TAC BETA_PAIR_THM);
6038 (EXPAND_TAC "f" THEN REPEAT STRIP_TAC);
6039 (REPEAT COND_CASES_TAC);
6040 (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
6041 (REWRITE_WITH `dihX V X (u',v') = dihX V X (v',u')`);
6042 (MATCH_MP_TAC DIHX_SYM);
6043 (ASM_REWRITE_TAC[]);
6045 (UP_ASM_TAC THEN REWRITE_TAC[]);
6046 (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`] THEN ASM_REWRITE_TAC[]);
6049 (UP_ASM_TAC THEN REWRITE_TAC[]);
6050 (ONCE_REWRITE_TAC[SET_RULE `{a,b} = {b,a}`] THEN ASM_REWRITE_TAC[]);
6055 (MATCH_MP_TAC REAL_LE_MUL);
6056 (REWRITE_TAC[DIHX_POS;lmfun_pos_le]);
6057 (REAL_ARITH_TAC)]);;
6059 (* ==================================================================== *)
6062 let CARD_LIST_klemma = prove_by_refinement (
6063 `!s t. FINITE (s:A->bool) /\ FINITE t ==>
6064 CARD {CONS u0 y1 | u0 IN s /\ y1 IN t} = CARD s * CARD t`,
6065 [(REPEAT STRIP_TAC);
6066 (ABBREV_TAC `S = {u0:A, y1:(A)list| u0 IN s /\ y1 IN t}`);
6067 (ABBREV_TAC `f = (\(u0:A, y1:(A)list). CONS u0 y1)`);
6068 (REWRITE_WITH `{CONS u0 y1 | u0 IN s /\ y1 IN t} =
6069 (IMAGE (f:A#(A)list->(A)list) S)`);
6070 (EXPAND_TAC "f" THEN EXPAND_TAC "S" THEN REWRITE_TAC[IMAGE]);
6071 (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
6073 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6074 (EXISTS_TAC `(u0:A,y1:(A)list)`);
6075 (ASM_REWRITE_TAC[]);
6076 (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:(A)list` THEN ASM_REWRITE_TAC[]);
6077 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6078 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x' = u0:A,y1:(A)list`] THEN STRIP_TAC);
6079 (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:(A)list` THEN ASM_REWRITE_TAC[]);
6080 (REWRITE_WITH `CARD (IMAGE (f:A#(A)list->(A)list) S) = CARD S`);
6081 (MATCH_MP_TAC CARD_IMAGE_INJ);
6083 (EXPAND_TAC "S" THEN EXPAND_TAC "f" THEN
6084 REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6085 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x = u0:A,y1:(A)list`;
6086 ASSUME `y = u0':A,y1':(A)list`; CONS_11]);
6087 (STRIP_TAC THEN ASM_REWRITE_TAC[]);
6088 (EXPAND_TAC "S" THEN MATCH_MP_TAC FINITE_PRODUCT THEN ASM_REWRITE_TAC[]);
6089 (EXPAND_TAC "S" THEN MATCH_MP_TAC CARD_PRODUCT THEN ASM_REWRITE_TAC[])]);;
6091 (* ==================================================================== *)
6094 let CARD_LIST_klemma_2 = prove_by_refinement (
6095 `!s t. FINITE (s:A->bool) /\ FINITE t ==>
6096 CARD {[u0;y1] | u0 IN s /\ y1 IN t} = CARD s * CARD t`,
6097 [(REPEAT STRIP_TAC);
6098 (ABBREV_TAC `S = {u0:A, y1:A| u0 IN s /\ y1 IN t}`);
6099 (ABBREV_TAC `f = (\(u0:A, y1:A). [u0; y1])`);
6100 (REWRITE_WITH `{[u0; y1] | u0 IN s /\ y1 IN t} =
6101 (IMAGE (f:A#A->(A)list) S)`);
6102 (EXPAND_TAC "f" THEN EXPAND_TAC "S" THEN REWRITE_TAC[IMAGE]);
6103 (REWRITE_TAC[SET_RULE `A = B <=> A SUBSET B /\ B SUBSET A`]);
6105 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6106 (EXISTS_TAC `(u0:A,y1:A)`);
6107 (ASM_REWRITE_TAC[]);
6108 (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:A` THEN ASM_REWRITE_TAC[]);
6109 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6110 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x' = u0:A,y1:A`] THEN STRIP_TAC);
6111 (EXISTS_TAC `u0:A` THEN EXISTS_TAC `y1:A` THEN ASM_REWRITE_TAC[]);
6112 (REWRITE_WITH `CARD (IMAGE (f:A#A->(A)list) S) = CARD S`);
6113 (MATCH_MP_TAC CARD_IMAGE_INJ);
6115 (EXPAND_TAC "S" THEN EXPAND_TAC "f" THEN
6116 REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6117 (UP_ASM_TAC THEN REWRITE_TAC[ASSUME `x = u0:A,y1:A`;
6118 ASSUME `y = u0':A,y1':A`]);
6119 (REWRITE_TAC[PAIR_EQ]);
6121 (REWRITE_WITH `u0 = HD [u0':A; y1']`);
6122 (UP_ASM_TAC THEN MESON_TAC[HD]);
6124 (REWRITE_WITH `y1 = HD (TL [u0':A; y1'])`);
6125 (UP_ASM_TAC THEN MESON_TAC[HD; TL]);
6126 (REWRITE_TAC[HD; TL]);
6127 (EXPAND_TAC "S" THEN MATCH_MP_TAC FINITE_PRODUCT THEN ASM_REWRITE_TAC[]);
6128 (EXPAND_TAC "S" THEN MATCH_MP_TAC CARD_PRODUCT THEN ASM_REWRITE_TAC[])]);;
6130 (* ==================================================================== *)
6133 let FINITE_LIST_klemma = prove (
6134 `!s t. FINITE (s:A->bool) /\ FINITE t ==>
6135 FINITE {CONS u0 y1 | u0 IN s /\ y1 IN t}`,
6136 REPEAT STRIP_TAC THEN
6137 MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);;
6139 (* ==================================================================== *)
6142 let CARD_LIST_4_klemma = prove_by_refinement (
6151 y = [u0; u1; u2; u3]} = CARD s * CARD s * CARD s * CARD s`,
6153 [(REPEAT STRIP_TAC);
6154 (REWRITE_TAC[SET_RULE
6155 `{y | ?u0 u1 u2 u3. u0 IN s /\ u1 IN s /\ u2 IN s /\ u3 IN s /\
6156 y = [u0; u1; u2; u3]} =
6157 {CONS u0 y1 | u0 IN s /\
6158 y1 IN {CONS u1 y2 | u1 IN s /\
6159 y2 IN {[u2;u3] | u2 IN s /\
6161 (NEW_GOAL `FINITE {[u2:A; u3] | u2 IN s /\ u3 IN s}`);
6162 (MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);
6164 {CONS u1 y2 | (u1:A) IN s /\ y2 IN {[u2; u3] | u2 IN s /\ u3 IN s}}`);
6165 (MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);
6167 {CONS u0 y1 | u0 IN s /\
6168 y1 IN {CONS u1 y2 | u1 IN s /\
6169 y2 IN {[u2:A; u3] | u2 IN s /\ u3 IN s}}}`);
6170 (MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]);
6172 {CONS u0 y1 | u0 IN s /\
6174 {CONS u1 y2 | u1 IN s /\ y2 IN {[u2:A; u3] | u2 IN s /\ u3 IN s}}}
6176 CARD {CONS u1 y2 | u1 IN s /\ y2 IN {[u2; u3] | u2 IN s /\ u3 IN s}}`);
6177 (ASM_SIMP_TAC[CARD_LIST_klemma]);
6179 `CARD {CONS u1 y2 | u1 IN s /\ y2 IN {[u2:A; u3] | u2 IN s /\ u3 IN s}}
6180 = CARD s * CARD {[u2; u3] | u2 IN s /\ u3 IN s}`);
6181 (ASM_SIMP_TAC[CARD_LIST_klemma]);
6183 (REWRITE_WITH `CARD {[u2:A; u3] | u2 IN s /\ u3 IN s} = CARD s * CARD s`);
6184 (ASM_SIMP_TAC[CARD_LIST_klemma_2])]);;
6186 (* ==================================================================== *)
6188 let BOUNDS_VGEN_klemma = prove_by_refinement(
6189 `!u0 V r. &0 <= r /\ packing V ==>
6190 &(CARD (V INTER ball (u0,r))) <= (r + &1) pow 3`,
6191 [(REPEAT STRIP_TAC);
6192 (NEW_GOAL `sum (V INTER ball (u0,r)) (\x. vol (ball (x:real^3, &1)))
6193 = & (CARD (V INTER ball (u0,r))) * (&4 / &3 * pi)`);
6194 (NEW_GOAL `&0 <= &1`);
6196 (REWRITE_WITH `(\x. vol (ball (x,&1))) = (\x. &4 / &3 * pi)`);
6197 (REWRITE_TAC[FUN_EQ_THM]);
6198 (ASM_SIMP_TAC[VOLUME_BALL] THEN REAL_ARITH_TAC);
6199 (MATCH_MP_TAC SUM_CONST);
6200 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6202 (ABBREV_TAC `f = (\x:real^3. ball (x, &1))`);
6203 (REWRITE_WITH `(\x. vol (ball (x:real^3,&1))) = (\x. vol (f x))`);
6204 (REWRITE_TAC[FUN_EQ_THM] THEN STRIP_TAC);
6205 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
6206 (REWRITE_WITH `sum (V INTER ball (u0:real^3,r)) (\x. vol (f x)) =
6207 vol (UNIONS (IMAGE f (V INTER ball (u0,r))))`);
6208 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6209 (MATCH_MP_TAC MEASURE_DISJOINT_UNIONS_IMAGE);
6210 (EXPAND_TAC "f" THEN REWRITE_TAC[] THEN REPEAT STRIP_TAC);
6211 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6212 (REWRITE_TAC[MEASURABLE_BALL]);
6213 (REWRITE_TAC[DISJOINT; SET_RULE `a = {} <=> ~(?s. s IN a)`]);
6214 (REWRITE_TAC[IN_INTER; IN_BALL]);
6216 (UNDISCH_TAC `packing V` THEN REWRITE_TAC[packing]);
6218 (NEW_GOAL `&2 <= dist (x,y:real^3)`);
6219 (FIRST_ASSUM MATCH_MP_TAC);
6221 (NEW_GOAL `dist (x,y) <= dist (x,s) + dist (y,s:real^3)`);
6223 (ASM_REAL_ARITH_TAC);
6225 (NEW_GOAL `vol (UNIONS (IMAGE f (V INTER ball (u0:real^3,r))))
6226 <= vol (ball (u0, r + &1))`);
6227 (MATCH_MP_TAC MEASURE_SUBSET);
6228 (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE; MEASURABLE_BALL]);
6230 (MATCH_MP_TAC MEASURABLE_UNIONS);
6232 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
6233 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6234 (REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6235 (ASM_REWRITE_TAC[MEASURABLE_BALL]);
6236 (REWRITE_TAC[UNIONS_SUBSET; IN_INTER; IN_BALL; IN_ELIM_THM; SUBSET]);
6238 (NEW_GOAL `dist (u0, x') <= dist (u0,x:real^3) + dist (x, x')`);
6240 (NEW_GOAL `dist (x,x':real^3) < &1`);
6241 (REWRITE_TAC[GSYM IN_BALL] THEN ASM_MESON_TAC[]);
6242 (ASM_REAL_ARITH_TAC);
6243 (NEW_GOAL `&(CARD (V INTER ball (u0,r))) * &4 / &3 * pi <=
6244 vol (ball (u0,r + &1))`);
6245 (ASM_REAL_ARITH_TAC);
6247 (UP_ASM_TAC THEN REWRITE_WITH
6248 `vol (ball (u0, r + &1)) = &4 / &3 * pi * (r + &1) pow 3`);
6249 (NEW_GOAL `&0 <= r + &1`);
6250 (ASM_REAL_ARITH_TAC);
6251 (SIMP_TAC[VOLUME_BALL; ASSUME `&0 <= r + &1`]);
6253 (REWRITE_TAC[REAL_ARITH `a * &4 / &3 * pi <= &4 / &3 * pi * b <=>
6254 &0 <= pi * (b - a)`]);
6256 (NEW_GOAL `&0 <= (r + &1) pow 3 - &(CARD (V INTER ball (u0:real^3,r)))`);
6257 (MATCH_MP_TAC Real_ext.REAL_PROP_NN_LCANCEL);
6259 (ASM_REWRITE_TAC[PI_POS]);
6260 (ASM_REAL_ARITH_TAC)]);;
6262 (* ==================================================================== *)
6265 let BOUNDS_V4_klemma = prove_by_refinement (
6266 `!u0 V. packing V ==> CARD (V INTER ball (u0, &4)) <= 125`,
6267 [(REPEAT STRIP_TAC);
6268 (NEW_GOAL `sum (V INTER ball (u0,&4)) (\x. vol (ball (x:real^3, &1)))
6269 = & (CARD (V INTER ball (u0,&4))) * (&4 / &3 * pi)`);
6270 (NEW_GOAL `&0 <= &1`);
6272 (REWRITE_WITH `(\x. vol (ball (x,&1))) = (\x. &4 / &3 * pi)`);
6273 (REWRITE_TAC[FUN_EQ_THM]);
6274 (ASM_SIMP_TAC[VOLUME_BALL] THEN REAL_ARITH_TAC);
6275 (MATCH_MP_TAC SUM_CONST);
6276 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6278 (ABBREV_TAC `f = (\x:real^3. ball (x, &1))`);
6279 (REWRITE_WITH `(\x. vol (ball (x:real^3,&1))) = (\x. vol (f x))`);
6280 (REWRITE_TAC[FUN_EQ_THM] THEN STRIP_TAC);
6281 (EXPAND_TAC "f" THEN REWRITE_TAC[]);
6282 (REWRITE_WITH `sum (V INTER ball (u0:real^3,&4)) (\x. vol (f x)) =
6283 vol (UNIONS (IMAGE f (V INTER ball (u0,&4))))`);
6284 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6285 (MATCH_MP_TAC MEASURE_DISJOINT_UNIONS_IMAGE);
6286 (EXPAND_TAC "f" THEN REWRITE_TAC[] THEN REPEAT STRIP_TAC);
6287 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6288 (REWRITE_TAC[MEASURABLE_BALL]);
6289 (REWRITE_TAC[DISJOINT; SET_RULE `a = {} <=> ~(?s. s IN a)`]);
6290 (REWRITE_TAC[IN_INTER; IN_BALL]);
6292 (UNDISCH_TAC `packing V` THEN REWRITE_TAC[packing]);
6294 (NEW_GOAL `&2 <= dist (x,y:real^3)`);
6295 (FIRST_ASSUM MATCH_MP_TAC);
6297 (NEW_GOAL `dist (x,y) <= dist (x,s) + dist (y,s:real^3)`);
6299 (ASM_REAL_ARITH_TAC);
6301 (NEW_GOAL `vol (UNIONS (IMAGE f (V INTER ball (u0:real^3,&4))))
6302 <= vol (ball (u0, &5))`);
6303 (MATCH_MP_TAC MEASURE_SUBSET);
6304 (EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE; MEASURABLE_BALL]);
6306 (MATCH_MP_TAC MEASURABLE_UNIONS);
6308 (MATCH_MP_TAC FINITE_IMAGE_EXPAND);
6309 (ASM_SIMP_TAC[FINITE_PACK_LEMMA]);
6310 (REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6311 (ASM_REWRITE_TAC[MEASURABLE_BALL]);
6312 (REWRITE_TAC[UNIONS_SUBSET; IN_INTER; IN_BALL; IN_ELIM_THM; SUBSET]);
6314 (NEW_GOAL `dist (u0, x') <= dist (u0,x:real^3) + dist (x, x')`);
6316 (NEW_GOAL `dist (x,x':real^3) < &1`);
6317 (REWRITE_TAC[GSYM IN_BALL] THEN ASM_MESON_TAC[]);
6318 (ASM_REAL_ARITH_TAC);
6319 (NEW_GOAL `&(CARD (V INTER ball (u0,&4))) * &4 / &3 * pi <=
6320 vol (ball (u0,&5))`);
6321 (ASM_REAL_ARITH_TAC);
6322 (UP_ASM_TAC THEN REWRITE_WITH
6323 `vol (ball (u0,&5)) = &4 / &3 * pi * (&5) pow 3`);
6324 (SIMP_TAC[VOLUME_BALL; REAL_ARITH `&0 <= &5`]);
6326 (REWRITE_TAC[REAL_ARITH `a * &4 / &3 * pi <= &4 / &3 * pi * b <=>
6327 &0 <= pi * (b - a)`]);
6329 (NEW_GOAL `&0 <= &5 pow 3 - &(CARD (V INTER ball (u0:real^3,&4)))`);
6330 (MATCH_MP_TAC Real_ext.REAL_PROP_NN_LCANCEL);
6332 (ASM_REWRITE_TAC[PI_POS]);
6333 (REWRITE_TAC[GSYM REAL_OF_NUM_LE]);
6334 (ASM_REAL_ARITH_TAC)]);;
6336 (* ==================================================================== *)
6339 let CARD_MCELL_CONTAINS_POINT_klemma = prove_by_refinement (
6340 `?c. (!V u0. saturated V /\ packing V /\ u0 IN V
6341 ==> CARD {X | mcell_set V X /\ VX V X u0} <= c)`,
6342 [(EXISTS_TAC `1220703125`);
6344 (ABBREV_TAC `S = {ul,i | barV V 3 ul /\ i IN 0..4 /\
6345 u0 IN set_of_list ul}`);
6346 (NEW_GOAL `FINITE (S:(real^3)list#num->bool)`);
6347 (REWRITE_WITH `S = {ul,i | ul IN {ul | barV V 3 ul /\
6348 u0 IN set_of_list ul} /\ i IN 0..4}`);
6351 (MATCH_MP_TAC FINITE_PRODUCT);
6352 (REWRITE_TAC[FINITE_NUMSEG]);
6353 (MATCH_MP_TAC FINITE_SUBSET);
6355 (ABBREV_TAC `T1 = V INTER ball (u0:real^3, &4)`);
6356 (NEW_GOAL `FINITE (T1:real^3->bool)`);
6357 (EXPAND_TAC "T1" THEN MATCH_MP_TAC FINITE_PACK_LEMMA);
6358 (ASM_REWRITE_TAC[]);
6360 (EXISTS_TAC `{ul | ?v0 v1 v2 v3.
6361 v0 IN T1 /\ v1 IN T1 /\ v2 IN T1 /\ v3 IN T1 /\
6362 ul = [v0;v1;v2;v3:real^3]}`);
6364 (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA THEN ASM_REWRITE_TAC[]);
6366 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
6368 (NEW_GOAL `?v0 v1 v2 v3. x = [v0:real^3; v1; v2; v3]`);
6369 (MATCH_MP_TAC BARV_3_EXPLICIT);
6370 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6371 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN EXISTS_TAC
6372 `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
6373 (ASM_REWRITE_TAC[]);
6374 (NEW_GOAL `set_of_list (x:(real^3)list) SUBSET T1`);
6375 (EXPAND_TAC "T1" THEN REWRITE_TAC[SUBSET_INTER]);
6377 (MATCH_MP_TAC Packing3.BARV_SUBSET);
6378 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6379 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6380 (EXISTS_TAC `V:(real^3->bool)`);
6381 (ASM_REWRITE_TAC[]);
6382 (UNDISCH_TAC `set_of_list (x:(real^3)list) u0` THEN ASM_REWRITE_TAC[IN]);
6383 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6385 (ABBREV_TAC `f = (\(ul,i). mcell i V ul)`);
6386 (NEW_GOAL `{X | mcell_set V X /\ VX V X u0} SUBSET
6387 (IMAGE (f:(real^3)list#num->real^3->bool) S) `);
6388 (EXPAND_TAC "S" THEN EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE]);
6389 (REWRITE_TAC[mcell_set_2; SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6390 (EXISTS_TAC `ul:(real^3)list,i:num`);
6392 (ASM_REWRITE_TAC[]);
6393 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6394 (ASM_REWRITE_TAC[]);
6396 (REWRITE_TAC[MESON[IN] `(0..4) i <=> i IN 0..4`]);
6397 (ASM_REWRITE_TAC[IN_NUMSEG_0]);
6398 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6399 (ASM_REWRITE_TAC[IN_NUMSEG_0]);
6400 (NEW_GOAL `(u0:real^3) IN V INTER x`);
6401 (REWRITE_WITH `V INTER x = VX V x`);
6402 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6403 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
6404 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6405 (ASM_REWRITE_TAC[]);
6407 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[VX]);
6408 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6410 (ASM_REWRITE_TAC[IN]);
6411 (UP_ASM_TAC THEN REWRITE_WITH
6412 `V INTER (x:real^3->bool) = set_of_list (truncate_simplex (i - 1) ul)`);
6413 (ASM_REWRITE_TAC[]);
6414 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
6415 (ASM_REWRITE_TAC[]);
6416 (NEW_GOAL `VX V x = V INTER x`);
6418 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
6419 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6420 (ASM_REWRITE_TAC[]);
6422 (SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[VX]);
6423 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6426 (ASM_CASES_TAC `i = 0`);
6428 (UNDISCH_TAC `VX V x u0` THEN ASM_REWRITE_TAC[]);
6429 (ASM_SIMP_TAC [Lepjbdj.LEPJBDJ_0]);
6430 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6434 (UNDISCH_TAC `VX V x u0` THEN ASM_REWRITE_TAC[]);
6435 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6437 (REWRITE_TAC[MESON[IN] `(A:real^3->bool) i <=> i IN A`]);
6438 (MATCH_MP_TAC (SET_RULE `A SUBSET B ==> (u0 IN A ==> u0 IN B)`));
6439 (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
6440 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
6441 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
6442 (EXISTS_TAC `V:real^3->bool`);
6443 (ASM_REWRITE_TAC[]);
6445 (MATCH_MP_TAC (ARITH_RULE `(?b. a:num <= b /\ b <= c) ==> a <= c`));
6446 (EXISTS_TAC `CARD (IMAGE (f:(real^3)list#num->real^3->bool) S)`);
6448 (MATCH_MP_TAC CARD_SUBSET);
6449 (ASM_REWRITE_TAC[]);
6450 (MATCH_MP_TAC FINITE_IMAGE);
6451 (ASM_REWRITE_TAC[]);
6453 (MATCH_MP_TAC (ARITH_RULE `(?b. a:num <= b /\ b <= c) ==> a <= c`));
6454 (EXISTS_TAC `CARD (S:(real^3)list#num->bool)`);
6456 (MATCH_MP_TAC CARD_IMAGE_LE);
6457 (ASM_REWRITE_TAC[]);
6460 `S = {ul,i |ul IN {ul | barV V 3 ul /\ u0 IN set_of_list ul}/\ i IN 0..4}`);
6461 (EXPAND_TAC "S" THEN SET_TAC[]);
6463 `CARD {ul,i |ul IN {ul | barV V 3 ul /\ u0 IN set_of_list ul}/\ i IN 0..4} =
6464 CARD {ul | barV V 3 ul /\ u0 IN set_of_list ul} * CARD (0..4)`);
6465 (MATCH_MP_TAC CARD_PRODUCT);
6466 (REWRITE_TAC[FINITE_NUMSEG]);
6467 (MATCH_MP_TAC FINITE_SUBSET);
6469 (ABBREV_TAC `T1 = V INTER ball (u0:real^3, &4)`);
6470 (NEW_GOAL `FINITE (T1:real^3->bool)`);
6471 (EXPAND_TAC "T1" THEN MATCH_MP_TAC FINITE_PACK_LEMMA);
6472 (ASM_REWRITE_TAC[]);
6474 (EXISTS_TAC `{ul | ?v0 v1 v2 v3.
6475 v0 IN T1 /\ v1 IN T1 /\ v2 IN T1 /\ v3 IN T1 /\
6476 ul = [v0;v1;v2;v3:real^3]}`);
6478 (MATCH_MP_TAC Ajripqn.FINITE_SET_LIST_LEMMA THEN ASM_REWRITE_TAC[]);
6480 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
6482 (NEW_GOAL `?v0 v1 v2 v3. x = [v0:real^3; v1; v2; v3]`);
6483 (MATCH_MP_TAC BARV_3_EXPLICIT);
6484 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6485 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN EXISTS_TAC
6486 `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
6487 (ASM_REWRITE_TAC[]);
6488 (NEW_GOAL `set_of_list (x:(real^3)list) SUBSET T1`);
6489 (EXPAND_TAC "T1" THEN REWRITE_TAC[SUBSET_INTER]);
6491 (MATCH_MP_TAC Packing3.BARV_SUBSET);
6492 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6493 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6494 (EXISTS_TAC `V:(real^3->bool)`);
6495 (ASM_REWRITE_TAC[]);
6496 (UNDISCH_TAC `set_of_list (x:(real^3)list) u0` THEN ASM_REWRITE_TAC[IN]);
6497 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6499 (REWRITE_TAC[CARD_NUMSEG; ARITH_RULE `(4 + 1) - 0 = 5`]);
6500 (REWRITE_TAC[ARITH_RULE `a * 5 <= 1220703125 <=> a <= 244140625`]);
6502 (ABBREV_TAC `T1 = V INTER ball (u0:real^3, &4)`);
6503 (NEW_GOAL `FINITE (T1:real^3->bool)`);
6504 (EXPAND_TAC "T1" THEN MATCH_MP_TAC FINITE_PACK_LEMMA);
6505 (ASM_REWRITE_TAC[]);
6507 (NEW_GOAL `{ul | barV V 3 ul /\ u0 IN set_of_list ul} SUBSET
6509 v0 IN T1 /\ v1 IN T1 /\ v2 IN T1 /\ v3 IN T1 /\
6510 ul = [v0;v1;v2;v3]}`);
6511 (REWRITE_TAC[SUBSET; IN; IN_ELIM_THM]);
6513 (NEW_GOAL `?v0 v1 v2 v3. x = [v0:real^3; v1; v2; v3]`);
6514 (MATCH_MP_TAC BARV_3_EXPLICIT);
6515 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6516 (UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `v0:real^3` THEN EXISTS_TAC
6517 `v1:real^3` THEN EXISTS_TAC `v2:real^3` THEN EXISTS_TAC `v3:real^3`);
6518 (ASM_REWRITE_TAC[]);
6519 (NEW_GOAL `set_of_list (x:(real^3)list) SUBSET T1`);
6520 (EXPAND_TAC "T1" THEN REWRITE_TAC[SUBSET_INTER]);
6522 (MATCH_MP_TAC Packing3.BARV_SUBSET);
6523 (EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
6524 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6525 (EXISTS_TAC `V:(real^3->bool)`);
6526 (ASM_REWRITE_TAC[]);
6527 (UNDISCH_TAC `set_of_list (x:(real^3)list) u0` THEN ASM_REWRITE_TAC[IN]);
6528 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
6530 (MATCH_MP_TAC (ARITH_RULE `(?x. a <= x /\ x <= b:num) ==> a <= b`));
6531 (EXISTS_TAC `CARD {ul | ?v0 v1 v2 v3.
6536 ul = [v0:real^3; v1; v2; v3]}`);
6538 (MATCH_MP_TAC CARD_SUBSET);
6539 (ASM_REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
6540 (ASM_REWRITE_TAC[]);
6547 y = [u0:real^3; u1; u2; u3:real^3]} =
6548 CARD T1 * CARD T1 * CARD T1 * CARD T1`);
6549 (ASM_SIMP_TAC [CARD_LIST_4_klemma]);
6550 (NEW_GOAL `CARD (T1:real^3->bool) <= 125`);
6552 (MATCH_MP_TAC BOUNDS_V4_klemma);
6553 (ASM_REWRITE_TAC[]);
6554 (NEW_GOAL `CARD (T1:real^3->bool) * CARD T1 <= 125 * 125`);
6555 (MATCH_MP_TAC LE_MULT2);
6556 (ASM_REWRITE_TAC[]);
6557 (NEW_GOAL `CARD (T1:real^3->bool) * CARD T1 * CARD T1 <= 125 * 125 * 125`);
6558 (MATCH_MP_TAC LE_MULT2);
6559 (ASM_REWRITE_TAC[]);
6560 (NEW_GOAL `CARD (T1:real^3->bool) * CARD T1 * CARD T1 * CARD T1 <=
6561 125 * 125 * 125 * 125`);
6562 (MATCH_MP_TAC LE_MULT2);
6563 (ASM_REWRITE_TAC[]);
6564 (UP_ASM_TAC THEN ARITH_TAC)]);;
6566 (* ==================================================================== *)
6569 (* deprecated by thales Jan 1, 2013. Replaced with version in bump.hl. *)
6573 let BOUND_BETA_BUMP_DEPRECATED = prove_by_refinement (
6575 saturated V /\ packing V /\ mcell_set V X /\ critical_edgeX V X e
6576 ==> beta_bump V e X <= c`,
6577 [(EXISTS_TAC `&614400`);
6578 (REWRITE_TAC[mcell_set_2; IN_ELIM_THM; IN; beta_bump]);
6579 (REPEAT STRIP_TAC THEN LET_TAC);
6580 (UP_ASM_TAC THEN REWRITE_TAC[cell_params]);
6582 (ONCE_REWRITE_TAC[EQ_SYM_EQ]);
6584 (ABBREV_TAC `P = (\(k,ul'). k <= 4 /\ ul' IN barV V 3 /\
6585 mcell i V ul = mcell k V ul')`);
6586 (NEW_GOAL `(P:(num#(real^3)list->bool)) (k,ul')`);
6587 (ASM_REWRITE_TAC[]);
6588 (MATCH_MP_TAC SELECT_AX);
6589 (EXISTS_TAC `(i:num,ul:(real^3)list)`);
6591 (REWRITE_TAC[BETA_THM]);
6592 (ASM_REWRITE_TAC[IN]);
6593 (UP_ASM_TAC THEN EXPAND_TAC "P");
6594 (REWRITE_TAC[BETA_THM; IN] THEN STRIP_TAC);
6596 (ABBREV_TAC `S = {e',e'',p,vl | 4 = k /\
6597 {e', e''} = critical_edgeX V X /\
6600 left_action_list p ul' = vl /\
6601 {EL 0 vl, EL 1 vl} = e' /\
6602 {EL 2 vl, EL 3 vl} = e''}`);
6604 (NEW_GOAL `?u0 u1 u2 u3. ul = [u0;u1;u2;u3:real^3]`);
6605 (MATCH_MP_TAC BARV_3_EXPLICIT);
6606 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6607 (UP_ASM_TAC THEN STRIP_TAC);
6608 (ABBREV_TAC `K1 = {us:real^3->bool | us SUBSET set_of_list ul}`);
6609 (NEW_GOAL `FINITE (K1:(real^3->bool)->bool)`);
6610 (EXPAND_TAC "K1" THEN MATCH_MP_TAC FINITE_POWERSET);
6611 (ASM_REWRITE_TAC[set_of_list; Geomdetail.FINITE6]);
6613 (NEW_GOAL `critical_edgeX V X SUBSET K1`);
6614 (EXPAND_TAC "K1" THEN
6615 REWRITE_TAC[critical_edgeX; edgeX; SUBSET; IN; IN_ELIM_THM]);
6618 (NEW_GOAL `(x:real^3->bool) SUBSET set_of_list ul`);
6619 (REWRITE_TAC[ASSUME `x = {u, v:real^3}`; ASSUME `{u, v} = {u', v':real^3}`]);
6620 (NEW_GOAL `VX V X = V INTER X`);
6621 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
6622 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
6623 (ASM_REWRITE_TAC[]);
6625 (NEW_GOAL `VX V X = {}`);
6626 (ASM_REWRITE_TAC[VX]);
6627 (UNDISCH_TAC `VX V X u'` THEN
6628 ASM_REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
6630 `V INTER (X:real^3->bool) = set_of_list (truncate_simplex (i - 1) ul)`);
6631 (REWRITE_TAC[ASSUME `X = mcell i V ul`]);
6632 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
6633 (ASM_REWRITE_TAC[]);
6635 (ASM_CASES_TAC `i = 0`);
6637 (NEW_GOAL `VX V X = {}`);
6638 (REWRITE_TAC[ASSUME `VX V X = V INTER X`; ASSUME `X = mcell i V ul`;
6640 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
6641 (ASM_REWRITE_TAC[]);
6642 (UNDISCH_TAC `VX V X u'` THEN REWRITE_TAC[ASSUME `VX V X = {}`;
6643 MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
6646 (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = mcell k V ul'`);
6647 GSYM (ASSUME `X = mcell i V ul`)]);
6649 (NEW_GOAL `NULLSET X`);
6650 (REWRITE_TAC[NEGLIGIBLE_EMPTY; ASSUME `X = {}:real^3->bool`]);
6651 (NEW_GOAL `VX V X = {}`);
6652 (REWRITE_TAC[VX; ASSUME `NULLSET X`]);
6653 (UNDISCH_TAC `VX V X u'` THEN REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`;
6654 ASSUME `VX V X = {}`] THEN SET_TAC[]);
6655 (NEW_GOAL `set_of_list (truncate_simplex (i - 1) ul) SUBSET
6656 set_of_list (ul:(real^3)list)`);
6657 (MATCH_MP_TAC Rogers.SET_OF_LIST_TRUNCATE_SIMPLEX_SUBSET);
6658 (ASM_REWRITE_TAC[LENGTH] THEN ASM_ARITH_TAC);
6664 (S:(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list->bool)`);
6666 (MATCH_MP_TAC FINITE_SUBSET);
6667 (EXISTS_TAC `{e',e'',p,vl | {e', e''} = critical_edgeX V X /\
6669 left_action_list p ul' = vl:(real^3)list}`);
6671 (MATCH_MP_TAC FINITE_SUBSET);
6672 (EXISTS_TAC `{e',e'',p,vl | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6674 left_action_list p ul' = vl:(real^3)list}`);
6676 (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6679 `f_temp = (\(e':real^3->bool,e'':real^3->bool,p).
6680 e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6681 (MATCH_MP_TAC FINITE_SUBSET);
6682 (EXISTS_TAC `IMAGE (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp`);
6684 (MATCH_MP_TAC FINITE_IMAGE);
6686 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6687 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6688 (EXPAND_TAC "S_temp");
6690 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6691 (MATCH_MP_TAC FINITE_PRODUCT);
6692 (ASM_REWRITE_TAC[]);
6695 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6696 (EXPAND_TAC "K2" THEN SET_TAC[]);
6697 (MATCH_MP_TAC FINITE_PRODUCT);
6698 (ASM_REWRITE_TAC[]);
6699 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6700 Marchal_cells_2_new.SET_OF_0_TO_3;
6701 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6702 (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6703 (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6704 (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6705 (ASM_REWRITE_TAC[]);
6706 (EXISTS_TAC `e':real^3->bool` THEN
6707 EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6708 (ASM_REWRITE_TAC[]);
6709 (UP_ASM_TAC THEN SET_TAC[]);
6713 (* ------------------------------------------------------------------------ *)
6714 (* Finish proving S is FINITE *)
6715 (* ------------------------------------------------------------------------ *)
6717 (MATCH_MP_TAC (REAL_ARITH `(?x. a <= x /\ x <= b) ==> a <= b`));
6719 `sum (S:(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list->bool)
6722 (MATCH_MP_TAC SUM_LE);
6723 (ASM_REWRITE_TAC[]);
6724 (EXPAND_TAC "S" THEN REWRITE_TAC[IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6725 (ASM_REWRITE_TAC[]);
6726 (REWRITE_TAC[GSYM (ASSUME `4 = k`); REAL_ARITH `a / &4 <= &100 <=> a <= &400`]);
6727 (REWRITE_TAC[bump]);
6728 (REWRITE_TAC[REAL_ARITH
6729 `#0.005 * (&1 - a) - #0.005 * (&1 - b) <= &400 <=>
6731 (MATCH_MP_TAC (REAL_ARITH `(&0 <= a /\ b <= c ==> b - a <= c)`));
6733 (MATCH_MP_TAC REAL_LE_DIV);
6734 (REWRITE_TAC[Real_ext.REAL_LE_POW_2]);
6735 (REWRITE_TAC[hplus; h0; REAL_ARITH
6736 `a / (#1.3254 - #1.26) pow 2 <= &80000 <=> a <= #342.1728`]);
6737 (NEW_GOAL `barV V 3 vl`);
6738 (MATCH_MP_TAC Qzksykg.QZKSYKG1);
6739 (EXISTS_TAC `ul':(real^3)list`);
6740 (EXISTS_TAC `4` THEN EXISTS_TAC `p:num->num`);
6741 (ASM_REWRITE_TAC[ARITH_RULE `4 - 1 = 3`]);
6744 (REWRITE_TAC[GSYM (ASSUME `mcell i V ul = mcell k V ul'`);
6745 GSYM (ASSUME `X = mcell i V ul`)]);
6747 (NEW_GOAL `critical_edgeX V X = {}`);
6748 (REWRITE_TAC[critical_edgeX ; edgeX; IN; IN_ELIM_THM;
6749 SET_RULE `X = {} <=> ~(?s. s IN X)`]);
6751 (NEW_GOAL `NULLSET X`);
6752 (ASM_MESON_TAC[NEGLIGIBLE_EMPTY]);
6753 (UNDISCH_TAC `VX V X v'` THEN REWRITE_TAC[VX; ASSUME `NULLSET X`]);
6754 (REWRITE_TAC[MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
6755 (UNDISCH_TAC `critical_edgeX V X e`);
6756 (REWRITE_TAC[ASSUME `critical_edgeX V X = {}`; MESON[IN] `{} x <=> x IN {}`]
6760 (NEW_GOAL `?v0 v1 v2 v3. vl = [v0;v1;v2;v3:real^3]`);
6761 (MATCH_MP_TAC BARV_3_EXPLICIT);
6762 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6763 (UP_ASM_TAC THEN REPEAT STRIP_TAC);
6764 (ASM_REWRITE_TAC[EL; ARITH_RULE `3 = SUC 2 /\ 2 = SUC 1 /\ 1 = SUC 0`; HD; TL]);
6765 (REWRITE_TAC[ARITH_RULE `SUC (SUC 0) = 2`]);
6766 (NEW_GOAL `(hl [v2; v3:real^3] - #1.26) pow 2 <= (&10) pow 2`);
6767 (REWRITE_TAC[GSYM REAL_LE_SQUARE_ABS; REAL_ARITH `abs (&10) = &10`]);
6768 (ASM_CASES_TAC `&0 <= hl [v2; v3:real^3] - #1.26`);
6769 (REWRITE_WITH `abs (hl [v2; v3:real^3] - #1.26) = hl [v2; v3] - #1.26`);
6770 (ASM_REAL_ARITH_TAC);
6773 REAL_ARITH `inv (&2) * a - #1.26 <= &10 <=> a <= #22.52`]);
6774 (NEW_GOAL `set_of_list vl SUBSET ball (v2:real^3,&4)`);
6775 (MATCH_MP_TAC Qzyzmjc.BARV_3_IMP_FINITE_lemma2);
6776 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[set_of_list]);
6778 (UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN STRIP_TAC);
6779 (SUBGOAL_THEN `v3:real^3 IN ball (v2, &k)` MP_TAC);
6780 (UP_ASM_TAC THEN SET_TAC[]);
6781 (REWRITE_TAC[IN_BALL; GSYM (ASSUME `4 = k`)]);
6783 (REWRITE_WITH `abs (hl [v2; v3] - #1.26) = #1.26 - hl [v2; v3:real^3]`);
6784 (ASM_REAL_ARITH_TAC);
6785 (MATCH_MP_TAC (REAL_ARITH `&0 <= a ==> #1.26 - a <= &10`));
6786 (REWRITE_TAC[HL_2] THEN NORM_ARITH_TAC);
6787 (UP_ASM_TAC THEN REAL_ARITH_TAC);
6788 (ASM_SIMP_TAC[SUM_CONST]);
6792 (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6793 (EXISTS_TAC `& (CARD {e',e'',p,vl | {e', e''} = critical_edgeX V X /\
6795 left_action_list p ul' = vl:(real^3)list}) * &100 `);
6797 (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6798 (REWRITE_TAC[REAL_OF_NUM_LE]);
6799 (MATCH_MP_TAC CARD_SUBSET);
6802 (MATCH_MP_TAC FINITE_SUBSET);
6805 (EXISTS_TAC `{e',e'',p,vl | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6807 left_action_list p ul' = vl:(real^3)list}`);
6809 (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6812 `f_temp = (\(e':real^3->bool,e'':real^3->bool,p).
6813 e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6814 (MATCH_MP_TAC FINITE_SUBSET);
6815 (EXISTS_TAC `IMAGE (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp`);
6817 (MATCH_MP_TAC FINITE_IMAGE);
6819 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6820 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6821 (EXPAND_TAC "S_temp");
6823 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6824 (MATCH_MP_TAC FINITE_PRODUCT);
6825 (ASM_REWRITE_TAC[]);
6828 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6829 (EXPAND_TAC "K2" THEN SET_TAC[]);
6830 (MATCH_MP_TAC FINITE_PRODUCT);
6831 (ASM_REWRITE_TAC[]);
6832 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6833 Marchal_cells_2_new.SET_OF_0_TO_3;
6834 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6835 (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6836 (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6837 (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6838 (ASM_REWRITE_TAC[]);
6839 (EXISTS_TAC `e':real^3->bool` THEN
6840 EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6841 (ASM_REWRITE_TAC[]);
6842 (SWITCH_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6844 (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6845 (EXISTS_TAC `& (CARD {e',e'',p,vl | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6847 left_action_list p ul' = vl:(real^3)list}) * &100 `);
6849 (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6850 (REWRITE_TAC[REAL_OF_NUM_LE]);
6851 (MATCH_MP_TAC CARD_SUBSET);
6853 (SWITCH_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
6856 (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6859 `f_temp = (\(e':real^3->bool,e'':real^3->bool,p).
6860 e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6861 (MATCH_MP_TAC FINITE_SUBSET);
6862 (EXISTS_TAC `IMAGE (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp`);
6864 (MATCH_MP_TAC FINITE_IMAGE);
6866 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6867 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6868 (EXPAND_TAC "S_temp");
6870 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6871 (MATCH_MP_TAC FINITE_PRODUCT);
6872 (ASM_REWRITE_TAC[]);
6875 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6876 (EXPAND_TAC "K2" THEN SET_TAC[]);
6877 (MATCH_MP_TAC FINITE_PRODUCT);
6878 (ASM_REWRITE_TAC[]);
6879 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6880 Marchal_cells_2_new.SET_OF_0_TO_3;
6881 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6882 (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6883 (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6884 (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6885 (ASM_REWRITE_TAC[]);
6886 (EXISTS_TAC `e':real^3->bool` THEN
6887 EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6888 (ASM_REWRITE_TAC[]);
6891 (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6892 (ABBREV_TAC `S_temp = {e',e'',p | (e':real^3->bool) IN K1 /\ e'' IN K1 /\
6895 `f_temp = (\(e':real^3->bool,e'':real^3->bool,p).
6896 e',e'',p, (left_action_list p (ul':(real^3)list)))`);
6897 (EXISTS_TAC `& (CARD (IMAGE (f_temp:(real^3->bool)#(real^3->bool)#(num->num)->(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list) S_temp)) * &100`);
6900 (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6901 (REWRITE_TAC[REAL_OF_NUM_LE]);
6902 (MATCH_MP_TAC CARD_SUBSET);
6904 (EXPAND_TAC "f_temp" THEN EXPAND_TAC "S_temp" THEN REWRITE_TAC[IMAGE]);
6905 (REWRITE_TAC[IN; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
6906 (EXISTS_TAC `e':real^3->bool,e'':real^3->bool,p:num->num`);
6907 (ASM_REWRITE_TAC[]);
6908 (EXISTS_TAC `e':real^3->bool` THEN
6909 EXISTS_TAC `e'':real^3->bool` THEN EXISTS_TAC `p:num->num`);
6910 (ASM_REWRITE_TAC[]);
6912 (MATCH_MP_TAC FINITE_IMAGE);
6913 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6914 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6915 (EXPAND_TAC "S_temp");
6917 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6918 (MATCH_MP_TAC FINITE_PRODUCT);
6919 (ASM_REWRITE_TAC[]);
6922 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6923 (EXPAND_TAC "K2" THEN SET_TAC[]);
6924 (MATCH_MP_TAC FINITE_PRODUCT);
6925 (ASM_REWRITE_TAC[]);
6926 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6927 Marchal_cells_2_new.SET_OF_0_TO_3;
6928 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6930 (MATCH_MP_TAC (REAL_ARITH `(?s. x <= s /\ s <= b) ==> x <= b`));
6932 `& (CARD (S_temp:(real^3->bool)#(real^3->bool)#(num->num)->bool)) * &100`);
6934 (REWRITE_TAC[REAL_ARITH `a * &100 <= b * &100 <=> a <= b`]);
6935 (REWRITE_TAC[REAL_OF_NUM_LE]);
6936 (MATCH_MP_TAC CARD_IMAGE_LE);
6937 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6938 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6939 (EXPAND_TAC "S_temp");
6941 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6942 (MATCH_MP_TAC FINITE_PRODUCT);
6943 (ASM_REWRITE_TAC[]);
6946 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6947 (EXPAND_TAC "K2" THEN SET_TAC[]);
6948 (MATCH_MP_TAC FINITE_PRODUCT);
6949 (ASM_REWRITE_TAC[]);
6950 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6951 Marchal_cells_2_new.SET_OF_0_TO_3;
6952 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6954 (REWRITE_WITH `S_temp = {e':real^3->bool,u | e' IN K1 /\
6955 u IN {e'', p | e'' IN K1 /\p permutes 0..3}}`);
6956 (EXPAND_TAC "S_temp");
6958 (ABBREV_TAC `K2 = {e'':real^3->bool, p | e'' IN K1 /\p permutes 0..3}`);
6959 (REWRITE_WITH `CARD {e':real^3->bool,u:(real^3->bool)#(num->num) |
6960 e' IN K1 /\ u IN K2} = CARD K1 * CARD K2`);
6961 (MATCH_MP_TAC CARD_PRODUCT);
6962 (ASM_REWRITE_TAC[]);
6965 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6966 (EXPAND_TAC "K2" THEN SET_TAC[]);
6967 (MATCH_MP_TAC FINITE_PRODUCT);
6968 (ASM_REWRITE_TAC[]);
6969 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6970 Marchal_cells_2_new.SET_OF_0_TO_3;
6971 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6973 (REWRITE_WITH `CARD (K2:(real^3->bool)#(num->num)->bool) =
6974 CARD (K1:(real^3->bool)->bool) * CARD {p | p permutes 0..3}`);
6976 `K2 = {e'':real^3->bool,p | e'' IN K1 /\ p IN {p | p permutes 0..3}}`);
6977 (EXPAND_TAC "K2" THEN SET_TAC[]);
6978 (MATCH_MP_TAC CARD_PRODUCT);
6979 (ASM_REWRITE_TAC[]);
6980 (REWRITE_TAC[GSYM NUMSEG_LE; ARITH_RULE `a <= 3 <=> a < 4`;
6981 Marchal_cells_2_new.SET_OF_0_TO_3;
6982 Upfzbzm_support_lemmas.FINITE_PERMUTE_4]);
6983 (REWRITE_WITH `CARD (K1:(real^3->bool)->bool) = 16`);
6985 (REWRITE_WITH `16 = 2 EXP (CARD (set_of_list (ul:(real^3)list)))`);
6986 (REWRITE_WITH `CARD (set_of_list (ul:(real^3)list)) = 3 + 1`);
6987 (MATCH_MP_TAC BARV_CARD_LEMMA);
6988 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
6991 (MATCH_MP_TAC CARD_POWERSET);
6992 (ASM_REWRITE_TAC[set_of_list; Geomdetail.FINITE6]);
6993 (REWRITE_WITH `CARD {p | p permutes 0..3} = FACT (CARD (0..3))`);
6994 (MATCH_MP_TAC CARD_PERMUTATIONS);
6995 (REWRITE_TAC[FINITE_NUMSEG]);
6996 (REWRITE_TAC[CARD_NUMSEG; ARITH_RULE `16 * 16 * FACT ((3 + 1) - 0) = 6144`]);
6998 (REAL_ARITH_TAC)]);;
7002 (* ==================================================================== *)
7005 let MCELL_SUBSET_BALL8_2 = prove (
7006 `!V X v. packing V /\ saturated V /\ mcell_set V X /\ v IN X
7007 ==> X SUBSET ball (v,&8)`,
7008 REWRITE_TAC[mcell_set; IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN
7009 UP_ASM_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
7010 MATCH_MP_TAC MCELL_SUBSET_BALL8 THEN ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);;
7012 (* ==================================================================== *)
7014 let critical_edge_subset_mcell = prove_by_refinement (
7015 `!V X x. packing V /\ saturated V /\ mcell_set V X /\ critical_edgeX V X x
7017 [(REWRITE_TAC[mcell_set_2; critical_edgeX; edgeX; IN_ELIM_THM; IN]);
7019 (NEW_GOAL `VX V X = V INTER X`);
7020 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7021 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7022 (ASM_REWRITE_TAC[]);
7023 (STRIP_TAC THEN UNDISCH_TAC `VX V X u'` THEN
7024 ASM_REWRITE_TAC[VX; MESON[IN] `{} u <=> u IN {}`] THEN SET_TAC[]);
7027 (* ==================================================================== *)
7030 let EDGEX_SUBSET_MCELL = prove_by_refinement (
7031 `!V X e. packing V /\ saturated V /\ mcell_set V X /\ edgeX V X e
7033 [(REWRITE_TAC[edgeX; IN; IN_ELIM_THM; mcell_set] THEN REPEAT STRIP_TAC);
7034 (NEW_GOAL `VX V X = V INTER X`);
7035 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7036 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]
7037 THEN STRIP_TAC THEN UNDISCH_TAC `VX V X u` THEN
7038 ASM_REWRITE_TAC[VX; MESON[IN] `{} x <=> x IN {}`] THEN SET_TAC[]);
7041 let CRITICAL_EDGEX_SUBSET_MCELL = prove (
7042 `!V X e. packing V /\ saturated V /\ mcell_set V X /\ critical_edgeX V X e
7044 (REPEAT STRIP_TAC) THEN
7045 (MATCH_MP_TAC EDGEX_SUBSET_MCELL) THEN
7046 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]) THEN
7047 (UP_ASM_TAC THEN REWRITE_TAC[critical_edgeX] THEN SET_TAC[]));;
7049 (* ==================================================================== *)
7052 let FINITE_VX = prove_by_refinement (
7053 `!V X. packing V /\ saturated V /\ mcell_set V X ==> FINITE (VX V X)`,
7054 [(REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
7055 (ASM_CASES_TAC `VX V X = {}`);
7056 (ASM_REWRITE_TAC[FINITE_EMPTY]);
7057 (REWRITE_WITH `VX V X = V INTER X`);
7058 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7059 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]
7060 THEN STRIP_TAC THEN UNDISCH_TAC `~(VX V X = {})` THEN
7061 ASM_REWRITE_TAC[VX]);
7062 (ASM_CASES_TAC `V INTER (X:real^3->bool) = {}`);
7063 (ASM_REWRITE_TAC[FINITE_EMPTY]);
7065 `(V:real^3->bool) INTER X = set_of_list (truncate_simplex (i-1) ul)`);
7066 (ASM_REWRITE_TAC[]);
7067 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7068 (ASM_REWRITE_TAC[]);
7070 (ASM_CASES_TAC `i = 0`);
7072 (UNDISCH_TAC `~(V INTER (X:real^3->bool) = {})`);
7073 (ASM_REWRITE_TAC[]);
7074 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7075 (ASM_REWRITE_TAC[]);
7079 (UNDISCH_TAC `~(VX V X = {})` THEN ASM_REWRITE_TAC[VX; NEGLIGIBLE_EMPTY]);
7080 (REWRITE_TAC[FINITE_SET_OF_LIST])]);;
7082 (* ==================================================================== *)
7085 let CARD_EDGEX_LE_16 = prove_by_refinement (
7086 `!V X. packing V /\ saturated V /\ mcell_set V X
7087 ==> CARD (edgeX V X) <= 16`,
7088 [(REWRITE_TAC[edgeX] THEN REPEAT STRIP_TAC);
7089 (ABBREV_TAC `S = {u, v | VX V X u /\ VX V X v /\ ~(u = v)}`);
7090 (ABBREV_TAC `f = (\(u,v:real^3). {u,v})`);
7091 (MATCH_MP_TAC (ARITH_RULE `(?x:num. y <= x /\ x <= z) ==> y <= z`));
7092 (EXISTS_TAC `CARD (IMAGE (f:(real^3#real^3)->(real^3->bool)) S)`);
7094 (MATCH_MP_TAC CARD_SUBSET);
7096 (EXPAND_TAC "f" THEN EXPAND_TAC "S" THEN
7097 REWRITE_TAC[IMAGE; SUBSET; IN; IN_ELIM_THM] THEN REPEAT STRIP_TAC);
7098 (EXISTS_TAC `u:real^3,v:real^3` THEN ASM_REWRITE_TAC[]);
7099 (EXISTS_TAC `u:real^3` THEN EXISTS_TAC `v:real^3` THEN ASM_REWRITE_TAC[]);
7100 (MATCH_MP_TAC FINITE_IMAGE);
7101 (MATCH_MP_TAC FINITE_SUBSET);
7102 (EXISTS_TAC `{u,v | u IN VX V X /\ v IN VX V X}`);
7104 (MATCH_MP_TAC FINITE_PRODUCT);
7105 (REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_VX);
7106 (ASM_REWRITE_TAC[]);
7109 (MATCH_MP_TAC (ARITH_RULE `(?x:num. y <= x /\ x <= z) ==> y <= z`));
7110 (EXISTS_TAC `CARD (S:(real^3#real^3)->bool)`);
7112 (MATCH_MP_TAC CARD_IMAGE_LE);
7113 (MATCH_MP_TAC FINITE_SUBSET);
7114 (EXISTS_TAC `{u,v | u IN VX V X /\ v IN VX V X}`);
7116 (MATCH_MP_TAC FINITE_PRODUCT);
7117 (REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_VX);
7118 (ASM_REWRITE_TAC[]);
7121 (MATCH_MP_TAC (ARITH_RULE `(?x:num. y <= x /\ x <= z) ==> y <= z`));
7122 (EXISTS_TAC `CARD {u,v | u IN VX V X /\ v IN VX V X}`);
7124 (MATCH_MP_TAC CARD_SUBSET);
7127 (MATCH_MP_TAC FINITE_PRODUCT);
7128 (REWRITE_TAC[] THEN MATCH_MP_TAC FINITE_VX);
7129 (ASM_REWRITE_TAC[]);
7131 `CARD {u,v | u IN VX V X /\ v IN VX V X} = CARD (VX V X) * CARD (VX V X)`);
7132 (MATCH_MP_TAC CARD_PRODUCT THEN ASM_SIMP_TAC[FINITE_VX]);
7134 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set_2; IN; IN_ELIM_THM]);
7137 (ASM_CASES_TAC `VX V X = {}`);
7138 (ASM_REWRITE_TAC[CARD_CLAUSES] THEN ARITH_TAC);
7139 (REWRITE_WITH `VX V X = V INTER X`);
7140 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7141 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]
7142 THEN STRIP_TAC THEN UNDISCH_TAC `~(VX V X = {})` THEN
7143 ASM_REWRITE_TAC[VX]);
7144 (ASM_CASES_TAC `V INTER (X:real^3->bool) = {}`);
7145 (ASM_REWRITE_TAC[CARD_CLAUSES] THEN ARITH_TAC);
7147 `(V:real^3->bool) INTER X = set_of_list (truncate_simplex (i-1) ul)`);
7148 (ASM_REWRITE_TAC[]);
7149 (MATCH_MP_TAC Lepjbdj.LEPJBDJ);
7150 (ASM_REWRITE_TAC[]);
7152 (ASM_CASES_TAC `i = 0`);
7154 (UNDISCH_TAC `~(V INTER (X:real^3->bool) = {})`);
7155 (ASM_REWRITE_TAC[]);
7156 (MATCH_MP_TAC Lepjbdj.LEPJBDJ_0);
7157 (ASM_REWRITE_TAC[]);
7161 (UNDISCH_TAC `~(VX V X = {})` THEN ASM_REWRITE_TAC[VX; NEGLIGIBLE_EMPTY]);
7162 (NEW_GOAL `CARD (set_of_list (truncate_simplex (i - 1) ul)) <=
7163 LENGTH (truncate_simplex (i - 1) (ul:(real^3)list))`);
7164 (REWRITE_TAC[CARD_SET_OF_LIST_LE]);
7165 (UP_ASM_TAC THEN REWRITE_WITH
7166 `LENGTH (truncate_simplex (i - 1) (ul:(real^3)list)) = (i - 1 + 1)`);
7167 (MATCH_MP_TAC Packing3.LENGTH_TRUNCATE_SIMPLEX);
7168 (REWRITE_WITH `LENGTH (ul:(real^3)list) = 3 + 1`);
7169 (MATCH_MP_TAC BARV_LENGTH_LEMMA);
7170 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7174 `s = CARD (set_of_list (truncate_simplex (i - 1) (ul:(real^3)list)))`);
7175 (NEW_GOAL `s <= 4`);
7177 (NEW_GOAL `s * s <= s * 4 /\ s * 4 <= 4 * 4`);
7178 (ASM_REWRITE_TAC[LE_MULT_LCANCEL; LE_MULT_RCANCEL]);
7181 (* ==================================================================== *)
7183 let gamma_y_lmfun_bound2 = prove_by_refinement (
7184 `?d. (!V X e. packing V /\ saturated V /\ mcell_set V X /\ edgeX V X e ==> gammaY V X lmfun e <= d)`,
7186 (EXISTS_TAC `pi * h0 / (h0 - &1)`);
7188 (ABBREV_TAC `f = (\u v. if {u, v} IN edgeX V X
7189 then dihX V X (u,v) * lmfun (hl [u; v])
7191 (REWRITE_WITH `gammaY V X lmfun = (\({u, v}). f u v)`);
7192 (EXPAND_TAC "f" THEN REWRITE_TAC[gammaY]);
7194 (NEW_GOAL `!u v. (f:real^3->real^3->real) u v = f v u`);
7195 (EXPAND_TAC "f" THEN REWRITE_TAC[BETA_THM]);
7196 (REWRITE_TAC[HL; set_of_list; SET_RULE `{a,b} = {b,a}`]);
7197 (REPEAT GEN_TAC THEN COND_CASES_TAC);
7199 (REWRITE_WITH `dihX V X (u,v) = dihX V X (v,u)`);
7200 (MATCH_MP_TAC DIHX_SYM);
7201 (ASM_REWRITE_TAC[]);
7202 (UP_ASM_TAC THEN MESON_TAC[]);
7204 (UP_ASM_TAC THEN MESON_TAC[]);
7207 (UNDISCH_TAC `edgeX V X e` THEN REWRITE_TAC[IN;IN_ELIM_THM; edgeX]);
7209 (ASM_REWRITE_TAC[]);
7211 (REWRITE_WITH `(\({u, v}). f u v) {u, v} =
7212 (f:real^3->real^3->real) u v`);
7213 (MATCH_MP_TAC BETA_PAIR_THM);
7214 (ASM_REWRITE_TAC[]);
7219 (NEW_GOAL `dihX V X (u,v) * lmfun (hl [u;v]) <= pi * lmfun (hl [u;v])`);
7220 (REWRITE_TAC[REAL_ARITH `a * x <= b * x <=> &0 <= (b - a) * x`]);
7221 (MATCH_MP_TAC REAL_LE_MUL);
7222 (REWRITE_TAC[lmfun_pos_le; REAL_ARITH `&0 <= a - b <=> b <= a`; DIHX_LE_PI]);
7224 (NEW_GOAL `pi * lmfun (hl [u:real^3;v]) <= pi * h0 / (h0 - &1)`);
7225 (REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> &0 <= (y - x) * a`]);
7226 (MATCH_MP_TAC REAL_LE_MUL);
7227 (REWRITE_TAC[PI_POS_LE; REAL_ARITH `&0 <= a - b <=> b <= a`]);
7228 (MATCH_MP_TAC lmfun_bounded);
7229 (REWRITE_TAC[HL_2; REAL_ARITH `&0 <= inv (&2) * x <=> &0 <= x`; DIST_POS_LE]);
7230 (UP_ASM_TAC THEN UP_ASM_TAC THEN REAL_ARITH_TAC);
7231 (MATCH_MP_TAC REAL_LE_MUL);
7232 (REWRITE_TAC[PI_POS_LE]);
7233 (MATCH_MP_TAC REAL_LE_DIV);
7234 (REWRITE_TAC[h0] THEN REAL_ARITH_TAC)]);;
7236 (* ==================================================================== *)
7238 let BOUND_GAMMA_X_lmfun = prove_by_refinement (
7240 (!V X. packing V /\ saturated V /\ mcell_set V X ==> gammaX V X lmfun <= c)`,
7241 [(MP_TAC gamma_y_lmfun_bound2 THEN STRIP_TAC);
7242 (ABBREV_TAC `e = max d (&0)`);
7243 (EXISTS_TAC `&4 / &3 * pi * (&8) pow 3 + (&8 * mm2 / pi) * &16 * e`);
7245 (REWRITE_TAC[gammaX]);
7246 (MATCH_MP_TAC (REAL_ARITH
7247 `a <= x /\ &0 <= b /\ c <= y ==> a - b + c <= x + y`));
7249 (ASM_CASES_TAC `X:real^3->bool = {}`);
7250 (ASM_REWRITE_TAC[MEASURE_EMPTY;
7251 REAL_ARITH `&0 <= &4 / &3 * pi * &8 pow 3 <=> &0 <= pi`]);
7252 (REWRITE_TAC[PI_POS_LE]);
7253 (NEW_GOAL `?p:real^3. p IN X`);
7255 (UP_ASM_TAC THEN STRIP_TAC);
7256 (REWRITE_WITH `&4 / &3 * pi * &8 pow 3 = vol (ball (p, &8))`);
7257 (ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC VOLUME_BALL);
7259 (MATCH_MP_TAC MEASURE_SUBSET);
7260 (REWRITE_TAC[MEASURABLE_BALL]);
7262 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7264 (ASM_REWRITE_TAC[]);
7265 (MATCH_MP_TAC MEASURABLE_MCELL);
7266 (ASM_REWRITE_TAC[]);
7267 (MATCH_MP_TAC MCELL_SUBSET_BALL8_2);
7268 (EXISTS_TAC `V:real^3->bool` THEN ASM_REWRITE_TAC[]);
7269 (MATCH_MP_TAC REAL_LE_MUL);
7271 (REWRITE_TAC[REAL_ARITH `&0 <= &2 * a <=> &0 <= a`]);
7272 (MATCH_MP_TAC REAL_LE_DIV);
7274 (NEW_GOAL `#1.012080 < mm1`);
7275 (REWRITE_TAC[Flyspeck_constants.bounds]);
7276 (ASM_REAL_ARITH_TAC);
7277 (REWRITE_TAC[PI_POS_LE]);
7278 (REWRITE_TAC[total_solid]);
7279 (MATCH_MP_TAC SUM_POS_LE);
7281 (MATCH_MP_TAC FINITE_VX);
7282 (ASM_REWRITE_TAC[]);
7285 (NEW_GOAL `eventually_radial (x:real^3) X`);
7286 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7288 (ASM_REWRITE_TAC[]);
7289 (MATCH_MP_TAC Urrphbz2.URRPHBZ2);
7290 (ASM_REWRITE_TAC[]);
7291 (NEW_GOAL `VX V X = V INTER X`);
7292 (MATCH_MP_TAC Hdtfnfz.HDTFNFZ);
7293 (EXISTS_TAC `ul:(real^3)list` THEN EXISTS_TAC `i:num`);
7294 (ASM_REWRITE_TAC[]);
7295 (STRIP_TAC THEN UNDISCH_TAC `x IN VX V X`);
7296 (ASM_REWRITE_TAC[VX] THEN SET_TAC[]);
7298 (UP_ASM_TAC THEN REWRITE_TAC[eventually_radial]);
7301 (REWRITE_WITH `sol x X = &3 * vol (X INTER normball x r) / r pow 3`);
7303 (REWRITE_TAC[GSYM Marchal_cells_2_new.RADIAL_VS_RADIAL_NORM; NORMBALL_BALL]);
7304 (ASM_REWRITE_TAC[]);
7305 (MATCH_MP_TAC MEASURABLE_INTER);
7306 (REWRITE_TAC[MEASURABLE_BALL]);
7307 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7309 (ASM_REWRITE_TAC[]);
7310 (MATCH_MP_TAC MEASURABLE_MCELL);
7311 (ASM_REWRITE_TAC[]);
7312 (REWRITE_TAC[REAL_ARITH `&0 <= &3 * a <=> &0 <= a`]);
7313 (MATCH_MP_TAC REAL_LE_DIV);
7315 (MATCH_MP_TAC MEASURE_POS_LE);
7316 (REWRITE_TAC[NORMBALL_BALL]);
7317 (MATCH_MP_TAC MEASURABLE_INTER);
7318 (REWRITE_TAC[MEASURABLE_BALL]);
7319 (UNDISCH_TAC `mcell_set V X` THEN REWRITE_TAC[mcell_set; IN; IN_ELIM_THM]);
7321 (ASM_REWRITE_TAC[]);
7322 (MATCH_MP_TAC MEASURABLE_MCELL);
7323 (ASM_REWRITE_TAC[]);
7324 (MATCH_MP_TAC Real_ext.REAL_PROP_NN_POW);
7325 (ASM_REAL_ARITH_TAC);
7326 (ONCE_REWRITE_TAC[REAL_ARITH `a <= b <=> &0 <= b - a`]);
7327 (REWRITE_TAC[REAL_ARITH `a * x - a * y = a * (x - y)`]);
7328 (MATCH_MP_TAC REAL_LE_MUL);
7331 (REWRITE_TAC[REAL_ARITH `&0 <= &8 * a <=> &0 <= a`]);
7332 (MATCH_MP_TAC REAL_LE_DIV);
7334 (NEW_GOAL `#0.02541 < mm2`);
7335 (REWRITE_TAC[Flyspeck_constants.bounds]);
7336 (ASM_REAL_ARITH_TAC);
7337 (REWRITE_TAC[PI_POS_LE]);
7338 (REWRITE_TAC[GSYM gammaY]);
7339 (ONCE_REWRITE_TAC[REAL_ARITH `&0 <= b - a <=> a <= b`]);
7340 (NEW_GOAL `sum (edgeX V X) (gammaY V X lmfun) <=
7341 sum (edgeX V X) (\x. e)`);
7342 (MATCH_MP_TAC SUM_LE);
7343 (REWRITE_TAC[Upfzbzm_support_lemmas.FINITE_edgeX]);
7345 (NEW_GOAL `gammaY V X lmfun x <= d`);
7346 (FIRST_ASSUM MATCH_MP_TAC);
7347 (ASM_REWRITE_TAC[]);
7348 (UP_ASM_TAC THEN REWRITE_TAC[IN]);
7349 (ASM_REAL_ARITH_TAC);
7351 (NEW_GOAL `sum (edgeX V X) (\x. e) <= &16 * e`);
7352 (REWRITE_WITH `sum (edgeX V X) (\x. e) = &(CARD (edgeX V X)) * e`);
7353 (MATCH_MP_TAC SUM_CONST);
7354 (REWRITE_TAC[Upfzbzm_support_lemmas.FINITE_edgeX]);
7356 (ONCE_REWRITE_TAC[REAL_ARITH `a <= b <=> &0 <= b - a`]);
7357 (REWRITE_TAC[REAL_ARITH `a * x - b * x = x * (a - b)`]);
7358 (MATCH_MP_TAC REAL_LE_MUL);
7360 (ASM_REAL_ARITH_TAC);
7361 (ONCE_REWRITE_TAC[REAL_ARITH `&0 <= b - a <=> a <= b`]);
7362 (REWRITE_TAC[REAL_OF_NUM_LE]);
7363 (MATCH_MP_TAC CARD_EDGEX_LE_16);
7364 (ASM_REWRITE_TAC[]);
7365 (ASM_REAL_ARITH_TAC)]);;
7367 (* ==================================================================== *)
7369 (* ==================================================================== *)
7371 (* ==================================================================== *)