1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION *)
4 (* Chapter: Tame Hypermap *)
5 (* Author: Alexey Solovyev *)
7 (* Note: use Tame_lemmas.sum_tauVEF_upper_bound because the theorem below *)
8 (* has unproved assumptions *)
9 (* ========================================================================== *)
11 (* Proof of HRXEFDM *)
13 flyspeck_needs "tame/TameGeneral.hl";;
16 module Hrxefdm_tame = struct
23 open Hypermap_and_fan;;
26 let tauVEF_alt1 = prove(`!V E f. conforming (V,E) /\ f IN face_set_of_fan (V,E) ==>
27 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))`,
28 REWRITE_TAC[face_set_of_fan; conforming; conforming_solid_angle] THEN
30 FIRST_X_ASSUM (MP_TAC o SPEC `f:real^3#real^3->bool`) THEN
31 ASM_REWRITE_TAC[] THEN
32 DISCH_THEN (MP_TAC o let_RULE) THEN
33 DISCH_THEN (CONJUNCTS_THEN2 (fun th -> ALL_TAC) MP_TAC) THEN
34 DISCH_THEN (CONJUNCTS_THEN2 (fun th -> ALL_TAC) MP_TAC) THEN
35 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
37 REWRITE_TAC[tauVEF] THEN
38 REWRITE_TAC[REAL_ARITH `a * (&1 + b * (&1 - c)) = a - b * (a * (c - &1))`] THEN
39 SUBGOAL_THEN `FINITE (f:real^3#real^3->bool)` ASSUME_TAC THENL
42 REWRITE_TAC[face_set; set_of_orbits; GSYM face] THEN
43 REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
44 ASM_REWRITE_TAC[FACE_FINITE];
48 ASM_SIMP_TAC[SUM_SUB; SUM_LMUL; SUM_CONST] THEN
53 let tauVEF_alt2 = prove(`!V E f. conforming (V,E) /\ f IN face_set_of_fan (V,E)
54 ==> tauVEF (V,E,f) = sol (vec 0) (dartset_leads_into (vec 0,V,E) f) * (&1 + sol0 / pi) - sol0 / pi * sum f (\x. azim_dart (V,E) x * lmfun (h_dart x))`,
56 ASM_SIMP_TAC[tauVEF_alt1] THEN
57 REPEAT (POP_ASSUM MP_TAC) THEN
58 REWRITE_TAC[conforming; conforming_solid_angle; face_set_of_fan] THEN
60 FIRST_X_ASSUM (MP_TAC o SPEC `f:real^3#real^3->bool`) THEN
61 ASM_REWRITE_TAC[] THEN
62 DISCH_THEN (fun th -> REWRITE_TAC[let_RULE th]) THEN
64 SUBGOAL_THEN `FINITE (f:real^3#real^3->bool)` ASSUME_TAC THENL
67 REWRITE_TAC[face_set; set_of_orbits; GSYM face] THEN
68 REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
69 ASM_REWRITE_TAC[FACE_FINITE];
73 REWRITE_TAC[REAL_ARITH `a * (b - &1) = a * b - a`] THEN
74 ASM_SIMP_TAC[SUM_SUB; SUM_CONST] THEN
77 CONV_TAC REAL_FIELD);;
82 let CHOICE_CONST_LEMMA = prove(`!f s. (!x y. x IN s /\ y IN s ==> f x = f y) ==> (!x. x IN s ==> f x = f (CHOICE s))`,
86 let scriptL_lemma = prove(`!V E. FAN (vec 0,V,E)
87 ==> scriptL V = sum (node_set (hypermap_of_fan (V,E))) (\n. lmfun (h_dart (CHOICE n)))`,
89 REWRITE_TAC[scriptL] THEN
90 MP_TAC (SPEC_ALL NODE_SET_AS_IMAGE) THEN
91 ASM_REWRITE_TAC[] THEN
93 ASM_REWRITE_TAC[] THEN
95 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
97 ASM_REWRITE_TAC[FUN_EQ_THM; o_THM; h_dart];
101 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
102 MATCH_MP_TAC (GSYM SUM_IMAGE) THEN
103 REPEAT STRIP_TAC THEN
104 FIRST_X_ASSUM (MP_TAC o SPECL [`x:real^3`; `y:real^3`]) THEN
109 let HRXEFDM_lemma1 = prove(`!V E. FAN (vec 0,V,E) ==>
110 sum (face_set_of_fan (V,E)) (\f. sum f (\x. azim_dart (V,E) x * lmfun (h_dart x)))
111 = &2 * pi * scriptL V`,
112 REPEAT STRIP_TAC THEN
113 SUBGOAL_THEN `!n. n IN node_set (hypermap_of_fan (V,E)) ==> sum n (azim_dart (V,E)) = &2 * pi` ASSUME_TAC THENL
116 REWRITE_TAC[node_set; set_of_orbits; GSYM node] THEN
117 REWRITE_TAC[IN_ELIM_THM] THEN
118 ASM_SIMP_TAC[dart; HYPERMAP_OF_FAN] THEN
120 MP_TAC (SPEC_ALL SUM_AZIM_DART) THEN
125 REWRITE_TAC[face_set_of_fan; DART_SUM_lemma] THEN
126 REWRITE_TAC[GSYM (SPEC_ALL DART_SUM_lemma)] THEN
127 ABBREV_TAC `g = (\n. sum n (\x. azim_dart (V,E) x * lmfun (h_dart x)))` THEN
128 MP_TAC (ISPECL [`g:(real^3#real^3->bool)->real`; `node_set (hypermap_of_fan (V,E))`] SUM_RESTRICT) THEN
129 REWRITE_TAC[FINITE_HYPERMAP_ORBITS] THEN
132 SUBGOAL_THEN `!n. n IN node_set (hypermap_of_fan (V,E)) ==> g n = &2 * pi * lmfun (h_dart (CHOICE n))` MP_TAC THENL
134 REMOVE_ASSUM THEN GEN_TAC THEN
135 POP_ASSUM (fun th -> REWRITE_TAC[SYM th]) THEN
137 FIRST_ASSUM (fun th -> FIRST_X_ASSUM (ASSUME_TAC o (fun th2 -> MATCH_MP th2 th))) THEN
138 MP_TAC (ISPECL [`(\x. azim_dart (V,E) x * lmfun (h_dart x))`; `n:real^3#real^3->bool`] SUM_RESTRICT) THEN
139 SUBGOAL_THEN `FINITE (n:real^3#real^3->bool)` ASSUME_TAC THENL
141 REMOVE_ASSUM THEN POP_ASSUM MP_TAC THEN
142 REWRITE_TAC[node_set; set_of_orbits; GSYM node] THEN
143 REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
144 ASM_REWRITE_TAC[NODE_FINITE];
147 ASM_REWRITE_TAC[] THEN
150 ABBREV_TAC `c = lmfun (h_dart (CHOICE (n:real^3#real^3->bool)))` THEN
151 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
154 ASM_CASES_TAC `x:real^3#real^3 IN n` THEN ASM_REWRITE_TAC[] THEN
155 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
156 MP_TAC (ISPECL [`h_dart:real^3#real^3->real`; `n:real^3#real^3->bool`] CHOICE_CONST_LEMMA) THEN
159 REPEAT STRIP_TAC THEN
160 REWRITE_TAC[h_dart] THEN
161 AP_THM_TAC THEN AP_TERM_TAC THEN
163 MP_TAC (SPEC_ALL FST_NODE_lemma) THEN
164 ASM_REWRITE_TAC[] THEN
165 DISCH_THEN MATCH_MP_TAC THEN
169 DISCH_THEN MATCH_MP_TAC THEN
175 FIRST_X_ASSUM (MP_TAC o check (is_eq o concl)) THEN
176 ASM_REWRITE_TAC[] THEN
177 DISCH_THEN (fun th -> REWRITE_TAC[SYM th]) THEN
178 MP_TAC (ISPECL [`(\x. azim_dart (V,E) x * c)`; `n:real^3#real^3->bool`] SUM_RESTRICT) THEN
179 ASM_SIMP_TAC[SUM_RMUL; ETA_AX] THEN
180 REWRITE_TAC[REAL_MUL_ASSOC];
184 POP_ASSUM (fun th -> REWRITE_TAC[SYM th]) THEN
186 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
189 ASM_CASES_TAC `x IN node_set (hypermap_of_fan (V,E))` THEN ASM_REWRITE_TAC[] THEN
194 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
195 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
196 REWRITE_TAC[FINITE_HYPERMAP_ORBITS] THEN
197 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
198 REWRITE_TAC[SUM_LMUL] THEN
199 ASM_SIMP_TAC[scriptL_lemma]);;
205 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`;;
209 let HRXEFDM_concl = `!V. contravening V ==>
210 ( sum (face_set_of_fan (V,ESTD V)) (\ f. tauVEF (V,ESTD V,f) ) < &4 * pi - &20 * sol0 )`;;
213 let HRXEFDM_concl2 = mk_imp (list_mk_conj [`!V. contravening V ==> conforming (V,ESTD V)`;
214 solid_angle_sum_assumption], HRXEFDM_concl);;
219 (* g (HRXEFDM_concl2);; *)
220 let HRXEFDM = prove(HRXEFDM_concl2,
221 REPEAT STRIP_TAC THEN
222 REPEAT (FIRST_X_ASSUM (ASSUME_TAC o SPEC `V:real^3->bool`)) THEN
223 POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
224 MP_TAC (SPEC_ALL CONTRAVENING_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
225 FIRST_X_ASSUM (ASSUME_TAC o SPEC `ESTD V`) THEN
227 SUBGOAL_THEN `FINITE (face_set_of_fan (V,ESTD V))` ASSUME_TAC THENL
229 REWRITE_TAC[face_set_of_fan; FINITE_HYPERMAP_ORBITS];
233 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
235 MP_TAC (ISPECL [`\f. tauVEF (V,ESTD V,f)`; `face_set_of_fan (V,ESTD V)`] SUM_RESTRICT) THEN
236 ASM_REWRITE_TAC[] THEN
237 DISCH_THEN (fun th -> REWRITE_TAC[SYM th]) THEN
238 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
240 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
242 X_GEN_TAC `f:real^3#real^3->bool` THEN
243 ASM_CASES_TAC `f IN face_set_of_fan (V,ESTD V)` THEN ASM_REWRITE_TAC[] THEN
245 MATCH_MP_TAC tauVEF_alt2 THEN
250 MP_TAC (ISPECL [`(\x. g x):(real^3#real^3->bool)->real`; `face_set_of_fan (V,ESTD V)`] SUM_RESTRICT) THEN
251 ASM_REWRITE_TAC[] THEN
252 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
253 POP_ASSUM (fun th -> REWRITE_TAC[SYM th]) THEN
255 ASM_SIMP_TAC[SUM_SUB; SUM_RMUL; SUM_LMUL] THEN
256 ASM_SIMP_TAC[HRXEFDM_lemma1] THEN
261 POP_ASSUM (fun th -> REWRITE_TAC[th]) THEN
262 ASSUME_TAC PI_POS THEN
264 ASM_SIMP_TAC[REAL_FIELD `&0 < pi ==> &4 * pi * (&1 + sol0 / pi) = &4 * pi + &4 * sol0`] THEN
265 ASM_SIMP_TAC[REAL_FIELD `&0 < pi ==> sol0 / pi * &2 * pi * a = &2 * a * sol0`] THEN
266 REWRITE_TAC[REAL_ARITH `(&4 * pi + &4 * a) - (&2 * b * a) = (&4 * pi - &20 * a) + &2 * a * (&12 - b)`] THEN
267 REWRITE_TAC[REAL_ARITH `a + b < a <=> b < &0`] THEN
268 ONCE_REWRITE_TAC[REAL_ARITH `&0 = (&2 * sol0) * &0`] THEN
269 REWRITE_TAC[REAL_MUL_ASSOC] THEN
270 MATCH_MP_TAC REAL_LT_LMUL THEN
273 MATCH_MP_TAC REAL_LT_MUL THEN
274 REWRITE_TAC[REAL_ARITH `&0 < &2`; sol0_POS];
278 REWRITE_TAC[REAL_ARITH `a - b < &0 <=> b > a`] THEN
279 FIRST_X_ASSUM (MP_TAC o check (fun th -> rator (concl th) = `contravening`)) THEN
280 SIMP_TAC[contravening]);;