(* ========================================================================= *)
(* FLYSPECK - BOOK FORMALIZATION *)
(* *)
(* Authour : VU KHAC KY *)
(* Book lemma: HDTFNFZ *)
(* Chaper : Packing (Marchal cells) *)
(* *)
(* ========================================================================= *)
(* ========================================================================= *)
(* FILES NEED TO BE LOADED *)
(* flyspeck_needs "packing/marchal_cells_2_new.hl";; *)
(* flyspeck_needs "packing/LEPJBDJ.hl";; *)
(* ========================================================================= *)
module Hdtfnfz = 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;;
let HDTFNFZ_concl =
`!V ul k v X.
saturated V /\
packing V /\
barV V 3 ul /\
X = mcell k V ul /\ ~(NULLSET X)
==> VX V X = V INTER X`;;
let HDTFNFZ = prove_by_refinement (HDTFNFZ_concl,
[(REPEAT STRIP_TAC);
(REWRITE_TAC[VX]);
(COND_CASES_TAC);
(NEW_GOAL `F`);
(ASM_MESON_TAC[]);
(ASM_MESON_TAC[]);
(LET_TAC);
(COND_CASES_TAC); (* break into 2 subgoals k' = 0 and k' > 0 *)
(UNDISCH_TAC `cell_params V X = k',ul'`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_TAC[cell_params]);
(ABBREV_TAC `P = (\(k,ul). k <= 4 /\ ul IN barV V 3 /\ X = mcell k V ul)`);
(DISCH_TAC);
(NEW_GOAL `(P:(num#(real^3)list->bool)) (k',ul')`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC SELECT_AX);
(EXISTS_TAC `((if (k <= 3) then k else 4),ul:(real^3)list)`);
(EXPAND_TAC "P");
(COND_CASES_TAC);
(REWRITE_TAC[BETA_THM]);
(REWRITE_TAC[IN] THEN ASM_REWRITE_TAC[]);
(ASM_ARITH_TAC);
(REWRITE_TAC[BETA_THM]);
(REWRITE_TAC[IN] THEN ASM_REWRITE_TAC[ARITH_RULE `4 <= 4`]);
(REWRITE_WITH `mcell k V ul = mcell4 V ul`);
(ASM_SIMP_TAC [MCELL_EXPLICIT; ARITH_RULE `~(k <= 3) ==> (k >= 4)`]);
(REWRITE_WITH `mcell 4 V ul = mcell4 V ul`);
(ASM_SIMP_TAC [MCELL_EXPLICIT; ARITH_RULE `(4 >= 4)`]);
(UP_ASM_TAC THEN EXPAND_TAC "P");
(REWRITE_TAC[BETA_THM] THEN STRIP_TAC);
(REWRITE_TAC[ASSUME `X = mcell k' V ul'`; ASSUME `k' = 0` ]);
(MATCH_MP_TAC LEPJBDJ_0);
(ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);
(* Finish the case k' = 0 *)
(* Continue with the case k' > 0 *)
(UNDISCH_TAC `cell_params V X = k',ul'`);
(ONCE_REWRITE_TAC[EQ_SYM_EQ]);
(REWRITE_TAC[cell_params]);
(ABBREV_TAC `P = (\(k,ul). k <= 4 /\ ul IN barV V 3 /\ X = mcell k V ul)`);
(DISCH_TAC);
(NEW_GOAL `(P:(num#(real^3)list->bool)) (k',ul')`);
(ASM_REWRITE_TAC[]);
(MATCH_MP_TAC SELECT_AX);
(EXISTS_TAC `((if (k <= 3) then k else 4),ul:(real^3)list)`);
(EXPAND_TAC "P");
(COND_CASES_TAC);
(REWRITE_TAC[BETA_THM]);
(REWRITE_TAC[IN] THEN ASM_REWRITE_TAC[]);
(ASM_ARITH_TAC);
(REWRITE_TAC[BETA_THM]);
(REWRITE_TAC[IN] THEN ASM_REWRITE_TAC[ARITH_RULE `4 <= 4`]);
(REWRITE_WITH `mcell k V ul = mcell4 V ul`);
(ASM_SIMP_TAC [MCELL_EXPLICIT; ARITH_RULE `~(k <= 3) ==> (k >= 4)`]);
(REWRITE_WITH `mcell 4 V ul = mcell4 V ul`);
(ASM_SIMP_TAC [MCELL_EXPLICIT; ARITH_RULE `(4 >= 4)`]);
(UP_ASM_TAC THEN EXPAND_TAC "P");
(REWRITE_TAC[BETA_THM] THEN STRIP_TAC);
(REWRITE_TAC[ASSUME `X = mcell k' V ul'`]);
(MATCH_MP_TAC LEPJBDJ);
(ASM_REWRITE_TAC[]);
(REPEAT STRIP_TAC);
(ASM_SET_TAC[]);
(ASM_ARITH_TAC);
(NEW_GOAL `X:real^3->bool = {}`);
(ASM_MESON_TAC[]);
(NEW_GOAL `NULLSET (X:real^3->bool)`);
(ASM_MESON_TAC[NEGLIGIBLE_EMPTY]);
(ASM_MESON_TAC[])]);;
end;;