(* ========================================================================== *)
(* FLYSPECK - BOOK FORMALIZATION *)
(* *)
(* Chapter: Tame Hypermap *)
(* Author: Alexey Solovyev *)
(* Date: 2010-06-17 *)
(* Note: use Tame_lemmas.sum_tauVEF_upper_bound because the theorem below *)
(* has unproved assumptions *)
(* ========================================================================== *)
(* Proof of HRXEFDM *)
flyspeck_needs "tame/TameGeneral.hl";;
module Hrxefdm_tame = struct
open Hypermap;;
open Fan_defs;;
open Tame_defs;;
open Tame_general;;
open Hypermap_and_fan;;
let tauVEF_alt1 = prove(`!V E f. conforming (V,E) /\ f
IN face_set_of_fan (V,E) ==>
tauVEF (V,E,f) = sol (
vec 0) (
dartset_leads_into (
vec 0,V,E) f) + (&2 - &(
CARD f)) * sol0 - sol0 /
pi *
sum f (\x.
azim_dart (V,E) x * (lmfun (
h_dart x) - &1))`,
REWRITE_TAC[
face_set_of_fan; conforming;
conforming_solid_angle] THEN
REPEAT STRIP_TAC THEN
FIRST_X_ASSUM (MP_TAC o SPEC `f:real^3#real^3->bool`) THEN
ASM_REWRITE_TAC[] THEN
DISCH_THEN (MP_TAC o let_RULE) THEN
DISCH_THEN (CONJUNCTS_THEN2 (fun
th -> ALL_TAC) MP_TAC) THEN
DISCH_THEN (CONJUNCTS_THEN2 (fun
th -> ALL_TAC) MP_TAC) THEN
DISCH_THEN (fun
th -> REWRITE_TAC[
th]) THEN
REWRITE_TAC[tauVEF] THEN
REWRITE_TAC[REAL_ARITH `a * (&1 + b * (&1 - c)) = a - b * (a * (c - &1))`] THEN
SUBGOAL_THEN `FINITE (f:real^3#real^3->bool)` ASSUME_TAC THENL
[
POP_ASSUM MP_TAC THEN
REWRITE_TAC[
face_set;
set_of_orbits; GSYM face] THEN
REWRITE_TAC[
IN_ELIM_THM] THEN STRIP_TAC THEN
ASM_REWRITE_TAC[
FACE_FINITE];
ALL_TAC
] THEN
ASM_SIMP_TAC[
SUM_SUB;
SUM_LMUL;
SUM_CONST] THEN
REAL_ARITH_TAC);;
let scriptL_lemma = prove(`!V E.
FAN (
vec 0,V,E)
==> scriptL V =
sum (
node_set (
hypermap_of_fan (V,E))) (\n. lmfun (
h_dart (
CHOICE n)))`,
REPEAT STRIP_TAC THEN
REWRITE_TAC[scriptL] THEN
MP_TAC (SPEC_ALL
NODE_SET_AS_IMAGE) THEN
ASM_REWRITE_TAC[] THEN
REPEAT STRIP_TAC THEN
ASM_REWRITE_TAC[] THEN
SUBGOAL_THEN `(\v:real^3. lmfun (
norm v / &2)) = (\n. lmfun (
h_dart (
CHOICE n))) o (f:real^3->(real^3#real^3->bool))` MP_TAC THENL
[
ASM_REWRITE_TAC[
FUN_EQ_THM;
o_THM;
h_dart];
ALL_TAC
] THEN
DISCH_THEN (fun
th -> REWRITE_TAC[
th]) THEN
MATCH_MP_TAC (GSYM
SUM_IMAGE) THEN
REPEAT STRIP_TAC THEN
FIRST_X_ASSUM (MP_TAC o SPECL [`x:real^3`; `y:real^3`]) THEN
ASM_SIMP_TAC[]);;
let HRXEFDM_lemma1 = prove(`!V E.
FAN (
vec 0,V,E) ==>
sum (
face_set_of_fan (V,E)) (\f.
sum f (\x.
azim_dart (V,E) x * lmfun (
h_dart x)))
= &2 *
pi * scriptL V`,
REPEAT STRIP_TAC THEN
SUBGOAL_THEN `!n. n
IN node_set (
hypermap_of_fan (V,E)) ==>
sum n (
azim_dart (V,E)) = &2 *
pi` ASSUME_TAC THENL
[
GEN_TAC THEN
REWRITE_TAC[
node_set;
set_of_orbits; GSYM node] THEN
REWRITE_TAC[
IN_ELIM_THM] THEN
ASM_SIMP_TAC[dart;
HYPERMAP_OF_FAN] THEN
STRIP_TAC THEN
MP_TAC (SPEC_ALL
SUM_AZIM_DART) THEN
ASM_SIMP_TAC[];
ALL_TAC
] THEN
REWRITE_TAC[
face_set_of_fan;
DART_SUM_lemma] THEN
REWRITE_TAC[GSYM (SPEC_ALL
DART_SUM_lemma)] THEN
ABBREV_TAC `g = (\n.
sum n (\x.
azim_dart (V,E) x * lmfun (
h_dart x)))` THEN
MP_TAC (ISPECL [`g:(real^3#real^3->bool)->
real`; `
node_set (
hypermap_of_fan (V,E))`]
SUM_RESTRICT) THEN
REWRITE_TAC[
FINITE_HYPERMAP_ORBITS] THEN
DISCH_TAC THEN
SUBGOAL_THEN `!n. n
IN node_set (
hypermap_of_fan (V,E)) ==> g n = &2 *
pi * lmfun (
h_dart (
CHOICE n))` MP_TAC THENL
[
REMOVE_ASSUM THEN GEN_TAC THEN
POP_ASSUM (fun
th -> REWRITE_TAC[SYM
th]) THEN
DISCH_TAC THEN
FIRST_ASSUM (fun
th -> FIRST_X_ASSUM (ASSUME_TAC o (fun
th2 -> MATCH_MP
th2 th))) THEN
MP_TAC (ISPECL [`(\x.
azim_dart (V,E) x * lmfun (
h_dart x))`; `n:real^3#real^3->bool`]
SUM_RESTRICT) THEN
SUBGOAL_THEN `FINITE (n:real^3#real^3->bool)` ASSUME_TAC THENL
[
REMOVE_ASSUM THEN POP_ASSUM MP_TAC THEN
REWRITE_TAC[
node_set;
set_of_orbits; GSYM node] THEN
REWRITE_TAC[
IN_ELIM_THM] THEN STRIP_TAC THEN
ASM_REWRITE_TAC[
NODE_FINITE];
ALL_TAC
] THEN
ASM_REWRITE_TAC[] THEN
DISCH_TAC THEN
ABBREV_TAC `c = lmfun (
h_dart (
CHOICE (n:real^3#real^3->bool)))` THEN
SUBGOAL_THEN `!x. (if x
IN n then
azim_dart (V,E) x * lmfun (
h_dart x) else &0) = (if x
IN n then
azim_dart (V,E) x * c else &0)` MP_TAC THENL
[
GEN_TAC THEN
ASM_CASES_TAC `x:real^3#real^3
IN n` THEN ASM_REWRITE_TAC[] THEN
SUBGOAL_THEN `
h_dart (x:real^3#real^3) =
h_dart (
CHOICE (n:real^3#real^3->bool))` (fun
th -> ASM_REWRITE_TAC[
th]) THEN
MP_TAC (ISPECL [`h_dart:real^3#real^3->
real`; `n:real^3#real^3->bool`]
CHOICE_CONST_LEMMA) THEN
ANTS_TAC THENL
[
REPEAT STRIP_TAC THEN
REWRITE_TAC[
h_dart] THEN
AP_THM_TAC THEN AP_TERM_TAC THEN
AP_TERM_TAC THEN
MP_TAC (SPEC_ALL
FST_NODE_lemma) THEN
ASM_REWRITE_TAC[] THEN
DISCH_THEN MATCH_MP_TAC THEN
ASM_REWRITE_TAC[];
ALL_TAC
] THEN
DISCH_THEN MATCH_MP_TAC THEN
ASM_REWRITE_TAC[];
ALL_TAC
] THEN
REMOVE_ASSUM THEN
DISCH_TAC THEN
FIRST_X_ASSUM (MP_TAC o check (is_eq o concl)) THEN
ASM_REWRITE_TAC[] THEN
DISCH_THEN (fun
th -> REWRITE_TAC[SYM
th]) THEN
MP_TAC (ISPECL [`(\x.
azim_dart (V,E) x * c)`; `n:real^3#real^3->bool`]
SUM_RESTRICT) THEN
ASM_SIMP_TAC[
SUM_RMUL; ETA_AX] THEN
REWRITE_TAC[REAL_MUL_ASSOC];
ALL_TAC
] THEN
POP_ASSUM (fun
th -> REWRITE_TAC[SYM
th]) THEN
DISCH_TAC THEN
SUBGOAL_THEN `!x. (if x
IN node_set (
hypermap_of_fan (V,E)) then g x else &0) = (if x
IN node_set (
hypermap_of_fan (V,E)) then &2 *
pi * lmfun (
h_dart (
CHOICE x)) else &0)` MP_TAC THENL
[
GEN_TAC THEN
ASM_CASES_TAC `x
IN node_set (
hypermap_of_fan (V,E))` THEN ASM_REWRITE_TAC[] THEN
ASM_SIMP_TAC[];
ALL_TAC
] THEN
DISCH_THEN (fun
th -> REWRITE_TAC[
th]) THEN
MP_TAC (ISPECL [`(\x:real^3#real^3->bool. &2 *
pi * lmfun (
h_dart (
CHOICE x)))`; `
node_set (
hypermap_of_fan (V,E))`]
SUM_RESTRICT) THEN
REWRITE_TAC[
FINITE_HYPERMAP_ORBITS] THEN
DISCH_THEN (fun
th -> REWRITE_TAC[
th]) THEN
REWRITE_TAC[
SUM_LMUL] THEN
ASM_SIMP_TAC[
scriptL_lemma]);;
let solid_angle_sum_assumption = `!V E. sum (face_set_of_fan (V,E)) (\f. sol (vec 0) (dartset_leads_into (vec 0,V,E) f) ) = &4 * pi`;;
let HRXEFDM_concl = `!V. contravening V ==>
( sum (face_set_of_fan (V,ESTD V)) (\ f. tauVEF (V,ESTD V,f) ) < &4 * pi - &20 * sol0 )`;;
let HRXEFDM_concl2 = mk_imp (list_mk_conj [`!V. contravening V ==> conforming (V,ESTD V)`;
solid_angle_sum_assumption], HRXEFDM_concl);;
(* g (HRXEFDM_concl2);; *)
let HRXEFDM = prove(HRXEFDM_concl2,
REPEAT STRIP_TAC THEN
REPEAT (FIRST_X_ASSUM (ASSUME_TAC o SPEC `V:real^3->bool`)) THEN
POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
MP_TAC (SPEC_ALL CONTRAVENING_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
FIRST_X_ASSUM (ASSUME_TAC o SPEC `ESTD V`) THEN
SUBGOAL_THEN `FINITE (face_set_of_fan (V,ESTD V))` ASSUME_TAC THENL
[
REWRITE_TAC[face_set_of_fan; FINITE_HYPERMAP_ORBITS];
ALL_TAC
] THEN
SUBGOAL_THEN `sum (face_set_of_fan (V,ESTD V)) (\f. tauVEF (V,ESTD V,f)) = &4 * pi * (&1 + sol0 / pi) - sol0 / pi * &2 * pi * scriptL V` ASSUME_TAC THENL
[
MP_TAC (ISPECL [`\f. tauVEF (V,ESTD V,f)`; `face_set_of_fan (V,ESTD V)`] SUM_RESTRICT) THEN
ASM_REWRITE_TAC[] THEN
DISCH_THEN (fun th -> REWRITE_TAC[SYM th]) THEN
ABBREV_TAC `g = (\f. sol (vec 0) (dartset_leads_into (vec 0,V,ESTD V) f) * (&1 + sol0 / pi) - sol0 / pi * sum f (\x. azim_dart (V,ESTD V) x * lmfun (h_dart x)))` THEN
SUBGOAL_THEN `!x. (if x IN face_set_of_fan (V,ESTD V) then tauVEF (V,ESTD V,x) else &0) = (if x IN face_set_of_fan (V,ESTD V) then g x else &0)` (fun th -> REWRITE_TAC[th]) THENL
[
X_GEN_TAC `f:real^3#real^3->bool` THEN
ASM_CASES_TAC `f IN face_set_of_fan (V,ESTD V)` THEN ASM_REWRITE_TAC[] THEN
EXPAND_TAC "g" THEN
MATCH_MP_TAC tauVEF_alt2 THEN
ASM_REWRITE_TAC[];
ALL_TAC
] THEN
MP_TAC (ISPECL [`(\x. g x):(real^3#real^3->bool)->real`; `face_set_of_fan (V,ESTD V)`] SUM_RESTRICT) THEN
ASM_REWRITE_TAC[] THEN
DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
POP_ASSUM (fun th -> REWRITE_TAC[SYM th]) THEN
ASM_SIMP_TAC[SUM_SUB; SUM_RMUL; SUM_LMUL] THEN
ASM_SIMP_TAC[HRXEFDM_lemma1] THEN
REAL_ARITH_TAC;
ALL_TAC
] THEN
POP_ASSUM (fun th -> REWRITE_TAC[th]) THEN
ASSUME_TAC PI_POS THEN
ASM_SIMP_TAC[REAL_FIELD `&0 < pi ==> &4 * pi * (&1 + sol0 / pi) = &4 * pi + &4 * sol0`] THEN
ASM_SIMP_TAC[REAL_FIELD `&0 < pi ==> sol0 / pi * &2 * pi * a = &2 * a * sol0`] THEN
REWRITE_TAC[REAL_ARITH `(&4 * pi + &4 * a) - (&2 * b * a) = (&4 * pi - &20 * a) + &2 * a * (&12 - b)`] THEN
REWRITE_TAC[REAL_ARITH `a + b < a <=> b < &0`] THEN
ONCE_REWRITE_TAC[REAL_ARITH `&0 = (&2 * sol0) * &0`] THEN
REWRITE_TAC[REAL_MUL_ASSOC] THEN
MATCH_MP_TAC REAL_LT_LMUL THEN
CONJ_TAC THENL
[
MATCH_MP_TAC REAL_LT_MUL THEN
REWRITE_TAC[REAL_ARITH `&0 < &2`; sol0_POS];
ALL_TAC
] THEN
REWRITE_TAC[REAL_ARITH `a - b < &0 <=> b > a`] THEN
FIRST_X_ASSUM (MP_TAC o check (fun th -> rator (concl th) = `contravening`)) THEN
SIMP_TAC[contravening]);;
end;;