(* ========================================================================= *)
(* FLYSPECK - BOOK FORMALIZATION *)
(* *)
(* Authour : VU KHAC KY *)
(* Book lemma: AJRIPQN *)
(* Chaper : Packing *)
(* *)
(* ========================================================================= *)
module Ajripqn = struct
open Rogers;;
open Vukhacky_tactics;;
open Pack_defs;;
open Pack_concl;;
open Pack1;;
open Sphere;;
open Marchal_cells;;
open Emnwuus;;
open Marchal_cells_2_new;;
open Lepjbdj;;
open Hdtfnfz;;
open Urrphbz1;;
open Sltstlo;;
open Qzksykg;;
open Rvfxzbu;;
open Ddzuphj;;
(* ========================================================================= *)
let AJRIPQN_concl =
`!V ul vl i j.
saturated V /\ packing V /\ barV V 3 ul /\ barV V 3 vl /\
i IN {0,1,2,3,4} /\ j IN {0,1,2,3,4} /\
~NULLSET (mcell i V ul INTER mcell j V vl) ==>
i = j /\ mcell i V ul = mcell j V vl`;;
(* ========================================================================= *)
(* Supported lemmas *)
let UP_TO_4_KY_LEMMA = prove (`!i. i <= 4 <=> i
IN {0,1,2,3,4}`,
REWRITE_TAC[SET_RULE `i
IN {0,1,2,3,4} <=>
(i = 0 \/ i = 1 \/ i = 2 \/ i = 3 \/i= 4)`] THEN ARITH_TAC);;
let FINITE_SET_LIST_LEMMA = prove
(`!s:A->bool.
FINITE s
==> FINITE
{y | ?u0 u1 u2 u3.
u0
IN s /\
u1
IN s /\
u2
IN s /\
u3
IN s /\
y = [u0; u1; u2; u3]}`,
REWRITE_TAC[SET_RULE
`{y | ?u0 u1 u2 u3. u0
IN s /\ u1
IN s /\ u2
IN s /\ u3
IN s /\
y = [u0; u1; u2; u3]} =
{CONS u0 y1 | u0
IN s /\
y1
IN {CONS u1 y2 | u1
IN s /\
y2
IN {[u2;u3] | u2
IN s /\
u3
IN s}}}`] THEN
REPEAT(GEN_TAC THEN DISCH_TAC THEN
MATCH_MP_TAC
FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]));;
(* ========================================================================= *)
(* Main theorem *)
let AJRIPQN = prove_by_refinement (AJRIPQN_concl,
[(REPEAT GEN_TAC THEN STRIP_TAC);
(ABBREV_TAC `S = mcell i V ul INTER mcell j V vl`);
(UNDISCH_TAC `~NULLSET (S:real^3->bool)`);
(REWRITE_WITH `~NULLSET (S:real^3->bool) <=> &0 < measure S`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(MATCH_MP_TAC MEASURABLE_MEASURE_POS_LT);
(EXPAND_TAC "S" THEN MATCH_MP_TAC MEASURABLE_INTER);
(ASM_SIMP_TAC[MEASURABLE_MCELL]);
(DISCH_TAC);
(NEW_GOAL `bounded (S:real^3->bool)`);
(EXPAND_TAC "S" THEN MATCH_MP_TAC BOUNDED_INTER);
(ASM_SIMP_TAC[BOUNDED_MCELL]);
(UP_ASM_TAC THEN REWRITE_TAC[bounded]);
(STRIP_TAC);
(NEW_GOAL `?(v:real^3) S1.
v IN V /\ S1 SUBSET S /\ measurable S1 /\ &0 < measure S1 /\
S1 SUBSET (voronoi_closed V v)`);
(ABBREV_TAC `SP = {v:real^3 | v IN V /\
~(voronoi_closed V v INTER S = {})}`);
(NEW_GOAL `FINITE (SP:(real^3->bool))`);
(NEW_GOAL `SP SUBSET (V INTER ball ((vec 0):real^3, a + &2))`);
(EXPAND_TAC "SP" THEN REWRITE_TAC[SUBSET;IN_INTER;IN;IN_ELIM_THM; ball]);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `~(A = {}) <=> (?z. z IN A)`]);
(REWRITE_TAC[IN_INTER]);
(REPEAT STRIP_TAC);
(REWRITE_TAC[dist; NORM_ARITH `norm (vec 0 - a) = norm a`]);
(NEW_GOAL `norm x <= norm z + dist (x , z:real^3)`);
(REWRITE_TAC[dist] THEN NORM_ARITH_TAC);
(NEW_GOAL `norm (z:real^3) <= a`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `dist (x, z:real^3) < &2`);
(ONCE_REWRITE_TAC[DIST_SYM]);
(MATCH_MP_TAC Pack2.voronoi_in_ball);
(EXISTS_TAC `V:real^3->bool`);
(ASM_REWRITE_TAC[]);
(ASM_REAL_ARITH_TAC);
(MATCH_MP_TAC FINITE_SUBSET);
(EXISTS_TAC `V INTER ball ((vec 0):real^3,a + &2)`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC KIUMVTC);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `~((S:real^3->bool) = {})`);
(STRIP_TAC);
(UNDISCH_TAC `&0 < vol (S:real^3->bool)`);
(ASM_REWRITE_TAC[MEASURE_EMPTY]);
(REAL_ARITH_TAC);
(UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `~(A = {}) <=> (?z. z IN A)`]);
(REPEAT STRIP_TAC);
(NEW_GOAL `norm (z:real^3) <= a`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `&0 <= norm (z:real^3)`);
(REWRITE_TAC[NORM_POS_LE]);
(ASM_REAL_ARITH_TAC);
(ABBREV_TAC `f = (\v:real^3. voronoi_closed V v INTER S)`);
(ABBREV_TAC `SPP = IMAGE (f:(real^3->real^3->bool)) (SP:real^3->bool)`);
(NEW_GOAL `FINITE (SPP:(real^3->bool)->bool)`);
(EXPAND_TAC "SPP" THEN MATCH_MP_TAC FINITE_IMAGE THEN ASM_REWRITE_TAC[]);
(NEW_GOAL `(S:real^3->bool) = (UNIONS SPP)`);
(EXPAND_TAC "SPP" THEN REWRITE_TAC[SET_EQ_LEMMA; UNIONS_IMAGE;IN;IN_ELIM_THM]
THEN REPEAT STRIP_TAC);
(EXPAND_TAC "f");
(NEW_GOAL `?v:real^3. v IN V /\ x IN voronoi_closed V v`);
(MATCH_MP_TAC Packing3.TIWWFYQ);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN REPEAT STRIP_TAC);
(EXISTS_TAC `v:real^3`);
(STRIP_TAC);
(EXPAND_TAC "SP" THEN REWRITE_TAC[IN_ELIM_THM]);
(ASM_REWRITE_TAC[]);
(REWRITE_TAC[SET_RULE `~(A = {}) <=> (?z. z IN A)`]);
(EXISTS_TAC `x:real^3`);
(REWRITE_TAC[IN_INTER]);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(ONCE_REWRITE_TAC[GSYM IN]);
(REWRITE_TAC[IN_INTER]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN EXPAND_TAC "f");
(REWRITE_WITH `(voronoi_closed V x' INTER S) (x:real^3)
<=> x IN (voronoi_closed V x' INTER S)`);
(MESON_TAC[GSYM IN]);
(REWRITE_TAC[IN_INTER]);
(ASM_SET_TAC[]);
(NEW_GOAL `!s1. s1 IN SPP ==> measurable (s1:(real^3->bool))`);
(EXPAND_TAC "SPP" THEN EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE;IN;
IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ONCE_ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_INTER);
(STRIP_TAC);
(ASM_SIMP_TAC[Packing3.DRUQUFE]);
(EXPAND_TAC "S");
(MATCH_MP_TAC MEASURABLE_INTER);
(ASM_SIMP_TAC[MEASURABLE_MCELL]);
(NEW_GOAL `?S1:real^3->bool. S1 IN SPP /\ ~(negligible S1)`);
(ONCE_REWRITE_TAC[MESON[] `S <=> ~S ==> F`]);
(STRIP_TAC);
(NEW_GOAL `!S1:real^3->bool. S1 IN SPP ==> negligible S1`);
(UP_ASM_TAC THEN MESON_TAC[]);
(NEW_GOAL `negligible (UNIONS (SPP:(real^3->bool)->bool))`);
(MATCH_MP_TAC NEGLIGIBLE_UNIONS);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[GSYM (ASSUME `S:real^3->bool = UNIONS SPP`)]);
(REWRITE_WITH `~NULLSET S <=> &0 < measure (S:real^3->bool)`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(MATCH_MP_TAC MEASURABLE_MEASURE_POS_LT);
(EXPAND_TAC "S");
(MATCH_MP_TAC MEASURABLE_INTER);
(ASM_SIMP_TAC[MEASURABLE_MCELL]);
(ASM_REWRITE_TAC[]);
(FIRST_X_ASSUM CHOOSE_TAC);
(UP_ASM_TAC THEN EXPAND_TAC "SPP" THEN EXPAND_TAC "f" THEN
REWRITE_TAC[IMAGE;IN;IN_ELIM_THM]);
(EXPAND_TAC "SP" THEN REWRITE_TAC[IN;IN_ELIM_THM;
SET_RULE `~(s = {}) <=> (?x. x IN s)`]);
(REPEAT STRIP_TAC);
(EXISTS_TAC `x:real^3`);
(EXISTS_TAC `S1:real^3->bool`);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(ONCE_ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_INTER);
(STRIP_TAC);
(ASM_SIMP_TAC[Packing3.DRUQUFE]);
(EXPAND_TAC "S");
(MATCH_MP_TAC MEASURABLE_INTER);
(ASM_SIMP_TAC[MEASURABLE_MCELL]);
(REWRITE_WITH `&0 < measure (S1:real^3->bool) <=> ~NULLSET S1`);
(MATCH_MP_TAC MEASURABLE_MEASURE_POS_LT);
(ONCE_ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_INTER);
(STRIP_TAC);
(ASM_SIMP_TAC[Packing3.DRUQUFE]);
(EXPAND_TAC "S");
(MATCH_MP_TAC MEASURABLE_INTER);
(ASM_SIMP_TAC[MEASURABLE_MCELL]);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(* ======================================================================== *)
(* OK here *)
(NEW_GOAL `?wl:(real^3)list S2.
barV V 3 wl /\ S2 SUBSET S1 /\ measurable S2 /\
&0 < measure S2 /\ S2 SUBSET (rogers V wl)`);
(ABBREV_TAC
`SP = {wl| wl IN barV V 3 /\ HD wl = v /\ ~(rogers V wl INTER S1 = {})}`);
(NEW_GOAL `FINITE (SP:((real^3)list->bool))`);
(ABBREV_TAC `H = {u:real^3| u IN V /\ dist (u,v) <= &4}`);
(NEW_GOAL `SP SUBSET
{wl | ?u0 u1 u2 u3.
u0 IN H /\ u1 IN H /\ u2 IN H /\ u3 IN H /\ wl = [u0;u1;u2;u3:real^3]}`);
(EXPAND_TAC "SP" THEN REWRITE_TAC[SUBSET;IN;IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(NEW_GOAL `?u0 u1 u2 u3. x = [u0:real^3;u1;u2;u3]`);
(MP_TAC (ASSUME `barV V 3 x`));
(REWRITE_TAC[BARV_3_EXPLICIT]);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
(EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `omega_list V x IN voronoi_list V x`);
(MATCH_MP_TAC Packing3.OMEGA_LIST_IN_VORONOI_LIST);
(EXISTS_TAC `3`);
(ASM_REWRITE_TAC[]);
(ABBREV_TAC `u = omega_list V x`);
(UNDISCH_TAC `(u:real^3) IN voronoi_list V x` THEN ASM_REWRITE_TAC[]);
(NEW_GOAL `u0 = v:real^3`);
(EXPAND_TAC "v" THEN REWRITE_TAC[ASSUME `x = [u0;u1;u2;u3:real^3]`;HD]);
(DISCH_TAC THEN EXPAND_TAC "H" THEN REWRITE_TAC[IN; IN_ELIM_THM]);
(NEW_GOAL `set_of_list (x:(real^3)list) SUBSET V`);
(MATCH_MP_TAC Packing3.BARV_SUBSET);
(EXISTS_TAC `3`);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
(DISCH_TAC);
(REWRITE_WITH `V v /\ (V:real^3->bool) u1 /\ V u2 /\ V (u3:real^3)`);
(UP_ASM_TAC THEN SET_TAC[]);
(NEW_GOAL `!z. z IN {v, u1, u2, u3:real^3} ==> dist (z,v) <= &4`);
(NEW_GOAL `!z. z IN {v, u1, u2, u3:real^3} ==> dist (z,u) <= &2`);
(REPEAT STRIP_TAC);
(ASM_CASES_TAC `dist (z,u:real^3) <= &2`);
(ASM_REWRITE_TAC[]);
(UNDISCH_TAC `saturated (V:real^3->bool)`);
(REWRITE_TAC[saturated]);
(REPEAT STRIP_TAC);
(NEW_GOAL `?y. y IN V /\ dist (u, y:real^3) < &2`);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(NEW_GOAL `u IN voronoi_closed V (z:real^3)`);
(UNDISCH_TAC `u IN voronoi_list V [u0; u1; u2; u3:real^3]`);
(REWRITE_TAC[VORONOI_LIST;VORONOI_SET; set_of_list; IN_INTERS]);
(STRIP_TAC);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_SET_TAC[]);
(ONCE_REWRITE_TAC[DIST_SYM]);
(UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN;IN_ELIM_THM]);
(STRIP_TAC);
(NEW_GOAL `dist (u,z:real^3) <= dist (u,y)`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_SET_TAC[]);
(ASM_REAL_ARITH_TAC);
(REPEAT STRIP_TAC);
(NEW_GOAL `dist (z, v) <= dist (z, u) + dist (v, u:real^3)`);
(NORM_ARITH_TAC);
(NEW_GOAL `dist (z,u:real^3) <= &2`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_SET_TAC[]);
(NEW_GOAL `dist (v,u:real^3) <= &2`);
(FIRST_ASSUM MATCH_MP_TAC);
(SET_TAC[]);
(ASM_REAL_ARITH_TAC);
(ASM_SIMP_TAC[SET_RULE
`a IN {a,b,c,d} /\ b IN {a,b,c,d} /\ c IN {a,b,c,d} /\ d IN {a,b,c,d}`]);
(MATCH_MP_TAC FINITE_SUBSET);
(EXISTS_TAC `{wl | ?a b c d.
a IN H /\ b IN H /\ c IN H /\ d IN H /\ wl = [a;b;c;d:real^3]}`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
(EXPAND_TAC "H");
(MATCH_MP_TAC FINITE_SUBSET);
(EXISTS_TAC `V INTER ball (v:real^3, &5)`);
(ASM_SIMP_TAC[KIUMVTC; REAL_ARITH `&0 <= &5`]);
(EXPAND_TAC "H" THEN REWRITE_TAC[SUBSET; ball; IN_INTER; IN;IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[]);
(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC);
(ABBREV_TAC `f = (\wl:(real^3)list. rogers V wl INTER S1)`);
(ABBREV_TAC `SPP = IMAGE (f:((real^3)list->real^3->bool))
(SP:(real^3)list->bool)`);
(NEW_GOAL `FINITE (SPP:(real^3->bool)->bool)`);
(EXPAND_TAC "SPP" THEN MATCH_MP_TAC FINITE_IMAGE THEN ASM_REWRITE_TAC[]);
(NEW_GOAL `(S1:real^3->bool) = (UNIONS SPP)`);
(EXPAND_TAC "SPP" THEN REWRITE_TAC[SET_EQ_LEMMA; UNIONS_IMAGE;IN;IN_ELIM_THM]
THEN REPEAT STRIP_TAC);
(EXPAND_TAC "f");
(NEW_GOAL `?vl. vl IN barV V 3 /\
x IN rogers V vl /\
truncate_simplex 0 vl = [v]`);
(REWRITE_WITH `(?vl. vl IN barV V 3 /\ x IN rogers V vl /\
truncate_simplex 0 vl = [v]) <=> x IN voronoi_closed V v`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(MATCH_MP_TAC Rogers.GLTVHUM);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(EXISTS_TAC `vl':(real^3)list`);
(STRIP_TAC);
(EXPAND_TAC "SP" THEN REWRITE_TAC[IN_ELIM_THM]);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `?u0 u1 u2 u3. vl' = [u0:real^3;u1;u2;u3]`);
(SUBGOAL_THEN `barV V 3 vl'` MP_TAC);
(ASM_SET_TAC[]);
(REWRITE_TAC[BARV_3_EXPLICIT]);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(NEW_GOAL `v = u0:real^3`);
(UNDISCH_TAC `truncate_simplex 0 vl' = [v:real^3]`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0]);
(STRIP_TAC);
(NEW_GOAL `v = HD [v:real^3] /\ u0 = HD [u0:real^3]`);
(REWRITE_TAC[HD]);
(ONCE_ASM_REWRITE_TAC[]);
(AP_TERM_TAC THEN ASM_REWRITE_TAC[]);
(STRIP_TAC);
(ASM_REWRITE_TAC[HD]);
(REWRITE_TAC[SET_RULE `~(x = {}) <=> (?y. y IN x)`]);
(EXISTS_TAC `x:real^3`);
(REWRITE_TAC[IN_INTER]);
(ASM_REWRITE_TAC[IN]);
(REWRITE_WITH `(rogers V vl' INTER S1) x <=> x IN rogers V vl'/\ x IN S1`);
(REWRITE_TAC[IN; GSYM IN_INTER]);
(ASM_REWRITE_TAC[IN]);
(UNDISCH_TAC `(f:(real^3)list->real^3->bool) x' x`);
(EXPAND_TAC "f");
(REWRITE_WITH `(rogers V x' INTER S1) x <=> x IN rogers V x'/\ x IN S1`);
(REWRITE_TAC[IN; GSYM IN_INTER]);
(SET_TAC[]);
(NEW_GOAL `!s1. s1 IN SPP ==> measurable (s1:(real^3->bool))`);
(EXPAND_TAC "SPP" THEN EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE;IN;
IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ONCE_ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_INTER);
(STRIP_TAC);
(MATCH_MP_TAC MEASURABLE_ROGERS);
(ASM_REWRITE_TAC[]);
(UNDISCH_TAC `(SP:(real^3)list->bool) x`);
(EXPAND_TAC "SP" THEN REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC);
(ASM_SET_TAC[]);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `?S2:real^3->bool. S2 IN SPP /\ ~(negligible S2)`);
(ONCE_REWRITE_TAC[MESON[] `S <=> ~S ==> F`]);
(STRIP_TAC);
(NEW_GOAL `!S2:real^3->bool. S2 IN SPP ==> negligible S2`);
(UP_ASM_TAC THEN MESON_TAC[]);
(NEW_GOAL `negligible (UNIONS (SPP:(real^3->bool)->bool))`);
(MATCH_MP_TAC NEGLIGIBLE_UNIONS);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[GSYM (ASSUME `S1:real^3->bool = UNIONS SPP`)]);
(REWRITE_WITH `~NULLSET S1 <=> &0 < measure (S1:real^3->bool)`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(MATCH_MP_TAC MEASURABLE_MEASURE_POS_LT);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(FIRST_X_ASSUM CHOOSE_TAC);
(UP_ASM_TAC THEN EXPAND_TAC "SPP" THEN EXPAND_TAC "f" THEN
REWRITE_TAC[IMAGE;IN;IN_ELIM_THM]);
(EXPAND_TAC "SP" THEN REWRITE_TAC[IN;IN_ELIM_THM;
SET_RULE `~(s = {}) <=> (?x. x IN s)`]);
(REPEAT STRIP_TAC);
(EXISTS_TAC `x:(real^3)list`);
(EXISTS_TAC `S2:real^3->bool`);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(ONCE_ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_INTER);
(STRIP_TAC);
(MATCH_MP_TAC MEASURABLE_ROGERS);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(REWRITE_WITH `&0 < measure (S2:real^3->bool) <=> ~NULLSET S2`);
(MATCH_MP_TAC MEASURABLE_MEASURE_POS_LT);
(ONCE_ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_INTER);
(STRIP_TAC);
(MATCH_MP_TAC MEASURABLE_ROGERS);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(* ======================================================================== *)
(* ----------------------------- *)
(* OK here *)
(NEW_GOAL
`?S3. S3 SUBSET S2 /\
measurable S3 /\
&0 < vol S3 /\
(!kl. barV V 3 kl /\ ~(rogers V kl = rogers V wl) ==> S3 INTER rogers V kl = {})`);
(ABBREV_TAC
`SP = {kl| kl IN barV V 3 /\ ~(rogers V kl INTER S2 = {})}`);
(NEW_GOAL `FINITE (SP:((real^3)list->bool))`);
(ABBREV_TAC `H = {u:real^3| u IN V /\ dist (u,HD wl) <= &12}`);
(NEW_GOAL `SP SUBSET
{kl | ?u0 u1 u2 u3.
u0 IN H /\ u1 IN H /\ u2 IN H /\ u3 IN H /\ kl = [u0;u1;u2;u3:real^3]}`);
(EXPAND_TAC "SP" THEN REWRITE_TAC[SUBSET;IN;IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(NEW_GOAL `?u0 u1 u2 u3. x = [u0:real^3;u1;u2;u3]`);
(MP_TAC (ASSUME `barV V 3 x`));
(REWRITE_TAC[BARV_3_EXPLICIT]);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(EXISTS_TAC `u0:real^3` THEN EXISTS_TAC `u1:real^3`);
(EXISTS_TAC `u2:real^3` THEN EXISTS_TAC `u3:real^3`);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `set_of_list x SUBSET (V:real^3 ->bool)`);
(MATCH_MP_TAC Packing3.BARV_SUBSET);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list]);
DISCH_TAC;
(NEW_GOAL `!u. u IN {u0,u1,u2,u3} ==> dist (u, u0:real^3) <= &4`);
(REPEAT STRIP_TAC);
(NEW_GOAL `aff_dim (voronoi_list V (x:(real^3)list)) + &(LENGTH x) = &4`);
(UNDISCH_TAC `barV V 3 x` THEN REWRITE_TAC[BARV;VORONOI_NONDG]);
(STRIP_TAC);
(MATCH_MP_TAC (MESON[] `
LENGTH x < 5 /\ set_of_list x SUBSET (V:real^3->bool) /\ A ==> A`));
(FIRST_ASSUM MATCH_MP_TAC);
(REWRITE_TAC[Packing3.INITIAL_SUBLIST_REFL]);
(ASM_REWRITE_TAC[]);
(ARITH_TAC);
(NEW_GOAL `LENGTH (x:(real^3)list) = 4`);
(MATCH_MP_TAC (MESON[] `A /\ CARD (set_of_list (x:(real^3)list)) = 3 + 1 ==> A`));
(REWRITE_TAC[ARITH_RULE `4 = 3 + 1`]);
(MATCH_MP_TAC Rogers.BARV_IMP_LENGTH_EQ_CARD);
(EXISTS_TAC `V:real^3->bool`);
(ASM_REWRITE_TAC[]);
(SWITCH_TAC THEN UP_ASM_TAC THEN ASM_REWRITE_TAC[]);
(REWRITE_TAC[ARITH_RULE `(a:int) + &4 = &4 <=> a = &0`; AFF_DIM_EQ_0]);
(REPEAT STRIP_TAC);
(NEW_GOAL `!p. p IN {u0, u1, u2, u3:real^3} ==> dist (a', p) <= &2`);
(REPEAT STRIP_TAC);
(NEW_GOAL `a' IN voronoi_closed V (p:real^3)`);
(SWITCH_TAC THEN UP_ASM_TAC THEN REWRITE_TAC[VORONOI_LIST;VORONOI_SET; set_of_list; INTERS]);
(MATCH_MP_TAC (SET_RULE `(s IN A ==> B) ==> (A = {s} ==> B)`));
(REWRITE_TAC[IN;IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(FIRST_ASSUM MATCH_MP_TAC);
(EXISTS_TAC `p:real^3`);
(STRIP_TAC);
(ASM_MESON_TAC[IN]);
(REWRITE_TAC[ETA_AX]);
(UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed;IN;IN_ELIM_THM] THEN DISCH_TAC);
(NEW_GOAL `?y. y IN V /\ dist (a',y:real^3) < &2`);
(ASM_MESON_TAC[saturated]);
(FIRST_X_ASSUM CHOOSE_TAC);
(MATCH_MP_TAC (REAL_ARITH `m <= dist (a', y:real^3) /\
dist (a', y:real^3) < b ==> m <= b`));
(ASM_REWRITE_TAC[]);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_MESON_TAC[IN]);
(NEW_GOAL `dist (u, u0) <= dist (a', u) + dist (a', u0:real^3)`);
(NORM_ARITH_TAC);
(NEW_GOAL `dist (a', u) <= &2 /\ dist (a', u0:real^3) <= &2`);
(ASM_SIMP_TAC[]);
(FIRST_ASSUM MATCH_MP_TAC);
(SET_TAC[]);
(ASM_REAL_ARITH_TAC);
(NEW_GOAL `u0 IN {u0, u1, u2, u3:real^3} /\ u1 IN {u0, u1, u2, u3} /\
u2 IN {u0, u1, u2, u3} /\ u3 IN {u0, u1, u2, u3}`);
(SET_TAC[]);
(EXPAND_TAC "H");
(REWRITE_TAC[IN_ELIM_THM]);
(REWRITE_WITH `(u0:real^3) IN V /\ u1 IN V /\ u2 IN V /\ u3 IN V`);
(ASM_SET_TAC[]);
(NEW_GOAL `!u. u IN {u0,u1,u2,u3} ==> dist (u:real^3, HD wl) <= &12`);
(UNDISCH_TAC `~(rogers V x INTER S2 = {})`);
(REWRITE_TAC[SET_RULE `~(s = {}) <=> (?p. p IN s)`]);
(REPEAT STRIP_TAC);
(NEW_GOAL `dist (u,HD wl) <= dist (u,u0:real^3) + dist (u0, p) + dist (p, HD wl)`);
(NORM_ARITH_TAC);
(NEW_GOAL `dist (u,u0:real^3) <= &4 /\ dist (u0,p) <= &4 /\ dist (p,HD wl) <= &4`);
(ASM_SIMP_TAC[]);
(STRIP_TAC);
(SUBGOAL_THEN `p IN rogers V x` ASSUME_TAC);
(ASM_SET_TAC[]);
(NEW_GOAL `p IN voronoi_closed V (u0:real^3)`);
(REWRITE_WITH `p IN voronoi_closed V u0 <=>
(?vl. vl IN barV V 3 /\
p IN rogers V vl /\
truncate_simplex 0 vl = [u0])`);
(MATCH_MP_TAC Rogers.GLTVHUM);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(EXISTS_TAC `x:(real^3)list`);
(ASM_REWRITE_TAC[TRUNCATE_SIMPLEX_EXPLICIT_0]);
(ASM_MESON_TAC[IN]);
(UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN;IN_ELIM_THM] THEN DISCH_TAC);
(NEW_GOAL `?y. y IN V /\ dist (p,y:real^3) < &2`);
(ASM_MESON_TAC[saturated]);
(FIRST_X_ASSUM CHOOSE_TAC);
(MATCH_MP_TAC (REAL_ARITH `m <= dist (p, y:real^3) /\
dist (p, y:real^3) < &2 ==> m <= &4`));
(ASM_REWRITE_TAC[]);
(REWRITE_WITH `dist (u0,p) = dist (p,u0:real^3)`);
(MESON_TAC[DIST_SYM]);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_MESON_TAC[IN]);
(SUBGOAL_THEN `p IN rogers V wl` ASSUME_TAC);
(ASM_SET_TAC[]);
(NEW_GOAL `?w0 w1 w2 w3. wl = [w0:real^3;w1;w2;w3]`);
(MP_TAC (ASSUME `barV V 3 wl`));
(REWRITE_TAC[BARV_3_EXPLICIT]);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(FIRST_X_ASSUM CHOOSE_TAC);
(ASM_REWRITE_TAC[HD]);
(NEW_GOAL `p IN voronoi_closed V (w0:real^3)`);
(REWRITE_WITH `p IN voronoi_closed V w0 <=>
(?vl. vl IN barV V 3 /\
p IN rogers V vl /\
truncate_simplex 0 vl = [w0])`);
(MATCH_MP_TAC Rogers.GLTVHUM);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `set_of_list wl SUBSET (V:real^3->bool)`);
(MATCH_MP_TAC Packing3.BARV_SUBSET);
(EXISTS_TAC `3` THEN ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN ASM_REWRITE_TAC[set_of_list] THEN SET_TAC[]);
(EXISTS_TAC `wl:(real^3)list`);
(ASM_MESON_TAC[IN;TRUNCATE_SIMPLEX_EXPLICIT_0]);
(UP_ASM_TAC THEN REWRITE_TAC[voronoi_closed; IN;IN_ELIM_THM] THEN DISCH_TAC);
(NEW_GOAL `?y. y IN V /\ dist (p,y:real^3) < &2`);
(ASM_MESON_TAC[saturated]);
(FIRST_X_ASSUM CHOOSE_TAC);
(MATCH_MP_TAC (REAL_ARITH `m <= dist (p, y:real^3) /\
dist (p, y:real^3) < &2 ==> m <= &4`));
(ASM_REWRITE_TAC[]);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_MESON_TAC[IN]);
(ASM_REAL_ARITH_TAC);
(ASM_SIMP_TAC[]);
(MATCH_MP_TAC FINITE_SUBSET);
(EXISTS_TAC `{kl | ?u0 u1 u2 u3:real^3.
u0 IN H /\ u1 IN H /\ u2 IN H /\ u3 IN H /\
kl = [u0; u1; u2; u3]}`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC FINITE_SET_LIST_LEMMA);
(EXPAND_TAC "H");
(MATCH_MP_TAC FINITE_SUBSET);
(EXISTS_TAC `V INTER ball ((HD wl):real^3, &15)`);
(ASM_SIMP_TAC[KIUMVTC; REAL_ARITH `&0 <= &15`]);
(EXPAND_TAC "H" THEN REWRITE_TAC[SUBSET; ball; IN_INTER; IN;IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[]);
(ONCE_REWRITE_TAC[DIST_SYM] THEN ASM_REAL_ARITH_TAC);
(* ======================================================================== *)
(* Ok here *)
(ABBREV_TAC `f = (\kl:(real^3)list. rogers V kl INTER rogers V wl)`);
(ABBREV_TAC `SPP = IMAGE (f:((real^3)list->real^3->bool))
((SP:(real^3)list->bool) DIFF {zl| rogers V zl = rogers V wl})`);
(NEW_GOAL `FINITE (SPP:(real^3->bool)->bool)`);
(EXPAND_TAC "SPP" THEN MATCH_MP_TAC FINITE_IMAGE THEN ASM_REWRITE_TAC[]);
(MATCH_MP_TAC FINITE_SUBSET);
(EXISTS_TAC `SP:(real^3)list->bool`);
(ASM_REWRITE_TAC[]);
(SET_TAC[]);
(EXISTS_TAC `(S2:real^3->bool) DIFF (rogers V wl INTER UNIONS SPP)`);
(REWRITE_TAC[SET_RULE `A DIFF B SUBSET A`]);
(REPEAT STRIP_TAC);
(MATCH_MP_TAC MEASURABLE_DIFF);
(ASM_REWRITE_TAC[MEASURABLE_INTER]);
(MATCH_MP_TAC MEASURABLE_INTER);
(STRIP_TAC);
(MATCH_MP_TAC MEASURABLE_ROGERS);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_UNIONS);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "SPP");
(EXPAND_TAC "f");
(REWRITE_TAC[BETA_THM; IMAGE;IN;IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_INTER);
(ASM_SIMP_TAC [MEASURABLE_ROGERS]);
(MATCH_MP_TAC MEASURABLE_ROGERS);
(ASM_REWRITE_TAC[]);
(UNDISCH_TAC `(SP DIFF {zl | rogers V zl = rogers V wl}) x`);
(REWRITE_WITH `(SP DIFF {zl | rogers V zl = rogers V wl}) x <=>
x IN (SP DIFF {zl | rogers V zl = rogers V wl})`);
(MESON_TAC[IN]);
(REWRITE_TAC[IN_DIFF]);
(EXPAND_TAC "SP" THEN REWRITE_TAC[IN_ELIM_THM]);
(MESON_TAC[IN]);
(REWRITE_WITH `measure (S2 DIFF rogers V wl INTER UNIONS SPP) = measure S2`);
(MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
(REWRITE_TAC[SET_RULE `(A DIFF B) DIFF A UNION A DIFF (A DIFF B) = A INTER B`]);
(MATCH_MP_TAC NEGLIGIBLE_SUBSET);
(EXISTS_TAC `rogers V wl INTER UNIONS SPP`);
(REWRITE_TAC[SET_RULE `A INTER B SUBSET B`]);
(REWRITE_TAC[INTER_UNIONS]);
(MATCH_MP_TAC NEGLIGIBLE_UNIONS);
(STRIP_TAC);
(REWRITE_WITH `{rogers V wl INTER x | x IN SPP} = IMAGE (\x. rogers V wl INTER x) SPP`);
(REWRITE_TAC[IMAGE; SET_EQ_LEMMA; IN;IN_ELIM_THM]);
(MATCH_MP_TAC FINITE_IMAGE);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "SPP" THEN EXPAND_TAC "SP" THEN EXPAND_TAC "f");
(REWRITE_TAC[IMAGE;IN;IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[SET_RULE `a INTER b INTER a = a INTER b`]);
(MATCH_MP_TAC COPLANAR_IMP_NEGLIGIBLE);
(MATCH_MP_TAC DUUNHOR);
(UNDISCH_TAC `({kl | barV V 3 kl /\ ~(rogers V kl INTER S2 = {})} DIFF
{zl | rogers V zl = rogers V wl}) x'`);
(REWRITE_WITH
`({kl | barV V 3 kl /\ ~(rogers V kl INTER S2 = {})} DIFF
{zl | rogers V zl = rogers V wl}) x' <=>
x' IN ({kl | barV V 3 kl /\ ~(rogers V kl INTER S2 = {})} DIFF
{zl | rogers V zl = rogers V wl})`);
(MESON_TAC[IN]);
(REWRITE_TAC[IN_DIFF]);
(REWRITE_TAC[IN; IN_ELIM_THM]);
(DISCH_TAC THEN ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "SPP" THEN EXPAND_TAC "SP" THEN EXPAND_TAC "f");
(REWRITE_TAC[IMAGE;IN;IN_ELIM_THM]);
(REWRITE_TAC[MESON[IN; IN_DIFF] `(S DIFF P) x <=> x IN S /\ ~(x IN P)`]);
(REWRITE_TAC[IN;IN_ELIM_THM]);
(MATCH_MP_TAC (SET_RULE `(!p. p IN S ==> ~(p IN P)) ==> (S INTER P = {})`));
(REWRITE_TAC[IN_DIFF; IN_INTER;IN_UNIONS; MESON[] `~(A /\ B) <=> ~A \/ ~ B`]);
(REPEAT STRIP_TAC);
(NEW_GOAL `p IN rogers V wl`);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(NEW_GOAL `?t. t IN
{y | ?x. ((barV V 3 x /\ ~(rogers V x INTER S2 = {})) /\
~(rogers V x = rogers V wl)) /\
y = rogers V x INTER rogers V wl} /\
p IN t`);
(EXISTS_TAC `rogers V kl INTER rogers V wl`);
(ASM_REWRITE_TAC[IN_INTER]);
(STRIP_TAC);
(REWRITE_TAC[IN;IN_ELIM_THM]);
(EXISTS_TAC `kl:(real^3)list`);
(ASM_REWRITE_TAC[]);
(REWRITE_TAC[SET_RULE `~(A INTER B = {}) <=> (?z. z IN A /\ z IN B)`]);
(EXISTS_TAC `p:real^3`);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(* ========================================================================= *)
(* OK here *)
(NEW_GOAL `?k:num S4. k <= 4 /\
S4 SUBSET S3 /\ measurable S4 /\ &0 < measure S4 /\
S4 SUBSET (mcell k V wl)`);
(ABBREV_TAC
`SP = {k:num| ~(mcell k V wl INTER S3 = {}) /\ k <= 4}`);
(NEW_GOAL `FINITE (SP:(num ->bool))`);
(MATCH_MP_TAC FINITE_SUBSET);
(EXISTS_TAC `{k | k <= 4}`);
(EXPAND_TAC "SP");
(SET_TAC[FINITE_NUMSEG_LE]);
(ABBREV_TAC `f = (\k:num. mcell k V wl INTER S3)`);
(ABBREV_TAC `SPP = IMAGE (f:(num->real^3->bool))
(SP:num->bool)`);
(NEW_GOAL `FINITE (SPP:(real^3->bool)->bool)`);
(EXPAND_TAC "SPP" THEN MATCH_MP_TAC FINITE_IMAGE THEN ASM_REWRITE_TAC[]);
(NEW_GOAL `(S3:real^3->bool) = (UNIONS SPP)`);
(EXPAND_TAC "SPP" THEN REWRITE_TAC[SET_EQ_LEMMA; UNIONS_IMAGE;IN;IN_ELIM_THM]
THEN REPEAT STRIP_TAC);
(EXPAND_TAC "f");
(NEW_GOAL `?j. j <= 4 /\ x IN mcell j V wl`);
(MATCH_MP_TAC SLTSTLO1);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC (SET_RULE `(x:real^3) IN S3 /\ S3 SUBSET B ==> x IN B`));
(STRIP_TAC);
(UP_ASM_TAC THEN SIMP_TAC[IN]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(EXISTS_TAC `j':num`);
(STRIP_TAC);
(EXPAND_TAC "SP");
(REWRITE_TAC[IN_ELIM_THM]);
(ASM_REWRITE_TAC[INTER]);
(ASM_SET_TAC[]);
(ONCE_REWRITE_TAC[GSYM IN]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN EXPAND_TAC "f");
(ONCE_REWRITE_TAC
[MESON[IN] `(mcell x' V wl INTER S3) x <=> x IN (mcell x' V wl INTER S3)`]);
(REWRITE_TAC[IN_INTER; IN]);
(MESON_TAC[]);
(NEW_GOAL `!s1. s1 IN SPP ==> measurable (s1:(real^3->bool))`);
(EXPAND_TAC "SPP" THEN EXPAND_TAC "f" THEN REWRITE_TAC[IMAGE;IN;
IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ONCE_ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_INTER);
(STRIP_TAC);
(MATCH_MP_TAC MEASURABLE_MCELL);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `?k. k <= 4 /\ ~negligible (mcell k V wl INTER S3)`);
(REWRITE_WITH `(?k. k <= 4 /\ ~negligible (mcell k V wl INTER S3)) <=>
~(!k. (k <= 4) ==> negligible (mcell k V wl INTER S3))`);
(MESON_TAC[]);
(STRIP_TAC);
(NEW_GOAL `negligible (UNIONS (SPP:(real^3->bool)->bool))`);
(MATCH_MP_TAC NEGLIGIBLE_UNIONS);
(ASM_REWRITE_TAC[]);
(EXPAND_TAC "SPP" THEN EXPAND_TAC "f");
(REWRITE_TAC[IMAGE]);
(REWRITE_TAC[IN; IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(ONCE_ASM_REWRITE_TAC[]);
(FIRST_ASSUM MATCH_MP_TAC);
(UNDISCH_TAC `(SP:num->bool) x`);
(EXPAND_TAC "SP" THEN REWRITE_TAC[IN_ELIM_THM]);
(MESON_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[GSYM
(ASSUME `S3 = UNIONS (SPP:(real^3->bool)->bool)`)]);
(REWRITE_WITH `~NULLSET S3 <=> &0 < measure (S3:real^3->bool)`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(MATCH_MP_TAC MEASURABLE_MEASURE_POS_LT);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC THEN EXISTS_TAC `k:num`
THEN EXISTS_TAC `mcell k V wl INTER S3`);
(REPEAT STRIP_TAC);
(ASM_REWRITE_TAC[]);
(SET_TAC[]);
(MATCH_MP_TAC MEASURABLE_INTER);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_MCELL);
(ASM_REWRITE_TAC[]);
(REWRITE_WITH `&0 < measure (mcell k V wl INTER S3) <=>
~negligible (mcell k V wl INTER S3)`);
(MATCH_MP_TAC MEASURABLE_MEASURE_POS_LT);
(MATCH_MP_TAC MEASURABLE_INTER);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC MEASURABLE_MCELL);
(ASM_REWRITE_TAC[]);
(ASM_REWRITE_TAC[]);
(SET_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(* -------------------------------------------------------------------------- *)
(* OK here *)
(NEW_GOAL `?S5. S5 SUBSET S4 /\ measurable S5 /\ &0 < measure S5 /\
(!h. ~(h = k) /\ h <= 4 ==> (S5 INTER mcell h V wl = {}))`);
(NEW_GOAL `?Z. !p. saturated V /\ packing V /\ barV V 3 wl
==> NULLSET Z /\
(p IN rogers V wl DIFF Z
==> (?!i. i <= 4 /\ p IN mcell i V wl))`);
(ASM_REWRITE_TAC[SLTSTLO2]);
(UP_ASM_TAC THEN STRIP_TAC);
(NEW_GOAL `NULLSET Z /\ !p. (p IN rogers V wl DIFF Z
==> (?!i. i <= 4 /\ p IN mcell i V wl))`);
(NEW_GOAL `!p. NULLSET Z /\ (p IN rogers V wl DIFF Z
==> (?!i. i <= 4 /\ p IN mcell i V wl))`);
(GEN_TAC THEN FIRST_ASSUM MATCH_MP_TAC);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN MESON_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[EXISTS_UNIQUE] THEN STRIP_TAC);
(EXISTS_TAC `S4 DIFF (Z:real^3->bool)`);
(REPEAT STRIP_TAC);
(SET_TAC[]);
(MATCH_MP_TAC MEASURABLE_DIFF);
(ASM_REWRITE_TAC[]);
(ASM_MESON_TAC[MEASURABLE_RULES]);
(REWRITE_WITH `measure (S4 DIFF Z) = measure (S4:real^3->bool)`);
(MATCH_MP_TAC MEASURE_NEGLIGIBLE_SYMDIFF);
(MATCH_MP_TAC NEGLIGIBLE_SUBSET);
(EXISTS_TAC `Z:real^3->bool`);
(ASM_REWRITE_TAC[]);
(SET_TAC[]);
(ASM_REWRITE_TAC[]);
(REWRITE_TAC[SET_RULE `A = {} <=> (!x. x IN A ==> F)`]);
(GEN_TAC THEN STRIP_TAC);
(NEW_GOAL `x IN mcell k V wl`);
(MATCH_MP_TAC (SET_RULE `x IN (S4 DIFF Z) INTER mcell h V wl /\
(S4 DIFF Z) INTER mcell h V wl SUBSET A ==> x IN A`));
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(NEW_GOAL `x IN rogers V wl DIFF Z`);
(ASM_SET_TAC[]);
(NEW_GOAL `(?i. (i <= 4 /\ x IN mcell i V wl) /\
(!y. y <= 4 /\ x IN mcell y V wl ==> y = i))`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_REWRITE_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(NEW_GOAL `k = i':num`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `h = i':num`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(UP_ASM_TAC THEN STRIP_TAC);
(* -------------------------------------------------------------------------- *)
(* OK here *)
(NEW_GOAL `mcell i V ul SUBSET
UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
(MATCH_MP_TAC QZKSYKG2);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `~(S5 = {}:real^3->bool)`);
(STRIP_TAC);
(NEW_GOAL `negligible (S5:real^3->bool)`);
(ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
(NEW_GOAL `vol (S5) = &0`);
(ASM_SIMP_TAC[volume_props]);
(ASM_REAL_ARITH_TAC);
(UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `~(S = {}) <=> (?x. x IN S)`]);
(STRIP_TAC);
(NEW_GOAL `S5 SUBSET mcell i V ul /\ S5 SUBSET mcell j V vl`);
(ASM_SET_TAC[]);
(NEW_GOAL `S5 SUBSET
UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
(UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
(NEW_GOAL `x IN UNIONS {rogers V (left_action_list p ul) | p permutes 0..i - 1}`);
(UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM] THEN STRIP_TAC);
(ABBREV_TAC `kl:(real^3)list = left_action_list p ul`);
(NEW_GOAL `barV V 3 kl`);
(MATCH_MP_TAC QZKSYKG1);
(EXISTS_TAC `ul:(real^3)list`);
(EXISTS_TAC `i:num` THEN EXISTS_TAC `p:num->num`);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `x IN mcell i V ul`);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN SET_TAC[]);
(NEW_GOAL `rogers V kl = rogers V wl`);
(ASM_CASES_TAC `rogers V kl = rogers V wl`);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `F`);
(NEW_GOAL `S3 INTER rogers V kl = {}`);
(ASM_SIMP_TAC[]);
(UP_ASM_TAC THEN ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(NEW_GOAL `mcell i V kl = mcell i V ul`);
(EXPAND_TAC "kl");
(MATCH_MP_TAC RVFXZBU);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `mcell i V kl = mcell i V wl`);
(MATCH_MP_TAC DDZUPHJ);
(ASM_REWRITE_TAC[]);
(STRIP_TAC);
(MATCH_MP_TAC VOL_POS_LT_AFF_DIM_3);
(ASM_SIMP_TAC[MEASURABLE_ROGERS]);
(NEW_GOAL `vol S5 <= vol (rogers V wl)`);
(MATCH_MP_TAC MEASURE_SUBSET);
(ASM_SIMP_TAC[MEASURABLE_ROGERS]);
(ASM_SET_TAC[]);
(ASM_REAL_ARITH_TAC);
(ASM_SET_TAC[]);
(NEW_GOAL `mcell j V vl SUBSET
UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
(MATCH_MP_TAC QZKSYKG2);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `~(S5 = {}:real^3->bool)`);
(STRIP_TAC);
(NEW_GOAL `negligible (S5:real^3->bool)`);
(ASM_REWRITE_TAC[NEGLIGIBLE_EMPTY]);
(NEW_GOAL `vol (S5) = &0`);
(ASM_SIMP_TAC[volume_props]);
(ASM_REAL_ARITH_TAC);
(UP_ASM_TAC THEN REWRITE_TAC[SET_RULE `~(S = {}) <=> (?x. x IN S)`]);
(STRIP_TAC);
(NEW_GOAL `S5 SUBSET
UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
(SET_TAC[ASSUME `S5 SUBSET mcell i V ul /\ S5 SUBSET mcell j V vl`; ASSUME
`mcell j V vl SUBSET
UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`]);
(NEW_GOAL `x' IN UNIONS {rogers V (left_action_list q vl) | q permutes 0..j - 1}`);
(UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);
(UP_ASM_TAC THEN REWRITE_TAC[IN_UNIONS; IN; IN_ELIM_THM] THEN STRIP_TAC);
(ABBREV_TAC `sl:(real^3)list = left_action_list q vl`);
(NEW_GOAL `barV V 3 sl`);
(MATCH_MP_TAC QZKSYKG1);
(EXISTS_TAC `vl:(real^3)list`);
(EXISTS_TAC `j:num` THEN EXISTS_TAC `q:num->num`);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(NEW_GOAL `rogers V sl = rogers V wl`);
(ASM_CASES_TAC `rogers V sl = rogers V wl`);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `F`);
(NEW_GOAL `S3 INTER rogers V sl = {}`);
(ASM_SIMP_TAC[]);
(ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(NEW_GOAL `mcell j V sl = mcell j V vl`);
(EXPAND_TAC "sl");
(MATCH_MP_TAC RVFXZBU);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `mcell j V sl = mcell j V wl`);
(MATCH_MP_TAC DDZUPHJ);
(ASM_REWRITE_TAC[]);
(STRIP_TAC);
(MATCH_MP_TAC VOL_POS_LT_AFF_DIM_3);
(ASM_SIMP_TAC[MEASURABLE_ROGERS]);
(NEW_GOAL `vol S5 <= vol (rogers V wl)`);
(MATCH_MP_TAC MEASURE_SUBSET);
(ASM_SIMP_TAC[MEASURABLE_ROGERS]);
(ASM_SET_TAC[]);
(ASM_REAL_ARITH_TAC);
(ASM_SET_TAC[]);
(NEW_GOAL `S5 SUBSET (mcell i V ul INTER mcell j V vl)`);
(ASM_REWRITE_TAC[]);
(ASM_SET_TAC[]);
(UP_ASM_TAC THEN REWRITE_WITH
`mcell i V ul = mcell i V wl /\ mcell j V vl = mcell j V wl`);
(ASM_MESON_TAC[]);
(STRIP_TAC);
(NEW_GOAL `i = k:num`);
(ASM_CASES_TAC `i = k:num`);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `S5 INTER mcell i V wl = {}`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_REWRITE_TAC[UP_TO_4_KY_LEMMA]);
(NEW_GOAL `F`);
(UP_ASM_TAC THEN ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(NEW_GOAL `j = k:num`);
(ASM_CASES_TAC `j = k:num`);
(ASM_REWRITE_TAC[]);
(NEW_GOAL `S5 INTER mcell j V wl = {}`);
(FIRST_ASSUM MATCH_MP_TAC);
(ASM_REWRITE_TAC[UP_TO_4_KY_LEMMA]);
(NEW_GOAL `F`);
(UP_ASM_TAC THEN ASM_SET_TAC[]);
(ASM_MESON_TAC[]);
(ASM_REWRITE_TAC[])]);;
end;;