(* ========================================================================= *)
(* FLYSPECK - BOOK FORMALIZATION *)
(* *)
(* Authour : VU KHAC KY *)
(* Book lemma: UPFZBZM *)
(* Chaper : Packing (Clusters) *)
(* Date : October 3, 2010 *)
(* *)
(* ========================================================================= *)
(* ========================================================================= *)
(* Supporting lemmas for UPFZBZM *)
(* Chaper : Packing (Clusters) *)
(* *)
(* ========================================================================= *)
(* ========================================================================= *)
(* FILES NEED TO BE LOADED *)
(* ========================================================================= *)
flyspeck_needs "jordan/refinement.hl";;
flyspeck_needs "jordan/hash_term.hl";;
flyspeck_needs "jordan/parse_ext_override_interface.hl";;
flyspeck_needs "jordan/real_ext.hl";;
flyspeck_needs "jordan/lib_ext.hl";;
flyspeck_needs "jordan/tactics_jordan.hl";;
flyspeck_needs "jordan/num_ext_nabs.hl";;
flyspeck_needs "jordan/taylor_atn.hl";;
flyspeck_needs "jordan/float.hl";;
flyspeck_needs "jordan/flyspeck_constants.hl";;
(* flyspeck_needs "packing/lemma_negligible.hl";; *)
flyspeck_needs "nonlinear/vukhacky_tactics.hl";;
flyspeck_needs "packing/pack_defs.hl";;
flyspeck_needs "packing/pack_concl.hl";;
(* flyspeck_needs "packing/beta_pair_thm.hl";; *)
module Upfzbzm_support_lemmas = struct
open Flyspeck_constants;;
open Pack_defs;;
open Pack_concl;;
open Vukhacky_tactics;;
let CHANGED_SET_TAC =
let basicthms =
[NOT_IN_EMPTY; IN_UNIV; IN_UNION; IN_INTER; IN_DIFF; IN_INSERT;
IN_DELETE; IN_REST; IN_INTERS; IN_UNIONS; IN_IMAGE] in
let allthms = basicthms @ map (REWRITE_RULE[IN]) basicthms @
[IN_ELIM_THM; IN] in
let PRESET_TAC =
TRY(POP_ASSUM_LIST(MP_TAC o end_itlist CONJ)) THEN
REPEAT COND_CASES_TAC THEN
REWRITE_TAC[EXTENSION; SUBSET; PSUBSET; DISJOINT; SING] THEN
REWRITE_TAC allthms in
fun ths ->
PRESET_TAC THEN
(if ths = [] then ALL_TAC else MP_TAC(end_itlist CONJ ths)) THEN
MESON_TAC[];;
let CHANGED_SET_RULE tm = prove(tm,CHANGED_SET_TAC[]);;
(*-------------------------------------------------------------------------- *)
(*
let UPFZBZM_concl =
`!V. saturated V /\ packing V /\ cell_cluster_estimate_v1 V /\
marchal_inequality /\
lmfun_inequality V ==>
(?G. negligible_fun_0 G V /\ fcc_compatible G V)`;;
*)
(* ------------------------------------------------------------------------- *)
(*
let SUM_GAMMAX_LMFUN_ESTIMATE_concl =
`!V. ?c. !r. saturated V /\ packing V /\ &1 <= r /\
cell_cluster_estimate_v1 V /\ marchal_inequality /\
lmfun_inequality V ==>
c * r pow 2 <= sum {X | X SUBSET ball (vec 0, r) /\ mcell_set V X}
(\X. gammaX V X lmfun)`;;
*)
let KIZHLTL3_new_concl =
`!V. ?c. !r. saturated V /\
packing V /\
&1 <= r
==> (&8 * mm2 / pi) *
sum {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}
(\X. sum (edgeX V X)
(\({u, v}). dihX V X (u,v) * lmfun (hl [u; v]))) +
c * r pow 2 <=
&8 * mm2 *
sum (V INTER ball (vec 0,r))
(\u. sum
{v | v IN V /\ ~(u = v) /\ dist (u,v) <= &2 * h0 }
(\v. lmfun (hl [u; v])))`;;
(* ========================================================================= *)
(* SOME COMPLEMENTARY LEMMAS *)
(* ========================================================================= *)
(* ========================================================================= *)
let tau0_not_zero = prove_by_refinement (
`~(tau0 = &0)`,
[(SUBGOAL_THEN `#1.54065 < tau0` ASSUME_TAC);
(REWRITE_TAC[bounds]);
(STRIP_TAC);
(ASM_MESON_TAC[REAL_ARITH `~(#1.54065 < &0)`])]);;
(* ========================================================================= *)
(* ========================================================================= *)
let FINITE_PACK_LEMMA = Packing3.KIUMVTC;;
(* Lemma 1 *)
let john_harrison_lemma2 = MESON[] `(?x. P x) /\ (@x. P x) = a ==> P a`;;
let JOHN_SELECT_THM = prove
(`(?x y. P x /\ Q y /\ R x y) /\
(@(x,y). P x /\ Q y /\ R x y) = (a,b)
==> P a /\ Q b /\ R a b`,
(* ------------------------------------------------------------------------- *)
(* Lemma 2 *)
(* ------------------------------------------------------------------------- *)
(* Lemma 3 *)
let m1_minus_12m2 = prove_by_refinement (
`mm1 - &12 * mm2 =
sqrt (&1 / &2)`,
[ (REWRITE_TAC[mm1;mm2]);
(REWRITE_TAC [REAL_ARITH `a * (b / c) = (a * b) / c`]);
(REWRITE_WITH
`&12 * (&6 * sol0 -
pi) *
sqrt (&2) = ((&6 * sol0 -
pi) *
sqrt (&8)) * &6`);
(REWRITE_TAC[REAL_ARITH`&12 * a * b = (a * &2 * b) * &6`]);
(MATCH_MP_TAC (MESON[
REAL_EQ_MUL_RCANCEL] `a = b ==> a * x = b * x`));
(MATCH_MP_TAC (MESON[
REAL_EQ_MUL_LCANCEL] `a = b ==> x * a = x * b`));
(REWRITE_TAC[REAL_ARITH `&8 = &4 * &2`]);
(REWRITE_WITH `
sqrt (&4 * &2) =
sqrt (&4) *
sqrt (&2)`);
(MATCH_MP_TAC
SQRT_MUL);
(REAL_ARITH_TAC);
(MATCH_MP_TAC (MESON[
REAL_EQ_MUL_RCANCEL] `a = b ==> a * x = b * x`));
(MATCH_MP_TAC
SQRT_RULE_Euler_lemma);
(REAL_ARITH_TAC);
(REWRITE_TAC[REAL_ARITH `(m * &6) / (&6 * tau0) = m * &6 / (tau0 * &6)`]);
(REWRITE_WITH `((&6 * sol0 -
pi) *
sqrt (&8)) * &6 / (tau0 * &6) =
((&6 * sol0 -
pi) *
sqrt (&8)) / tau0`);
(MATCH_MP_TAC
REDUCE_WITH_DIV_Euler_lemma);
(REWRITE_TAC[REAL_ARITH `~(&6 = &0)`;
tau0_not_zero]);
(REWRITE_TAC[REAL_ARITH `a / b - c / b = (a - c) / b`]);
(REWRITE_TAC[REAL_ARITH `a * x - b * x = (a - b) * x`]);
(REWRITE_WITH `sol0 - (&6 * sol0 -
pi) = tau0 / &4`);
(REWRITE_TAC[tau0]);
(REAL_ARITH_TAC);
(REWRITE_TAC[REAL_ARITH
`(tau0 / &4 * x) / tau0 = (tau0 / tau0) * (x / &4)`]);
(REWRITE_WITH `
sqrt (&8) / &4 =
sqrt (&1 / &2)`);
(REWRITE_TAC[REAL_ARITH `&1 / &2 = &8 / &16`]);
(REWRITE_WITH `
sqrt (&8 / &16) =
sqrt (&8) /
sqrt (&16)`);
(MATCH_MP_TAC
SQRT_DIV THEN REAL_ARITH_TAC);
(REWRITE_WITH `
sqrt (&16) = &4`);
(MATCH_MP_TAC (MESON[] `a = b ==> b = a`));
(MATCH_MP_TAC
SQRT_RULE_Euler_lemma THEN REAL_ARITH_TAC);
(MATCH_MP_TAC (MESON[REAL_MUL_LID] `x = &1 ==> x * y = y`));
(MATCH_MP_TAC
REAL_DIV_REFL);
(REWRITE_TAC[
tau0_not_zero])]);;
(* ------------------------------------------------------------------------- *)
(* Lemma 4 *)
let ZERO_LE_MM2_LEMMA =
MATCH_MP (REAL_ARITH `&0 < x ==> &0 <= x`) ZERO_LT_MM2_LEMMA;;
(* ------------------------------------------------------------------------- *)
(* Lemma 5 *)
let FINITE_edgeX = prove_by_refinement (
`!V X. FINITE (edgeX V X)`,
[(REPEAT GEN_TAC THEN REWRITE_TAC[edgeX;
VX]);
(COND_CASES_TAC);
(* Break into 2 subgoal *)
(REWRITE_WITH `{{u:real^3, v} | {} u /\ {} v /\ ~(u = v)} = {}`);
(* New Subgoal 1.1 *)
(CHANGED_SET_TAC[]); (* End subgoal 1.1 *)
(MESON_TAC[FINITE_CASES]); (* End Subgoal 1 *)
(REPEAT LET_TAC);
(SUBGOAL_THEN
`FINITE (
set_of_list (truncate_simplex (k - 1) (ul:(real^3)list)))`
ASSUME_TAC);
(REWRITE_TAC[
FINITE_SET_OF_LIST]);
(ABBREV_TAC `S =
set_of_list (truncate_simplex (k - 1) (ul:(real^3)list))`);
(MATCH_MP_TAC
FINITE_SUBSET);
(EXISTS_TAC `{t:real^3->bool | t
SUBSET S}`);
(STRIP_TAC);
(ASM_MESON_TAC[
FINITE_POWERSET]);
(REWRITE_TAC[
SUBSET;
IN_ELIM_THM]);
(REPEAT STRIP_TAC);
(REPLICATE_TAC 5 UP_ASM_TAC);
(CHANGED_SET_TAC[])]);;
(* ------------------------------------------------------------------------- *)
(* Lemma 6 *)
(* ------------------------------------------------------------------------- *)
(* Lemma 7 *)
(* ------------------------------------------------------------------------- *)
(* Lemma 8 *)
let DIHV_SYM = prove_by_refinement (
`!(x:real^N) y z t.
dihV x y z t =
dihV y x z t`,
[ (REPEAT GEN_TAC);
(REWRITE_TAC[
dihV] THEN REPEAT LET_TAC);
(MATCH_MP_TAC (MESON[]
`!a b c d x. (a = b) /\ (c = d) ==>
arcV x a c =
arcV x b d`));
(REPEAT STRIP_TAC);
(* Break into 2 subgoals with similar proofs *)
(* Subgoal 1 *)
(EXPAND_TAC "vap'" THEN EXPAND_TAC "vap");
(REWRITE_WITH `(va':real^N) = va - vc`);
(EXPAND_TAC "va'" THEN EXPAND_TAC "va" THEN EXPAND_TAC "vc");
(VECTOR_ARITH_TAC);
(REWRITE_WITH `(vc':real^N) = --vc`);
(EXPAND_TAC "vc'" THEN EXPAND_TAC "vc");
(VECTOR_ARITH_TAC);
(REWRITE_WITH
`(--vc
dot --vc) % (va:real^N - vc) = (vc
dot vc) % va - (vc
dot vc) % vc`);
(REWRITE_TAC[
DOT_RNEG;
DOT_LNEG;REAL_ARITH `-- --x = x `]);
(VECTOR_ARITH_TAC);
(MATCH_MP_TAC (VECTOR_ARITH `a = b + c ==> x:real^N - b - c = x - a `));
(REWRITE_WITH `((va:real^N - vc)
dot --vc) % --vc =
(va
dot vc) % vc - (vc
dot vc) % vc`);
(REWRITE_TAC[
DOT_RNEG;
DOT_LNEG;
VECTOR_MUL_LNEG;
VECTOR_MUL_RNEG]);
(REWRITE_TAC[
VECTOR_NEG_MINUS1;
VECTOR_MUL_ASSOC]);
(REWRITE_TAC[REAL_ARITH `-- &1 * -- &1 * x = x`;
DOT_LSUB;
VECTOR_SUB_RDISTRIB]);
(VECTOR_ARITH_TAC);
(* Subgoal 2 *)
(EXPAND_TAC "vbp'" THEN EXPAND_TAC "vbp");
(REWRITE_WITH `(vb':real^N) = vb - vc`);
(EXPAND_TAC "vb'" THEN EXPAND_TAC "vb" THEN EXPAND_TAC "vc");
(VECTOR_ARITH_TAC);
(REWRITE_WITH `(vc':real^N) = --vc`);
(EXPAND_TAC "vc'" THEN EXPAND_TAC "vc");
(VECTOR_ARITH_TAC);
(REWRITE_WITH
`(--vc
dot --vc) % (vb:real^N - vc) = (vc
dot vc) % vb - (vc
dot vc) % vc`);
(REWRITE_TAC[
DOT_RNEG;
DOT_LNEG;REAL_ARITH `-- --x = x `]);
(VECTOR_ARITH_TAC);
(MATCH_MP_TAC (VECTOR_ARITH `a = b + c ==> x:real^N - b - c = x - a `));
(REWRITE_WITH `((vb:real^N - vc)
dot --vc) % --vc =
(vb
dot vc) % vc - (vc
dot vc) % vc`);
(REWRITE_TAC[
DOT_RNEG;
DOT_LNEG;
VECTOR_MUL_LNEG;
VECTOR_MUL_RNEG]);
(REWRITE_TAC[
VECTOR_NEG_MINUS1;
VECTOR_MUL_ASSOC]);
(REWRITE_TAC[REAL_ARITH `-- &1 * -- &1 * x = x`;
DOT_LSUB;
VECTOR_SUB_RDISTRIB]);
(VECTOR_ARITH_TAC)]);;
(* ------------------------------------------------------------------------- *)
(* Lemma 9 *)
let DIHX_POS = prove_by_refinement (
`!u v V X. &0 <= dihX V X (u,v)`,
[(REPEAT STRIP_TAC THEN REWRITE_TAC[dihX; dihu2; dihu3;dihu4]);
(LET_TAC);
(COND_CASES_TAC);
(REAL_ARITH_TAC);
(COND_CASES_TAC);
(REWRITE_TAC[
DIHV_RANGE]);
(COND_CASES_TAC);
(REWRITE_TAC[
DIHV_RANGE]);
(COND_CASES_TAC);
(REWRITE_TAC[
DIHV_RANGE]);
(REAL_ARITH_TAC)]);;
(* ------------------------------------------------------------------------- *)
(* Lemma 10 *)
let pos_lemma = prove_by_refinement(
`!Q. (?C. (&0 <= C /\ (!r. &1 <= r ==> Q r <= C * r pow 2))) <=>
(?C. ( (!r. &1 <= r ==> Q r <= C * r pow 2)))`,
[(GEN_TAC);
EQ_TAC;
(REPEAT STRIP_TAC);
(EXISTS_TAC `C:real`);
(ASM_REWRITE_TAC[]);
(REPEAT STRIP_TAC);
(EXISTS_TAC `abs(C)`);
(REWRITE_TAC[REAL_ARITH `&0 <= abs C`]);
(REPEAT STRIP_TAC);
(ASSUME_TAC (REAL_ARITH `C <= abs C`));
(MATCH_MP_TAC
REAL_LE_TRANS);
(EXISTS_TAC `C * r pow 2`);
(CONJ_TAC);
(ASM_SIMP_TAC[]);
(REWRITE_TAC[REAL_ARITH `a * b <= c * b <=> &0 <= (c - a) * b`]);
(MATCH_MP_TAC
REAL_LE_MUL);
(REWRITE_TAC[
REAL_LE_POW_2] THEN ASM_REAL_ARITH_TAC)]);;
end;;