2 (* ========================================================================= *)
3 (* FLYSPECK - BOOK FORMALIZATION *)
5 (* Authour : VU KHAC KY *)
6 (* Book lemma: UPFZBZM *)
7 (* Chaper : Packing (Clusters) *)
8 (* Date : October 3, 2010 *)
10 (* ========================================================================= *)
12 (* ========================================================================= *)
13 (* FILES NEED TO BE LOADED *)
14 (* ========================================================================= *)
16 (* dmtcp: needs "flyspeck_load.hl";; *)
18 flyspeck_needs "nonlinear/vukhacky_tactics.hl";;
19 flyspeck_needs "packing/pack_defs.hl";;
20 flyspeck_needs "packing/pack_concl.hl";;
21 flyspeck_needs "packing/beta_pair_thm.hl";;
22 flyspeck_needs "packing/ky/UPFZBZM_support_lemmas.hl";;
23 (* Note that UPFZBZM_support_lemmas.hl also load a file including unproved
24 lemmas that need to be finished
27 module Upfzbzm = struct
31 open Vukhacky_tactics;;
33 (*-------------------------------------------------------------------------- *)
36 `!V. saturated V /\ packing V /\ cell_cluster_estimate V /\
38 lmfun_inequality V ==>
39 (?G. negligible_fun_0 G V /\ fcc_compatible G V)`;;
41 (* ------------------------------------------------------------------------- *)
45 (* ========================================================================= *)
47 (* ========================================================================= *)
49 (* PART 1 OF THE LEMMA *)
51 let FCC_COMPATABILITY_FUNC = prove_by_refinement (
52 `!V. saturated V /\ packing V /\ cell_cluster_estimate V /\
54 lmfun_inequality V /\ G = (\u. --vol(voronoi_open V u) +
55 &8 * mm1 - &8 * mm2 * sum { v | v IN V /\ ~(u=v) /\ dist(u,v) <= &2*h0 }
56 (\v. lmfun (hl [u;v])))
57 ==> fcc_compatible G V`,
59 [(REWRITE_TAC[lmfun_inequality;fcc_compatible]);
61 (ASM_REWRITE_TAC[REAL_ARITH `a + --a + b - c = b - c`]);
62 (MATCH_MP_TAC (REAL_ARITH
63 `x = &8 * mm1 - &8 * (&12 * mm2) /\ y <= &8 * (&12 * mm2) ==>
66 (REWRITE_TAC[SQRT_OF_32_lemma]);
67 (REWRITE_TAC[REAL_ARITH `a * b - a * c = a * (b - c)`]);
68 (REWRITE_TAC[m1_minus_12m2]);
69 (MATCH_MP_TAC REAL_LE_LMUL);
70 (REWRITE_TAC[REAL_ARITH `&0 <= &8`]);
71 (REWRITE_TAC[REAL_ARITH `&12 * mm2 = mm2 * &12`]);
72 (MATCH_MP_TAC REAL_LE_LMUL);
73 (REWRITE_TAC[ZERO_LE_MM2_LEMMA]);
77 (* ========================================================================= *)
80 (* ========================================================================= *)
82 g `!V. saturated V /\ packing V /\ cell_cluster_estimate V /\
85 G = (\u. --vol(voronoi_open V u) +
86 &8 * mm1 - &8 * mm2 * sum { v | v IN V /\ ~(u=v) /\ dist(u,v) <= &2*h0 }
87 (\v. lmfun (hl [u;v])))
88 ==> negligible_fun_0 G V`;;
90 e (REWRITE_TAC[negligible_fun_0; negligible_fun_any_C]);;
91 e (REPEAT STRIP_TAC);;
92 e (ASM_REWRITE_TAC[]);;
94 e (MP_TAC (SPEC `V:real^3->bool` KIZHLTL1));;
95 e (DISCH_THEN (LABEL_TAC "asm1"));;
96 e (USE_THEN "asm1" CHOOSE_TAC);;
98 e (MP_TAC (SPEC `V:real^3->bool` KIZHLTL2));;
99 e (DISCH_THEN (LABEL_TAC "asm2"));;
100 e (USE_THEN "asm2" CHOOSE_TAC);;
102 (* ! It appears that the constant used in KIZHLTL3 needs to be changed. *)
103 (* ! Rather than prove indirectly, better to directly prove the similar result for Lmfun, as in this adapted form of 'KIZHLTL3_concl' from 'packing/pack_concl.hl'
104 (so if KIZHLTL3_concl is just for Ky's lemma, then this needs to change)
106 let KIZHLTL3_concl* = `!(V:real^3->bool) f. ?c. !r. saturated V /\ packing V /\ (&1 <= r) /\
107 (?c1. !x. &2 <= x /\ x < sqrt(&8) ==> abs( f x) <= c1)
110 sum { X | X SUBSET ball(vec 0, r) /\ mcell_set V X }
111 ( \ X. sum (edgeX V X) ( \ {u,v}. (dihX V X (u ,v))*f (hl[u;v])))
114 sum (V INTER ball(vec 0,r))
115 ( \u. sum { v | v IN V /\ ~(u=v) /\ dist(u,v) < sqrt(&8)}
116 ( \v. lmfun (hl [u;v]))))`;;
118 ( and the ?c from here becomes c'' in the proof below )
120 ! instead of for F fun. The two have the same techinique:
124 e (MP_TAC (SPEC `lmfun:real->real`(SPEC `V:real^3->bool` KIZHLTL3)));;
125 e (DISCH_THEN (LABEL_TAC "asm3"));;
126 e (USE_THEN "asm3" CHOOSE_TAC);;
128 e (MP_TAC (SPEC `V:real^3->bool` SUM_GAMMAX_LMFUM_ESTIMATE));;
129 e (DISCH_THEN (LABEL_TAC "asm4"));;
130 e (USE_THEN "asm4" CHOOSE_TAC);;
132 e (EXISTS_TAC `--(c + c' + c'' + c''')`);;
134 e (GEN_TAC THEN DISCH_TAC);;
135 e (MP_TAC FINITE_PACK_LEMMA THEN DISCH_TAC);;
137 e (REWRITE_WITH `sum (V INTER ball (vec 0,r))
138 (\u. --vol (voronoi_open V u) +
142 sum {v | v IN V /\ ~(u = v) /\ dist (u,v) <= &2 * h0}
143 (\v. lmfun (hl [u; v]))) =
144 sum (V INTER ball (vec 0,r))
145 (\u. --vol (voronoi_open V u)) +
146 sum (V INTER ball (vec 0,r))
149 sum {v | v IN V /\ ~(u = v) /\ dist (u,v) <= &2 * h0}
150 (\v. lmfun (hl [u; v])))`);;
151 e (MATCH_MP_TAC SUM_ADD);;
154 e (REWRITE_WITH `sum (V INTER ball (vec 0,r))
158 sum {v:real^3 | v IN V /\ ~(u = v) /\ dist (u,v) <= &2 * h0}
159 (\v. lmfun (hl [u; v]))) =
160 sum (V INTER ball (vec 0,r))
162 sum (V INTER ball (vec 0,r))
165 sum {v | v IN V /\ ~(u = v) /\ dist (u,v) <= &2 * h0}
166 (\v. lmfun (hl [u; v])))`);;
167 e (MATCH_MP_TAC SUM_SUB);;
170 e (ASM_SIMP_TAC[SUM_NEG;SUM_CONST;SUM_LMUL]);;
171 e (MATCH_MP_TAC (REAL_ARITH `--A <= x - y + z ==> --x + y - z <= A `));;
172 e (REWRITE_TAC[REAL_ARITH `--(--x * y) = x * y`]);;
174 e (ABBREV_TAC `T1' = sum (V INTER ball (vec 0,r)) (\u. vol (voronoi_open V u))`);;
175 e (ABBREV_TAC `T2' = &8 * &(CARD ((V:real^3 -> bool) INTER ball (vec 0,r))) * mm1`);;
176 e (ABBREV_TAC `T3' = &8 *
177 mm2 * sum (V INTER ball (vec 0,r))
178 (\u. sum {v:real^3 | v IN V /\ ~(u = v) /\ dist (u,v) <= &2 * h0}
179 (\v. lmfun (hl [u; v])))`);;
181 e (ABBREV_TAC `B_0_r = {X | X SUBSET ball (vec 0, r) /\ mcell_set V X}`);;
183 e (ABBREV_TAC `T1 = sum B_0_r vol`);;
184 e (ABBREV_TAC `T2 = --(&2 * mm1 / pi) * sum B_0_r (total_solid V)`);;
185 e (ABBREV_TAC `T3 = (&8 * mm2 / pi) * sum B_0_r (\X. sum (edgeX V X)
186 (\({u, v}). dihX V X (u,v) * lmfun (hl [u; v])))`);;
188 e (MATCH_MP_TAC (REAL_ARITH
189 `T1 + c * r pow 2 <= T1' /\
190 T2 + c' * r pow 2 <= -- T2' /\
191 T3 + c'' * r pow 2 <= T3' /\
192 c''' * r pow 2 <= T1 + T2 + T3 ==>
193 (c + c' + c'' + c''') * r pow 2 <= T1' - T2' + T3'`));;
194 e (REPEAT STRIP_TAC);;
196 e (EXPAND_TAC "T1" THEN EXPAND_TAC "T1'");;
197 e (EXPAND_TAC "B_0_r");;
198 e (MP_TAC (ASSUME `!r. saturated V /\ packing V /\ &1 <= r
199 ==> sum {X | X SUBSET ball (vec 0,r) /\ mcell_set V X} vol +
201 sum (V INTER ball (vec 0,r)) (\u. vol (voronoi_open V u))`));;
204 e (EXPAND_TAC "T2" THEN EXPAND_TAC "T2'");;
205 e (EXPAND_TAC "B_0_r");;
206 e (MATCH_MP_TAC(REAL_ARITH `t + z <= x * y ==> --x * y + z <= --t`));;
207 e (REWRITE_TAC[REAL_ARITH `a * b * c = b * a * c`]);;
208 e (MP_TAC (ASSUME `!r. saturated V /\ packing V /\ &1 <= r
209 ==> &(CARD (V INTER ball (vec 0,r))) * &8 * mm1 + c' * r pow 2 <=
211 sum {X | X SUBSET ball (vec 0,r) /\ mcell_set V X}
217 (* !!!!! This part may then become very easy (maybe little more than a rewrite) *)
219 e (EXPAND_TAC "T3" THEN EXPAND_TAC "T3'");;
220 e (EXPAND_TAC "B_0_r");;
221 e (ABBREV_TAC `temp = &8 * mm2 *
222 sum ((V:real^3->bool) INTER ball (vec 0,r))
223 (\u. sum {v | v IN V /\ ~(u = v) /\ dist (u,v) < sqrt (&8)}
224 (\v. lmfun (hl [u; v])))`);;
226 e (MATCH_MP_TAC (REAL_ARITH `(a <= temp /\ temp <= b) ==> a <= b`));;
228 (* Break into 2 subgoals *)
231 e (EXPAND_TAC "temp");;
232 e (MATCH_MP_TAC (ASSUME `!r. saturated V /\
235 (?c1. !x. &2 <= x /\ x < sqrt (&8) ==> abs (lmfun x) <= c1)
236 ==> (&8 * mm2 / pi) *
237 sum {X | (X:real^3 -> bool) SUBSET ball (vec 0,r) /\ mcell_set V X}
239 (\({u, v}). dihX V X (u,v) * lmfun (hl [u; v]))) +
243 sum ((V:real^3->bool) INTER ball (vec 0,r))
244 (\u. sum {v | v IN V /\ ~(u = v) /\ dist (u,v) < sqrt (&8)}
245 (\v. lmfun (hl [u; v])))`));;
248 e (EXISTS_TAC `&1`);;
249 e (GEN_TAC THEN DISCH_TAC);;
250 e (REWRITE_TAC[lmfun]);;
252 e (UP_ASM_TAC THEN UP_ASM_TAC);;
253 e (REWRITE_TAC[h0]);;
254 e (MESON_TAC[REAL_ARITH `&2 <= x /\ x < sqrt (&8) ==> x <= #1.26 ==> F`]);;
258 e (EXPAND_TAC "temp");;
259 e (REWRITE_TAC[REAL_ARITH `a * b * c = (a * b) * c`]);;
260 e (MATCH_MP_TAC REAL_LE_LMUL);;
262 e (MATCH_MP_TAC REAL_LE_MUL);;
263 e (REWRITE_TAC[REAL_ARITH `&0 <= &8`;ZERO_LE_MM2_LEMMA]);;
264 e (MATCH_MP_TAC SUM_LE);;
268 e (GEN_TAC THEN DISCH_TAC);;
269 e (REWRITE_TAC[IN_ELIM_THM]);;
271 `temp_s1 = {v:real^3 | v IN V /\ ~(x = v) /\ dist (x,v) < sqrt (&8)}`);;
273 `temp_s2 = {v:real^3 | v IN V /\ ~(x = v) /\ dist (x,v) <= &2 * h0}`);;
274 e (MATCH_MP_TAC SUM_SUBSET_SIMPLE);;
275 e (REPEAT STRIP_TAC);;
276 (* Break into 3 subgoals *)
279 e (NEW_GOAL `temp_s2 SUBSET (V INTER ball (x:real^3, &10))`);;
280 e (EXPAND_TAC "temp_s2");;
281 e (REWRITE_TAC[SUBSET]);;
282 e (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM;IN_INTER] THEN DISCH_TAC);;
283 e (ASM_SIMP_TAC[ball;IN_ELIM_THM]);;
285 (REAL_ARITH `&2 * h0 < &10 /\ a <= &2 * h0 ==> a < &10`));;
286 e (ASM_REWRITE_TAC[h0] THEN REAL_ARITH_TAC);;
287 e (NEW_GOAL `FINITE (V INTER ball (x:real^3,&10))`);;
289 e (UP_ASM_TAC THEN UP_ASM_TAC THEN MESON_TAC[FINITE_SUBSET]);;
292 e (EXPAND_TAC "temp_s1" THEN EXPAND_TAC "temp_s2");;
293 e (REWRITE_TAC[SUBSET;IN_ELIM_THM]);;
294 e (GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[h0]);;
296 (REAL_ARITH `x < sqrt(&8) /\ sqrt(&8) < y ==> x <= y`));;
297 e (ASM_REWRITE_TAC[h0]);;
299 e CHEAT_TAC;; (* ! Because it isn't true at all - see KIZHLTL3 above *)
302 (* !!!!! End of part that will become very easy *)
306 (* ! There is a serious logical mistake here, we have to fix it right away *)
309 e (REWRITE_WITH `T1 + T2 + T3 =
310 sum B_0_r (\X:real^3->bool. gammaX V X lmfun)`);;
311 e (SUBGOAL_THEN `FINITE (B_0_r:(real^3->bool)->bool)` ASSUME_TAC);;
312 e (EXPAND_TAC "B_0_r");;
313 e (REWRITE_TAC[FINITE_MCELL_SET_LEMMA]);;
316 `sum B_0_r (\X. gammaX V X lmfun) =
317 sum B_0_r (\X. vol X - (&2 * mm1 / pi) * total_solid V X) +
319 (\X. (&8 * mm2 / pi) *
320 sum (edgeX V X) (\({u, v}). dihX V X (u,v) * lmfun (hl [u; v])))`
322 e (REWRITE_TAC[gammaX]);;
323 e (MATCH_MP_TAC SUM_ADD);;
324 e (ASM_REWRITE_TAC[]);;
326 `sum B_0_r (\X. vol X - (&2 * mm1 / pi) * total_solid V X) =
327 sum B_0_r (\X. vol X) - sum B_0_r (\X. (&2 * mm1 / pi) * total_solid V X)`
329 e (ABBREV_TAC `temp1 = (\X. (&2 * mm1 / pi) * total_solid V X)`);;
330 e (ABBREV_TAC `temp2:(real^3->bool)->real = (\X. vol X)`);;
332 e (REWRITE_WITH `(\X. vol X - (&2 * mm1 / pi) * total_solid V X) =
333 (\X. temp2 X - temp1 X)`);;
334 e (EXPAND_TAC "temp1" THEN EXPAND_TAC "temp2" THEN REWRITE_TAC[]);;
335 e (MATCH_MP_TAC SUM_SUB);;
336 e (ASM_REWRITE_TAC[]);;
338 e (ASM_REWRITE_TAC[]);;
339 e (EXPAND_TAC "T1" THEN EXPAND_TAC "T2" THEN EXPAND_TAC "T3");;
340 e (MATCH_MP_TAC (REAL_ARITH ` x1 = x2 /\ --y1 = y2 /\ z1 = z2 ==>
341 x1 + y1 + z1 = x2 - y2 + z2`));;
342 e (REPEAT STRIP_TAC);;
343 e (MATCH_MP_TAC SUM_EQ);;
344 e (GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[IN_ELIM_THM]);;
345 e (REWRITE_TAC[REAL_ARITH `--(--x * y) = x * y`]);;
346 e (REWRITE_TAC[SUM_LMUL]);;
347 e (REWRITE_TAC[REAL_EQ_MUL_LCANCEL]);;
349 e (MATCH_MP_TAC SUM_EQ);;
350 e (GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[IN_ELIM_THM]);;
351 e (REWRITE_TAC[SUM_LMUL]);;
352 e (EXPAND_TAC "B_0_r");;
356 let NEGLIGIBLE_FUNC = top_thm();;
358 (* ========================================================================= *)
360 (* ========================================================================= *)
362 let UPFZBZM = prove (UPFZBZM_concl,
363 (REPEAT STRIP_TAC) THEN (ABBREV_TAC `G = (\u. --vol (voronoi_open V u) +
367 sum {v:real^3 | v IN V /\ ~(u = v) /\ dist (u,v) <= &2 * h0}
368 (\v. lmfun (hl [u; v])))`) THEN
369 (EXISTS_TAC `G:real^3->real`) THEN
370 (ASM_MESON_TAC[NEGLIGIBLE_FUNC;FCC_COMPATABILITY_FUNC]));;
374 (* ========================================================================== *)
375 (* Continue back up of complementary lemmas *)
376 (* ========================================================================== *)
378 let SUM_GAMMAX_LMFUM_ESTIMATE_concl =
379 `!V. ?c. !r. saturated V /\ packing V /\ &1 <= r /\
380 cell_cluster_estimate V /\ marchal_inequality /\
381 lmfun_inequality V ==>
382 c * r pow 2 <= sum {X | X SUBSET ball (vec 0, r) /\ mcell_set V X}
383 (\X. gammaX V X lmfun)`;;
385 (* ---------------------- We prove it below ------------------------------- *)
387 g SUM_GAMMAX_LMFUM_ESTIMATE_concl;;
389 e (EXISTS_TAC `c:real`);;
390 e (REPEAT STRIP_TAC);;
392 e (SUBGOAL_THEN `!X. (critical_edgeX V X = {}) ==>
393 (!u v:real^3. {u, v} IN edgeX V X ==>
394 lmfun (hl [u; v]) >= marchal (hl [u ; v]))` ASSUME_TAC);;
395 e (REPEAT STRIP_TAC);;
396 e (SUBGOAL_THEN `~(hminus <= hl [u:real^3; v] /\ hl [u; v] <= hplus)`
399 e (SUBGOAL_THEN `critical_edgeX V X {u, v}` ASSUME_TAC);;
400 e (REWRITE_TAC[critical_edgeX]);;
401 e (REWRITE_TAC[IN_ELIM_THM]);;
402 e (EXISTS_TAC `u:real^3`);;
403 e (EXISTS_TAC `v:real^3`);;
404 e (ASM_REWRITE_TAC[]);;
405 e (SUBGOAL_THEN `~ (critical_edgeX V X = {})` ASSUME_TAC);;
408 e (ASM_MESON_TAC[]);;
409 e (ASM_SIMP_TAC[lmfun_vs_marchal]);;
411 (* We have already proved that :
413 !X. critical_edgeX V X = {}
416 ==> lmfun (hl [u; v]) >= marchal (hl [u; v]))
420 `!X. mcell_set V X /\ (critical_edgeX V X = {}) ==> gammaX V X lmfun >= &0` ASSUME_TAC);;
421 e (REPEAT STRIP_TAC);;
422 e (MATCH_MP_TAC (REAL_ARITH
423 `a >= gammaX V X marchal /\ gammaX V X marchal >= &0 ==> a >= &0`));;
426 (* break into 2 small part *)
428 e (REWRITE_TAC[gammaX]);;
429 e (MATCH_MP_TAC (REAL_ARITH `a <= b ==> x - y + b >= x - y + a`));;
430 e (MATCH_MP_TAC REAL_LE_LMUL);;
432 e (MATCH_MP_TAC REAL_LE_MUL);;
435 e (MATCH_MP_TAC (REAL_ARITH `&0 < a ==> &0 <= a`));;
436 e (MATCH_MP_TAC REAL_LT_DIV);;
437 e (REWRITE_TAC[PI_POS;ZERO_LT_MM2_LEMMA]);;
439 e (MATCH_MP_TAC SUM_LE);;
440 e (REWRITE_TAC[FINITE_edgeX]);;
441 e (REWRITE_TAC[edgeX;IN_ELIM_THM]);;
442 e (REPEAT STRIP_TAC);;
443 e (REWRITE_TAC[ASSUME `x = {u:real^3, v}`;BETA_THM]);;
445 e (REWRITE_WITH `(\({u, v}). dihX V X (u,v) * marchal (hl [u; v])) {u, v} =
446 dihX V X (u,v) * marchal (hl [u; v])`);;
447 e (MATCH_MP_TAC BETA_PAIR_THM);;
449 e (REWRITE_TAC[HL;DIHX_SYM]);;
451 e (REWRITE_WITH `set_of_list [u':real^3; v'] = set_of_list [v'; u']`);;
452 e (REWRITE_TAC[set_of_list]);;
455 e (REWRITE_WITH `(\({u, v}). dihX V X (u,v) * lmfun (hl [u; v])) {u, v} =
456 dihX V X (u,v) * lmfun (hl [u; v])`);;
457 e (MATCH_MP_TAC BETA_PAIR_THM);;
459 e (REWRITE_TAC[HL;DIHX_SYM]);;
461 e (REWRITE_WITH `set_of_list [u':real^3; v'] = set_of_list [v'; u']`);;
462 e (REWRITE_TAC[set_of_list]);;
465 e (MATCH_MP_TAC (REAL_ARITH `&0 <= a * ( y - x) ==> a * x <= a * y`));;
466 e (MATCH_MP_TAC REAL_LE_MUL);;
468 e (REWRITE_TAC[DIHX_POS]);;
469 e (MATCH_MP_TAC (REAL_ARITH `a >= b ==> &0 <= a - b`));;
470 e (NEW_GOAL `{u, v} IN edgeX V X`);;
471 e (ASM_REWRITE_TAC[edgeX]);;
472 e (DEL_TAC THEN REPLICATE_TAC 3 UP_ASM_TAC THEN SET_TAC[]);;
473 e (ASM_MESON_TAC[]);;
475 e (MP_TAC (ASSUME `marchal_inequality`));;
476 e (REWRITE_TAC[marchal_inequality]);;
477 e (DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC);;
478 e (ASM_REWRITE_TAC[]);;
480 (* ------------------------------------------------------------------------ *)
482 e (ABBREV_TAC `B_0_r = {X | X SUBSET ball (vec 0, r) /\ mcell_set V X}`);;
483 e (ABBREV_TAC `B_0_r_empty = B_0_r INTER {X| critical_edgeX V X = {}}`);;
484 e (ABBREV_TAC `B_0_r_no_empty = B_0_r INTER {X| ~(critical_edgeX V X = {})}`);;
487 `B_0_r:(real^3->bool)->bool = B_0_r_empty UNION B_0_r_no_empty` ASSUME_TAC);;
488 e (EXPAND_TAC "B_0_r_empty");;
489 e (EXPAND_TAC "B_0_r_no_empty");;
490 e (EXPAND_TAC "B_0_r");;
492 e (ASM_REWRITE_TAC[]);;
494 e (SUBGOAL_THEN `FINITE (B_0_r:(real^3->bool)->bool)` ASSUME_TAC);;
495 e (EXPAND_TAC "B_0_r");;
496 e (REWRITE_TAC[FINITE_MCELL_SET_LEMMA]);;
498 e (SUBGOAL_THEN `FINITE (B_0_r_empty:(real^3->bool)->bool)` ASSUME_TAC);;
499 e (MATCH_MP_TAC FINITE_SUBSET);;
500 e (EXISTS_TAC `(B_0_r:(real^3->bool)->bool)`);;
501 e (ASM_REWRITE_TAC[]);;
504 e (SUBGOAL_THEN `FINITE (B_0_r_no_empty:(real^3->bool)->bool)` ASSUME_TAC);;
505 e (MATCH_MP_TAC FINITE_SUBSET);;
506 e (EXISTS_TAC `(B_0_r:(real^3->bool)->bool)`);;
507 e (ASM_REWRITE_TAC[]);;
510 e (SUBGOAL_THEN `DISJOINT B_0_r_empty (B_0_r_no_empty:(real^3->bool)->bool)` ASSUME_TAC);;
511 e (REWRITE_TAC[IN_DISJOINT]);;
512 e (EXPAND_TAC "B_0_r_empty" THEN EXPAND_TAC "B_0_r_no_empty");;
514 e (SUBGOAL_THEN `x IN {X | critical_edgeX V X = {}}` ASSUME_TAC);;
515 e (DEL_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
516 e (SUBGOAL_THEN `x IN {X | ~(critical_edgeX V X = {})}` ASSUME_TAC);;
517 e (DEL_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
518 e (UP_ASM_TAC THEN UP_ASM_TAC THEN SET_TAC[]);;
521 `sum (B_0_r_empty UNION B_0_r_no_empty) (\X. gammaX V X lmfun) =
522 sum (B_0_r_empty) (\X. gammaX V X lmfun) +
523 sum (B_0_r_no_empty) (\X. gammaX V X lmfun)`);;
524 e (MATCH_MP_TAC SUM_UNION);;
525 e (ASM_REWRITE_TAC[]);;
527 e (SUBGOAL_THEN `&0 <= sum B_0_r_empty (\X. gammaX V X lmfun)` ASSUME_TAC);;
528 e (MATCH_MP_TAC SUM_POS_LE);;
531 e (ASM_REWRITE_TAC[]);;
532 e (EXPAND_TAC "B_0_r_empty");;
533 e (EXPAND_TAC "B_0_r");;
534 e (REWRITE_TAC[REAL_ARITH `&0 <= x <=> x >= &0`]);;
536 `!X. mcell_set V X /\ critical_edgeX V X = {} ==>
537 gammaX V X lmfun >= &0`));;
540 e (MATCH_MP_TAC (REAL_ARITH `x <= a /\ &0 <= b ==> x <= b + a`));;
541 e (ASM_REWRITE_TAC[]);;
544 `sum B_0_r_no_empty (\X. gammaX V X lmfun) =
545 sum B_0_r (\X. (gammaX V X lmfun) *
546 sum (critical_edgeX V X) (\e. critical_weight V X))`);;
547 e (ASM_REWRITE_TAC[]);;
550 `sum (B_0_r_empty UNION B_0_r_no_empty)
551 (\X. gammaX V X lmfun * sum (critical_edgeX V X) (\e. critical_weight V X)) =
553 (\X. gammaX V X lmfun * sum (critical_edgeX V X) (\e. critical_weight V X)) +
555 (\X. gammaX V X lmfun * sum (critical_edgeX V X) (\e. critical_weight V X))`
557 e (MATCH_MP_TAC SUM_UNION);;
558 e (ASM_REWRITE_TAC[]);;
562 (\X. gammaX V X lmfun * sum (critical_edgeX V X)
563 (\e. critical_weight V X)) = &0` ASSUME_TAC);;
564 e (MATCH_MP_TAC SUM_EQ_0);;
565 e (EXPAND_TAC "B_0_r_empty");;
566 e (GEN_TAC THEN REWRITE_TAC[IN_INTER;IN_ELIM_THM]);;
568 e (MATCH_MP_TAC (MESON[REAL_MUL_RZERO] `x = &0 ==> y * x = &0`));;
569 e (MATCH_MP_TAC (MESON[SUM_CLAUSES] `x = {} ==> sum x f = &0`));;
570 e (ASM_REWRITE_TAC[]);;
573 e (ASM_REWRITE_TAC[REAL_ADD_LID]);;
574 e (MATCH_MP_TAC (SUM_EQ));;
576 e (EXPAND_TAC "B_0_r_no_empty" THEN EXPAND_TAC "B_0_r");;
577 e (REWRITE_TAC[IN_INTER;IN_ELIM_THM]);;
579 e (MATCH_MP_TAC (MESON[REAL_MUL_RID] `x = &1 ==> y = y * x`));;
580 e (REWRITE_TAC[critical_weight]);;
582 e (SIMP_TAC[SUM_CONST]);;
583 e (NEW_GOAL `FINITE (critical_edgeX V x)`);;
584 e (ASM_SIMP_TAC[FINITE_critical_edgeX]);;
585 e (ASM_SIMP_TAC[SUM_CONST]);;
586 e (REWRITE_TAC[REAL_ARITH `a * &1 / a = (a * &1) / a`; REAL_MUL_RID]);;
587 e (MATCH_MP_TAC REAL_DIV_REFL);;
588 e (MATCH_MP_TAC (MESON[REAL_OF_NUM_EQ] `~(x = 0) ==> ~ (&x = &0)`));;
589 e (UP_ASM_TAC THEN UP_ASM_TAC);;
590 e (MESON_TAC[CARD_EQ_0]);;
592 (* ------------------------------------------------------------------------- *)
595 `temp_set = {e:real^3->bool | (?X. X IN B_0_r /\ e IN critical_edgeX V X)}`);;
596 e (SUBGOAL_THEN `FINITE (temp_set:(real^3->bool)->bool)` ASSUME_TAC);;
599 (* Used CHEAT_TAC here. But it seems to be easy *)
603 (\X. gammaX V X lmfun *
604 sum (critical_edgeX V X) (\e. critical_weight V X)) =
606 (\X. sum (critical_edgeX V X) (\e. gammaX V X lmfun * critical_weight V X))`);;
607 e (REWRITE_TAC[GSYM SUM_LMUL]);;
611 (\X. sum (critical_edgeX V X) (\e. gammaX V X lmfun * critical_weight V X)) =
613 (\X. sum {e | e IN temp_set /\ critical_edgeX V X e}
614 (\e. gammaX V X lmfun * critical_weight V X))`);;
615 e (MATCH_MP_TAC SUM_EQ);;
616 e (GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[IN_ELIM_THM]);;
617 e (MATCH_MP_TAC (MESON[] `(s = r) ==> sum s f = sum r f`));;
618 e (REWRITE_TAC[SET_RULE
619 `(X = Y) <=> (!x. (x IN X ==> x IN Y) /\ (x IN Y ==> x IN X))`]);;
620 e (GEN_TAC THEN STRIP_TAC);;
621 e (REWRITE_TAC[IN_ELIM_THM]);;
622 e (REPEAT STRIP_TAC);;
623 e (EXPAND_TAC "temp_set" THEN REWRITE_TAC[IN_ELIM_THM]);;
624 e (EXISTS_TAC `x:real^3 -> bool`);;
625 e (ASM_REWRITE_TAC[]);;
626 e (UP_ASM_TAC THEN SET_TAC[]);;
627 e (REWRITE_TAC[IN_ELIM_THM]);;
631 (\X. sum {e | e IN temp_set /\ critical_edgeX V X e}
632 (\e. gammaX V X lmfun * critical_weight V X)) =
634 (\e. sum {X | X IN B_0_r /\ critical_edgeX V X e}
635 (\X. gammaX V X lmfun * critical_weight V X))`);;
636 e (MATCH_MP_TAC SUM_SUM_RESTRICT);;
637 e (ASM_REWRITE_TAC[]);;
640 (* need to continue *)
644 (*-------------------- The lemma about sum of beta_bump ---------------------*)
647 g `!V X. saturated V /\ packing V /\ mcell_set V X ==>
648 sum {e | e IN critical_edgeX V X } (\e. beta_bump V e X) = &0`;;
649 e (REPEAT STRIP_TAC THEN UP_ASM_TAC);;
650 e (REWRITE_TAC[mcell_set; IN_ELIM_THM]);;
652 e (REWRITE_TAC[beta_bump]);;
654 e (ASM_CASES_TAC `~(k = 4)`);;
656 (* Two case. Here is CASE 1*)
659 {e',e'',p,vl | k = 4 /\
660 critical_edgeX V X = {e', e''} /\
663 vl = left_action_list p ul /\
664 e' = {EL 0 vl, EL 1 vl} /\
665 e'' = {EL 2 vl, EL 3 vl}}
666 (\(e',e'',p,vl). (bump (hl [EL 0 vl; EL 1 vl]) -
667 bump (hl [EL 2 vl; EL 3 vl])) /
670 e (ABBREV_TAC `SET1 = {e',e'',p,vl | k = 4 /\
671 critical_edgeX V X = {e', e''} /\
674 vl = left_action_list p ul /\
675 e' = {EL 0 vl, EL 1 vl} /\
676 e'' = {EL 2 vl, EL 3 vl}}`);;
679 `SET1:(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list->bool = {}`);;
680 e (EXPAND_TAC "SET1");;
681 e (MP_TAC (ASSUME `~(k = 4)`));;
683 e (ASM_REWRITE_TAC[]);;
684 e (ASM_REWRITE_TAC[SUM_CLAUSES]);;
685 e (ASM_REWRITE_TAC[SUM_0]);;
689 e (NEW_GOAL `k = 4`);;
690 e (UP_ASM_TAC THEN MESON_TAC[]);;
691 e (SWITCH_TAC THEN DEL_TAC);;
693 e (UP_ASM_TAC THEN REWRITE_TAC[cell_params]);;
696 (* ------------------------------------------------------------------------ *)
698 e (NEW_GOAL `k <= 4 /\ ul IN barV V 3 /\ X = mcell k V ul`);;
699 e (NEW_GOAL ` (?k ul. k <= 4 /\ ul IN barV V 3 /\ X = mcell k V ul) /\ ((@(k,ul). k <= 4 /\ ul IN barV V 3 /\ X = mcell k V ul) = k,ul)`);;
700 e (ASM_REWRITE_TAC[]);;
701 e (CHOOSE_TAC (ASSUME `?i ul. X = mcell i V ul /\ ul IN barV V 3`));;
702 e (CHOOSE_TAC (ASSUME `?ul. X = mcell i V ul /\ ul IN barV V 3`));;
703 e (ASM_CASES_TAC `i <= 4`);;
704 e (EXISTS_TAC `i:num`);;
705 e (EXISTS_TAC `ul':(real^3) list`);;
706 e (ASM_REWRITE_TAC[]);;
709 e (EXISTS_TAC `ul':(real^3) list`);;
710 e (ASM_REWRITE_TAC[ARITH_RULE `4 <= 4`]);;
711 e (REWRITE_TAC[mcell]);;
713 e (UP_ASM_TAC THEN UP_ASM_TAC);;
714 e (MESON_TAC[ARITH_RULE `~(i <= 4) ==> (i = 0) ==> F`]);;
717 e (UP_ASM_TAC THEN UP_ASM_TAC);;
718 e (MESON_TAC[ARITH_RULE `~(i <= 4) ==> (i = 1) ==> F`]);;
721 e (UP_ASM_TAC THEN UP_ASM_TAC);;
722 e (MESON_TAC[ARITH_RULE `~(i <= 4) ==> (i = 2) ==> F`]);;
725 e (UP_ASM_TAC THEN UP_ASM_TAC);;
726 e (MESON_TAC[ARITH_RULE `~(i <= 4) ==> (i = 3) ==> F`]);;
729 e (UP_ASM_TAC THEN MESON_TAC[ARITH_RULE `4 = 0 ==> F`]);;
731 e (UP_ASM_TAC THEN MESON_TAC[ARITH_RULE `4 = 1 ==> F`]);;
733 e (UP_ASM_TAC THEN MESON_TAC[ARITH_RULE `4 = 2 ==> F`]);;
735 e (UP_ASM_TAC THEN MESON_TAC[ARITH_RULE `4 = 3 ==> F`]);;
739 e (ABBREV_TAC `P = (\k. k <= 4)`);;
740 e (ABBREV_TAC `Q = (\ul. ul IN barV V 3)`);;
741 e (ABBREV_TAC `R = (\k ul. X = mcell k V ul)`);;
744 `(?k ul. k <= 4 /\ ul IN barV V 3 /\ X = mcell k V ul) /\
745 (@(k,ul). k <= 4 /\ ul IN barV V 3 /\ X = mcell k V ul) = k,ul
746 ==> k <= 4 /\ ul IN barV V 3 /\ X = mcell k V ul <=>
747 (?k ul. P k /\ Q ul /\ R k ul) /\ (@(k,ul). P k /\ Q ul /\ R k ul) = k,ul
748 ==> P k /\ Q ul /\ R k ul`);;
749 e (EXPAND_TAC "P" THEN EXPAND_TAC "Q" THEN EXPAND_TAC "R");;
750 e (REWRITE_TAC[IN_ELIM_THM]);;
751 e (REWRITE_TAC[JOHN_SELECT_THM]);;
752 e (UP_ASM_TAC THEN DEL_TAC THEN UP_ASM_TAC THEN DEL_TAC THEN REPEAT STRIP_TAC);;
753 e (UP_ASM_TAC THEN UP_ASM_TAC THEN DEL_TAC THEN REPEAT STRIP_TAC);;
755 (* ------------------------------------------------------------------------- *)
757 e (REWRITE_WITH `{e | e IN critical_edgeX V X} = critical_edgeX V X`);;
759 e (ASM_CASES_TAC `?e e'. ~ (e = e') /\ critical_edgeX V X = {e , e'}`);;
760 e (CHOOSE_TAC (ASSUME `?e e'. ~ (e = e') /\ critical_edgeX V X = {e, e'}`));;
761 e (CHOOSE_TAC (ASSUME `?e'. ~ (e = e') /\ critical_edgeX V X = {e, e'}`));;
762 e (UP_ASM_TAC THEN DEL_TAC THEN DEL_TAC THEN DISCH_TAC);;
764 e (ASM_SIMP_TAC [SUM_SET_OF_2_ELEMENTS]);;
765 e (ABBREV_TAC `K1 = {e'',e''',p,(vl:(real^3)list) | {e, e'} = {e'', e'''} /\
768 vl = left_action_list p ul /\
769 e'' = {EL 0 vl, EL 1 vl} /\
770 e''' = {EL 2 vl, EL 3 vl}}`);;
772 ` sum (K1:(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list->bool)
773 (\(e',e'',p,vl). (bump (hl [EL 0 vl; EL 1 vl]) -
774 bump (hl [EL 2 vl; EL 3 vl])) /
776 sum K1 (\(e',e'',p,vl). --((bump (hl [EL 2 vl; EL 3 vl]) -
777 bump (hl [EL 0 vl; EL 1 vl])) /
779 e (MATCH_MP_TAC SUM_EQ);;
780 e (EXPAND_TAC "K1" THEN REWRITE_TAC[IN;IN_ELIM_THM;BETA_THM]);;
781 e (REPEAT STRIP_TAC);;
782 e (ASM_REWRITE_TAC[BETA_THM]);;
786 ` sum (K1:(real^3->bool)#(real^3->bool)#(num->num)#(real^3)list->bool)
787 (\(e',e'',p,vl). --((bump (hl [EL 2 vl; EL 3 vl]) -
788 bump (hl [EL 0 vl; EL 1 vl])) /
790 -- sum K1 (\(e',e'',p,vl). (bump (hl [EL 2 vl; EL 3 vl]) -
791 bump (hl [EL 0 vl; EL 1 vl])) /
795 (* need to continue *)
801 e (MESON_TAC[SUM_NEG;john_harrison_lemma1]);;
807 e (ABBREV_TAC `S1 = {e',e'',p,vl | k = 4 /\
808 critical_edgeX V X = {e', e''} /\
811 vl = left_action_list p ul /\
812 e' = {EL 0 vl, EL 1 (vl:(real^3)list)} /\
813 e'' = {EL 2 vl, EL 3 vl}}`);;
816 search [`sum f (\x. s - t)`];;
820 (* ! this may be difficult here *)
822 (* -------------------------------------------------------*)
824 e (MATCH_MP_TAC SUM_EQ_0);;
825 e (GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[IN_ELIM_THM]);;
826 e (NEW_GOAL `! e e'. (e = e') \/ ~(critical_edgeX V X = {e, e'})`);;
827 e (ASM_MESON_TAC[]);;
828 e (MATCH_MP_TAC SUM_EQ_0);;
829 e (GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM]);;
831 e (ASM_REWRITE_TAC[IN_ELIM_THM]);;
832 e (MATCH_MP_TAC (REAL_ARITH `a = &0 ==> a / &4 = &0`));;
833 e (MATCH_MP_TAC (REAL_ARITH `a = b ==> a - b = &0`));;
835 e (REWRITE_TAC[HL]);;
837 e (REWRITE_WITH `!a:real^3 b. set_of_list[a;b] = {a, b}`);;
838 e (MESON_TAC[set_of_list]);;
840 (ASSUME `vl:(real^3)list = left_action_list (p:num->num) ul`)]);;
841 e (SUBGOAL_THEN `e':real^3->bool = e''`ASSUME_TAC);;
842 e (ASM_MESON_TAC[]);;
843 e (ASM_MESON_TAC[]);;
845 let SUM_BETA_BUMP_LEMMA = top_thm();;