1 (* ========================================================================== *)
\r
2 (* FLYSPECK - BOOK FORMALIZATION *)
\r
4 (* Chapter: Tame Hypermap *)
\r
5 (* Author: Alexey Solovyev *)
\r
6 (* Date: 2010-06-17 *)
\r
7 (* ========================================================================== *)
\r
9 (******************************)
\r
10 (* Proof of CRTTXAT (tame_9a) *)
\r
11 (******************************)
\r
14 flyspeck_needs "tame/TameGeneral.hl";;
\r
15 flyspeck_needs "tame/ArcProperties.hl";;
\r
18 module Crttxat_tame = struct
\r
24 open Hypermap_and_fan;;
\r
25 open Arc_properties;;
\r
29 (* An auxiliary result about sums over a face *)
\r
30 let ORBIT_MAP_PAIR_SUM_lemma = prove(`!P s f g (x:A#A). FINITE s /\ f permutes s /\
\r
31 (!y. y IN orbit_map f x ==> f y = (SND y, g y))
\r
32 ==> sum (orbit_map f x) (\x. P (FST x)) = sum (orbit_map f x) (\x. P (SND x))`,
\r
33 REPEAT STRIP_TAC THEN
\r
34 ABBREV_TAC `k = CARD (orbit_map f (x:A#A))` THEN
\r
35 MP_TAC (ISPECL [`(\x:A#A. (P:A->real) (FST x))`; `s:A#A->bool`; `f:A#A->A#A`; `x:A#A`; `k:num`; `1`] SUM_ORBIT) THEN
\r
36 ASM_REWRITE_TAC[] THEN
\r
37 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
\r
38 MP_TAC (ISPECL [`(\x:A#A. (P:A->real) (SND x))`; `s:A#A->bool`; `f:A#A->A#A`; `x:A#A`; `k:num`; `0`] SUM_ORBIT) THEN
\r
39 ASM_REWRITE_TAC[] THEN
\r
40 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
\r
41 REWRITE_TAC[ARITH_RULE `1 + k - 1 = (k - 1) + 1`] THEN
\r
42 GEN_REWRITE_TAC (DEPTH_CONV o (PAT_CONV `\x. sum (x..m) f`)) [ARITH_RULE `1 = 0 + 1`] THEN
\r
43 REWRITE_TAC[SUM_OFFSET; ARITH_RULE `0 + a = a`] THEN
\r
44 MATCH_MP_TAC SUM_EQ THEN
\r
45 X_GEN_TAC `i:num` THEN BETA_TAC THEN
\r
46 REWRITE_TAC[ARITH_RULE `i + 1 = 1 + i`] THEN
\r
47 REWRITE_TAC[Hypermap.addition_exponents; Hypermap.POWER_1; o_THM] THEN
\r
48 ABBREV_TAC `y:A#A = (f POWER i) x` THEN
\r
49 SUBGOAL_THEN `y:A#A IN orbit_map f x` ASSUME_TAC THENL
\r
52 REWRITE_TAC[Hypermap.lemma_in_orbit];
\r
55 FIRST_X_ASSUM (MP_TAC o SPEC `y:A#A`) THEN
\r
61 let FACE_SUM_lemma = prove(`!V E x P. FAN (vec 0,V,E) /\ x IN dart1_of_fan (V,E)
\r
62 ==> sum (face (hypermap_of_fan (V,E)) x) (\x. P (FST x)) =
\r
63 sum (face (hypermap_of_fan (V,E)) x) (\x. P (SND x))`,
\r
64 REPEAT STRIP_TAC THEN
\r
65 REWRITE_TAC[Hypermap.face] THEN
\r
66 MATCH_MP_TAC ORBIT_MAP_PAIR_SUM_lemma THEN
\r
67 EXISTS_TAC `dart (hypermap_of_fan (V,E))` THEN
\r
68 EXISTS_TAC `(\x. SND (face_map (hypermap_of_fan (V,E)) x))` THEN
\r
69 REWRITE_TAC[Hypermap.hypermap_lemma; GSYM Hypermap.face] THEN
\r
70 ASM_SIMP_TAC[Hypermap.face_map; HYPERMAP_OF_FAN] THEN
\r
71 REPEAT STRIP_TAC THEN
\r
72 SUBGOAL_THEN `y IN dart1_of_fan (V:real^3->bool,E)` ASSUME_TAC THENL
\r
74 MATCH_MP_TAC Hypermap.lemma_in_subset THEN
\r
75 EXISTS_TAC `face (hypermap_of_fan (V,E)) x` THEN
\r
76 ASM_REWRITE_TAC[] THEN
\r
77 MATCH_MP_TAC FACE_SUBSET_DART1_OF_FAN THEN
\r
81 ASM_REWRITE_TAC[f_fan_pair_ext] THEN
\r
82 MP_TAC (ISPEC `y:real^3#real^3` PAIR_SURJECTIVE) THEN
\r
84 ASM_REWRITE_TAC[f_fan_pair]);;
\r
90 let CRTTXAT_lemma1 = prove(`!V f. simple_hypermap (hypermap_of_fan (V,ESTD V)) ==>
\r
91 contravening V /\ f IN face_set (hypermap_of_fan (V,ESTD V)) ==>
\r
92 sum f (\x. lmfun (h_dart x)) >= &12 + &(CARD f) - &(CARD V)`,
\r
93 REPEAT GEN_TAC THEN DISCH_TAC THEN
\r
94 DISCH_THEN (CONJUNCTS_THEN2 (LABEL_TAC "A") MP_TAC) THEN
\r
95 MP_TAC (SPEC_ALL CONTRAVENING_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
\r
96 USE_THEN "A" MP_TAC THEN
\r
97 REWRITE_TAC[contravening] THEN
\r
98 REPLICATE_TAC 2 (DISCH_THEN (CONJUNCTS_THEN2 (fun th -> ALL_TAC) MP_TAC)) THEN
\r
99 DISCH_THEN (CONJUNCTS_THEN2 MP_TAC (fun th -> ALL_TAC)) THEN
\r
100 REPEAT STRIP_TAC THEN
\r
101 SUBGOAL_THEN `sum f (\x:real^3#real^3. lmfun (h_dart x)) = sum {FST x | x IN f} (\v. lmfun ((norm v) / &2))` ASSUME_TAC THENL
\r
103 REWRITE_TAC[IMAGE_LEMMA; h_dart] THEN
\r
104 SUBGOAL_THEN `(\x:real^3#real^3. lmfun (norm (FST x) / &2)) = (\v. lmfun (norm v / &2)) o FST` ASSUME_TAC THENL
\r
106 REWRITE_TAC[FUN_EQ_THM; o_THM];
\r
109 ASM_REWRITE_TAC[] THEN
\r
110 MATCH_MP_TAC EQ_SYM THEN
\r
111 MATCH_MP_TAC SUM_IMAGE THEN
\r
112 REPEAT STRIP_TAC THEN
\r
113 MP_TAC (SPEC_ALL (SPECL [`V:real^3->bool`; `ESTD V`] HYPERMAP_OF_FAN_FACE_NODE_INJ)) THEN
\r
117 POP_ASSUM (fun th -> REWRITE_TAC[th]) THEN
\r
118 ABBREV_TAC `A = {FST (x:real^3#real^3) | x IN f}` THEN
\r
120 SUBGOAL_THEN `A:real^3->bool SUBSET V` ASSUME_TAC THENL
\r
122 EXPAND_TAC "A" THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
\r
123 X_GEN_TAC `v:real^3` THEN DISCH_THEN (CHOOSE_THEN MP_TAC) THEN
\r
124 REMOVE_ASSUM THEN POP_ASSUM MP_TAC THEN
\r
125 REWRITE_TAC[Hypermap.face_set; Hypermap.set_of_orbits; GSYM Hypermap.face; IN_ELIM_THM] THEN
\r
126 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
\r
127 SUBGOAL_THEN `x:real^3#real^3 IN dart (hypermap_of_fan (V,ESTD V))` MP_TAC THENL
\r
129 MATCH_MP_TAC Hypermap.lemma_in_subset THEN
\r
130 EXISTS_TAC `f:real^3#real^3->bool` THEN
\r
131 ASM_SIMP_TAC[Hypermap.lemma_face_subset];
\r
135 ASM_SIMP_TAC[Hypermap.dart; HYPERMAP_OF_FAN] THEN
\r
136 MP_TAC (ISPEC `x:real^3#real^3` PAIR_SURJECTIVE) THEN
\r
137 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
\r
138 MP_TAC (SPECL [`V:real^3->bool`; `ESTD V`; `x'':real^3`; `y:real^3`] PAIR_IN_DART_OF_FAN) THEN
\r
143 SUBGOAL_THEN `A:real^3->bool = V DIFF (V DIFF A)` MP_TAC THENL
\r
145 MATCH_MP_TAC DIFF_LEMMA THEN ASM_REWRITE_TAC[];
\r
149 DISCH_THEN (fun th -> ONCE_REWRITE_TAC[th]) THEN
\r
150 SUBGOAL_THEN `FINITE (V:real^3->bool)` ASSUME_TAC THENL
\r
152 UNDISCH_TAC `FAN (vec 0, V, ESTD V)` THEN
\r
153 SIMP_TAC[Fan_defs.FAN; Fan_defs.fan1];
\r
157 SUBGOAL_THEN `sum (V DIFF (V DIFF A)) (\v:real^3. lmfun (norm v / &2)) = scriptL V - sum (V DIFF A) (\v. lmfun (norm v / &2))` MP_TAC THENL
\r
159 REWRITE_TAC[scriptL] THEN
\r
160 MATCH_MP_TAC SUM_DIFF THEN
\r
161 ASM_REWRITE_TAC[SUBSET_DIFF];
\r
165 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
\r
166 MATCH_MP_TAC (REAL_ARITH `a >= c /\ b <= --d ==> a - b >= c + d`) THEN
\r
167 FIRST_X_ASSUM (MP_TAC o check (fun th -> rand (concl th) = `&12`)) THEN
\r
168 SIMP_TAC[real_ge; real_gt; REAL_LT_IMP_LE] THEN DISCH_TAC THEN
\r
169 MATCH_MP_TAC REAL_LE_TRANS THEN
\r
170 EXISTS_TAC `&(CARD (V:real^3->bool DIFF A)) * &1` THEN
\r
173 MATCH_MP_TAC SUM_BOUND THEN
\r
176 MATCH_MP_TAC FINITE_DIFF THEN
\r
181 X_GEN_TAC `v:real^3` THEN REWRITE_TAC[IN_DIFF] THEN
\r
183 MP_TAC (SPEC_ALL CONTRAVENING_LMFUN_BOUND) THEN
\r
188 SUBGOAL_THEN `CARD (V:real^3->bool DIFF A) = CARD V - CARD A /\ CARD A <= CARD V` MP_TAC THENL
\r
192 MATCH_MP_TAC CARD_DIFF THEN
\r
194 MATCH_MP_TAC CARD_SUBSET THEN
\r
201 MP_TAC (SPECL [`CARD (A:real^3->bool)`; `CARD (V:real^3->bool)`] REAL_OF_NUM_SUB) THEN
\r
202 ASM_REWRITE_TAC[] THEN
\r
203 DISCH_THEN (fun th -> REWRITE_TAC[SYM th; REAL_MUL_RID; REAL_NEG_SUB]) THEN
\r
204 SUBGOAL_THEN `CARD (A:real^3->bool) = CARD (f:real^3#real^3->bool)` MP_TAC THENL
\r
206 EXPAND_TAC "A" THEN
\r
207 REWRITE_TAC[IMAGE_LEMMA] THEN
\r
208 MATCH_MP_TAC CARD_IMAGE_INJ THEN
\r
211 REPEAT GEN_TAC THEN
\r
212 MP_TAC (SPEC_ALL (SPECL [`V:real^3->bool`; `ESTD V`] HYPERMAP_OF_FAN_FACE_NODE_INJ)) THEN
\r
217 FIRST_X_ASSUM (MP_TAC o check (is_binary "IN" o concl)) THEN
\r
218 REWRITE_TAC[Hypermap.face_set; Hypermap.set_of_orbits; GSYM Hypermap.face] THEN
\r
219 REWRITE_TAC[IN_ELIM_THM] THEN
\r
220 STRIP_TAC THEN ASM_REWRITE_TAC[Hypermap.FACE_FINITE];
\r
224 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
\r
225 REWRITE_TAC[REAL_LE_REFL]);;
\r
233 (* Another expression for the perimeter of f *)
\r
234 let CRTTXAT_lemma2 = prove(`!V f. FAN (vec 0,V,ESTD V) /\ f IN face_set (hypermap_of_fan (V,ESTD V))
\r
235 ==> sum f (\(v,w). arcV (vec 0) v w) = sum f (\(v,w). arclength (norm v) (norm w) (dist (v,w)))`,
\r
236 REPEAT STRIP_TAC THEN
\r
237 MATCH_MP_TAC SUM_EQ THEN
\r
239 MP_TAC (ISPEC `x:real^3#real^3` PAIR_SURJECTIVE) THEN
\r
240 DISCH_THEN (X_CHOOSE_THEN `v:real^3` MP_TAC) THEN
\r
241 DISCH_THEN (X_CHOOSE_THEN `w:real^3` ASSUME_TAC) THEN
\r
242 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
\r
243 REWRITE_TAC[GSYM DIST_0] THEN
\r
244 MATCH_MP_TAC Trigonometry1.arcVarc THEN
\r
246 SUBGOAL_THEN `(v,w) IN dart_of_fan (V,ESTD V)` ASSUME_TAC THENL
\r
248 MATCH_MP_TAC Hypermap.lemma_in_subset THEN
\r
249 EXISTS_TAC `f:real^3#real^3->bool` THEN
\r
250 POP_ASSUM (fun th -> REWRITE_TAC[th]) THEN
\r
251 FIRST_X_ASSUM (MP_TAC o check (is_binary "IN" o concl)) THEN
\r
252 REWRITE_TAC[Hypermap.face_set; Hypermap.set_of_orbits; GSYM Hypermap.face; IN_ELIM_THM] THEN
\r
253 ASM_SIMP_TAC[Hypermap.dart; HYPERMAP_OF_FAN] THEN
\r
254 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
\r
255 MATCH_MP_TAC FACE_SUBSET_DART_OF_FAN THEN
\r
260 MP_TAC (SPECL [`V:real^3->bool`; `ESTD V`; `v:real^3`; `w:real^3`] PAIR_IN_DART_OF_FAN) THEN
\r
261 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
\r
262 FIRST_X_ASSUM (MP_TAC o check (fun th -> rand (concl th) = `(vec 0:real^3,V,ESTD V)`)) THEN
\r
263 REWRITE_TAC[Fan_defs.FAN; Fan_defs.fan2] THEN
\r
264 POP_ASSUM MP_TAC THEN
\r
269 (* A variation of the first lemma *)
\r
270 let CRTTXAT_lemma1' = prove(`!V f. simple_hypermap (hypermap_of_fan (V,ESTD V)) ==>
\r
271 contravening V /\ f IN face_set (hypermap_of_fan (V,ESTD V)) ==>
\r
272 sum f (\x. lmfun (norm (SND x) / &2)) >= &12 + &(CARD f) - &(CARD V)`,
\r
273 REPEAT STRIP_TAC THEN
\r
274 MP_TAC (SPEC_ALL CONTRAVENING_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
\r
275 SUBGOAL_THEN `sum f (\x:real^3#real^3. lmfun (norm (SND x) / &2)) = sum f (\x. lmfun (h_dart x))` (fun th -> REWRITE_TAC[th]) THENL
\r
277 FIRST_X_ASSUM (MP_TAC o check (is_binary "IN" o concl)) THEN
\r
278 REWRITE_TAC[Hypermap.face_set; Hypermap.set_of_orbits; GSYM Hypermap.face] THEN
\r
279 ASM_SIMP_TAC[Hypermap.dart; HYPERMAP_OF_FAN] THEN
\r
280 REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
\r
281 ASM_REWRITE_TAC[h_dart] THEN
\r
282 MATCH_MP_TAC (GSYM FACE_SUM_lemma) THEN
\r
283 ASM_REWRITE_TAC[] THEN
\r
284 MATCH_MP_TAC CONTRAVENING_IMP_IN_DART1_OF_FAN THEN
\r
288 MP_TAC (SPEC_ALL CRTTXAT_lemma1) THEN
\r
296 let SUM_RMUL_BOUND = prove(`!(s:A->bool) f g c. FINITE s /\
\r
297 (!x. x IN s ==> c <= g x /\ &0 <= f x)
\r
298 ==> sum s (\x. f x) * c <= sum s (\x. f x * g x)`,
\r
299 REPEAT STRIP_TAC THEN
\r
300 REWRITE_TAC[GSYM SUM_RMUL] THEN
\r
301 MATCH_MP_TAC SUM_LE THEN
\r
302 ASM_REWRITE_TAC[] THEN GEN_TAC THEN
\r
304 MATCH_MP_TAC REAL_LE_LMUL THEN
\r
311 let CRTTXAT_concl = `!V. contravening V /\ (perimeterbound (V, ESTD V))==>
\r
312 tame_9a (hypermap_of_fan (V, ESTD V))`;;
\r
316 let CRTTXAT_assum = mk_imp (list_mk_conj [`!V. contravening V ==> simple_hypermap (hypermap_of_fan (V,ESTD V))`], CRTTXAT_concl);;
\r
319 (* g(CRTTXAT_assum);; *)
\r
320 let CRTTXAT = prove(CRTTXAT_assum,
\r
321 REPEAT STRIP_TAC THEN
\r
322 FIRST_X_ASSUM (MP_TAC o SPEC `V:real^3->bool`) THEN
\r
323 MP_TAC (SPEC_ALL CONTRAVENING_FAN) THEN
\r
324 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN DISCH_TAC THEN
\r
326 REWRITE_TAC[tame_9a] THEN
\r
327 ASM_SIMP_TAC[Hypermap.dart; HYPERMAP_OF_FAN] THEN
\r
328 REPEAT STRIP_TAC THENL
\r
330 MP_TAC (SPEC_ALL CONTRAVENING_IMP_CARD_FACE_GE_3) THEN
\r
331 ASM_REWRITE_TAC[] THEN
\r
332 DISCH_THEN (MP_TAC o SPEC `x:real^3#real^3`) THEN
\r
337 ABBREV_TAC `f = face (hypermap_of_fan (V,ESTD V)) x` THEN
\r
338 ABBREV_TAC `k = CARD (f:real^3#real^3->bool)` THEN
\r
340 FIRST_X_ASSUM (MP_TAC o check (fun th -> rator (concl th) = `perimeterbound`)) THEN
\r
341 REWRITE_TAC[perimeterbound] THEN
\r
342 DISCH_THEN (MP_TAC o SPEC `f:(real^3#real^3->bool)`) THEN
\r
344 SUBGOAL_THEN `f IN face_set_of_fan (V,ESTD V) /\ FINITE f` MP_TAC THENL
\r
346 EXPAND_TAC "f" THEN REWRITE_TAC[Hypermap.FACE_FINITE] THEN
\r
347 REWRITE_TAC[face_set_of_fan; Hypermap.face_set; Hypermap.set_of_orbits; GSYM Hypermap.face] THEN
\r
348 ASM_SIMP_TAC[Hypermap.dart; HYPERMAP_OF_FAN] THEN
\r
349 REWRITE_TAC[IN_ELIM_THM] THEN
\r
350 EXISTS_TAC `x:real^3#real^3` THEN
\r
355 SIMP_TAC[face_set_of_fan] THEN DISCH_TAC THEN
\r
356 MP_TAC (SPEC_ALL CRTTXAT_lemma2) THEN
\r
357 ASM_REWRITE_TAC[] THEN
\r
358 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
\r
361 SUBGOAL_THEN `!v w. (v:real^3,w:real^3) IN f ==> &2 <= norm v /\ norm v <= #2.52 /\ &2 <= norm w /\ norm w <= #2.52 /\ &2 <= dist (v,w) /\ dist (v,w) <= #2.52` ASSUME_TAC THENL
\r
363 REPEAT GEN_TAC THEN DISCH_TAC THEN
\r
364 SUBGOAL_THEN `v,w IN dart_of_fan (V,ESTD V)` ASSUME_TAC THENL
\r
366 MATCH_MP_TAC Hypermap.lemma_in_subset THEN
\r
367 EXISTS_TAC `f:real^3#real^3->bool` THEN
\r
368 ASM_REWRITE_TAC[] THEN
\r
369 EXPAND_TAC "f" THEN
\r
370 MATCH_MP_TAC FACE_SUBSET_DART_OF_FAN THEN
\r
371 ASM_REWRITE_TAC[];
\r
374 SUBGOAL_THEN `v:real^3 IN V /\ w IN V` ASSUME_TAC THENL
\r
376 MATCH_MP_TAC PAIR_IN_DART_OF_FAN THEN
\r
377 EXISTS_TAC `ESTD V` THEN
\r
382 MP_TAC (SPEC_ALL CONTRAVENING_DIST) THEN
\r
383 MP_TAC (SPECL [`V:real^3->bool`; `w:real^3`] CONTRAVENING_DIST) THEN
\r
384 MP_TAC (SPECL [`V:real^3->bool`; `v:real^3,w:real^3`] CONTRAVENING_DART_DIST) THEN
\r
385 ASM_REWRITE_TAC[DIST_0; REAL_ARITH `&2 = #2.0`] THEN
\r
390 SUBGOAL_THEN `sum f (\x:real^3#real^3. arclength (#2.52) (norm (SND x)) (&2) + lmfun (h_dart x) * (arclength (&2) (norm (SND x)) (&2) - arclength (#2.52) (norm (SND x)) (&2))) <= &2 * pi` MP_TAC THENL
\r
392 MATCH_MP_TAC REAL_LE_TRANS THEN
\r
393 EXISTS_TAC `sum f (\(v:real^3,w:real^3). arclength (norm v) (norm w) (&2))` THEN
\r
396 MATCH_MP_TAC SUM_LE THEN
\r
397 ASM_REWRITE_TAC[] THEN
\r
399 MP_TAC (ISPEC `x':real^3#real^3` PAIR_SURJECTIVE) THEN
\r
400 DISCH_THEN (X_CHOOSE_THEN `v:real^3` MP_TAC) THEN
\r
401 DISCH_THEN (X_CHOOSE_THEN `w:real^3` ASSUME_TAC) THEN
\r
402 ASM_REWRITE_TAC[GSYM real_ge] THEN DISCH_TAC THEN
\r
403 REWRITE_TAC[h_dart] THEN
\r
404 MATCH_MP_TAC arc_lemma3 THEN
\r
405 FIRST_X_ASSUM (MP_TAC o SPECL [`v:real^3`; `w:real^3`]) THEN
\r
410 MATCH_MP_TAC REAL_LE_TRANS THEN
\r
411 EXISTS_TAC `sum f (\(v:real^3,w:real^3). arclength (norm v) (norm w) (dist (v,w)))` THEN
\r
412 ASM_REWRITE_TAC[] THEN
\r
413 MATCH_MP_TAC SUM_LE THEN
\r
414 ASM_REWRITE_TAC[] THEN GEN_TAC THEN
\r
415 MP_TAC (ISPEC `x':real^3#real^3` PAIR_SURJECTIVE) THEN
\r
416 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
\r
417 MATCH_MP_TAC arc_lemma1 THEN
\r
418 FIRST_X_ASSUM (MP_TAC o SPECL [`x'':real^3`; `y:real^3`]) THEN
\r
423 ASM_SIMP_TAC[SUM_ADD] THEN
\r
424 ABBREV_TAC `s1 = sum f (\x:real^3#real^3. arclength #2.52 #2.52 (&2) + lmfun (norm (SND x) / &2) * (arclength #2.52 (&2) (&2) - arclength #2.52 #2.52 (&2)))` THEN
\r
425 ABBREV_TAC `s2 = sum f (\x:real^3#real^3. arclength #2.52 (norm (SND x)) (&2))` THEN
\r
426 ABBREV_TAC `s3 = sum f (\x:real^3#real^3. lmfun (h_dart x) * (arclength (&2) (norm (SND x)) (&2) - arclength #2.52 (norm (SND x)) (&2)))` THEN
\r
429 SUBGOAL_THEN `s1:real <= s2` ASSUME_TAC THENL
\r
431 EXPAND_TAC "s1" THEN EXPAND_TAC "s2" THEN
\r
432 MATCH_MP_TAC SUM_LE THEN
\r
433 ASM_REWRITE_TAC[] THEN GEN_TAC THEN
\r
434 MP_TAC (ISPEC `x':real^3#real^3` PAIR_SURJECTIVE) THEN
\r
435 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
\r
436 REWRITE_TAC[GSYM real_ge] THEN
\r
437 MP_TAC (SPECL [`norm (y:real^3)`; `#2.52`] arc_lemma3) THEN
\r
438 REWRITE_TAC[arc_sym] THEN
\r
439 DISCH_THEN MATCH_MP_TAC THEN
\r
440 FIRST_X_ASSUM (MP_TAC o SPECL [`x'':real^3`; `y:real^3`]) THEN
\r
441 ASM_SIMP_TAC[] THEN
\r
446 SUBGOAL_THEN `(&12 + &k - &(CARD (V:real^3->bool))) * #0.073 <= s3` ASSUME_TAC THENL
\r
448 MATCH_MP_TAC REAL_LE_TRANS THEN
\r
449 EXISTS_TAC `sum f (\x:real^3#real^3. lmfun (h_dart x)) * #0.073` THEN
\r
452 MATCH_MP_TAC REAL_LE_RMUL THEN
\r
453 MP_TAC (SPEC_ALL CRTTXAT_lemma1) THEN
\r
454 ASM_SIMP_TAC[REAL_ARITH `&0 <= #0.073`; real_ge];
\r
458 EXPAND_TAC "s3" THEN
\r
459 MATCH_MP_TAC SUM_RMUL_BOUND THEN
\r
460 ASM_REWRITE_TAC[] THEN
\r
461 GEN_TAC THEN MP_TAC (ISPEC `x':real^3#real^3` PAIR_SURJECTIVE) THEN
\r
462 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
\r
465 REWRITE_TAC[GSYM real_ge] THEN
\r
466 MATCH_MP_TAC arc_lemma4 THEN
\r
467 FIRST_X_ASSUM (MP_TAC o SPECL [`x'':real^3`; `y:real^3`]) THEN
\r
472 REWRITE_TAC[h_dart; Pack_defs.lmfun; Pack_defs.h0] THEN
\r
477 SUBGOAL_THEN `(&k) * (arclength #2.52 #2.52 (&2)) + (&12 + &k - &(CARD (V:real^3->bool))) * #0.073 <= s1` ASSUME_TAC THENL
\r
479 REPLICATE_TAC 5 REMOVE_ASSUM THEN
\r
480 POP_ASSUM (fun th -> REWRITE_TAC[SYM th]) THEN
\r
481 ASM_SIMP_TAC[SUM_ADD] THEN
\r
482 ASM_SIMP_TAC[SUM_CONST] THEN
\r
483 REWRITE_TAC[REAL_ARITH `a + b <= a + c <=> b <= c`] THEN
\r
484 REWRITE_TAC[SUM_RMUL] THEN
\r
485 MATCH_MP_TAC REAL_LE_TRANS THEN
\r
486 EXISTS_TAC `sum f (\x:real^3#real^3. lmfun (norm (SND x) / &2)) * #0.073` THEN
\r
489 MATCH_MP_TAC REAL_LE_RMUL THEN
\r
490 REWRITE_TAC[REAL_ARITH `&0 <= #0.073`; GSYM real_ge] THEN
\r
491 MP_TAC (SPEC_ALL CRTTXAT_lemma1') THEN
\r
495 MATCH_MP_TAC REAL_LE_LMUL THEN
\r
498 MATCH_MP_TAC SUM_POS_LE THEN
\r
499 ASM_REWRITE_TAC[Pack_defs.lmfun; Pack_defs.h0] THEN
\r
504 REWRITE_TAC[GSYM real_ge] THEN
\r
505 MP_TAC (SPEC `#2.52` arc_lemma4) THEN
\r
506 REWRITE_TAC[arc_sym] THEN
\r
511 SUBGOAL_THEN `&k * arclength #2.52 #2.52 (&2) + (&2) * (&12 + &k - &(CARD (V:real^3->bool))) * #0.073 <= &2 * pi` MP_TAC THENL
\r
513 MATCH_MP_TAC REAL_LE_TRANS THEN
\r
514 EXISTS_TAC `(s1:real) + s3` THEN
\r
517 REWRITE_TAC[REAL_ARITH `c + &2 * a * b = (c + a * b) + a * b`] THEN
\r
518 MATCH_MP_TAC REAL_LE_ADD2 THEN
\r
522 MATCH_MP_TAC REAL_LE_TRANS THEN
\r
523 EXISTS_TAC `(s2:real) + s3` THEN
\r
524 ASM_REWRITE_TAC[] THEN
\r
525 MATCH_MP_TAC REAL_LE_ADD2 THEN
\r
526 ASM_REWRITE_TAC[REAL_LE_REFL];
\r
531 SUBGOAL_THEN `&k * (arclength #2.52 #2.52 (&2) + #0.146) <= &2 * pi + (&(CARD (V:real^3->bool)) - &12) * #0.146` ASSUME_TAC THENL
\r
533 POP_ASSUM MP_TAC THEN
\r
538 SUBGOAL_THEN `&k * (#0.816 + #0.146) <= &2 * #3.1416 + &3 * #0.146` ASSUME_TAC THENL
\r
540 MATCH_MP_TAC REAL_LE_TRANS THEN
\r
541 EXISTS_TAC `&k * (arclength #2.52 #2.52 (&2) + #0.146)` THEN
\r
544 MATCH_MP_TAC REAL_LE_LMUL THEN
\r
545 REWRITE_TAC[REAL_ARITH `&0 <= &k`; REAL_ARITH `a + b <= c + b <=> a <= c`] THEN
\r
546 ASM_REWRITE_TAC[GSYM real_ge; arc_lemma5];
\r
549 MATCH_MP_TAC REAL_LE_TRANS THEN
\r
550 EXISTS_TAC `&2 * pi + (&(CARD (V:real^3->bool)) - &12) * #0.146` THEN
\r
551 CONJ_TAC THEN ASM_REWRITE_TAC[] THEN
\r
552 MATCH_MP_TAC REAL_LE_ADD2 THEN
\r
555 MP_TAC PI_APPROX_32 THEN
\r
559 MATCH_MP_TAC REAL_LE_RMUL THEN
\r
560 REWRITE_TAC[REAL_ARITH `&0 <= #0.146`; REAL_ARITH `a - &12 <= &3 <=> a <= &15`] THEN
\r
561 REWRITE_TAC[REAL_OF_NUM_LE] THEN
\r
562 FIRST_X_ASSUM (MP_TAC o check (fun th -> rator (concl th) = `contravening`)) THEN
\r
563 REWRITE_TAC[contravening] THEN
\r
564 SIMP_TAC[ARITH_RULE `a = 13 \/ a = 14 \/ a = 15 ==> a <= 15`];
\r
568 SUBGOAL_THEN `&k <= #6.99` MP_TAC THENL
\r
570 POP_ASSUM MP_TAC THEN
\r
575 DISJ_CASES_TAC (ARITH_RULE `k <= 6 \/ 7 <= k`) THEN ASM_REWRITE_TAC[] THEN
\r
576 POP_ASSUM MP_TAC THEN
\r
577 REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN
\r