Update from HH
[Flyspeck/.git] / text_formalization / local / lunar_deform.hl
1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION                                              *)
3 (*                                                                            *)
4 (* Chapter: Local Fan                                                   *)
5 (* Author: Nguyen Quang Truong                                          *)
6 (* Date: 2013 - 5 - 31                                                        *)
7 (* ========================================================================== *)
8
9
10 (* ================================================================ *)
11
12
13
14
15 module Lunar_deform = struct
16
17
18 open Hales_tactic;;
19 open Localization;;
20 open Wrgcvdr_cizmrrh;;
21 open Fan;;
22 open Fan_defs;;
23 open Localization;;
24 open Hypermap;;
25 open Hypermap_iso;;
26 open Conforming;;
27 open Sphere;;
28
29
30 (* ================================== *)
31
32
33
34
35 (*
36 let asms_search0 sths =
37   let rec immediatesublist l1 l2 =
38     match (l1,l2) with
39       [],_ -> true
40     | _,[] -> false
41     | (h1::t1,h2::t2) -> h1 = h2 & immediatesublist t1 t2 in
42   let rec sublist l1 l2 =
43     match (l1,l2) with
44       [],_ -> true
45     | _,[] -> false
46     | (h1::t1,h2::t2) -> immediatesublist l1 l2 or sublist l1 t2 in
47   let exists_subterm_satisfying p (n,th) = can (find_term p) (concl th)
48   and name_contains s (n,th) = sublist (explode s) (explode n) in
49   let rec filterpred tm =
50     match tm with
51       Comb(Var("<omit this pattern>",_),t) -> not o filterpred t
52     | Comb(Var("<match theorem name>",_),Var(pat,_)) -> name_contains pat
53     | Comb(Var("<match aconv>",_),pat) -> exists_subterm_satisfying (aconv pat)
54     | pat -> exists_subterm_satisfying (can (term_match [] pat)) in
55   fun pats ->
56     let triv,nontriv = partition is_var pats in
57     (if triv <> [] then
58       warn true
59          ("Ignoring plain variables in search: "^
60           end_itlist (fun s t -> s^", "^t) (map (fst o dest_var) triv))
61      else ());
62     (if nontriv = [] & triv <> [] then []
63      else itlist (filter o filterpred) pats sths);;
64
65 let asms_search tms =
66   let gstk = !current_goalstack in
67   match gstk with
68     [] -> []
69   | (meta,gl::_,just)::_
70        -> let (sths,_) = gl in
71           map snd (asms_search0 sths tms)
72   | _  -> failwith "asm_searchs: Invalid goal state";;
73
74 let ASMS_SEARCH_TCL (tms:(term)list) (thstac:(thm)list->tactic) : tactic =
75   fun (gl:goal) ->
76   let (sths,tm) = gl in
77   let ths1 = map snd (asms_search0 sths tms) in
78   thstac ths1 gl;;
79
80 let ASM_SEARCH_TCL (tms:(term)list) (thstac:thm->tactic) : tactic =
81   let foo ths = match ths with
82                   [] -> failwith "ASM_SEARCH_TCL: No matching asms found"
83                 | _  -> thstac (hd ths) in
84   ASMS_SEARCH_TCL tms foo;;
85
86 let ASM_SEARCH_TC = asms_search;;
87 *)
88
89 let ATTACH thm = MATCH_MP (MESON[]` ! a b. ( a ==> b ) ==> ( a <=> a /\ b )`) thm;;
90
91 let NHANH tm = ONCE_REWRITE_TAC[ ATTACH (SPEC_ALL ( tm ))];;
92
93 let PHA = REWRITE_TAC[ MESON[] ` (a/\b)/\c <=> a/\ b /\ c `; MESON[]`
94 a ==> b ==> c <=> a /\ b ==> c `];;
95
96 let DOWN_TAC = REPEAT (FIRST_X_ASSUM MP_TAC) THEN REWRITE_TAC[IMP_IMP] THEN PHA;;
97
98
99 let DOWN = FIRST_X_ASSUM MP_TAC;;
100
101 let DOWNS n = REPLICATE_TAC n DOWN THEN PHA;;
102
103 let REMOVE_TAC = FIRST_X_ASSUM MP_TAC THEN MATCH_MP_TAC (TAUT` a ==> b ==> a`);;
104
105
106 (*
107 let types_thm th = let cl = concl th in
108 List.map dest_var (frees cl );;
109
110 let seans_fn () =
111 let (tms,tm) = top_goal () in
112 let vss = map frees (tm::tms) in
113 let vs = setify (flat vss) in
114 map dest_var vs;;
115 *)
116
117
118
119
120 let PAT_REWRITE_TAC tm thms =
121 (CONV_TAC (PAT_CONV tm (REWRITE_CONV thms )));;
122
123 let FOR_ASM th =
124 let th1 = REWRITE_RULE[MESON[]` a /\ b ==> c <=>
125 a ==> b ==> c `] th in
126 let th2 = SPEC_ALL th1 in UNDISCH_ALL th2;;
127
128 (* change a th having form |- A ==> t to the form A |- t
129 to get ready to some other commands
130
131
132 |- A ==> t
133 ----------- FOR_ASM
134 A |- t
135 *)
136
137 let ASSUME_TAC2 = ASSUME_TAC o FOR_ASM;;
138
139
140 let PAT_ONCE_REWRITE_TAC tm thms =
141 (CONV_TAC (PAT_CONV tm (ONCE_REWRITE_CONV thms )));;
142
143 let ASM_PAT_RW_TAC tm thms = EVERY_ASSUM (fun th ->
144 (CONV_TAC (PAT_CONV tm (ONCE_REWRITE_CONV
145 ( th ::[ thms ] )))));;
146
147 let PAT_TH_TAC tm th =
148 (CONV_TAC (PAT_CONV tm (REWRITE_CONV[th] )));;
149
150
151 let IMP_TO_EQ_RULE th = MATCH_MP (TAUT` (a ==> b ) ==>
152 ( a <=> a /\ b )`) (SPEC_ALL th);;
153
154 let NHANH_PAT tm th = PAT_ONCE_REWRITE_TAC tm
155 [ IMP_TO_EQ_RULE th ];;
156
157
158 let MAKE_FIRST_TAC tm = UNDISCH_TAC tm THEN DISCH_TAC;;
159
160
161 (* ---------- BG TEST ------------- *)
162
163
164 (*
165 let rec els L = match L with
166 [] -> p ()
167 | (x::l) -> e x; els l;;
168
169 let rec bls L = match L with
170 [] -> p ()
171 | (x::l) -> b (); bls l;;
172 *)
173
174 (* ============================================= *)
175
176
177
178 let CONS_IMP_CONTINUOUS_ATREAL = prove_by_refinement(` (! t. t IN real_interval (a,b) ==> f t = (u:real^N) )
179 ==> (! t. t IN real_interval (a,b) ==> f continuous atreal t ) `,
180 [REWRITE_TAC[continuous_atreal; real_interval; IN_ELIM_THM];
181 REPEAT STRIP_TAC;
182 EXISTS_TAC` min (b - t ) ( t - a ) ` ;
183 CONJ_TAC;
184 REWRITE_TAC[REAL_LT_MIN];
185 ASM_REAL_ARITH_TAC;
186 GEN_TAC;
187 REWRITE_TAC[REAL_LT_MIN];
188 STRIP_TAC;
189 ASSUME_TAC2 (REAL_ARITH` a < t /\ t < b /\ abs (x' - t) < b - t /\ abs (x' - t) < t - a ==> x' < b  /\ a < x' `);
190 SUBGOAL_THEN ` f (x':real) = (u:real^N) ` MP_TAC;
191 FIRST_X_ASSUM MATCH_MP_TAC;
192 ASM_REWRITE_TAC[];
193 ASM_SIMP_TAC[DIST_REFL]]);;
194
195
196 let AFF_GT_SUBSET_AFFINE_HULL21 = ISPECL [` {u, v:real^N} `;` {w:real^N } `] AFF_GT_SUBSET_AFFINE_HULL;;
197
198
199
200 let DISJTINCT_PROPERTY = prove_by_refinement (
201 ` FINITE V /\
202 (f : real^N -> real -> real^N) u continuous atreal (&0) /\
203  f u (&0) = u /\
204  a < &0 /\
205  &0 < b /\
206  (!u' t. u' IN V /\ ~(u = u') /\ t IN real_interval (a,b) ==> f u' t = u')
207  ==> (?e. &0 < e /\
208           (!t u'.
209                --e < t /\ t < e /\ u' IN V /\ ~(u' = u) ==> ~(f u t = f u' t)))`, [
210 STRIP_TAC;
211 SUBGOAL_THEN`!u'. u' IN V /\ ~(u = u') ==> (!t. t IN real_interval (a,b) ==>
212 (f: real^N -> real -> real^N) u' continuous atreal t )` ASSUME_TAC;
213 GEN_TAC THEN STRIP_TAC;
214 MATCH_MP_TAC (GEN`u: real^N ` CONS_IMP_CONTINUOUS_ATREAL);
215 EXISTS_TAC` u': real^N `;
216 REPEAT STRIP_TAC;
217 FIRST_X_ASSUM MATCH_MP_TAC;
218 ASM_REWRITE_TAC[];
219 MP_TAC (ISPECL [` &0 `;` u:real^N `;` f: real^N -> real -> real^N `; 
220 ` V:real^N -> bool `] (GEN_ALL Local_lemmas1.CONTINUOUS_FUN_DISTINCT_FINITE_SET));
221 ANTS_TAC;
222 ASM_REWRITE_TAC[];
223 ANTS_TAC;
224 CONJ_TAC;
225 REPEAT STRIP_TAC;
226 SUBGOAL_THEN` &0 IN real_interval (a,b) ` MP_TAC;
227 ASM_REWRITE_TAC[real_interval; IN_ELIM_THM];
228 ASM_MESON_TAC[];
229 GEN_TAC;
230 REWRITE_TAC[IN_INSERT];
231 STRIP_TAC;
232 ASM_REWRITE_TAC[];
233 SUBGOAL_THEN` &0 IN real_interval (a,b) ` MP_TAC;
234 ASM_REWRITE_TAC[real_interval; IN_ELIM_THM];
235 ASM_MESON_TAC[];
236
237 REWRITE_TAC[REAL_SUB_RZERO; GSYM REAL_BOUNDS_LT];
238 MESON_TAC[]]);;
239
240
241
242
243
244 let EDGE_FORM_IN_LOCAL_FAN = prove_by_refinement(
245 ` local_fan (V,E,FF) /\ x IN E ==> ? u v. ~( u = v ) /\ {u, v} = x `,
246 [REWRITE_TAC[local_fan; FAN; graph; IN];
247 LET_TAC; STRIP_TAC; FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` x:real^3 -> bool `));
248 DOWN; REWRITE_TAC[Local_lemmas1.HAS_SIZE_2_EXISTS2]; MESON_TAC[]]);;
249
250
251
252
253
254 let EDGE_IN_LOCAL_FAN_DET_RHO_NODE = prove_by_refinement
255 (` local_fan (V,E,FF) /\ x IN E ==> (?v. v IN V /\ {v, rho_node1 FF v} = x) `,
256 [NHANH EDGE_FORM_IN_LOCAL_FAN;
257 STRIP_TAC;
258 UNDISCH_TAC` (x:real^3 -> bool) IN E `;
259 UNDISCH_TAC` local_fan (V,E,FF) `;
260 PHA;
261 EXPAND_TAC "x";
262 NHANH Local_lemmas.LOFA_IN_E_IMP_IN_FF;
263 STRIP_TAC;
264 DOWN;
265 UNDISCH_TAC` local_fan (V,E,FF) `;
266 PHA;
267 NHANH Local_lemmas.DETER_RHO_NODE;
268 STRIP_TAC;
269 EXISTS_TAC `u: real^3 `;
270
271 ASM_MESON_TAC[Local_lemmas.LOCAL_FAN_IMP_IN_V; Local_lemmas.DETER_RHO_NODE; INSERT_COMM];
272 ASM_MESON_TAC[Local_lemmas.LOCAL_FAN_IMP_IN_V; Local_lemmas.DETER_RHO_NODE; INSERT_COMM]]);;
273
274
275
276
277
278 let TOW_POINTS_IN_IMP_AFF_GT_SUBSET = prove_by_refinement
279 (` DISJOINT {x, u} {v:real^N } /\ 
280 a IN aff_gt {x,u} {v} /\
281 b IN aff_gt {x, u} {v} /\
282 DISJOINT {x} {a,b} 
283 ==> aff_gt {x} {a,b} SUBSET aff_gt {x,u} {v} `,
284 [NHANH AFF_GT_2_1;
285 NHANH AFF_GT_1_2;
286 STRIP_TAC;
287 UNDISCH_TAC` a IN aff_gt {x, u} {v:real^N }`;
288 UNDISCH_TAC` b IN aff_gt {x, u} {v:real^N }`;
289 ASM_REWRITE_TAC[IN_ELIM_THM; SUBSET];
290 STRIP_TAC;
291 STRIP_TAC;
292 GEN_TAC;
293 STRIP_TAC;
294 DOWN;
295 ASM_REWRITE_TAC[];
296 REWRITE_TAC[VECTOR_ARITH`  t1'' % x +
297
298  t2'' % (t1' % x + t2' % u + t3' % v) +
299  t3'' % (t1 % x + t2 % u + t3 % v) = 
300 (t1'' + t2'' * t1' + t3'' * t1 ) % x + (t2'' * t2' + t3'' * t2) % u + 
301 (t2'' * t3' + t3'' * t3 ) % v `];
302 STRIP_TAC;
303 EXISTS_TAC` (t1'' + t2'' * t1' + t3'' * t1:real) `;
304 EXISTS_TAC` t2'' * t2' + t3'' * t2:real `;
305 EXISTS_TAC` t2'' * t3' + t3'' * t3 `;
306 CONJ_TAC;
307 MATCH_MP_TAC Real_ext.REAL_PROP_POS_ADD2;
308 ASM_MESON_TAC[REAL_LT_MUL];
309 ASM_REWRITE_TAC[];
310
311 UNDISCH_TAC` t1' + t2' + t3' = &1 `;
312 UNDISCH_TAC` t1 + t2 + t3 = &1 `;
313 UNDISCH_TAC` t1'' + t2'' + t3'' = &1 `;
314 PHA;
315 CONV_TAC REAL_RING]);;
316
317
318
319
320 let REAL_LT_MUL12 = prove(` &0 < b /\ a < &0 ==> a * b < &0 `,
321 REWRITE_TAC[REAL_ARITH` a * b < &0 <=> &0 < (-- a) * (b ) `] THEN 
322 STRIP_TAC THEN 
323 MATCH_MP_TAC REAL_LT_MUL THEN 
324 DOWN_TAC THEN 
325 REAL_ARITH_TAC);;
326
327
328 let COLL_IN_AFF_GT_INTER_EMPTY = prove_by_refinement
329 (` ~ collinear {a,b,x: real^N} /\ u IN aff_gt {a,b} {x} ==>
330 aff_gt {a, b} {x} INTER aff_lt {a} {u} = {} `,
331 [NHANH Local_lemmas.COLL_IN_AFF_GT_TOO;
332 NHANH Fan.th3a;
333 STRIP_TAC;
334 DOWN;
335 NHANH (SET_RULE` DISJOINT {a, b} {u} ==> DISJOINT {a} {u} `);
336 NHANH AFF_LT_1_1;
337 STRIP_TAC;
338 UNDISCH_TAC` DISJOINT {a, b} {x: real^N} `;
339 NHANH AFF_GT_2_1;
340 STRIP_TAC;
341 UNDISCH_TAC` u IN aff_gt {a, b} {x: real^N} `;
342 ASM_REWRITE_TAC[IN_ELIM_THM];
343 STRIP_TAC;
344 REWRITE_TAC[SET_RULE` A INTER B = {} <=> (! x. x IN B ==> ~( x IN A)) `];
345 REWRITE_TAC[IN_ELIM_THM];
346 GEN_TAC THEN STRIP_TAC;
347 ASM_REWRITE_TAC[];
348
349 REWRITE_TAC[Local_lemmas.VECTOR_ADD_LDISTRIB1];
350 STRIP_TAC;
351 SUBGOAL_THEN` (t1' + t2' * t1 ) + (t2' * t2 ) + (t2' * t3) = &1 ` ASSUME_TAC;
352 ASM_REWRITE_TAC[REAL_RING` (t1' + t2' * t1) + t2' * t2 + t2' * t3 = t1' + t2' * (t1 + t2 + t3 ) `; REAL_ARITH` a * &1 = a `];
353 ABBREV_TAC` vv: real^N = t1'' % a + t2'' % b + t3' % x ` ;
354 SUBGOAL_THEN` (vv: real^N) IN affine hull {a, b, x} ` ASSUME_TAC;
355 ASM_REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM];
356 ASM_MESON_TAC[];
357 UNDISCH_TAC` ~collinear {a, b, x:real^N} `;
358 DOWN THEN PHA;
359 NHANH Collect_geom.lemma11;
360 STRIP_TAC;
361 FIRST_ASSUM (MP_TAC o (SPECL [` t1'': real `;` t2'': real `;` t3': real `]));
362 ANTS_TAC;
363 ASM_REWRITE_TAC[];
364 FIRST_ASSUM (MP_TAC o (SPECL [` (t1': real) + t2' * t1`;`( t2': real ) * t2 `;` (t2': real) * t3 `]));
365 ANTS_TAC;
366 ASM_REWRITE_TAC[];
367 UNDISCH_TAC` t1' % a + (t2' * t1) % a + (t2' * t2) % b + (t2' * t3) % x = (vv: real^N) `;
368 ASM_REWRITE_TAC[];
369 DISCH_THEN (SUBST1_TAC o SYM);
370 CONV_TAC VECTOR_ARITH;
371 STRIP_TAC;
372 STRIP_TAC;
373 DOWN;
374 EXPAND_TAC "t3''";
375 ASSUME_TAC2 (SPECL [` t2': real `;` t3: real `] (GEN_ALL REAL_LT_MUL12));
376 DOWN;
377 UNDISCH_TAC` &0 < t3' `;
378 REAL_ARITH_TAC]);;
379
380
381
382
383
384
385 let HKIRPEP_ALT = prove(` convex_local_fan (V,E,FF) /\ lunar (v,w) V E
386      ==> (!u. u IN V DIFF {v, w} ==> interior_angle1 (vec 0) FF u = pi) /\
387          &0 < interior_angle1 (vec 0) FF v /\
388          interior_angle1 (vec 0) FF v <= pi /\
389          interior_angle1 (vec 0) FF v = interior_angle1 (vec 0) FF w /\
390          (?i j. i + j = CARD V /\ i < CARD V /\
391               ~(i = 0) /\
392               ~(i = 1) /\
393               w = ITER i (rho_node1 FF) v /\
394               {ITER l (rho_node1 FF) v | 0 < l /\ l < i} =
395               aff_gt {vec 0, v} {rho_node1 FF v} INTER V /\
396         j < CARD V /\
397               ~(j = 0) /\
398               ~(j = 1) /\
399               v = ITER j (rho_node1 FF) w /\
400               {ITER l (rho_node1 FF) w | 0 < l /\ l < j} =
401               aff_gt {vec 0, v} {ivs_rho_node1 FF v} INTER V) `,
402 NHANH Local_lemmas.HKIRPEP THEN
403 STRIP_TAC THEN
404 UNDISCH_TAC` v = ITER j (rho_node1 FF) w ` THEN
405 UNDISCH_TAC` w = ITER i (rho_node1 FF) v ` THEN
406 DISCH_THEN (ASSUME_TAC o SYM) THEN
407 DISCH_THEN (ASSUME_TAC o SYM) THEN
408 ASM_REWRITE_TAC[] THEN
409 EXISTS_TAC` i: num ` THEN
410 EXISTS_TAC` j:num ` THEN
411 ASM_REWRITE_TAC[] THEN
412 MATCH_MP_TAC (GEN_ALL Local_lemmas1.CARD_V_TWO_HAFL_CIRCLE) THEN
413 EXISTS_TAC` E: (real^3 -> bool) -> bool ` THEN
414 EXISTS_TAC` FF: real^3 # real^3 -> bool ` THEN
415 EXISTS_TAC` w:real^3 ` THEN
416 EXISTS_TAC` v: real^3 ` THEN
417 ASM_REWRITE_TAC[] THEN
418 UNDISCH_TAC` convex_local_fan (V,E,FF)` THEN
419 UNDISCH_TAC ` lunar (v,w:real^3) V E ` THEN
420 SIMP_TAC[convex_local_fan; lunar; INSERT_SUBSET]);;
421
422
423
424
425
426
427 let LUNAR_IMP_IN_TWO_HAFLS_PLANE = prove_by_refinement (` convex_local_fan (V,E,FF) /\ lunar (v,w) V E ==>
428 (! u. u IN V /\ ~( u = v ) /\ ~( u = w) ==> u IN aff_gt {vec 0, v} {rho_node1 FF v} \/ u IN aff_gt {vec 0, v} {ivs_rho_node1 FF v} ) `,
429 [NHANH HKIRPEP_ALT;
430 STRIP_TAC;
431 ASSUME_TAC2 Local_lemmas.CVX_LO_IMP_LO;
432 SUBGOAL_THEN` lunar (v,w:real^3) V E ` MP_TAC;
433 FIRST_X_ASSUM ACCEPT_TAC;
434 REWRITE_TAC[lunar; circular; INSERT_SUBSET];
435 STRIP_TAC;
436 ASSUME_TAC2 (SPEC_ALL Localization.LOFA_IMP_LT_CARD_SET_V_ALT);
437 GEN_TAC THEN STRIP_TAC;
438 UNDISCH_TAC` (u:real^3) IN V `;
439 EXPAND_TAC "V";
440 REWRITE_TAC[IN_ELIM_THM];
441 STRIP_TAC;
442 ASM_CASES_TAC` n = 0 `;
443 FIRST_X_ASSUM (SUBST_ALL_TAC);
444 DOWN;
445 UNDISCH_TAC` v = ITER j (rho_node1 FF) w `;
446 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
447 DISCH_THEN (ASSUME_TAC o SYM);
448 DISCH_THEN (ASSUME_TAC o SYM);
449 ASM_REWRITE_TAC[ITER];
450 ASM_CASES_TAC` n < (i:num) `;
451 DISJ1_TAC;
452
453 UNDISCH_TAC` v = ITER j (rho_node1 FF) w `;
454 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
455 DISCH_THEN (ASSUME_TAC o SYM);
456 DISCH_THEN (ASSUME_TAC o SYM);
457
458
459 SUBGOAL_THEN` u IN {ITER l (rho_node1 FF) v | 0 < l /\ l < i} ` MP_TAC;
460 REWRITE_TAC[IN_ELIM_THM];
461 EXISTS_TAC` n: num `;
462 ASM_REWRITE_TAC[];
463 UNDISCH_TAC` ~( n = 0) `;
464 ARITH_TAC;
465 ASM_SIMP_TAC[IN_INTER];
466
467 ASM_CASES_TAC` n = (i:num) `;
468 UNDISCH_TAC` u = ITER n (rho_node1 FF) v `;
469 UNDISCH_TAC` v = ITER j (rho_node1 FF) w `;
470 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
471 DISCH_THEN (ASSUME_TAC o SYM);
472 DISCH_THEN (ASSUME_TAC o SYM);
473 ASM_REWRITE_TAC[];
474
475 DISJ2_TAC;
476 SUBGOAL_THEN`u IN {ITER l (rho_node1 FF) w | 0 < l /\ l < j} ` MP_TAC;
477 REWRITE_TAC[IN_ELIM_THM];
478 EXISTS_TAC` n - (i:num ) `;
479
480 UNDISCH_TAC` v = ITER j (rho_node1 FF) w `;
481 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
482 DISCH_THEN (ASSUME_TAC o SYM);
483 DISCH_THEN (ASSUME_TAC o SYM);
484 ASM_REWRITE_TAC[];
485 EXPAND_TAC "w";
486 REWRITE_TAC[ITER_ADD];
487 ASSUME_TAC2 (ARITH_RULE` ~( n < i) ==> n - i + i = (n:num ) `);
488 ASM_REWRITE_TAC[];
489 ASSUME_TAC2 (ARITH_RULE` ~(n < i) ==> (n - i < j <=> (n:num) < i + j ) `);
490 ASM_REWRITE_TAC[ARITH_RULE` 0 < n - i <=> ~( n < i ) /\ ~( n = (i:num)) `];
491
492 UNDISCH_TAC` v = ITER j (rho_node1 FF) w `;
493 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
494 DISCH_THEN (ASSUME_TAC o SYM);
495 DISCH_THEN (ASSUME_TAC o SYM);
496
497 ASM_SIMP_TAC[IN_INTER]]);;
498
499
500
501
502
503 let IN_CONV0_IMP_AFF_EQ1 = prove(` a IN conv0 {x, y} ==> aff {a, x} = aff {a, y} `,
504 NHANH Local_lemmas.IN_CONV0_IMP_AFF_EQ THEN 
505 ONCE_REWRITE_TAC[INSERT_COMM] THEN 
506 NHANH Local_lemmas.IN_CONV0_IMP_AFF_EQ THEN 
507 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN 
508 SIMP_TAC[INSERT_COMM]);;
509
510
511
512
513 let AFF_LT_SUBSET_AFF11 = prove_by_refinement (
514 ` DISJOINT {a} {b} ==> aff_lt {a} {b} SUBSET aff {a,b:real^N} `,
515 [NHANH AFF_LT_1_1;
516 SIMP_TAC[Collect_geom.AFF_2POINTS_INTERPRET; SUBSET; IN_ELIM_THM];
517 STRIP_TAC;
518 GEN_TAC;
519 STRIP_TAC;
520 EXISTS_TAC` t1: real `;
521 EXISTS_TAC` t2: real `;
522 ASM_REWRITE_TAC[]]);;
523
524
525
526
527 let IN_AFF_LT_STILL_NOT_COLLINEAR = prove_by_refinement
528 (` ~ collinear {x: real^N,y,a} /\ b IN aff_lt {x, y} {a} ==>
529 ~ collinear {x,y,b} `,
530 [REPEAT STRIP_TAC;
531 UNDISCH_TAC` b IN aff_lt {x, y} {a: real^N} `;
532 PHA;
533 UNDISCH_TAC ` ~collinear {x, y, a: real^N} `;
534 NHANH Fan.th3a;
535 NHANH AFF_LT_2_1;
536 SIMP_TAC[IN_ELIM_THM];
537 REPEAT STRIP_TAC;
538 UNDISCH_TAC` ~collinear {x, y, a:real^N} `;
539 PHA;
540 UNDISCH_TAC` collinear {x,y,b:real^N} `;
541 REWRITE_TAC[Local_lemmas.collinear_fan22; Collect_geom.AFF_2POINTS_INTERPRET; IN_ELIM_THM];
542 STRIP_TAC;
543 DISJ1_TAC;
544 DOWN;
545 ASM_REWRITE_TAC[];
546 REWRITE_TAC[
547 VECTOR_ARITH` t1 % x + t2 % y + t3 % a = ta % x + tb % y <=>  t3 % a = (ta - t1) % x + (tb - t2) % y `];
548 NHANH_PAT`\x. x ==> y `  (MESON[]` a = b ==> ( &1 / t3) % a = (&1 / t3) % b `);
549 REWRITE_TAC[Local_lemmas.VECTOR_ADD_LDISTRIB1];
550 ASSUME_TAC2 (REAL_FIELD` t3 < &0 ==> &1 / t3 * t3 = &1 `);
551 ASM_REWRITE_TAC[VECTOR_MUL_LID];
552 SIMP_TAC[];
553 STRIP_TAC;
554 EXISTS_TAC` (&1 / t3 * (ta - t1)) `;
555 EXISTS_TAC` (&1 / t3 * (tb - t2)) `;
556 ASM_REWRITE_TAC[GSYM REAL_ADD_LDISTRIB; REAL_ARITH` a - x + b - y = (a + b ) - ( x + y )`];
557 UNDISCH_TAC`t1 + t2 + t3 = &1 `;
558 ASM_SIMP_TAC[REAL_ARITH` a + b + c = &1 <=> &1 - ( a + b ) = c `];
559
560 ASM_REWRITE_TAC[]]);;
561
562
563
564
565
566 let AZIM_PI_LEMMA = prove_by_refinement
567 (` ~(aff_gt {u} s INTER aff_lt {u} {a} = {} ) /\
568 aff_gt {u} s SUBSET aff_gt {u, v} {y} /\
569 a IN aff_gt {u, v} {x} /\
570 ~ collinear {u, v, x} /\
571 ~ collinear {u, v, y} 
572 ==> azim u v x y = pi `,
573 [MP_TAC (
574 ISPECL [`{u: real^3} `;` {u, v:real^3} `; `{a: real^3 }`] AFF_LT_MONO_LEFT);
575 ANTS_TAC;
576 CONV_TAC SET_RULE;
577 REPEAT STRIP_TAC;
578 SUBGOAL_THEN` aff_gt {u,v} {x} = aff_gt {u,v} {a:real^3} ` MP_TAC;
579 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
580 ASM_REWRITE_TAC[];
581 DISCH_THEN (ASSUME_TAC o SYM);
582 ASSUME_TAC2 (
583 SET_RULE` ~(aff_gt {u: real^3} s INTER aff_lt {u} {a} = {}) /\
584 aff_lt {u} {a} SUBSET aff_lt {u, v} {a} /\
585 aff_gt {u} s SUBSET aff_gt {u, v} {y}
586 ==> ~ ( aff_gt {u, v} {y} INTER aff_lt {u, v} {a} = {} ) `);
587 DOWN;
588 REWRITE_TAC[SET_RULE` ~( A INTER B = {} ) <=> ? x. x IN A /\ x IN B `];
589 STRIP_TAC;
590 UNDISCH_TAC` x' IN aff_gt {u, v} {y:real^3} `;
591 UNDISCH_TAC` ~ collinear {u, v, y:real^3} `;
592 PHA;
593 NHANH Local_lemmas.COLL_IN_AFF_GT_TOO;
594 STRIP_TAC;
595 SUBGOAL_THEN` ~ collinear {u, v, a: real^3} ` ASSUME_TAC;
596 MATCH_MP_TAC (GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO);
597 EXISTS_TAC` x: real ^3 `;
598 ASM_REWRITE_TAC[];
599
600 UNDISCH_TAC` ~collinear {u, v, x' : real^3} `;
601 UNDISCH_TAC` ~collinear {u, v, a: real^3} `;
602 PHA;
603 NHANH AZIM_EQ_PI_ALT;
604 STRIP_TAC;
605
606
607 SUBGOAL_THEN` azim u v a x' = azim u v a y ` MP_TAC;
608 MATCH_MP_TAC AZIM_EQ_IMP;
609 ASM_REWRITE_TAC[];
610 FIRST_X_ASSUM (ASSUME_TAC o SYM);
611
612 STRIP_TAC;
613 UNDISCH_TAC` x' IN aff_lt {u, v} {a:real^3} `;
614 ASM_REWRITE_TAC[];
615 SUBGOAL_THEN` azim u v a y = azim u v x y ` MP_TAC;
616 ONCE_REWRITE_TAC[ Rogers.AZIM_EQ_SYM];
617 MATCH_MP_TAC (* Polar_fan. *) AZIM_EQ_IMP;
618 ASM_REWRITE_TAC[];
619 SIMP_TAC[]]);;
620
621
622
623
624 (* ================================================== *)
625
626
627
628
629
630
631
632
633
634
635 let SUB_LUNAR_DEFORM_LEMMA = prove_by_refinement(` FINITE V /\ convex_local_fan (V,E,FF) /\ lunar (v,w) V E /\
636 (! x. x IN E ==> x SUBSET V) /\
637 f (u:real^3) (&0 ) = u /\
638 f u continuous atreal (&0) /\
639 interior_angle1 (vec 0) FF v < pi /\
640 a < &0  /\ &0 < b /\
641      u IN V /\
642      ~(u = v) /\
643      ~(u = w) /\
644      (!u' t. u' IN V /\ ~(u = u') /\ t IN real_interval (a,b) ==> f u' t = u') /\
645      (!t. t IN real_interval (a,b) ==> f u t IN affine hull {vec 0, v, w, u})
646
647 ==> (?e. &0 < e /\
648               (!t. --e < t /\ t < e
649                    ==> 
650                        lunar (v,w) (IMAGE (\v. f v t) V)
651                        (IMAGE (IMAGE (\v. f v t)) E)))`,
652 [
653 STRIP_TAC;
654 ASSUME_TAC2 Local_lemmas.HKIRPEP;
655 DOWN_TAC;
656 REWRITE_TAC[lunar; circular];
657 STRIP_TAC;
658 SUBGOAL_THEN` ! t. t IN real_interval (a,b) ==>  {v, w} SUBSET IMAGE (\v. (f:real^3->real->real^3) v t) V ` ASSUME_TAC;
659
660 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_IMAGE];
661 REPEAT STRIP_TAC;
662 EXISTS_TAC` v:real^3` ;
663 SUBGOAL_THEN` (v:real^3) IN V ` MP_TAC;
664 MATCH_MP_TAC (SET_RULE` {v, w:real^3} SUBSET V ==> v IN V`);
665 FIRST_X_ASSUM ACCEPT_TAC;
666 SIMP_TAC[];
667 FIRST_X_ASSUM (ASSUME_TAC o (SPEC ` &0 `));
668 FIRST_X_ASSUM (ASSUME_TAC o (ISPECL[ ` v:real^3`; ` t:real `]));
669 STRIP_TAC;
670 ONCE_REWRITE_TAC[EQ_SYM_EQ];
671 FIRST_X_ASSUM MATCH_MP_TAC;
672 ASM_REWRITE_TAC[];
673 EXISTS_TAC` w:real^3 `;
674
675
676
677 SUBGOAL_THEN` (w:real^3) IN V ` ASSUME_TAC;
678 MATCH_MP_TAC (SET_RULE` {v, w} SUBSET V ==> w IN V ` );
679 FIRST_X_ASSUM ACCEPT_TAC;
680 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
681 DISCH_THEN (ASSUME_TAC o GSYM);
682 ASM_REWRITE_TAC[];
683
684
685
686 FIRST_X_ASSUM (ASSUME_TAC o (SPEC ` &0 `)) THEN
687 FIRST_X_ASSUM (ASSUME_TAC o (SPECL[ ` w:real^3 `; ` t:real `]));
688
689
690
691 ONCE_REWRITE_TAC[EQ_SYM_EQ];
692 FIRST_X_ASSUM MATCH_MP_TAC THEN
693 ASM_REWRITE_TAC[];
694
695 ABBREV_TAC` CONCL = ?e. &0 < e /\
696      (!t. --e < t /\ t < e
697           ==> ~(?v w u.
698                     {v, w} IN IMAGE (IMAGE (\v. (f:real^3 -> real -> real^3) v t)) E /\
699                     u IN IMAGE (\v. f v t) V /\
700                     ~(aff_gt {vec 0} {v, w} INTER aff_lt {vec 0} {u} = {})) /\
701               {v, w} SUBSET IMAGE (\v. f v t) V /\
702               ~(v = w) /\
703               collinear {vec 0, v, w}) `;
704
705
706 MP_TAC (ISPEC`V: real^3 -> bool ` (GEN`V: real^N -> bool ` DISJTINCT_PROPERTY));
707
708 ANTS_TAC;
709 ASM_REWRITE_TAC[];
710 STRIP_TAC;
711
712 SUBGOAL_THEN` t IN real_interval (a,b) /\ --e < t /\ t < e
713                 ==> (!v w u'.
714                           {v, w} IN IMAGE (IMAGE (\v. (f:real^3 -> real -> real^3) v t)) E /\
715                           u' IN IMAGE (\v. f v t) V /\
716  ~( f u t IN {u' ,v, w} )
717 ==> (aff_gt {vec 0} {v, w} INTER aff_lt {vec 0} {u'} =
718                             {})) ` ASSUME_TAC;
719 REWRITE_TAC[IN_IMAGE];
720 REPEAT STRIP_TAC;
721
722 SUBGOAL_THEN` x SUBSET (V:real^3 -> bool ) ` ASSUME_TAC;
723 FIRST_ASSUM MATCH_MP_TAC;
724 FIRST_ASSUM ACCEPT_TAC;
725 ASM_CASES_TAC` (u:real^3) IN x `;
726 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN {v', w'} ` ASSUME_TAC;
727 UNDISCH_TAC` {v': real^3, w'} = IMAGE (\v. (f:real^3 -> real -> real^3) v t) x `;
728 SIMP_TAC[IN_IMAGE];
729 STRIP_TAC;
730
731 EXISTS_TAC` u:real^3 `;
732 ASM_REWRITE_TAC[];
733 DOWN;
734 REPLICATE_TAC 3 DOWN;
735 SIMP_TAC[IN_INSERT];
736 MESON_TAC[]; 
737 SUBGOAL_THEN` t IN real_interval (a, b) ==> IMAGE (\v. (f:real^3 -> real -> real^3) v t ) x = x ` MP_TAC;
738 STRIP_TAC;
739 MATCH_MP_TAC Counting_spheres.pad2d3d_dropout_lemma;
740 EXISTS_TAC` \x. (x:real^3) IN V /\ ~( x = u ) ` ;
741 CONJ_TAC;
742 GEN_TAC;
743 REWRITE_TAC[BETA_THM];
744 DOWN THEN DOWN THEN DOWN;
745 REWRITE_TAC[SUBSET];
746 MESON_TAC[];
747 GEN_TAC;
748 REWRITE_TAC[BETA_THM];
749 STRIP_TAC;
750 UNDISCH_TAC` !u' t. u' IN V /\ ~(u = u') /\ t IN real_interval (a,b) ==> (f: real^3 -> real -> real^3) u' t = u' `;
751 DISCH_THEN MATCH_MP_TAC;
752 ASM_REWRITE_TAC[];
753 DISCH_THEN ASSUME_TAC2;
754 FIRST_X_ASSUM SUBST_ALL_TAC;
755
756 ASM_CASES_TAC` x' = (u:real^3) `;
757 FIRST_X_ASSUM SUBST_ALL_TAC;
758 UNDISCH_TAC` ~((f:real^3 -> real -> real^3 ) u t IN {u', v', w'}) ` ;
759 ASM_REWRITE_TAC[IN_INSERT];
760 SUBGOAL_THEN` (f: real^3 -> real -> real^3) x' t = x' ` MP_TAC;
761 UNDISCH_TAC` !u' t. u' IN V /\ ~(u = u') /\ t IN real_interval (a,b) ==> (f: real^3 -> real -> real^3 ) u' t = u' ` ;
762 DISCH_THEN MATCH_MP_TAC;
763 ASM_REWRITE_TAC[];
764 DISCH_THEN SUBST_ALL_TAC;
765 UNDISCH_TAC` ~(?v w u.
766             {v, w} IN E /\
767             u IN V /\
768             ~(aff_gt {vec 0} {v, w: real^3} INTER aff_lt {vec 0} {u} = {})) `;
769
770 UNDISCH_TAC` x': real^3 IN V `;
771 UNDISCH_TAC` (x: real^3 -> bool) IN E `;
772 EXPAND_TAC "x'";
773 EXPAND_TAC "x";
774 MESON_TAC[];
775
776 ASSUME_TAC2 Local_lemmas.CVX_LO_IMP_LO;
777 MP_TAC (SPECL [` i:num `;` j:num `] (GENL[` n:num `;` n': num `] Local_lemmas1.CARD_V_TWO_HAFL_CIRCLE));
778 ANTS_TAC;
779 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
780 DISCH_THEN (ASSUME_TAC o SYM);
781 UNDISCH_TAC` v = ITER j (rho_node1 FF) w `;
782 DISCH_THEN (ASSUME_TAC o SYM);
783 ASM_REWRITE_TAC[SET_RULE` x IN A /\ y IN A <=> {x,y} SUBSET A `];
784 STRIP_TAC;
785 ASSUME_TAC2 (SET_RULE` {v, w:real^3} SUBSET V ==> v IN V `);
786 ASSUME_TAC2 Localization.LOFA_IMP_LT_CARD_SET_V_ALT;
787 UNDISCH_TAC` (u:real^3) IN V `;
788 EXPAND_TAC "V";
789 REWRITE_TAC[IN_ELIM_THM];
790 STRIP_TAC;
791 UNDISCH_TAC` v = ITER j (rho_node1 FF) w ` ;
792 DOWN;
793 DISCH_THEN (ASSUME_TAC o SYM);
794 DISCH_THEN (ASSUME_TAC o SYM);
795 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
796 DISCH_THEN (ASSUME_TAC o SYM);
797 MP_TAC Local_lemmas.AFF_IVS_RHO_NODE_EQQ;
798 ANTS_TAC;
799 ASM_REWRITE_TAC[lunar; circular];
800 DISCH_THEN (ASSUME_TAC o SYM);
801 FIRST_X_ASSUM SUBST_ALL_TAC;
802 SUBGOAL_THEN` u IN aff_gt {vec 0, v} {rho_node1 FF v} \/ u IN aff_gt {vec 0, w} {rho_node1 FF w} ` MP_TAC;
803
804 ASM_CASES_TAC` (n:num) < i ` ;
805 DISJ1_TAC;
806 ASM_CASES_TAC` n = 0 `;
807 FIRST_X_ASSUM SUBST_ALL_TAC;
808 REPLICATE_TAC 4 DOWN THEN PHA;
809 ASM_REWRITE_TAC[ITER];
810 SUBGOAL_THEN` u IN {ITER l (rho_node1 FF) v | 0 < l /\ l < i} ` ASSUME_TAC;
811 REWRITE_TAC[IN_ELIM_THM];
812 EXISTS_TAC` n: num `;
813 ASM_REWRITE_TAC[];
814 DOWN THEN DOWN;
815 ARITH_TAC;
816 DOWN;
817 ASM_SIMP_TAC[IN_INTER];
818 ASM_CASES_TAC` (n:num) = i ` ;
819 FIRST_X_ASSUM SUBST_ALL_TAC;
820 REPLICATE_TAC 2 DOWN THEN PHA;
821 ASM_REWRITE_TAC[];
822 DISJ2_TAC;
823 ASSUME_TAC2 (ARITH_RULE` ~( n:num < i) ==> i + ( n - i ) = n`);
824 SUBGOAL_THEN` u IN {ITER l (rho_node1 FF) w | 0 < l /\ l < j}` MP_TAC;
825 REWRITE_TAC[IN_ELIM_THM];
826 EXISTS_TAC` (n: num) - i `;
827 EXPAND_TAC "w";
828 ASM_REWRITE_TAC[ITER_ADD; ADD_SYM];
829 REPLICATE_TAC 3 DOWN THEN PHA;
830 SIMP_TAC[ (ARITH_RULE` ~((n:num) < i) ==> ( n - i < j <=> n < i + j ) `)];
831 ASM_REWRITE_TAC[];
832 ARITH_TAC;
833 ASM_SIMP_TAC[IN_INTER];
834
835 ASSUME_TAC2 (SET_RULE` {v, w:real^3} SUBSET V ==> w IN V `);
836 MP_TAC (SPEC` w:real^3 ` Local_lemmas.LOFA_IMP_LT_CARD_SET_V);
837 ANTS_TAC;
838 ASM_SIMP_TAC[SET_RULE` {a,b} SUBSET V ==> b IN V `];
839 STRIP_TAC;
840 SUBGOAL_THEN` u IN {ITER n (rho_node1 FF) v | n < CARD (V:real^3 -> bool)} ` ASSUME_TAC;
841 EXPAND_TAC "u";
842 REWRITE_TAC[IN_ELIM_THM];
843 EXISTS_TAC` n:num `;
844 ASM_REWRITE_TAC[];
845 DOWN;
846 ASM_REWRITE_TAC[];
847 EXPAND_TAC "V";
848 REWRITE_TAC[IN_ELIM_THM];
849 STRIP_TAC;
850
851 DOWN;
852 DISCH_THEN (ASSUME_TAC o SYM);
853
854 DOWN_TAC;
855 REWRITE_TAC[TAUT` a /\ b /\ c <=> (a /\ b) /\ c `];
856 SPEC_TAC (`n':num `,` n': num ` );
857 SPEC_TAC (`n:num `,` n: num ` );
858
859 SPEC_TAC (`v:real^3 `, ` v:real^3 `);
860 SPEC_TAC (`i: num `,` i:num ` );
861 SPEC_TAC (`w:real^3 `, ` w:real^3 `);
862 SPEC_TAC (`j: num `,` j:num ` );
863
864
865
866
867 MATCH_MP_TAC (
868 MESON[]` (! j w i v n n'. P j w i v n n' ==> P i v j w n' n) /\ (! j w i v n n'. P j w i v n n' /\ u IN Q v ==> concl ) ==>
869 (! j w i v n n'. P j w i v n n'/\ (u IN Q v \/ u IN Q w ) ==> concl )`);
870 CONJ_TAC;
871 SIMP_TAC[];
872 SIMP_TAC[INSERT_COMM; ADD_SYM];
873 REPEAT GEN_TAC;
874 STRIP_TAC;
875 CONJ_TAC;
876 UNDISCH_TAC` interior_angle1 (vec 0) FF v = interior_angle1 (vec 0) FF w ` ;
877 DISCH_THEN (SUBST1_TAC o SYM);
878 ASM_REWRITE_TAC[];
879 UNDISCH_TAC`(?e. &0 < e /\
880            (!t. --e < t /\ t < e
881                 ==> ((~(?v w u.
882                             ({v, w} IN IMAGE (IMAGE (\v. f v t)) E /\
883                              u IN IMAGE (\v. f v t) V) /\
884                             ~(aff_gt {vec 0} {v, w} INTER aff_lt {vec 0} {u} =
885                               {})) /\
886                       {v, w} SUBSET IMAGE (\v. (f:real^3 -> real -> real^3) v t) V) /\
887                      ~(v = w)) /\
888                     collinear {v, w, vec 0})) <=>
889       CONCL`;
890 ASM_REWRITE_TAC[];
891 PHA;
892 REPEAT STRIP_TAC; 
893
894
895
896
897
898 (* ====================================
899
900 prove_by_refinement (`FINITE V /\
901  convex_local_fan (V,E,FF) /\
902  ~(?v w u.
903        {v, w} IN E /\
904        u IN V /\
905        ~(aff_gt {vec 0} {v, w} INTER aff_lt {vec 0} {u} = {})) /\
906  {v, w} SUBSET V /\
907  ~(v = w) /\
908  collinear {vec 0, v, w} /\
909  (!x. x IN E ==> x SUBSET V) /\
910  f u (&0) = u /\
911  f u continuous atreal (&0) /\
912  interior_angle1 (vec 0) FF v < pi /\
913  a < &0 /\
914  &0 < b /\
915  ~(u = v) /\
916  ~(u = w) /\
917  (!u' t. u' IN V /\ ~(u = u') /\ t IN real_interval (a,b) ==> f u' t = u') /\
918  (!t. t IN real_interval (a,b) ==> f u t IN affine hull {vec 0, v, w, u}) /\
919  (!u. u IN V DIFF {v, w} ==> interior_angle1 (vec 0) FF u = pi) /\
920  &0 < interior_angle1 (vec 0) FF v /\
921  interior_angle1 (vec 0) FF v <= pi /\
922  interior_angle1 (vec 0) FF v = interior_angle1 (vec 0) FF w /\
923  i < CARD V /\
924  ~(i = 0) /\
925  ~(i = 1) /\
926  {ITER l (rho_node1 FF) v | 0 < l /\ l < i} =
927  aff_gt {vec 0, v} {rho_node1 FF v} INTER V /\
928  j < CARD V /\
929  ~(j = 0) /\
930  ~(j = 1) /\
931  {ITER l (rho_node1 FF) w | 0 < l /\ l < j} =
932  aff_gt {vec 0, w} {rho_node1 FF w} INTER V /\
933  (!t. t IN real_interval (a,b) ==> {v, w} SUBSET IMAGE (\v. f v t) V) /\
934  ((?e. &0 < e /\
935        (!t. --e < t /\ t < e
936             ==> ~(?v w u.
937                       {v, w} IN IMAGE (IMAGE (\v. f v t)) E /\
938                       u IN IMAGE (\v. f v t) V /\
939                       ~(aff_gt {vec 0} {v, w} INTER aff_lt {vec 0} {u} = {})) /\
940                 {v, w} SUBSET IMAGE (\v. f v t) V /\
941                 ~(v = w) /\
942                 collinear {vec 0, v, w})) <=>
943   CONCL) /\
944  &0 < e /\
945  (!t u'. --e < t /\ t < e /\ u' IN V /\ ~(u' = u) ==> ~(f u t = f u' t)) /\
946  (t IN real_interval (a,b) /\ --e < t /\ t < e
947   ==> (!v w u'.
948            {v, w} IN IMAGE (IMAGE (\v. f v t)) E /\
949            u' IN IMAGE (\v. f v t) V /\
950            ~(f u t IN {u', v, w})
951            ==> aff_gt {vec 0} {v, w} INTER aff_lt {vec 0} {u'} = {})) /\
952  local_fan (V,E,FF) /\
953  i + j = CARD V /\
954  v IN V /\
955  {ITER n (rho_node1 FF) v | n < CARD V} = V /\
956  n < CARD V /\
957  ITER n (rho_node1 FF) v = u /\
958  ITER j (rho_node1 FF) w = v /\
959  ITER i (rho_node1 FF) v = w /\
960  w IN V /\
961  {ITER n (rho_node1 FF) w | n < CARD V} = V /\
962  n' < CARD V /\
963  ITER n' (rho_node1 FF) w = u   /\
964  u IN aff_gt {vec 0, v} {rho_node1 FF v} 
965  ==> CONCL`,
966
967  [STRIP_TAC ;
968
969
970 ================================= *)
971
972
973 SUBGOAL_THEN` aff_gt {vec 0, v} {rho_node1 FF v} = aff_gt {vec 0, v} {u} ` MP_TAC;
974 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
975 ASM_REWRITE_TAC[];
976 MATCH_MP_TAC Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2 ;
977 ASM_REWRITE_TAC[];
978 STRIP_TAC;
979 ABBREV_TAC` u1 = ( (u dot v ) / ( v dot v )) % (v:real^3)`;
980 ABBREV_TAC` uh = u - (u1:real^3) `;
981 SUBGOAL_THEN` uh dot (v:real^3) = &0 ` ASSUME_TAC;
982 EXPAND_TAC "uh";
983 EXPAND_TAC "u1";
984 REWRITE_TAC[DOT_LSUB; DOT_LMUL];
985 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
986 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 ` ));
987 DOWN;
988 REWRITE_TAC[GSYM DOT_EQ_0];
989 CONV_TAC REAL_FIELD;
990 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u continuous atreal (&0) ` MP_TAC;
991 ASM_REWRITE_TAC[];
992 REWRITE_TAC[continuous_atreal];
993 DISCH_THEN (MP_TAC o (SPEC` norm (uh: real ^3)`));
994 ANTS_TAC;
995 REWRITE_TAC[NORM_POS_LT];
996 STRIP_TAC;
997 FIRST_X_ASSUM SUBST_ALL_TAC;
998 UNDISCH_TAC` (u:real^3) - u1 = vec 0 ` ;
999 REWRITE_TAC[VECTOR_SUB_EQ];
1000 EXPAND_TAC "u1";
1001 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
1002 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
1003 ASSUME_TAC2 (ISPEC` v:real^3 ` (GEN_ALL Local_lemmas.COLLINEAR_ONCE_VEC_0));
1004 FIRST_X_ASSUM (MP_TAC o (SPEC` u: real^3 `));
1005 STRIP_TAC;
1006 STRIP_TAC;
1007 SUBGOAL_THEN` collinear {vec 0, v, u:real^3 } ` MP_TAC;
1008 ASM_REWRITE_TAC[];
1009 DOWN THEN MESON_TAC[];
1010 REWRITE_TAC[];
1011 MATCH_MP_TAC (GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO);
1012 EXISTS_TAC` rho_node1 FF v `;
1013 ASM_REWRITE_TAC[];
1014 MATCH_MP_TAC Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
1015 ASM_REWRITE_TAC[];
1016 STRIP_TAC;
1017 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
1018 SUBGOAL_THEN` ~ collinear {vec 0, v, u:real^3} ` MP_TAC;
1019 MATCH_MP_TAC (GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO);
1020 EXISTS_TAC` rho_node1 FF v `;
1021 ASM_REWRITE_TAC[];
1022 NHANH Fan.th3a;
1023 NHANH AFF_GT_2_1;
1024 STRIP_TAC;
1025
1026 SUBGOAL_THEN` (uh: real^3) IN aff_gt {vec 0, v} {u} ` MP_TAC;
1027 ASM_REWRITE_TAC[IN_ELIM_THM];
1028 EXPAND_TAC "uh";
1029 EXPAND_TAC "u1";
1030 EXISTS_TAC` (u dot v) / (v dot (v:real^3))`;
1031 EXISTS_TAC` -- ((u dot v) / (v dot (v:real^3)))`;
1032 EXISTS_TAC` &1 `;
1033 CONJ_TAC;
1034 REAL_ARITH_TAC;
1035 CONJ_TAC;
1036 REAL_ARITH_TAC;
1037 CONV_TAC VECTOR_ARITH;
1038
1039 UNDISCH_TAC` ~collinear {vec 0, v, (u:real^3)}`;
1040 PHA;
1041 NHANH Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1042 STRIP_TAC;
1043 MP_TAC (ISPEC` {vec 0, v, u:real^3} ` Qzksykg.SET_SUBSET_AFFINE_HULL);
1044 ASSUME_TAC (ISPECL [` vec 0: real^3`;`u:real^3`] (GENL [` u:real^N `;` w:real^N `] AFF_GT_SUBSET_AFFINE_HULL21));
1045
1046 SUBGOAL_THEN` {vec 0, v , uh:real^3} SUBSET affine hull {vec 0, v, u}` MP_TAC;
1047 MP_TAC (ISPEC` {vec 0, v, u:real^3} ` Qzksykg.SET_SUBSET_AFFINE_HULL);
1048 SIMP_TAC[INSERT_SUBSET];
1049 STRIP_TAC;
1050 UNDISCH_TAC` aff_gt {vec 0, v} {u} SUBSET affine hull ({vec 0, v} UNION {u:real^3}) ` ;
1051 REWRITE_TAC[SET_RULE` {a,b} UNION {c} = {a,b,c} `; SUBSET];
1052 DISCH_THEN MATCH_MP_TAC;
1053 FIRST_ASSUM ACCEPT_TAC;
1054 REPEAT STRIP_TAC;
1055 UNDISCH_TAC` uh IN aff_gt {vec 0, v} {u:real^3} `;
1056 UNDISCH_TAC` ~collinear {vec 0, v, u:real^3} `;
1057 PHA;
1058 NHANH Local_lemmas.COLL_IN_AFF_GT_TOO;
1059 STRIP_TAC;
1060 DOWN;
1061 UNDISCH_TAC` {vec 0, v, uh} SUBSET affine hull {vec 0, v, u:real^3} `;
1062 PHA;
1063 NHANH Local_lemmas.SUBSET_NOT_COLLINEAR_AFFINE_HULL_EQ;
1064 STRIP_TAC;
1065 SUBGOAL_THEN` affine hull {vec 0, v, w, u:real^3} = affine hull {vec 0, v, u } ` ASSUME_TAC;
1066 MP_TAC (SPECL [` w:real^3 `;` {vec 0, v, u:real^3} `] Marchal_cells_3.AFFINE_HULL_3_INSERT);
1067 ANTS_TAC;
1068
1069 MP_TAC (ISPECL [` vec 0: real^3 `;` v:real^3 `; ` w:real^3 `] COLLINEAR_3_AFFINE_HULL);
1070 ANTS_TAC;
1071 ONCE_REWRITE_TAC[EQ_SYM_EQ];
1072 ASM_REWRITE_TAC[];
1073 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
1074 FIRST_ASSUM MATCH_MP_TAC;
1075 FIRST_ASSUM ACCEPT_TAC;
1076 STRIP_TAC;
1077 SUBGOAL_THEN` collinear {vec 0, v, w:real^3} ` MP_TAC;
1078 ASM_REWRITE_TAC[];
1079 FIRST_ASSUM SUBST1_TAC;
1080 SPEC_TAC (`w:real^3 `,` w:real^3 `);
1081 REWRITE_TAC[GSYM SUBSET];
1082 MATCH_MP_TAC Marchal_cells_2_new.AFFINE_SUBSET_KY_LEMMA ;
1083 REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET];
1084 REWRITE_TAC[INSERT_COMM];
1085
1086
1087
1088
1089 SUBGOAL_THEN` ! t. -- d < t /\ t < d /\ t IN real_interval (a,b) ==> f u t IN aff_gt {vec 0, v} {u:real^3} ` ASSUME_TAC;
1090 GEN_TAC THEN STRIP_TAC;
1091 UNDISCH_TAC` !t. t IN real_interval (a,b) ==> f u t IN affine hull {vec 0, v, w, u:real^3} ` ;
1092 STRIP_TAC;
1093 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` t':real `));
1094 DOWN;
1095 ASM_REWRITE_TAC[];
1096
1097 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM];
1098 STRIP_TAC;
1099 ASM_CASES_TAC` w' = &0 `;
1100 FIRST_X_ASSUM SUBST_ALL_TAC;
1101 UNDISCH_TAC` !x'. abs (x' - &0) < d ==> dist ((f: real^3 -> real -> real^3) u x',f u (&0)) < norm (uh: real^3) ` ;
1102 STRIP_TAC;
1103 FIRST_ASSUM (MP_TAC o (SPEC` t': real `));
1104 REWRITE_TAC[REAL_SUB_RZERO; GSYM REAL_BOUNDS_LT];
1105 DISCH_THEN ASSUME_TAC2;
1106 DOWN;
1107 SUBST_ALL_TAC (VECTOR_ARITH` u - u1 = (uh: real^3) <=> u = uh + u1 `);
1108 ASM_REWRITE_TAC[VECTOR_ARITH` u' % vec 0 + v' % v + &0 % uh = v' % v `];
1109 EXPAND_TAC "u1";
1110 REWRITE_TAC[dist; Pack1.norm_ineq_lt; VECTOR_ARITH` a % v - ( u + b % v ) = ( a - b ) % v - u `];
1111 REWRITE_TAC[DOT_LSUB; DOT_RSUB; DOT_LMUL; DOT_RMUL];
1112 ABBREV_TAC` con1 =  v' - (u dot v) / ((v:real^3) dot v) `;
1113 ASM_REWRITE_TAC[DOT_SYM; Collect_geom.ZERO_NEUTRAL; REAL_ARITH` a - ( &0 - x ) = a + x `];
1114 MP_TAC (ISPEC` v:real^3 ` DOT_POS_LE);
1115 REWRITE_TAC[REAL_ARITH` a + x < x <=> a < &0 `];
1116 MP_TAC (SPEC` con1: real` REAL_LE_SQUARE );
1117 STRIP_TAC;
1118 STRIP_TAC;
1119 ASSUME_TAC2 (SPECL [` con1 * (con1:real)`;` v dot (v:real^3) `] REAL_LE_MUL);
1120 DOWN;
1121 REAL_ARITH_TAC;
1122 ASM_CASES_TAC` w' < &0 `;
1123 UNDISCH_TAC` !x'. abs (x' - &0) < d ==> dist ((f:real^3 -> real -> real^3) u x',f u (&0)) < norm (uh: real^3) `;
1124 STRIP_TAC;
1125 FIRST_ASSUM (MP_TAC o (SPEC` t': real `));
1126 REWRITE_TAC[REAL_SUB_RZERO; GSYM REAL_BOUNDS_LT];
1127 DISCH_THEN ASSUME_TAC2;
1128 DOWN;
1129 SUBST_ALL_TAC (VECTOR_ARITH` u - u1 = uh <=> u = uh + (u1: real^3) `);
1130 ASM_REWRITE_TAC[dist];
1131
1132
1133 REWRITE_TAC[Pack1.norm_ineq_lt] ;
1134 EXPAND_TAC "u1" ;
1135 REWRITE_TAC[VECTOR_ARITH` (u' % vec 0 + v' % v + w' % uh) - (uh + uv % v)
1136 = (v' - uv ) % v + (w' - &1) % uh `] ;
1137 ABBREV_TAC` con1 = (u dot v) / (v dot (v:real^3)) ` ;
1138 ASM_REWRITE_TAC[DOT_LADD; DOT_RADD; DOT_LMUL; DOT_RMUL; DOT_SYM; Collect_geom.ZERO_NEUTRAL] ;
1139 ASSUME_TAC (ISPEC` v:real^ 3 ` DOT_POS_LE) ;
1140 ASSUME_TAC (SPEC` v' - con1:real ` REAL_LE_SQUARE) ;
1141 ASSUME_TAC (ISPEC` uh:real^ 3 ` DOT_POS_LE) ;
1142 STRIP_TAC ;
1143 MP_TAC (ISPECL [` &1 `;` -- w' + &1 `] Collect_geom.POW2_COND) ;
1144 ANTS_TAC ;
1145 UNDISCH_TAC` w' < &0 ` ;
1146 REAL_ARITH_TAC ;
1147 STRIP_TAC ;
1148 SUBGOAL_THEN` &1 <= -- w' + &1 ` MP_TAC ;
1149 UNDISCH_TAC` w' < &0 ` ;
1150 REAL_ARITH_TAC ;
1151 ASM_REWRITE_TAC[] ;
1152
1153 REWRITE_TAC[REAL_ARITH` &1 pow 2 <= (--w' + &1) pow 2 <=> &0 <= (w' - &1 ) * (w' - &1 ) - &1 `] ;
1154 STRIP_TAC ;
1155 ASSUME_TAC2 (ISPECL[`(w' - &1) * (w' - &1) - &1 `;` (uh:real^3 ) dot uh `] REAL_LE_MUL) ;
1156 ASSUME_TAC2 (ISPECL[`(v' - con1) * (v' - con1)`;` (v:real^3 ) dot v `] REAL_LE_MUL) ;
1157 UNDISCH_TAC` (v' - con1) * (v' - con1) * ((v:real^3) dot v) +
1158       (w' - &1) * (w' - &1) * (uh dot uh) <
1159       uh dot (uh: real^3) ` ;
1160 DOWN THEN DOWN ;
1161 REAL_ARITH_TAC ;
1162 SUBGOAL_THEN` f u (t': real) IN aff_gt {vec 0, v} {u:real^3} ` MP_TAC ;
1163 UNDISCH_TAC` aff_gt {vec 0, v} {u} = aff_gt {vec 0, v} {uh:real^3} ` ;
1164 DISCH_THEN SUBST1_TAC ;
1165 UNDISCH_TAC` ~collinear {vec 0, v, uh:real^3} ` ;
1166 NHANH Fan.th3a ;
1167 NHANH AFF_GT_2_1 ;
1168 SIMP_TAC[IN_ELIM_THM] ;
1169 STRIP_TAC ;
1170 EXISTS_TAC` u': real ` ;
1171 EXISTS_TAC` v':real ` ;
1172 EXISTS_TAC` w': real ` ;
1173 ASM_REWRITE_TAC[];
1174
1175
1176 UNDISCH_TAC` ~( w' = &0 ) `;
1177 UNDISCH_TAC` ~( w' < &0 ) `;
1178 REAL_ARITH_TAC;
1179
1180 ASM_REWRITE_TAC[IN_ELIM_THM];
1181
1182
1183 SUBGOAL_THEN` ! t u. abs t < d /\ t IN real_interval (a,b) /\ (u:real^3) IN V ==> f u t IN aff_gt {vec 0, v} {u} ` MP_TAC;
1184 REPEAT STRIP_TAC;
1185 ASM_CASES_TAC` ~(u = u':real^3 )`;
1186 UNDISCH_TAC` !u' t. u' IN V /\ ~(u: real^3 = u') /\ t IN real_interval (a,b) ==> f u' t = u' `;
1187 DISCH_THEN (MP_TAC o (SPECL [` u':real^3 `;` t': real`]));
1188 ANTS_TAC;
1189 ASM_REWRITE_TAC[];
1190 SIMP_TAC[];
1191 MP_TAC (ISPECL [` {vec 0, v:real^3} `;` {u':real^3} `] (GEN_ALL Local_lemmas.CONV0_SUBSET_AFF_GT));
1192 SIMP_TAC[Geomdetail.CONV0_SING; INSERT_SUBSET];
1193 DOWN;
1194
1195 REWRITE_TAC[];
1196 DISCH_THEN SUBST_ALL_TAC;
1197 FIRST_X_ASSUM MATCH_MP_TAC;
1198 ASM_REWRITE_TAC[REAL_BOUNDS_LT];
1199 STRIP_TAC;
1200
1201
1202 SUBGOAL_THEN` ! t. abs t < d /\ t IN real_interval (a,b) ==> (! s. s IN IMAGE (IMAGE (\v. f (v:real^3) t)) E ==> aff_gt {vec 0} s SUBSET aff_gt { vec 0, v} {rho_node1 FF v } \/
1203 aff_gt {vec 0} s SUBSET aff_gt { vec 0, w} {rho_node1 FF w })` MP_TAC;
1204
1205
1206
1207
1208 REWRITE_TAC[GSYM REAL_BOUNDS_LT];
1209 PHA;
1210 DOWN;
1211 FIRST_ASSUM NHANH;
1212 STRIP_TAC;
1213 GEN_TAC THEN STRIP_TAC;
1214 GEN_TAC;
1215 REWRITE_TAC[IN_IMAGE];
1216 STRIP_TAC;
1217 DOWN;
1218 UNDISCH_TAC` local_fan (V,E, FF) `;
1219 PHA;
1220 NHANH EDGE_IN_LOCAL_FAN_DET_RHO_NODE;
1221 STRIP_TAC;
1222 UNDISCH_TAC` (v': real^3) IN V `;
1223 EXPAND_TAC "V";
1224
1225
1226 REWRITE_TAC[IN_ELIM_THM];
1227 ONCE_REWRITE_TAC[EQ_SYM_EQ];
1228 STRIP_TAC;
1229 ASM_CASES_TAC` n'' < (j:num ) `;
1230 ASM_CASES_TAC` n'' = 0 `;
1231 FIRST_X_ASSUM SUBST_ALL_TAC;
1232 DOWN THEN DOWN;
1233 REWRITE_TAC[ITER];
1234 DISCH_THEN (SUBST_ALL_TAC o SYM);
1235 STRIP_TAC;
1236 DISJ2_TAC;
1237 UNDISCH_TAC` !u' t. u' IN V /\ ~(u = u') /\ t IN real_interval (a,b) ==> f u' t = (u': real^3) `;
1238 STRIP_TAC;
1239 FIRST_ASSUM (MP_TAC o (SPECL [` w:real^3 `;` t': real `]));
1240 ANTS_TAC;
1241 ASM_REWRITE_TAC[];
1242 STRIP_TAC;
1243 FIRST_ASSUM (MP_TAC o (SPECL [` t': real `;` rho_node1 FF w `]));
1244 ANTS_TAC;
1245 ASM_REWRITE_TAC[GSYM REAL_BOUNDS_LT];
1246 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
1247 ASM_REWRITE_TAC[];
1248 MP_TAC Local_lemmas.AFF_GT_SAME_WITH_ENDS;
1249 ANTS_TAC;
1250 ASM_REWRITE_TAC[lunar; circular];
1251 SIMP_TAC[];
1252 STRIP_TAC THEN STRIP_TAC;
1253 ASSUME_TAC2 (SPEC`w: real^3 ` (GEN`v: real^3 ` Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
1254 SUBGOAL_THEN` aff_gt {vec 0, w} {rho_node1 FF w} = aff_gt {vec 0, w} { f (rho_node1 FF w) (t':real)} ` MP_TAC;
1255 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1256 ASM_REWRITE_TAC[];
1257 DISCH_THEN (ASSUME_TAC o SYM);
1258
1259
1260
1261 MP_TAC (ISPECL [` {w:real^3} `;` {vec 0, w:real^3} `;` {(f (rho_node1 FF w) (t': real)): real^3 } `]
1262  (GEN_ALL Local_lemmas.AFF_GT_MONO_TRANS));
1263 ANTS_TAC;
1264 REWRITE_TAC[IN_INSERT; INSERT_SUBSET; EMPTY_SUBSET];
1265 REWRITE_TAC[SET_RULE` A UNION {a} = a INSERT A `];
1266 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
1267 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
1268 ASSUME_TAC2 (SET_RULE` ~((w:real^3) = vec 0) ==> {vec 0, w} DIFF {w} = {vec 0} `);
1269 UNDISCH_TAC` s = IMAGE (\v. (f:real^3 -> real -> real^3) v t') x `;
1270 DISCH_THEN (ASSUME_TAC o SYM);
1271 ASM_SIMP_TAC[];
1272
1273 SUBGOAL_THEN` {w, f (rho_node1 FF w) (t':real)} = s ` MP_TAC;
1274 EXPAND_TAC "s";
1275 EXPAND_TAC "x";
1276 REWRITE_TAC[EXTENSION; IN_IMAGE];
1277 GEN_TAC;
1278 EQ_TAC;
1279 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
1280 STRIP_TAC;
1281 EXISTS_TAC `w:real^3 `;
1282 ASM_REWRITE_TAC[];
1283
1284 EXISTS_TAC` rho_node1 FF w `;
1285 ASM_REWRITE_TAC[];
1286 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
1287 STRIP_TAC;
1288 DISJ1_TAC;
1289 ASM_REWRITE_TAC[];
1290 DISJ2_TAC;
1291 ASM_REWRITE_TAC[];
1292 SIMP_TAC[];
1293
1294
1295
1296 ASM_CASES_TAC` n'' = j - 1 `;
1297 ASSUME_TAC2 (ARITH_RULE` ~( j = 0 ) ==> j - 1 + 1 = j`);
1298 SUBGOAL_THEN` rho_node1 FF v' = v ` MP_TAC;
1299 EXPAND_TAC "v'";
1300 UNDISCH_TAC` n'' = j - 1 `;
1301 SIMP_TAC[GSYM ITER; ADD1];
1302 ASM_REWRITE_TAC[];
1303 STRIP_TAC;
1304 SUBGOAL_THEN` v' IN {ITER l (rho_node1 FF) w | 0 < l /\ l < j} ` MP_TAC;
1305 REWRITE_TAC[IN_ELIM_THM];
1306 EXISTS_TAC` n'':num `;
1307 ASM_REWRITE_TAC[ARITH_RULE` 0 < n <=> ~( n = 0) `];
1308 ASM_REWRITE_TAC[];
1309 STRIP_TAC;
1310 DISJ2_TAC;
1311 DOWN;
1312 ASM_REWRITE_TAC[];
1313 REWRITE_TAC[IN_INTER];
1314 STRIP_TAC;
1315
1316
1317
1318
1319
1320
1321
1322 SUBGOAL_THEN` IMAGE (\v. f v t') x = { f (v':real^3) (t':real), v:real^3} ` MP_TAC;
1323 REWRITE_TAC[EXTENSION];
1324 GEN_TAC;
1325 EQ_TAC;
1326 EXPAND_TAC "x";
1327 REWRITE_TAC[IN_IMAGE; IN_INSERT; NOT_IN_EMPTY];
1328 STRIP_TAC;
1329 ASM_REWRITE_TAC[];
1330
1331
1332 ASM_REWRITE_TAC[];
1333 DISJ2_TAC;
1334
1335 UNDISCH_TAC` !u' t. u' IN V /\ ~(u = u') /\ t IN real_interval (a,b) ==> f u' t = (u': real^3) `;
1336 DISCH_TAC;
1337 FIRST_ASSUM MATCH_MP_TAC;
1338 ASM_REWRITE_TAC[];
1339
1340 EXPAND_TAC "x";
1341 REWRITE_TAC[IN_IMAGE; IN_INSERT; NOT_IN_EMPTY];
1342 STRIP_TAC;
1343 EXISTS_TAC `v': real^3 `;
1344 ASM_REWRITE_TAC[];
1345 EXISTS_TAC` v: real^3 `;
1346 ASM_REWRITE_TAC[];
1347 ONCE_REWRITE_TAC[EQ_SYM_EQ];
1348 FIRST_ASSUM MATCH_MP_TAC;
1349 ASM_REWRITE_TAC[];
1350 SIMP_TAC[];
1351 STRIP_TAC;
1352
1353 FIRST_ASSUM (MP_TAC o (SPECL [` t': real`;` v': real^3 `]));
1354 ANTS_TAC;
1355 ASM_REWRITE_TAC[GSYM REAL_BOUNDS_LT];
1356 STRIP_TAC;
1357 MP_TAC (ISPECL [` {v:real^3 } `; `{ vec 0, v:real^3 } `;
1358 ` { (f: real^3 -> real -> real^3) v' t' } `] (GEN_ALL Local_lemmas.AFF_GT_MONO_TRANS));
1359 ANTS_TAC;
1360 REWRITE_TAC[IN_INSERT; INSERT_SUBSET; EMPTY_SUBSET];
1361 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
1362 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
1363 ASSUME_TAC2 (
1364 SET_RULE` ~((v:real^3) = vec 0 ) ==> {vec 0, v} DIFF {v} = {vec 0 } `);
1365 ASM_REWRITE_TAC[SET_RULE` {a} UNION {b} = {a,b} `];
1366
1367 MP_TAC Local_lemmas.LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
1368 ANTS_TAC;
1369 ASM_REWRITE_TAC[lunar; circular];
1370 STRIP_TAC;
1371
1372 ASSUME_TAC2 (
1373 SPEC` w:real^3 ` (GEN` v:real^3 ` Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
1374
1375 MP_TAC (GSYM Local_lemmas.AFF_GT_SAME_WITH_ENDS);
1376 ANTS_TAC;
1377 ASM_REWRITE_TAC[lunar; circular];
1378
1379 STRIP_TAC;
1380 SUBGOAL_THEN` lunar (v,w:real^3) V E ` ASSUME_TAC;
1381 ASM_REWRITE_TAC[lunar; circular];
1382 ASSUME_TAC2 Local_lemmas.NOT_COLL_RHONODE_SND_POINT;
1383 UNDISCH_TAC` v' IN aff_gt {vec 0, w} {rho_node1 FF w} `;
1384 ASM_REWRITE_TAC[];
1385 STRIP_TAC;
1386 SUBGOAL_THEN` ~ collinear {vec 0, v, v':real^3 } ` MP_TAC;
1387 MATCH_MP_TAC (GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO);
1388 EXISTS_TAC` rho_node1 FF w `;
1389 ASM_REWRITE_TAC[];
1390 STRIP_TAC;
1391
1392 STRIP_TAC;
1393 UNDISCH_TAC` v' IN aff_gt {vec 0, v} {rho_node1 FF w} `;
1394 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF w} `;
1395 PHA;
1396 NHANH Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1397 STRIP_TAC;
1398 SUBGOAL_THEN` aff_gt {vec 0, v} {f v' (t':real)} = aff_gt {vec 0, v} {v': real^3}` ASSUME_TAC;
1399 MATCH_MP_TAC (GSYM Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ);
1400 ASM_REWRITE_TAC[];
1401 UNDISCH_TAC` aff_gt {vec 0} {f v' t', v} SUBSET aff_gt {vec 0, v} {(f: real^3 -> real -> real^3) v' t'} `;
1402 ASM_REWRITE_TAC[];
1403
1404
1405
1406 SUBGOAL_THEN` lunar (v, (w:real^3)) V E` ASSUME_TAC;
1407 ASM_REWRITE_TAC[lunar; circular];
1408
1409 SUBGOAL_THEN` v' IN {ITER l (rho_node1 FF) w | 0 < l /\ l < j} /\
1410 rho_node1 FF v' IN {ITER l (rho_node1 FF) w | 0 < l /\ l < j} ` MP_TAC;
1411 EXPAND_TAC "v'";
1412 REWRITE_TAC[IN_ELIM_THM];
1413 CONJ_TAC;
1414 EXISTS_TAC`n'': num `;
1415 ASM_REWRITE_TAC[ARITH_RULE` 0 < n <=> ~( n = 0) `];
1416 EXISTS_TAC` n'' + 1 `;
1417 REWRITE_TAC[GSYM ITER; ADD1; ARITH_RULE` 0 < a + 1 `];
1418 MATCH_MP_TAC (ARITH_RULE` n'' < j  /\ ~(n'' = j - 1)
1419 ==> n'' + 1 < j `);
1420 ASM_REWRITE_TAC[];
1421
1422 ASM_REWRITE_TAC[];
1423 UNDISCH_TAC` aff_gt {vec 0, v} {u: real^3} =
1424       {y | ?t1 t2 t3.
1425                &0 < t3 /\
1426                t1 + t2 + t3 = &1 /\
1427                y = t1 % vec 0 + t2 % v + t3 % u} `;
1428 DISCH_THEN (ASSUME_TAC o SYM);
1429 ASM_REWRITE_TAC[IN_INTER];
1430 STRIP_TAC;
1431 DISJ2_TAC;
1432 EXPAND_TAC "x";
1433 REWRITE_TAC[IMAGE_CLAUSES];
1434
1435 ASSUME_TAC2 (
1436 SPEC` w:real^3 ` (GEN` v: real^3 ` Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
1437 SUBGOAL_THEN` aff_gt {vec 0, w} {rho_node1 FF w } = aff_gt { vec 0, w} {v'} ` ASSUME_TAC;
1438 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1439 ASM_REWRITE_TAC[];
1440 SUBGOAL_THEN` aff_gt {vec 0, w} {rho_node1 FF w } = aff_gt { vec 0, w} {rho_node1 FF v'} ` ASSUME_TAC;
1441 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1442 ASM_REWRITE_TAC[];
1443 DOWN;
1444 DOWN;
1445 ASSUME_TAC2 (GSYM Local_lemmas.AFF_GT_SAME_WITH_ENDS);
1446 ASSUME_TAC2 Local_lemmas.NOT_COLL_RHONODE_SND_POINT;
1447 UNDISCH_TAC` v' IN aff_gt {vec 0, w} {rho_node1 FF w} `;
1448 ASM_REWRITE_TAC[];
1449 STRIP_TAC;
1450 SUBGOAL_THEN` aff_gt {vec 0, v} {rho_node1 FF w} =  aff_gt {vec 0, v} {v'} ` ASSUME_TAC;
1451 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1452 ASM_REWRITE_TAC[];
1453
1454
1455 SUBGOAL_THEN` f (v':real^3) (t': real) IN aff_gt {vec 0, w} {rho_node1 FF w} ` MP_TAC;
1456 ASM_REWRITE_TAC[];
1457 FIRST_X_ASSUM MATCH_MP_TAC;
1458 ASM_REWRITE_TAC[GSYM REAL_BOUNDS_LT];
1459 SUBGOAL_THEN` f (rho_node1 FF v') (t': real) IN aff_gt {vec 0, w} {rho_node1 FF w} ` MP_TAC;
1460 ASM_REWRITE_TAC[];
1461 UNDISCH_TAC` rho_node1 FF v' IN aff_gt {vec 0, w} {rho_node1 FF w} `;
1462 DOWN;
1463 ASM_REWRITE_TAC[];
1464 STRIP_TAC;
1465 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF w} `;
1466 PHA;
1467 NHANH Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1468 ASM_SIMP_TAC[];
1469 STRIP_TAC;
1470 FIRST_X_ASSUM MATCH_MP_TAC;
1471 ASM_REWRITE_TAC[GSYM REAL_BOUNDS_LT];
1472 REPEAT STRIP_TAC;
1473
1474 ASSUME_TAC2 (
1475 let tt = GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO in
1476 ISPECL [` rho_node1 FF w` ;` vec 0: real^3 `;` w:real^3 `;
1477 ` (f:real^3 -> real -> real^3) v' t' `] tt);
1478 ASSUME_TAC2 (
1479 let tt = GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO in
1480 ISPECL [` rho_node1 FF w` ;` vec 0: real^3 `;` w:real^3 `;
1481 ` (f:real^3 -> real -> real^3) (rho_node1 FF v') t' `] tt);
1482 DOWN THEN DOWN;
1483 NHANH Fan.th3b1;
1484 PHA;
1485 NHANH (SET_RULE` ~( a = x ) /\ t /\ ~( a = y ) ==> DISJOINT {a} {x,y} `);
1486 STRIP_TAC;
1487 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF w} `;
1488 NHANH Fan.th3a;
1489 STRIP_TAC;
1490 MATCH_MP_TAC TOW_POINTS_IN_IMP_AFF_GT_SUBSET;
1491 ASM_REWRITE_TAC[];
1492 UNDISCH_TAC` (f: real^3 -> real -> real^3) v' t' IN aff_gt {vec 0, w} {rho_node1 FF w} `;
1493 UNDISCH_TAC` (f: real^3 -> real -> real^3) (rho_node1 FF v') t' IN aff_gt {vec 0, w} {rho_node1 FF w} `;
1494 ASM_REWRITE_TAC[];
1495 SIMP_TAC[];
1496
1497 ASM_CASES_TAC` n'' = (j:num) ` ;
1498 FIRST_X_ASSUM SUBST_ALL_TAC;
1499 DOWN THEN DOWN;
1500 ASM_REWRITE_TAC[];
1501 EXPAND_TAC "x";
1502 REWRITE_TAC[IMAGE_CLAUSES];
1503 DISCH_THEN (SUBST_ALL_TAC o SYM);
1504 STRIP_TAC;
1505 SUBGOAL_THEN` (f:real^3 -> real -> real^3) v t' = v ` ASSUME_TAC;
1506 FIRST_X_ASSUM MATCH_MP_TAC;
1507 ASM_REWRITE_TAC[];
1508 ASM_REWRITE_TAC[];
1509
1510
1511 MP_TAC (
1512 let tt = GEN_ALL Local_lemmas.AFF_GT_MONO_TRANS in
1513 ISPECL [` {v:real^3 } `; `{vec 0, v:real^3} ` ;` { (f: real^3 -> real -> real^3) (rho_node1 FF v) t' }` ] tt);
1514 ANTS_TAC;
1515 REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET];
1516 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
1517 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v: real^3 `));
1518 ASSUME_TAC2 (SET_RULE` ~( v = vec 0) ==> {vec 0, v} DIFF {v} = {vec 0: real^3 }`);
1519 ASM_REWRITE_TAC[SET_RULE` {a} UNION {b} = {b,a} `];
1520 FIRST_ASSUM (MP_TAC o (ISPECL [` t': real `;` rho_node1 FF v `]));
1521 ANTS_TAC;
1522 ASSUME_TAC2 Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
1523
1524 ASM_REWRITE_TAC[GSYM REAL_BOUNDS_LT];
1525 STRIP_TAC;
1526 ASSUME_TAC2 (
1527 let tt = GEN_ALL Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ in
1528 ISPECL [` rho_node1 FF v `;` vec 0: real^3 `;` v:real^3 `;` (f:real^3 -> real -> real^3) (rho_node1 FF v) t' `] tt);
1529 FIRST_X_ASSUM (SUBST1_TAC o SYM);
1530 ASM_REWRITE_TAC[];
1531 SIMP_TAC[];
1532
1533
1534
1535 ASM_CASES_TAC` n'' = CARD (V: real^3 -> bool) - 1 `;
1536 SUBGOAL_THEN` rho_node1 FF v' = w ` ASSUME_TAC;
1537 EXPAND_TAC "v'";
1538 DOWN THEN SIMP_TAC[];
1539 STRIP_TAC;
1540 REWRITE_TAC[GSYM ITER; ADD1];
1541 ASSUME_TAC2 (ARITH_RULE` n'' < CARD (V:real^3 -> bool) ==> CARD V - 1 + 1 = CARD V `);
1542 ASM_REWRITE_TAC[];
1543 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
1544 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
1545 ASM_REWRITE_TAC[];
1546
1547
1548
1549
1550
1551
1552 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
1553 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
1554 UNDISCH_TAC` ITER n'' (rho_node1 FF) w = v' `;
1555 ASM_REWRITE_TAC[];
1556 STRIP_TAC;
1557 MP_TAC (GSYM (
1558 SPECL [` w:real^3 `;` v:real^3 `] (GENL [` v: real^3 `;` w:real^3 `]
1559  Local_lemmas.AFF_IVS_RHO_NODE_EQQ)));
1560 ANTS_TAC;
1561 ASM_REWRITE_TAC[Local_lemmas.LUNAR_COMM; lunar; circular; INSERT_SUBSET; EMPTY_SUBSET];
1562 UNDISCH_TAC` collinear {vec 0, v, w:real^3} `;
1563 SIMP_TAC[INSERT_COMM];
1564
1565
1566
1567 STRIP_TAC;
1568 EXPAND_TAC "x";
1569 ASM_REWRITE_TAC[IMAGE_CLAUSES];
1570 SUBGOAL_THEN` (f:real^3 -> real -> real^3 ) w t' = w ` ASSUME_TAC;
1571 FIRST_X_ASSUM MATCH_MP_TAC;
1572 ASM_REWRITE_TAC[];
1573
1574 ASM_REWRITE_TAC[];
1575 FIRST_ASSUM (MP_TAC o (SPECL [` t': real `;` v': real^3 `]));
1576 ANTS_TAC;
1577 ASM_REWRITE_TAC[GSYM REAL_BOUNDS_LT];
1578 EXPAND_TAC "v'";
1579 ASSUME_TAC2 Polar_fan.IVS_RHO_NODE1_IN_V;
1580 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
1581 ASM_REWRITE_TAC[];
1582 SUBGOAL_THEN` lunar (v,w:real^3) V E ` ASSUME_TAC;
1583 ASM_REWRITE_TAC[lunar; circular];
1584 MP_TAC Local_lemmas.IVS_RNODE_IN_AFF_V;
1585
1586 ANTS_TAC;
1587 ASM_REWRITE_TAC[];
1588 STRIP_TAC THEN STRIP_TAC;
1589 MP_TAC (
1590 let tt = GEN_ALL Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ in
1591 ISPECL [` rho_node1 FF v `;` vec 0: real^3 `;` v: real^3 `;` v': real^3 `] tt);
1592 ANTS_TAC;
1593
1594
1595 UNDISCH_TAC ` ivs_rho_node1 FF w IN aff_gt {vec 0, v} {rho_node1 FF v} ` ;
1596 ASM_REWRITE_TAC[];
1597 DISCH_THEN (SUBST_ALL_TAC o SYM);
1598 DOWN;
1599 ASM_REWRITE_TAC[];
1600 UNDISCH_TAC ` aff_gt {vec 0, v} {u: real^3} =
1601       {y | ?t1 t2 t3.
1602                &0 < t3 /\
1603                t1 + t2 + t3 = &1 /\
1604                y = t1 % vec 0 + t2 % v + t3 % u}`;
1605 DISCH_THEN (ASSUME_TAC o SYM);
1606 ASM_REWRITE_TAC[];
1607 SUBGOAL_THEN` aff_gt {vec 0, v} {uh: real^3} = aff_gt {vec 0, w} {ivs_rho_node1 FF w} ` MP_TAC;
1608 ASM_REWRITE_TAC[];
1609 SIMP_TAC[];
1610
1611 ASSUME_TAC2 (SPEC` w: real^3 ` Local_lemmas.LOFA_IMP_NOT_COLL_IVS);
1612 REPEAT STRIP_TAC;
1613 SUBGOAL_THEN` aff_gt {vec 0, w} {ivs_rho_node1 FF w} = aff_gt {vec 0, w} {(f: real^3 -> real -> real^3) v' t' } ` ASSUME_TAC;
1614 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1615 REPLICATE_TAC 3 DOWN THEN PHA;
1616
1617 SIMP_TAC[];
1618 FIRST_X_ASSUM SUBST1_TAC;
1619
1620 DISJ1_TAC;
1621 MP_TAC (
1622 let tt = GEN_ALL Local_lemmas.AFF_GT_MONO_TRANS in
1623 ISPECL [` {w:real^3 } `;` {vec 0, w:real^3} `; `{(f: real^3 -> real -> real^3) v' t' } `] tt);
1624 ANTS_TAC;
1625 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_INSERT];
1626 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
1627 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
1628 DOWN;
1629 SIMP_TAC[SET_RULE` ~(w = vec 0) ==> {vec 0, w} DIFF {w} = {vec 0 } `; SET_RULE` {a} UNION {b} = {a,b} `];
1630
1631 SUBGOAL_THEN` x SUBSET {ITER l (rho_node1 FF) v | 0 < l /\ l < i} ` MP_TAC;
1632 EXPAND_TAC "x";
1633 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_ELIM_THM];
1634 ABBREV_TAC `i' = n'' - (j:num ) `;
1635 ASSUME_TAC2 (ARITH_RULE` ~( n'' < j) ==> (n'' - j) + j = (n'': num) `);
1636 SUBGOAL_THEN` ITER i' (rho_node1 FF) v = v' ` ASSUME_TAC;
1637 EXPAND_TAC "v";
1638 REWRITE_TAC[ITER_ADD];
1639 EXPAND_TAC "i'";
1640 FIRST_ASSUM SUBST1_TAC;
1641 ASM_REWRITE_TAC[];
1642 CONJ_TAC;
1643 EXISTS_TAC` i': num `;
1644 ASM_REWRITE_TAC[];
1645 CONJ_TAC;
1646 EXPAND_TAC "i'";
1647 UNDISCH_TAC` ~(n'' < j:num) `;
1648 UNDISCH_TAC` ~(n'' = j:num) `;
1649 ARITH_TAC;
1650
1651 EXPAND_TAC "i'";
1652 UNDISCH_TAC` ~( n'' < j: num) `;
1653 SIMP_TAC[ARITH_RULE`~( n'' < j) ==> (n'' - j < i <=> n'' < i + (j:num))`];
1654 ASM_REWRITE_TAC[];
1655
1656 EXISTS_TAC` i' + 1 `;
1657 ASM_REWRITE_TAC[GSYM ADD1; ITER; ARITH_RULE` 0 < SUC a `];
1658
1659
1660 EXPAND_TAC "i'";
1661 UNDISCH_TAC` ~( n'' < j: num) `;
1662 SIMP_TAC[ARITH_RULE`~( n'' < j) ==> (SUC (n'' - j) < i <=> n'' < (i + (j:num)) - 1 )`];
1663 ASM_REWRITE_TAC[];
1664 STRIP_TAC;
1665 MATCH_MP_TAC (ARITH_RULE` n < x /\ ~( n = x - 1) ==> n < x - 1 `);
1666 ASM_REWRITE_TAC[];
1667
1668 UNDISCH_TAC` aff_gt {vec 0, v} {rho_node1 FF v} = aff_gt {vec 0, v} {u} `;
1669 DISCH_THEN (ASSUME_TAC o SYM);
1670 ASM_REWRITE_TAC[];
1671 EXPAND_TAC "x";
1672 REWRITE_TAC[IMAGE_CLAUSES; INSERT_SUBSET; EMPTY_SUBSET; IN_INTER];
1673 STRIP_TAC;
1674 ASSUME_TAC2 (
1675 let tt = GEN_ALL Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ in
1676 ISPECL [` rho_node1 FF v `;` vec 0: real^3 `;` v:real^3 `;` v': real^3 `] tt);
1677 ASSUME_TAC2 (
1678 let tt = GEN_ALL Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ in
1679 ISPECL [` rho_node1 FF v `;` vec 0: real^3 `;` v:real^3 `;` rho_node1 FF v'`] tt);
1680 DOWN THEN DOWN;
1681 DISCH_THEN (ASSUME_TAC o SYM);
1682 DISCH_THEN (ASSUME_TAC o SYM);
1683 FIRST_ASSUM (MP_TAC o (SPECL [` t':real `;` v': real^3 `]));
1684 ANTS_TAC;
1685 ASM_REWRITE_TAC[GSYM REAL_BOUNDS_LT];
1686 STRIP_TAC;
1687 FIRST_ASSUM (MP_TAC o (SPECL [` t':real `;` rho_node1 FF v' `]));
1688 ANTS_TAC;
1689 ASM_REWRITE_TAC[GSYM REAL_BOUNDS_LT];
1690 STRIP_TAC;
1691
1692 DOWN THEN DOWN;
1693 ASM_REWRITE_TAC[];
1694 STRIP_TAC;
1695 UNDISCH_TAC` ~ collinear {vec 0, v, rho_node1 FF v } `;
1696 PHA;
1697 NHANH Local_lemmas.COLL_IN_AFF_GT_TOO;
1698 NHANH Fan.th3a;
1699
1700 NHANH Fan.th3b1;
1701
1702
1703 STRIP_TAC;
1704 UNDISCH_TAC` (f: real^3 -> real -> real^3) v' t' IN aff_gt {vec 0, v} {rho_node1 FF v} `;
1705 UNDISCH_TAC` ~ collinear {vec 0, v, rho_node1 FF v } `;
1706 PHA;
1707 NHANH Local_lemmas.COLL_IN_AFF_GT_TOO;
1708 NHANH Fan.th3b1;
1709 STRIP_TAC;
1710
1711 DISJ1_TAC;
1712 MATCH_MP_TAC TOW_POINTS_IN_IMP_AFF_GT_SUBSET;
1713 ASM_REWRITE_TAC[SET_RULE` DISJOINT {a} {x,y} <=> ~( a = x ) /\ ~( a = y) `];
1714
1715 STRIP_TAC;
1716
1717 SUBGOAL_THEN` !t. abs t < d /\ t IN real_interval (a,b)
1718           ==> (!s u. s IN IMAGE (IMAGE (\v. f v t)) E /\ 
1719 u IN IMAGE (\v. (f:real^3 -> real -> real^3) v t) V ==>
1720                           (aff_gt {vec 0} s INTER aff_lt {vec 0} {u} =
1721                             {})) ` ASSUME_TAC;
1722
1723 FIRST_ASSUM NHANH;
1724 GEN_TAC THEN STRIP_TAC;
1725 FIRST_ASSUM NHANH;
1726 GEN_TAC THEN GEN_TAC;
1727 ABBREV_TAC` vw = (aff_gt {vec 0} s SUBSET aff_gt {vec 0, v} {rho_node1 FF v} \/
1728        aff_gt {vec 0} s SUBSET aff_gt {vec 0, w} {rho_node1 FF w})`;
1729
1730 STRIP_TAC;
1731 DOWN;
1732 REWRITE_TAC[IN_IMAGE];
1733 STRIP_TAC;
1734
1735
1736 FIRST_ASSUM (MP_TAC o (SPECL [` t': real `;` x: real^3 `]));
1737 ANTS_TAC;
1738 ASM_REWRITE_TAC[];
1739 STRIP_TAC;
1740
1741 ASSUME_TAC2 Local_lemmas1.LOCAL_RHO_NODE_PAIR_E;
1742 DOWN;
1743 SUBGOAL_THEN` FAN (vec 0: real^3,V,E)` MP_TAC;
1744 UNDISCH_TAC` local_fan (V: real^3 -> bool,E,FF) `;
1745 SIMP_TAC[local_fan];
1746 LET_TAC;
1747 SIMP_TAC[];
1748 PHA;
1749 NHANH Topology.disjoint_fan3;
1750 STRIP_TAC;
1751
1752 ASSUME_TAC2 (SPEC` w: real^3 ` Local_lemmas1.LOCAL_RHO_NODE_PAIR_E);
1753 DOWN;
1754 SUBGOAL_THEN` FAN (vec 0: real^3,V,E)` MP_TAC;
1755 UNDISCH_TAC` local_fan (V: real^3 -> bool,E,FF) `;
1756 SIMP_TAC[local_fan];
1757 LET_TAC;
1758 SIMP_TAC[];
1759 PHA;
1760 NHANH Topology.disjoint_fan3;
1761 STRIP_TAC;
1762 SUBGOAL_THEN` lunar (v,w:real^3) V E ` ASSUME_TAC;
1763 ASM_REWRITE_TAC[lunar; circular];
1764 ASSUME_TAC2 Local_lemmas.LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
1765 DOWN THEN STRIP_TAC;
1766 UNDISCH_TAC` vec 0 IN conv0 {v, w:real^3} `;
1767 NHANH IN_CONV0_IMP_AFF_EQ1;
1768 STRIP_TAC;
1769 ASM_CASES_TAC ` x = v:real^3 `;
1770 FIRST_X_ASSUM SUBST_ALL_TAC;
1771 SUBGOAL_THEN` (f:real^3 -> real -> real^3) v t' = v ` MP_TAC;
1772 FIRST_ASSUM MATCH_MP_TAC;
1773 ASM_REWRITE_TAC[];
1774 ASM_REWRITE_TAC[];
1775 SIMP_TAC[];
1776 STRIP_TAC;
1777
1778 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
1779 FIRST_ASSUM (ASSUME_TAC2 o SPEC_ALL);
1780 DOWN;
1781 REWRITE_TAC[SET_RULE` ~( a = b) <=> DISJOINT {b} {a} `];
1782 NHANH AFF_LT_SUBSET_AFF11;
1783 UNDISCH_TAC` aff {vec 0, v} = aff {vec 0, w:real^3} `;
1784 UNDISCH_TAC` aff {vec 0, w} INTER aff_gt {vec 0, w} {rho_node1 FF w} = {} `;
1785 UNDISCH_TAC` aff {vec 0, v} INTER aff_gt {vec 0, v} {rho_node1 FF v} = {} `;
1786 UNDISCH_TAC` vw: bool `;
1787 EXPAND_TAC "vw";
1788 DISCH_TAC;
1789 PHA THEN STRIP_TAC;
1790 MATCH_MP_TAC (SET_RULE`!A. a SUBSET A /\ x INTER A = {} ==> x INTER a = {} `);
1791
1792 EXISTS_TAC` aff {vec 0, v:real^3} `;
1793 ASM_REWRITE_TAC[];
1794 UNDISCH_TAC` aff_gt {vec 0} s SUBSET aff_gt {vec 0, v} {rho_node1 FF v} \/
1795       aff_gt {vec 0} s SUBSET aff_gt {vec 0, w} {rho_node1 FF w} `;
1796 STRIP_TAC;
1797 MATCH_MP_TAC (SET_RULE`!A. a SUBSET A /\ x INTER A = {} ==> a INTER x = {} `);
1798
1799 EXISTS_TAC` aff_gt {vec 0, v} {rho_node1 FF v} `;
1800 UNDISCH_TAC` aff_gt {vec 0, v} {u:real^3} =
1801       {y | ?t1 t2 t3.
1802                &0 < t3 /\
1803                t1 + t2 + t3 = &1 /\
1804                y = t1 % vec 0 + t2 % v + t3 % u} `;
1805 DISCH_THEN (ASSUME_TAC o SYM);
1806 UNDISCH_TAC` aff_gt {vec 0, v} {rho_node1 FF v} = aff_gt {vec 0, v} {u} `;
1807 DISCH_THEN (ASSUME_TAC o SYM);
1808 UNDISCH_TAC` aff_gt {vec 0, v} {u} = aff_gt {vec 0, v} {uh: real^3} `;
1809 DISCH_THEN (ASSUME_TAC o SYM);
1810
1811
1812 ASM_REWRITE_TAC[];
1813 UNDISCH_TAC` aff {vec 0, v} = aff {vec 0, w:real^3} `;
1814 DISCH_THEN (ASSUME_TAC o SYM);
1815 ASM_REWRITE_TAC[];
1816 DOWN;
1817 UNDISCH_TAC` aff {vec 0, w} INTER aff_gt {vec 0, w} {rho_node1 FF w} = {} `;
1818 CONV_TAC SET_RULE;
1819
1820
1821 ASM_CASES_TAC` x = (w:real^3) `;
1822 FIRST_X_ASSUM SUBST_ALL_TAC;
1823 SUBGOAL_THEN` (f:real^3 -> real -> real^3) w t' = w ` MP_TAC;
1824 FIRST_ASSUM MATCH_MP_TAC;
1825 ASM_REWRITE_TAC[];
1826
1827 ASM_REWRITE_TAC[];
1828 SIMP_TAC[];
1829 STRIP_TAC;
1830 UNDISCH_TAC` aff {vec 0, v} = aff {vec 0, w: real^3} `;
1831 UNDISCH_TAC` aff {vec 0, w} INTER aff_gt {vec 0, w} {rho_node1 FF w} = {} `;
1832 UNDISCH_TAC` aff {vec 0, v} INTER aff_gt {vec 0, v} {rho_node1 FF v} = {} `;
1833 ASSUME_TAC2 (Local_lemmas.LOFA_IMP_V_DIFF);
1834 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC ` w:real^3 `));
1835 DOWN;
1836 NHANH (SET_RULE` ~( a = b) ==> DISJOINT {b} {a} `);
1837 NHANH AFF_LT_SUBSET_AFF11;
1838 STRIP_TAC;
1839 DOWN;
1840 UNDISCH_TAC` vw: bool `;
1841 EXPAND_TAC "vw";
1842 CONV_TAC SET_RULE;
1843
1844
1845 ASSUME_TAC2 LUNAR_IMP_IN_TWO_HAFLS_PLANE;
1846 FIRST_X_ASSUM (MP_TAC o (SPEC` x: real^3 `));
1847 PHA;
1848 ANTS_TAC;
1849 ASM_REWRITE_TAC[];
1850 ASSUME_TAC2 (GSYM Local_lemmas.AFF_IVS_RHO_NODE_EQQ);
1851 FIRST_ASSUM SUBST1_TAC;
1852 DISCH_TAC;
1853 UNDISCH_TAC` aff_gt {vec 0, v} {rho_node1 FF v} = aff_gt {vec 0, v} {u} `;
1854 DISCH_THEN (ASSUME_TAC o SYM);
1855 ASSUME_TAC2 (GSYM Local_lemmas.AFF_GT_SAME_WITH_ENDS);
1856 UNDISCH_TAC` x IN aff_gt {vec 0, v} {rho_node1 FF v} \/
1857       x IN aff_gt {vec 0, w} {rho_node1 FF w} `;
1858 STRIP_TAC;
1859 UNDISCH_TAC` vw: bool `;
1860 EXPAND_TAC "vw";
1861 STRIP_TAC;
1862 UNDISCH_TAC` x IN aff_gt {vec 0, v} {rho_node1 FF v} ` ;
1863 UNDISCH_TAC` ~ collinear {vec 0, v, rho_node1 FF v } `;
1864 PHA;
1865 NHANH Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1866 STRIP_TAC;
1867 FIRST_X_ASSUM (ASSUME_TAC o SYM);
1868 FIRST_ASSUM (MP_TAC o (SPECL [` t': real`;` x: real^3 `]));
1869 ANTS_TAC;
1870 ASM_REWRITE_TAC[];
1871 FIRST_ASSUM SUBST1_TAC;
1872 STRIP_TAC;
1873 MATCH_MP_TAC (SET_RULE` ! s. a SUBSET s /\ s INTER b = {} ==> a INTER b = {} `);
1874 EXISTS_TAC` aff_gt {vec 0, v} {rho_node1 FF v} `;
1875 ASM_REWRITE_TAC[];
1876 MATCH_MP_TAC COLL_IN_AFF_GT_INTER_EMPTY;
1877 ASM_REWRITE_TAC[];
1878
1879 ASM_CASES_TAC` aff_gt {vec 0} s INTER aff_lt {vec 0} {u': real^3} = {} `;
1880 FIRST_X_ASSUM ACCEPT_TAC;
1881 MP_TAC (ISPECL [` s: real^3 -> bool `; `u': real^3 `; `vec 0: real^3 `;
1882  `v:real^3 `; `rho_node1 FF v `; ` ivs_rho_node1 FF v `]
1883 (GEN_ALL AZIM_PI_LEMMA));
1884 ANTS_TAC;
1885 ASM_REWRITE_TAC[];
1886 DOWN THEN DOWN;
1887 ASM_SIMP_TAC[];
1888 STRIP_TAC THEN STRIP_TAC;
1889 ASSUME_TAC2 Local_lemmas.LOFA_IMP_NOT_COLL_IVS;
1890 ASM_REWRITE_TAC[];
1891 SUBGOAL_THEN ` aff_gt {vec 0, v} {rho_node1 FF v} = aff_gt {vec 0, v} {x} ` ASSUME_TAC;
1892 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1893 ASM_REWRITE_TAC[];
1894
1895 ASM_REWRITE_TAC[];
1896 UNDISCH_TAC` interior_angle1 (vec 0) FF v < pi `;
1897 ASSUME_TAC2 Nkezbfc_local.CONVEX_LOFA_IMP_INANGLE_EQ_AZIM_IVS;
1898 UNDISCH_TAC` interior_angle1 (vec 0) FF v = interior_angle1 (vec 0) FF w `;
1899 ASM_SIMP_TAC[];
1900 STRIP_TAC;
1901 REAL_ARITH_TAC;
1902
1903 UNDISCH_TAC` vw: bool `;
1904 EXPAND_TAC "vw";
1905 STRIP_TAC;
1906
1907 ASM_CASES_TAC` aff_gt {vec 0} s INTER aff_lt {vec 0} {u': real^3} = {} `;
1908 FIRST_X_ASSUM ACCEPT_TAC;
1909
1910 MP_TAC (
1911 let tt = GEN_ALL AZIM_PI_LEMMA in
1912 ISPECL [` s: real^3 -> bool `; `u': real^3 `;` vec 0: real^3 `;` w: real^3 `;
1913  ` rho_node1 FF w `;` ivs_rho_node1 FF w `] tt);
1914 ANTS_TAC;
1915 ASM_REWRITE_TAC[];
1916
1917
1918 SUBGOAL_THEN` aff_gt {vec 0, v} {rho_node1 FF v} =
1919            aff_gt {vec 0, w} {ivs_rho_node1 FF w} ` ASSUME_TAC;
1920 MATCH_MP_TAC Local_lemmas.AFF_IVS_RHO_NODE_EQQ;
1921 ASM_REWRITE_TAC[Local_lemmas.LUNAR_COMM];
1922 FIRST_X_ASSUM (ASSUME_TAC o SYM);
1923 ASM_REWRITE_TAC[];
1924
1925
1926 ASSUME_TAC2 Local_lemmas.AFF_GT_SAME_WITH_ENDS;
1927 UNDISCH_TAC` x IN aff_gt {vec 0, w} {rho_node1 FF w} `;
1928 FIRST_X_ASSUM SUBST1_TAC;
1929 UNDISCH_TAC` aff_gt {vec 0, v} {ivs_rho_node1 FF v} =
1930       aff_gt {vec 0, w} {rho_node1 FF w} `;
1931 DISCH_THEN (SUBST1_TAC o SYM );
1932 ASSUME_TAC2 Local_lemmas.LOFA_IMP_NOT_COLL_IVS;
1933 ASSUME_TAC2 (SPEC` w: real^3 ` Local_lemmas.LOFA_IMP_NOT_COLL_IVS);
1934 ASM_REWRITE_TAC[];
1935 STRIP_TAC;
1936 SUBGOAL_THEN` aff_gt {vec 0, v} {ivs_rho_node1 FF v} = aff_gt {vec 0, v} {x} ` ASSUME_TAC;
1937 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1938 ASM_REWRITE_TAC[];
1939
1940 ASM_REWRITE_TAC[];
1941 MATCH_MP_TAC Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
1942 ASM_REWRITE_TAC[];
1943
1944 UNDISCH_TAC` interior_angle1 (vec 0) FF v < pi `;
1945 ASM_REWRITE_TAC[];
1946 ASSUME_TAC2 Nkezbfc_local.CONVEX_LOFA_IMP_INANGLE_EQ_AZIM_IVS;
1947 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w: real^ 3 `));
1948 ASM_REWRITE_TAC[];
1949 REAL_ARITH_TAC;
1950 MATCH_MP_TAC (SET_RULE` ! A. a SUBSET A /\ A INTER b = {} ==> a INTER b = {} `);
1951 EXISTS_TAC` aff_gt {vec 0, w} {rho_node1 FF w} `;
1952 CONJ_TAC;
1953 ASM_REWRITE_TAC[];
1954 MATCH_MP_TAC COLL_IN_AFF_GT_INTER_EMPTY;
1955 CONJ_TAC;
1956 ASM_REWRITE_TAC[];
1957 MATCH_MP_TAC Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
1958 ASM_REWRITE_TAC[];
1959 UNDISCH_TAC` aff_gt {vec 0, w} {rho_node1 FF w} = aff_gt {vec 0, v} {rho_node1 FF w}`;
1960 ASSUME_TAC2 Local_lemmas.AFF_IVS_RHO_NODE_EQQ;
1961
1962 FIRST_X_ASSUM SUBST1_TAC;
1963 DISCH_THEN (ASSUME_TAC o SYM);
1964 ASM_REWRITE_TAC[];
1965
1966 UNDISCH_TAC ` x IN aff_gt {vec 0, w} {rho_node1 FF w} `;
1967 UNDISCH_TAC` aff_gt {vec 0, v} {ivs_rho_node1 FF v} =
1968       aff_gt {vec 0, w} {rho_node1 FF w} `;
1969 DISCH_THEN (ASSUME_TAC o SYM);
1970 ASM_REWRITE_TAC[];
1971 ASSUME_TAC2 Local_lemmas.LOFA_IMP_NOT_COLL_IVS;
1972 DOWN;
1973 PHA;
1974 NHANH Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
1975 SIMP_TAC[];
1976 ASM_REWRITE_TAC[];
1977
1978
1979
1980
1981
1982 EXPAND_TAC "CONCL";
1983 ABBREV_TAC` e1 = min ( -- a) b `;
1984 EXISTS_TAC` min e1 d `;
1985
1986 CONJ_TAC;
1987 EXPAND_TAC "e1";
1988 REWRITE_TAC[REAL_LT_MIN];
1989 ASM_REWRITE_TAC[REAL_ARITH` &0 < -- a <=> a < &0 `];
1990 GEN_TAC;
1991
1992 REWRITE_TAC[REAL_BOUNDS_LT];
1993 EXPAND_TAC "e1";
1994 REWRITE_TAC[REAL_LT_MIN];
1995 STRIP_TAC;
1996 CONJ_TAC;
1997 REWRITE_TAC[MESON[] `
1998 ~(?v w u. P v w u /\ Q v w u /\ ~ R v w u ) <=>
1999 (! v w u. P v w u /\ Q v w u ==> R v w u ) `];
2000 REPEAT GEN_TAC;
2001 FIRST_X_ASSUM (MP_TAC o (SPEC` t': real `));
2002 ANTS_TAC;
2003 ASM_REWRITE_TAC[real_interval; IN_ELIM_THM];
2004 DOWN THEN DOWN THEN DOWN;
2005 REAL_ARITH_TAC;
2006
2007
2008 SIMP_TAC[];
2009
2010
2011 CONJ_TAC;
2012 FIRST_X_ASSUM MATCH_MP_TAC;
2013 DOWN THEN DOWN THEN DOWN;
2014 REWRITE_TAC[real_interval; IN_ELIM_THM];
2015 REAL_ARITH_TAC;
2016 ASM_REWRITE_TAC[]]);;
2017
2018
2019
2020 let LOCAL_FAN_SET_E = prove_by_refinement(` local_fan (V,E,FF) ==> {{v, rho_node1 FF v} | v IN V } = E `,
2021 [REWRITE_TAC[EXTENSION; IN_ELIM_THM];
2022 STRIP_TAC;
2023 GEN_TAC;
2024 EQ_TAC;
2025 STRIP_TAC;
2026 DOWN;
2027 SIMP_TAC[GSYM EXTENSION];
2028 STRIP_TAC;
2029 MATCH_MP_TAC Local_lemmas1.LOCAL_RHO_NODE_PAIR_E;
2030 ASM_REWRITE_TAC[];
2031 REWRITE_TAC[GSYM EXTENSION];
2032 DOWN THEN PHA;
2033 NHANH EDGE_IN_LOCAL_FAN_DET_RHO_NODE;
2034 SIMP_TAC[EQ_SYM_EQ]]);;
2035
2036
2037
2038
2039
2040 let LOCAL_FAN_FACE_FF = prove_by_refinement(` local_fan (V,E,FF) ==> { v, rho_node1 FF v | v IN V } = FF `,
2041 [REWRITE_TAC[EXTENSION; IN_ELIM_THM];
2042 STRIP_TAC;
2043 GEN_TAC;
2044 EQ_TAC;
2045 STRIP_TAC;
2046 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS;
2047 DOWN THEN STRIP_TAC;
2048 ASM_REWRITE_TAC[];
2049 FIRST_X_ASSUM MATCH_MP_TAC;
2050 FIRST_X_ASSUM ACCEPT_TAC;
2051 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
2052 DOWN THEN PHA THEN STRIP_TAC;
2053 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` x: real^3 # real^3 `));
2054 EXISTS_TAC` FST (x: real^3 # real^3 ) `;
2055 CONJ_TAC;
2056 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_IMP_IN_V2;
2057 ASM_REWRITE_TAC[];
2058 FIRST_X_ASSUM ACCEPT_TAC]);;
2059
2060
2061
2062
2063
2064
2065 let ORD_PAIRS_INJ_IMAGE = prove_by_refinement(` (! s. s IN E ==> INJ f s (IMAGE f s )) ==>
2066  ord_pairs (IMAGE (\s. IMAGE f s) E) = IMAGE (\ (x:real^N,y). (f: real^N -> real^M) x, f y) (ord_pairs E ) `,
2067 [REWRITE_TAC[EXTENSION];
2068 STRIP_TAC;
2069 GEN_TAC THEN EQ_TAC;
2070 REWRITE_TAC[ord_pairs; IN_ELIM_THM; IN_IMAGE];
2071 NHANH_PAT `\x. x ==> y ` (SET_RULE` {a,b} = S ==> a IN S /\ b IN S `);
2072 REWRITE_TAC[IN_IMAGE];
2073 STRIP_TAC;
2074 EXISTS_TAC` (x'': real^N, x''': real^N) `;
2075 ASM_REWRITE_TAC[];
2076
2077 SUBGOAL_THEN` {x'', x''': real^N} = x' ` MP_TAC;
2078 ASM_REWRITE_TAC[GSYM SUBSET_ANTISYM_EQ; INSERT_SUBSET; EMPTY_SUBSET];
2079 DOWN THEN DOWN;
2080 FIRST_X_ASSUM NHANH;
2081 REWRITE_TAC[SUBSET; INJ];
2082 STRIP_TAC;
2083 REPEAT STRIP_TAC;
2084 UNDISCH_TAC` !x. (x:real^N) IN x' ==> (f x):real^M IN IMAGE f x' `;
2085 DISCH_THEN (ASSUME_TAC2 o (SPEC` x'''': real^N `));
2086 DOWN_TAC;
2087 CONV_TAC SET_RULE;
2088 DOWN THEN DOWN;
2089 MESON_TAC[];
2090
2091
2092 REWRITE_TAC[IN_IMAGE; ord_pairs; IN_ELIM_THM];
2093 STRIP_TAC;
2094 EXISTS_TAC` (f: real^N -> real^M ) a `;
2095 EXISTS_TAC` (f: real^N -> real^M ) b `;
2096 ASM_REWRITE_TAC[];
2097 EXISTS_TAC` {a, b: real^N } `;
2098 ASM_REWRITE_TAC[IMAGE_CLAUSES]]);;
2099
2100
2101
2102
2103
2104 let SET2_DETER = 
2105 prove(` s = {x,y} /\ a IN s /\ b IN s /\ ~( a = b) ==> s = {a, b} `,
2106 STRIP_TAC THEN 
2107 REPLICATE_TAC 3 DOWN THEN PHA THEN 
2108 ASM_REWRITE_TAC[] THEN 
2109 CONV_TAC SET_RULE);;
2110
2111
2112
2113 let INSERT_UNION_CLAUSES =
2114 prove(` x INSERT S UNION U = S UNION x INSERT U /\ {} UNION U = U `,
2115 REWRITE_TAC[Local_lemmas.INSERT_UNION2; UNION_EMPTY]);;
2116
2117
2118
2119 let INJ_IMP_BIJ_IMAGE = prove(` INJ f S S' ==> BIJ f S (IMAGE f S) `,
2120 SIMP_TAC[BIJ; INJ; SURJ; FUN_IN_IMAGE] THEN 
2121 STRIP_TAC THEN 
2122 REWRITE_TAC[IN_IMAGE] THEN ASM_MESON_TAC[]);;
2123
2124
2125
2126
2127
2128 let BIJ_AND_MAP_COMM = prove_by_refinement(` local_fan (V,E,FF) /\
2129 BIJ (f: real^3 -> real^3) V V' /\
2130 IMAGE (\s. IMAGE f s) E = E' /\
2131 FAN (vec 0, V', E') /\ 
2132 (\(x,y). f x, f y ) = ff
2133 ==>  BIJ ff ( darts_of_hyp E V) (darts_of_hyp E' V') /\
2134      (!x. x IN  darts_of_hyp E V
2135           ==> ff_of_hyp (vec 0,V',E') (ff x) = ff (ff_of_hyp (vec 0,V,E) x))
2136
2137 `,
2138
2139 [REWRITE_TAC[hyp_iso; local_fan];
2140 LET_TAC;
2141 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2142 ASM_REWRITE_TAC[];
2143 STRIP_TAC;
2144 SUBGOAL_THEN` local_fan (V,E,FF) ` ASSUME_TAC;
2145 REWRITE_TAC[local_fan];
2146 LET_TAC;
2147 ASM_REWRITE_TAC[];
2148 DOWN;
2149 ASM_SIMP_TAC[];
2150 STRIP_TAC;
2151 CONJ_TAC;
2152 EXISTS_TAC` (x: real^3 # real^3) `;
2153 ASM_REWRITE_TAC[];
2154 UNDISCH_TAC` dart H = darts_of_hyp E (V: real^3 -> bool) `;
2155 DISCH_THEN SUBST_ALL_TAC;
2156 ASM_SIMP_TAC[];
2157 UNDISCH_TAC` dih2k (H:(real^3 # real^3) hypermap) (CARD (FF: real^3 # real^3 -> bool)) ` ;
2158 ASM_SIMP_TAC[];
2159
2160 ASSUME_TAC2 LOCAL_FAN_SET_E;
2161 ASSUME_TAC2 Local_lemmas.LOFA_DARTS_FF_UNION_SWITCH_FF;
2162 ASSUME_TAC2 LOCAL_FAN_FACE_FF;
2163 SUBST_ALL_TAC (
2164 MESON[] ` FF = face H x <=> face H x = (FF: real^3 # real^3 -> bool) `);
2165 ASM_REWRITE_TAC[];
2166
2167
2168 SUBGOAL_THEN` {{(f: real^3 -> real^3) v, f (rho_node1 FF v)} | v IN V} = E' ` ASSUME_TAC;
2169 EXPAND_TAC "E'";
2170 REWRITE_TAC[EXTENSION];
2171 GEN_TAC;
2172 EXPAND_TAC "E";
2173 REWRITE_TAC[IN_ELIM_THM; IN_IMAGE];
2174 EQ_TAC;
2175 STRIP_TAC;
2176 EXISTS_TAC` {v, rho_node1 FF v} `;
2177 REWRITE_TAC[IMAGE_CLAUSES];
2178 ASM_REWRITE_TAC[];
2179 EXISTS_TAC` v: real^3 `;
2180 ASM_REWRITE_TAC[];
2181
2182 STRIP_TAC;
2183 EXISTS_TAC` v: real^3 `;
2184 ASM_REWRITE_TAC[IMAGE_CLAUSES];
2185 UNDISCH_TAC` BIJ (f: real^3 -> real^3) V V' `;
2186 PAT_REWRITE_TAC `\x. x ==> y ` [BIJ];
2187 NHANH Wrgcvdr_cizmrrh.SURJ_IMP_S2_EQ_IMAGE_S1;
2188 STRIP_TAC;
2189
2190 SUBGOAL_THEN` self_pairs E' (V': real^3 -> bool) = {} ` MP_TAC;
2191 REWRITE_TAC[self_pairs];
2192 EXPAND_TAC "V'";
2193 EXPAND_TAC "E'";
2194 REWRITE_TAC[IN_IMAGE];
2195
2196
2197 MATCH_MP_TAC (SET_RULE` (! x. ~ P x ) ==> {x,x | P x } = {} `);
2198 GEN_TAC;
2199 STRIP_TAC;
2200 DOWN;
2201 PHA;
2202 REWRITE_TAC[SET_RULE` ~( x = {} ) <=> ? a. a IN x `; EE; IN_ELIM_THM];
2203 EXISTS_TAC` (f: real^3 -> real^3) (rho_node1 FF x') `;
2204 EXISTS_TAC` x': real^3 `;
2205 ASM_REWRITE_TAC[];
2206
2207 STRIP_TAC;
2208 SUBGOAL_THEN` darts_of_hyp E' V' = IMAGE (ff: real^3 # real^3 -> real^3 # real^3) (darts_of_hyp E V ) ` MP_TAC;
2209 ASM_REWRITE_TAC[];
2210 ASM_REWRITE_TAC[darts_of_hyp; UNION_EMPTY; ord_pairs];
2211
2212 SUBGOAL_THEN` (! s. s IN E ==> INJ (f:real^3 -> real^3) s (IMAGE f s)) ` MP_TAC;
2213 REWRITE_TAC[INJ];
2214 REPEAT STRIP_TAC;
2215 REWRITE_TAC[IN_IMAGE];
2216 EXISTS_TAC` x': real^3 `;
2217 ASM_REWRITE_TAC[];
2218 UNDISCH_TAC` (s: real^3 -> bool) IN E `;
2219 EXPAND_TAC "E";
2220 REWRITE_TAC[IN_ELIM_THM];
2221 STRIP_TAC;
2222
2223 ASM_CASES_TAC` x' = (y:real^3) `;
2224 DOWN THEN SIMP_TAC[];
2225 REPLICATE_TAC 6 DOWN THEN PHA;
2226 NHANH (
2227 MESON[SET2_DETER]` x' IN s /\
2228  y IN s /\
2229  f x' = f y /\
2230  v IN V /\
2231  s = {v, rho_node1 FF v} /\
2232  ~(x' = y) ==> s = {x', y} `);
2233 STRIP_TAC;
2234 SUBGOAL_THEN` IMAGE (f: real^3 -> real^3 ) s IN E' ` ASSUME_TAC;
2235 DOWN;
2236 ASM_REWRITE_TAC[IMAGE_CLAUSES];
2237 EXPAND_TAC "E'";
2238 REWRITE_TAC[IN_ELIM_THM];
2239 STRIP_TAC;
2240 EXISTS_TAC `v: real^3 `;
2241 ASM_REWRITE_TAC[];
2242 UNDISCH_TAC` FAN (vec 0,V': real^3 -> bool,E') `;
2243 REWRITE_TAC[FAN; fan6];
2244 STRIP_TAC;
2245 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` IMAGE (f:real^3 -> real^3) s `));
2246 DOWN;
2247 UNDISCH_TAC` s = {x', y:real^3} `;
2248 SIMP_TAC[IMAGE_CLAUSES; Local_lemmas.INSERT_UNION2; UNION_EMPTY];
2249 ASM_REWRITE_TAC[INSERT_INSERT; COLLINEAR_2];
2250 NHANH ORD_PAIRS_INJ_IMAGE;
2251 REWRITE_TAC[GSYM ord_pairs];
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262 SUBGOAL_THEN` (IMAGE (\s. IMAGE (f:real^3 -> real^3) s) E) = E': (real^3 -> bool) -> bool ` MP_TAC;
2263 REWRITE_TAC[EXTENSION; IN_IMAGE];
2264 GEN_TAC;
2265 EQ_TAC;
2266 STRIP_TAC;
2267 FIRST_ASSUM (ASSUME_TAC o (SPEC` a: real^3 `));
2268 EXPAND_TAC "E'";
2269 REWRITE_TAC[IN_ELIM_THM];
2270 DOWN THEN DOWN;
2271 EXPAND_TAC "E";
2272 REWRITE_TAC[IN_ELIM_THM];
2273 REPEAT STRIP_TAC;
2274 EXISTS_TAC` v: real^3 `;
2275 ASM_REWRITE_TAC[];
2276 REPLICATE_TAC 4 DOWN THEN PHA;
2277 CONV_TAC SET_RULE;
2278
2279
2280
2281
2282 EXPAND_TAC "E'";
2283 REWRITE_TAC[IN_ELIM_THM];
2284 STRIP_TAC;
2285 EXISTS_TAC` {v, rho_node1 FF v }`;
2286 ASM_REWRITE_TAC[];
2287 EXPAND_TAC "E";
2288 DOWN THEN DOWN;
2289 CONV_TAC SET_RULE;
2290 SIMP_TAC[];
2291 ASM_REWRITE_TAC[];
2292 STRIP_TAC;
2293 SUBGOAL_THEN` self_pairs E (V:real^3 -> bool) = {} ` MP_TAC;
2294 REWRITE_TAC[self_pairs; EE; SET_RULE` s = {} <=> ! x. ~ ( x IN s) `; IN_ELIM_THM];
2295 GEN_TAC;
2296 STRIP_TAC;
2297 FIRST_X_ASSUM (MP_TAC o (SPEC` rho_node1 FF v `));
2298 PHA;
2299 EXPAND_TAC "E";
2300 REWRITE_TAC[IN_ELIM_THM];
2301 EXISTS_TAC` v: real^3 `;
2302 ASM_REWRITE_TAC[];
2303 UNDISCH_TAC` darts_of_hyp E V = FF UNION {(v:real^3),w | w,v IN FF} `;
2304 DISCH_THEN (SUBST1_TAC o SYM);
2305 SIMP_TAC[darts_of_hyp; UNION_EMPTY];
2306
2307
2308 (* ============ *)
2309
2310 ASM_SIMP_TAC[];
2311 STRIP_TAC;
2312 CONJ_TAC;
2313 MATCH_MP_TAC (GEN_ALL INJ_IMP_BIJ_IMAGE);
2314 EXISTS_TAC` IMAGE (ff: real^3 # real^3 -> real^3 # real^3) (FF UNION {(v:real^3,w: real^3) | w,v IN FF} )`;
2315 REWRITE_TAC[INJ; FUN_IN_IMAGE];
2316 EXPAND_TAC "ff";
2317
2318
2319 SUBGOAL_THEN` !x. x IN FF UNION {v,w | w,v IN FF} ==> (? a b. x = (a,b) /\ a IN V /\ b IN (V: real^3 -> bool)) ` MP_TAC;
2320 REWRITE_TAC[IN_UNION];
2321 REPEAT STRIP_TAC;
2322 DOWN;
2323 EXPAND_TAC "FF";
2324 REWRITE_TAC[IN_ELIM_THM];
2325 STRIP_TAC;
2326 EXISTS_TAC` v: real^3 `;
2327 EXISTS_TAC` rho_node1 FF v `;
2328 ASM_REWRITE_TAC[];
2329 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2330 ASM_REWRITE_TAC[];
2331 DOWN;
2332 EXPAND_TAC "FF";
2333 REWRITE_TAC[IN_ELIM_THM];
2334 STRIP_TAC;
2335 EXISTS_TAC` rho_node1 FF v' `;
2336 EXISTS_TAC` v': real^ 3 `;
2337 DOWN THEN DOWN;
2338 ASM_SIMP_TAC[PAIR_EQ];
2339 REPEAT STRIP_TAC;
2340 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2341 ASM_REWRITE_TAC[];
2342 DISCH_THEN NHANH;
2343 REPEAT STRIP_TAC;
2344 DOWN;
2345 ASM_REWRITE_TAC[];
2346 EXPAND_TAC "ff";
2347 REWRITE_TAC[PAIR_EQ];
2348 UNDISCH_TAC` INJ (f:real^3 -> real^3) V V' `;
2349 DOWN THEN DOWN;
2350 UNDISCH_TAC` (a:real^3) IN V `;
2351 UNDISCH_TAC` (b: real^3) IN V `;
2352 REWRITE_TAC[INJ];
2353 MESON_TAC[];
2354
2355 UNDISCH_TAC` darts_of_hyp E V = FF UNION {v:real^3,w | w,v IN FF} `;
2356 DISCH_THEN (ASSUME_TAC2 o SYM);
2357 ASM_REWRITE_TAC[];
2358 REPEAT STRIP_TAC;
2359 SUBGOAL_THEN` (ff: real^3 # real^3 -> real^3 # real^3) x' IN darts_of_hyp E' V' ` MP_TAC;
2360 ASM_REWRITE_TAC[];
2361 MATCH_MP_TAC FUN_IN_IMAGE;
2362 FIRST_ASSUM ACCEPT_TAC;
2363 DOWN;
2364 SIMP_TAC[Wrgcvdr_cizmrrh.ff_of_hyp2];
2365 ASM_REWRITE_TAC[];
2366 FIRST_X_ASSUM (SUBST1_TAC o SYM);
2367 REWRITE_TAC[];
2368 REWRITE_TAC[IN_UNION];
2369 STRIP_TAC THEN STRIP_TAC;
2370 UNDISCH_TAC` (x': real^3 # real^3 ) IN FF `;
2371 EXPAND_TAC "FF";
2372 REWRITE_TAC[IN_ELIM_THM];
2373 STRIP_TAC;
2374 ASM_REWRITE_TAC[];
2375 EXPAND_TAC "ff";
2376 REWRITE_TAC[PAIR_EQ];
2377 SUBGOAL_THEN` rho_node1 FF v IN V ` MP_TAC;
2378 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2379 ASM_REWRITE_TAC[];
2380 UNDISCH_TAC` local_fan (V,E,FF) `;
2381 PHA;
2382 NHANH Local_lemmas1.LOFA_IMP_EE_TWO_ELMS_INS_ND;
2383 ASSUME_TAC2 Local_lemmas.IVS_RHO_IDD;
2384 ASM_SIMP_TAC[];
2385 ONCE_REWRITE_TAC[INSERT_COMM];
2386 REWRITE_TAC[Polar_fan.IVS_AZIM_CYCLE_TWO_POINT_SET];
2387 STRIP_TAC;
2388
2389 SUBGOAL_THEN` EE ((f:real^3 -> real^3) (rho_node1 FF v)) E' = { f v, f (rho_node1 FF (rho_node1 FF v )) } ` MP_TAC;
2390 REWRITE_TAC[EE; GSYM SUBSET_ANTISYM_EQ; SUBSET];
2391 CONJ_TAC;
2392 GEN_TAC;
2393 REWRITE_TAC[IN_ELIM_THM];
2394 EXPAND_TAC "E'";
2395 REWRITE_TAC[IN_ELIM_THM];
2396 STRIP_TAC;
2397 DOWN;
2398 REWRITE_TAC[Collect_geom.PAIR_EQ_EXPAND];
2399 STRIP_TAC;
2400 UNDISCH_TAC` INJ (f: real^3 -> real ^3) V V' `;
2401 REWRITE_TAC[INJ];
2402 STRIP_TAC;
2403 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`rho_node1 FF v `;` v': real^3 `]));
2404 ASM_REWRITE_TAC[];
2405 CONV_TAC SET_RULE;
2406
2407 UNDISCH_TAC` INJ (f: real^3 -> real ^3) V V' `;
2408 REWRITE_TAC[INJ];
2409 STRIP_TAC;
2410 FIRST_ASSUM (MP_TAC o (SPECL [`rho_node1 FF v `;` rho_node1 FF v'`]));
2411 ANTS_TAC;
2412 ASM_REWRITE_TAC[];
2413 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2414 ASM_REWRITE_TAC[];
2415 ASSUME_TAC2 Polar_fan.RHO_NODE1_INJECTIVE;
2416 FIRST_X_ASSUM (ASSUME_TAC2 o (SPECL[` v: real^3 `;` v': real^3 `]));
2417 ASM_SIMP_TAC[];
2418 REWRITE_TAC[IN_INSERT];
2419 GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM];
2420 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
2421 STRIP_TAC;
2422 ASM_REWRITE_TAC[];
2423 EXPAND_TAC "E'";
2424 REWRITE_TAC[IN_ELIM_THM];
2425 EXISTS_TAC `v: real^3 `;
2426 ASM_REWRITE_TAC[INSERT_COMM];
2427 ASM_REWRITE_TAC[];
2428 EXPAND_TAC "E'";
2429 REWRITE_TAC[IN_ELIM_THM];
2430 EXISTS_TAC` rho_node1 FF v `;
2431 ASM_REWRITE_TAC[];
2432 SIMP_TAC[Polar_fan.IVS_AZIM_CYCLE_TWO_POINT_SET];
2433
2434
2435
2436 UNDISCH_TAC` (x': real^3 # real^3) IN {v,w | w,v IN FF} `;
2437 EXPAND_TAC "FF";
2438 REWRITE_TAC[IN_ELIM_THM; PAIR_EQ];
2439 STRIP_TAC;
2440 ASM_REWRITE_TAC[];
2441 EXPAND_TAC "ff";
2442 REWRITE_TAC[PAIR_EQ];
2443 ASSUME_TAC2 (
2444 SPEC` v': real^3 ` (
2445 GEN`v: real^3 ` Local_lemmas1.LOFA_IMP_EE_TWO_ELMS_INS_ND));
2446 ASM_REWRITE_TAC[Polar_fan.IVS_AZIM_CYCLE_TWO_POINT_SET];
2447 SUBGOAL_THEN` EE ((f:real^3 -> real^3) v') E'= { f (rho_node1 FF v'), f (ivs_rho_node1 FF v' )} ` MP_TAC;
2448 REWRITE_TAC[EE; GSYM SUBSET_ANTISYM_EQ; SUBSET];
2449
2450 UNDISCH_TAC` INJ (f: real^3 -> real^3) V V' `;
2451 REWRITE_TAC[INJ];
2452 STRIP_TAC;
2453
2454
2455 CONJ_TAC;
2456 EXPAND_TAC "E'";
2457 REWRITE_TAC[IN_ELIM_THM; Collect_geom.PAIR_EQ_EXPAND];
2458 REPEAT STRIP_TAC;
2459 FIRST_X_ASSUM (ASSUME_TAC2 o (SPECL [` v': real^3 `;` v'': real^3 `]));
2460 ASM_REWRITE_TAC[IN_INSERT];
2461
2462 FIRST_X_ASSUM (MP_TAC o (SPECL [` v': real^3 `;` rho_node1 FF v'' `]));
2463 ANTS_TAC;
2464 ASM_REWRITE_TAC[IN_INSERT];
2465 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2466 ASM_REWRITE_TAC[];
2467 STRIP_TAC;
2468 ASM_REWRITE_TAC[];
2469 ASSUME_TAC2 (
2470 SPEC ` v'': real^3 ` (
2471 GEN`v: real^3 ` Local_lemmas.IVS_RHO_IDD));
2472 ASM_REWRITE_TAC[IN_INSERT];
2473
2474 REWRITE_TAC[IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY];
2475 REPEAT STRIP_TAC;
2476 ASM_REWRITE_TAC[];
2477 EXPAND_TAC "E'";
2478 REWRITE_TAC[IN_ELIM_THM];
2479 EXISTS_TAC` v': real^3 `;
2480 ASM_REWRITE_TAC[];
2481 ASM_REWRITE_TAC[];
2482 EXPAND_TAC "E'";
2483 REWRITE_TAC[IN_ELIM_THM];
2484 EXISTS_TAC` ivs_rho_node1 FF v' `;
2485 ASM_REWRITE_TAC[];
2486 ASSUME_TAC2 Polar_fan.IVS_RHO_NODE1_IN_V;
2487 CONJ_TAC;
2488 FIRST_X_ASSUM MATCH_MP_TAC;
2489 FIRST_ASSUM ACCEPT_TAC;
2490 ASSUME_TAC2 (
2491 SPEC` v': real ^3 ` (
2492 GEN`v: real^3 ` Local_lemmas1.LOCAL_FAN_RHO_NODE_IVS ));
2493 ASM_REWRITE_TAC[INSERT_COMM];
2494 SIMP_TAC[Polar_fan.IVS_AZIM_CYCLE_TWO_POINT_SET]]);;
2495
2496
2497
2498 let NODE_EDGE_COMM_LEMMA = prove_by_refinement (` local_fan (V,E,FF) /\
2499      BIJ f V V' /\
2500      IMAGE (\s. IMAGE f s) E = E' /\
2501      FAN (vec 0,V',E') /\
2502      (\(x,y). f x,f y) = ff
2503      ==> 
2504          (!x. x IN darts_of_hyp E V
2505               ==> nn_of_hyp (vec 0,V',E') (ff x) =
2506                   ff (nn_of_hyp (vec 0,V,E) x)  /\
2507             ee_of_hyp (vec 0,V',E') (ff x) =
2508                   ff (ee_of_hyp (vec 0,V,E) x) ) `,
2509
2510
2511
2512 [REWRITE_TAC[hyp_iso; local_fan];
2513 LET_TAC;
2514 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2515 ASM_REWRITE_TAC[];
2516 STRIP_TAC;
2517 SUBGOAL_THEN` local_fan (V,E,FF) ` ASSUME_TAC;
2518 REWRITE_TAC[local_fan];
2519 LET_TAC;
2520 ASM_REWRITE_TAC[];
2521 DOWN;
2522 ASM_SIMP_TAC[];
2523 STRIP_TAC;
2524 CONJ_TAC;
2525 EXISTS_TAC` (x: real^3 # real^3) `;
2526 ASM_REWRITE_TAC[];
2527 UNDISCH_TAC` dart H = darts_of_hyp E (V: real^3 -> bool) `;
2528 DISCH_THEN SUBST_ALL_TAC;
2529 ASM_SIMP_TAC[];
2530 UNDISCH_TAC` dih2k (H:(real^3 # real^3) hypermap) (CARD (FF: real^3 # real^3 -> bool)) ` ;
2531 ASM_SIMP_TAC[];
2532
2533 ASSUME_TAC2 LOCAL_FAN_SET_E;
2534 ASSUME_TAC2 Local_lemmas.LOFA_DARTS_FF_UNION_SWITCH_FF;
2535 ASSUME_TAC2 LOCAL_FAN_FACE_FF;
2536 SUBST_ALL_TAC (
2537 MESON[] ` FF = face H x <=> face H x = (FF: real^3 # real^3 -> bool) `);
2538 ASM_REWRITE_TAC[];
2539
2540
2541 SUBGOAL_THEN` {{(f: real^3 -> real^3) v, f (rho_node1 FF v)} | v IN V} = E' ` ASSUME_TAC;
2542 EXPAND_TAC "E'";
2543 REWRITE_TAC[EXTENSION];
2544 GEN_TAC;
2545 EXPAND_TAC "E";
2546 REWRITE_TAC[IN_ELIM_THM; IN_IMAGE];
2547 EQ_TAC;
2548 STRIP_TAC;
2549 EXISTS_TAC` {v, rho_node1 FF v} `;
2550 REWRITE_TAC[IMAGE_CLAUSES];
2551 ASM_REWRITE_TAC[];
2552 EXISTS_TAC` v: real^3 `;
2553 ASM_REWRITE_TAC[];
2554
2555 STRIP_TAC;
2556 EXISTS_TAC` v: real^3 `;
2557 ASM_REWRITE_TAC[IMAGE_CLAUSES];
2558 UNDISCH_TAC` BIJ (f: real^3 -> real^3) V V' `;
2559 PAT_REWRITE_TAC `\x. x ==> y ` [BIJ];
2560 NHANH Wrgcvdr_cizmrrh.SURJ_IMP_S2_EQ_IMAGE_S1;
2561 STRIP_TAC;
2562
2563 SUBGOAL_THEN` self_pairs E' (V': real^3 -> bool) = {} ` MP_TAC;
2564 REWRITE_TAC[self_pairs];
2565 EXPAND_TAC "V'";
2566 EXPAND_TAC "E'";
2567 REWRITE_TAC[IN_IMAGE];
2568
2569
2570 MATCH_MP_TAC (SET_RULE` (! x. ~ P x ) ==> {x,x | P x } = {} `);
2571 GEN_TAC;
2572 STRIP_TAC;
2573 DOWN;
2574 PHA;
2575 REWRITE_TAC[SET_RULE` ~( x = {} ) <=> ? a. a IN x `; EE; IN_ELIM_THM];
2576 EXISTS_TAC` (f: real^3 -> real^3) (rho_node1 FF x') `;
2577 EXISTS_TAC` x': real^3 `;
2578 ASM_REWRITE_TAC[];
2579
2580 STRIP_TAC;
2581 SUBGOAL_THEN` darts_of_hyp E' V' = IMAGE (ff: real^3 # real^3 -> real^3 # real^3) (darts_of_hyp E V ) ` MP_TAC;
2582 ASM_REWRITE_TAC[];
2583 ASM_REWRITE_TAC[darts_of_hyp; UNION_EMPTY; ord_pairs];
2584
2585 SUBGOAL_THEN` (! s. s IN E ==> INJ (f:real^3 -> real^3) s (IMAGE f s)) ` MP_TAC;
2586 REWRITE_TAC[INJ];
2587 REPEAT STRIP_TAC;
2588 REWRITE_TAC[IN_IMAGE];
2589 EXISTS_TAC` x': real^3 `;
2590 ASM_REWRITE_TAC[];
2591 UNDISCH_TAC` (s: real^3 -> bool) IN E `;
2592 EXPAND_TAC "E";
2593 REWRITE_TAC[IN_ELIM_THM];
2594 STRIP_TAC;
2595
2596 ASM_CASES_TAC` x' = (y:real^3) `;
2597 DOWN THEN SIMP_TAC[];
2598 REPLICATE_TAC 6 DOWN THEN PHA;
2599 NHANH (
2600 MESON[SET2_DETER]` x' IN s /\
2601  y IN s /\
2602  f x' = f y /\
2603  v IN V /\
2604  s = {v, rho_node1 FF v} /\
2605  ~(x' = y) ==> s = {x', y} `);
2606 STRIP_TAC;
2607 SUBGOAL_THEN` IMAGE (f: real^3 -> real^3 ) s IN E' ` ASSUME_TAC;
2608 DOWN;
2609 ASM_REWRITE_TAC[IMAGE_CLAUSES];
2610 EXPAND_TAC "E'";
2611 REWRITE_TAC[IN_ELIM_THM];
2612 STRIP_TAC;
2613 EXISTS_TAC `v: real^3 `;
2614 ASM_REWRITE_TAC[];
2615 UNDISCH_TAC` FAN (vec 0,V': real^3 -> bool,E') `;
2616 REWRITE_TAC[FAN; fan6];
2617 STRIP_TAC;
2618 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` IMAGE (f:real^3 -> real^3) s `));
2619 DOWN;
2620 UNDISCH_TAC` s = {x', y:real^3} `;
2621 SIMP_TAC[IMAGE_CLAUSES; Local_lemmas.INSERT_UNION2; UNION_EMPTY];
2622 ASM_REWRITE_TAC[INSERT_INSERT; COLLINEAR_2];
2623 NHANH ORD_PAIRS_INJ_IMAGE;
2624 REWRITE_TAC[GSYM ord_pairs];
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635 SUBGOAL_THEN` (IMAGE (\s. IMAGE (f:real^3 -> real^3) s) E) = E': (real^3 -> bool) -> bool ` MP_TAC;
2636 REWRITE_TAC[EXTENSION; IN_IMAGE];
2637 GEN_TAC;
2638 EQ_TAC;
2639 STRIP_TAC;
2640 FIRST_ASSUM (ASSUME_TAC o (SPEC` a: real^3 `));
2641 EXPAND_TAC "E'";
2642 REWRITE_TAC[IN_ELIM_THM];
2643 DOWN THEN DOWN;
2644 EXPAND_TAC "E";
2645 REWRITE_TAC[IN_ELIM_THM];
2646 REPEAT STRIP_TAC;
2647 EXISTS_TAC` v: real^3 `;
2648 ASM_REWRITE_TAC[];
2649 REPLICATE_TAC 4 DOWN THEN PHA;
2650 CONV_TAC SET_RULE;
2651
2652
2653
2654
2655 EXPAND_TAC "E'";
2656 REWRITE_TAC[IN_ELIM_THM];
2657 STRIP_TAC;
2658 EXISTS_TAC` {v, rho_node1 FF v }`;
2659 ASM_REWRITE_TAC[];
2660 EXPAND_TAC "E";
2661 DOWN THEN DOWN;
2662 CONV_TAC SET_RULE;
2663 SIMP_TAC[];
2664 ASM_REWRITE_TAC[];
2665 STRIP_TAC;
2666 SUBGOAL_THEN` self_pairs E (V:real^3 -> bool) = {} ` MP_TAC;
2667 REWRITE_TAC[self_pairs; EE; SET_RULE` s = {} <=> ! x. ~ ( x IN s) `; IN_ELIM_THM];
2668 GEN_TAC;
2669 STRIP_TAC;
2670 FIRST_X_ASSUM (MP_TAC o (SPEC` rho_node1 FF v `));
2671 PHA;
2672 EXPAND_TAC "E";
2673 REWRITE_TAC[IN_ELIM_THM];
2674 EXISTS_TAC` v: real^3 `;
2675 ASM_REWRITE_TAC[];
2676 UNDISCH_TAC` darts_of_hyp E V = FF UNION {(v:real^3),w | w,v IN FF} `;
2677 DISCH_THEN (SUBST1_TAC o SYM);
2678 SIMP_TAC[darts_of_hyp; UNION_EMPTY];
2679
2680 STRIP_TAC;
2681 REWRITE_TAC[Wrgcvdr_cizmrrh.nn_of_hyp2];
2682 UNDISCH_TAC` darts_of_hyp E V = FF UNION {v:real^3,w | w,v IN FF} `;
2683 DISCH_THEN (ASSUME_TAC o SYM);
2684 ASM_SIMP_TAC[];
2685 SUBGOAL_THEN`(! x. x IN darts_of_hyp E (V:real^3 -> bool) ==> ((ff x): real^3 # real^3) IN darts_of_hyp E' V' )` MP_TAC;
2686 ASM_REWRITE_TAC[FUN_IN_IMAGE];
2687 STRIP_TAC;
2688 FIRST_ASSUM NHANH;
2689 ASM_SIMP_TAC[];
2690
2691 SUBGOAL_THEN` ! v. v IN V ==> ivs_rho_node1 FF (rho_node1 FF v) = v ` ASSUME_TAC;
2692 GEN_TAC THEN STRIP_TAC;
2693 MATCH_MP_TAC Local_lemmas.IVS_RHO_IDD;
2694 ASM_REWRITE_TAC[];
2695 SUBGOAL_THEN` ! v. v IN V ==> rho_node1 FF (ivs_rho_node1 FF v) = v ` ASSUME_TAC;
2696 GEN_TAC THEN STRIP_TAC;
2697 MATCH_MP_TAC Local_lemmas1.LOCAL_FAN_RHO_NODE_IVS;
2698 ASM_REWRITE_TAC[];
2699
2700
2701 SUBGOAL_THEN` !v . v IN V ==> rho_node1 FF v IN V ` ASSUME_TAC;
2702 GEN_TAC THEN STRIP_TAC;
2703 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2704 ASM_SIMP_TAC[Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V];
2705
2706
2707 SUBGOAL_THEN` !v . v IN V ==> ivs_rho_node1 FF v IN V ` ASSUME_TAC;
2708 MATCH_MP_TAC Polar_fan.IVS_RHO_NODE1_IN_V;
2709 EXISTS_TAC` E: (real^3 -> bool) -> bool `;
2710 ASM_REWRITE_TAC[];
2711
2712
2713
2714 UNDISCH_TAC` INJ (f: real^3 -> real^3) V V' `;
2715 REWRITE_TAC[INJ];
2716 STRIP_TAC;
2717
2718
2719 SUBGOAL_THEN` !v. v IN V
2720           ==> EE v E = {rho_node1 FF v,  (ivs_rho_node1 FF v)} ` ASSUME_TAC;
2721 REPEAT STRIP_TAC;
2722 MATCH_MP_TAC Local_lemmas1.LOFA_IMP_EE_TWO_ELMS_INS_ND;
2723 ASM_REWRITE_TAC[];
2724
2725
2726
2727
2728
2729 SUBGOAL_THEN`!v. v IN V ==> EE ((f:real^3 -> real^3) v ) E' = {f (rho_node1 FF v), f (ivs_rho_node1 FF v ) } ` ASSUME_TAC;
2730 REPEAT STRIP_TAC;
2731 REWRITE_TAC[EE; GSYM SUBSET_ANTISYM_EQ; SUBSET];
2732 EXPAND_TAC "E'";
2733 REWRITE_TAC[IN_ELIM_THM];
2734 CONJ_TAC;
2735 GEN_TAC THEN STRIP_TAC;
2736 DOWN;
2737 REWRITE_TAC[Collect_geom.PAIR_EQ_EXPAND];
2738 STRIP_TAC;
2739 FIRST_X_ASSUM (ASSUME_TAC2 o (SPECL [` v: real^3 `;` v': real^3 `]));
2740 ASM_REWRITE_TAC[IN_INSERT];
2741 FIRST_X_ASSUM (MP_TAC o (SPECL [` v: real^3 `;` rho_node1 FF v' `]));
2742 ANTS_TAC;
2743 ASM_REWRITE_TAC[IN_INSERT];
2744 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2745 ASM_REWRITE_TAC[];
2746 STRIP_TAC;
2747
2748 ASM_SIMP_TAC[IN_INSERT];
2749 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
2750 GEN_TAC THEN STRIP_TAC;
2751 EXISTS_TAC` v: real^3 `;
2752 ASM_REWRITE_TAC[];
2753 EXISTS_TAC` ivs_rho_node1 FF v `;
2754 ASM_SIMP_TAC[INSERT_COMM];
2755
2756 GEN_TAC THEN STRIP_TAC;
2757 SUBGOAL_THEN` x' IN FF UNION {v:real^3,w | w,v IN FF} ` MP_TAC;
2758 ASM_REWRITE_TAC[];
2759 REWRITE_TAC[IN_UNION];
2760 STRIP_TAC;
2761 DOWN;
2762 EXPAND_TAC "FF";
2763 REWRITE_TAC[IN_ELIM_THM];
2764 STRIP_TAC;
2765 ASM_REWRITE_TAC[];
2766 EXPAND_TAC "ff";
2767 REWRITE_TAC[];
2768
2769 CONJ_TAC;
2770 ASM_SIMP_TAC[PAIR_EQ];
2771 REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
2772
2773 REWRITE_TAC[Wrgcvdr_cizmrrh.ee_of_hyp2];
2774 UNDISCH_TAC` x' IN darts_of_hyp E (V: real^3 -> bool) `;
2775 UNDISCH_TAC` (ff: real^3 # real^3 -> real^3 # real^3 ) x' IN IMAGE ff (darts_of_hyp E V) `;
2776 ASM_REWRITE_TAC[];
2777 EXPAND_TAC "ff";
2778 SIMP_TAC[];
2779
2780 DOWN;
2781 EXPAND_TAC "FF";
2782 REWRITE_TAC[IN_ELIM_THM; PAIR_EQ];
2783 STRIP_TAC;
2784 ASM_REWRITE_TAC[];
2785 EXPAND_TAC "ff";
2786 REWRITE_TAC[PAIR_EQ];
2787 ASM_SIMP_TAC[];
2788 ONCE_REWRITE_TAC[INSERT_COMM];
2789 REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
2790
2791 REWRITE_TAC[Wrgcvdr_cizmrrh.ee_of_hyp2];
2792 UNDISCH_TAC` x' IN darts_of_hyp E (V: real^3 -> bool) `;
2793 UNDISCH_TAC` (ff: real^3 # real^3 -> real^3 # real^3 ) x' IN IMAGE ff (darts_of_hyp E V) `;
2794 ASM_REWRITE_TAC[];
2795 EXPAND_TAC "ff";
2796 SIMP_TAC[]]);;
2797
2798
2799
2800
2801
2802 let HYP_ISO_LEMMAA = prove_by_refinement (` local_fan (V,E,FF) /\
2803      BIJ f V V' /\
2804      IMAGE (\s. IMAGE f s) E = E' /\
2805      FAN (vec 0,V',E') /\
2806      (\(x,y). f x,f y) = ff
2807 ==> hyp_iso ff (hypermap (HYP (vec 0, V, E)), hypermap (HYP (vec 0, V', E')))`,
2808 [REWRITE_TAC[hyp_iso; local_fan];
2809 LET_TAC;
2810 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2811 ASM_REWRITE_TAC[];
2812 STRIP_TAC;
2813 SUBGOAL_THEN` local_fan (V,E,FF) ` ASSUME_TAC;
2814 REWRITE_TAC[local_fan];
2815 LET_TAC;
2816 ASM_REWRITE_TAC[];
2817 DOWN;
2818 ASM_SIMP_TAC[];
2819 STRIP_TAC;
2820 CONJ_TAC;
2821 EXISTS_TAC` (x: real^3 # real^3) `;
2822 ASM_REWRITE_TAC[];
2823 UNDISCH_TAC` dart H = darts_of_hyp E (V: real^3 -> bool) `;
2824 DISCH_THEN SUBST_ALL_TAC;
2825 ASM_SIMP_TAC[];
2826 UNDISCH_TAC` dih2k (H:(real^3 # real^3) hypermap) (CARD (FF: real^3 # real^3 -> bool)) ` ;
2827 ASM_SIMP_TAC[];
2828
2829 ASSUME_TAC2 LOCAL_FAN_SET_E;
2830 ASSUME_TAC2 Local_lemmas.LOFA_DARTS_FF_UNION_SWITCH_FF;
2831 ASSUME_TAC2 LOCAL_FAN_FACE_FF;
2832 SUBST_ALL_TAC (
2833 MESON[] ` FF = face H x <=> face H x = (FF: real^3 # real^3 -> bool) `);
2834 ASM_REWRITE_TAC[];
2835
2836
2837 SUBGOAL_THEN` {{(f: real^3 -> real^3) v, f (rho_node1 FF v)} | v IN V} = E' ` ASSUME_TAC;
2838 EXPAND_TAC "E'";
2839 REWRITE_TAC[EXTENSION];
2840 GEN_TAC;
2841 EXPAND_TAC "E";
2842 REWRITE_TAC[IN_ELIM_THM; IN_IMAGE];
2843 EQ_TAC;
2844 STRIP_TAC;
2845 EXISTS_TAC` {v, rho_node1 FF v} `;
2846 REWRITE_TAC[IMAGE_CLAUSES];
2847 ASM_REWRITE_TAC[];
2848 EXISTS_TAC` v: real^3 `;
2849 ASM_REWRITE_TAC[];
2850
2851 STRIP_TAC;
2852 EXISTS_TAC` v: real^3 `;
2853 ASM_REWRITE_TAC[IMAGE_CLAUSES];
2854 UNDISCH_TAC` BIJ (f: real^3 -> real^3) V V' `;
2855 PAT_REWRITE_TAC `\x. x ==> y ` [BIJ];
2856 NHANH Wrgcvdr_cizmrrh.SURJ_IMP_S2_EQ_IMAGE_S1;
2857 STRIP_TAC;
2858
2859 SUBGOAL_THEN` self_pairs E' (V': real^3 -> bool) = {} ` MP_TAC;
2860 REWRITE_TAC[self_pairs];
2861 EXPAND_TAC "V'";
2862 EXPAND_TAC "E'";
2863 REWRITE_TAC[IN_IMAGE];
2864
2865
2866 MATCH_MP_TAC (SET_RULE` (! x. ~ P x ) ==> {x,x | P x } = {} `);
2867 GEN_TAC;
2868 STRIP_TAC;
2869 DOWN;
2870 PHA;
2871 REWRITE_TAC[SET_RULE` ~( x = {} ) <=> ? a. a IN x `; EE; IN_ELIM_THM];
2872 EXISTS_TAC` (f: real^3 -> real^3) (rho_node1 FF x') `;
2873 EXISTS_TAC` x': real^3 `;
2874 ASM_REWRITE_TAC[];
2875
2876 STRIP_TAC;
2877 SUBGOAL_THEN` darts_of_hyp E' V' = IMAGE (ff: real^3 # real^3 -> real^3 # real^3) (darts_of_hyp E V ) ` MP_TAC;
2878 ASM_REWRITE_TAC[];
2879 ASM_REWRITE_TAC[darts_of_hyp; UNION_EMPTY; ord_pairs];
2880
2881 SUBGOAL_THEN` (! s. s IN E ==> INJ (f:real^3 -> real^3) s (IMAGE f s)) ` MP_TAC;
2882 REWRITE_TAC[INJ];
2883 REPEAT STRIP_TAC;
2884 REWRITE_TAC[IN_IMAGE];
2885 EXISTS_TAC` x': real^3 `;
2886 ASM_REWRITE_TAC[];
2887 UNDISCH_TAC` (s: real^3 -> bool) IN E `;
2888 EXPAND_TAC "E";
2889 REWRITE_TAC[IN_ELIM_THM];
2890 STRIP_TAC;
2891
2892 ASM_CASES_TAC` x' = (y:real^3) `;
2893 DOWN THEN SIMP_TAC[];
2894 REPLICATE_TAC 6 DOWN THEN PHA;
2895 NHANH (
2896 MESON[SET2_DETER]` x' IN s /\
2897  y IN s /\
2898  f x' = f y /\
2899  v IN V /\
2900  s = {v, rho_node1 FF v} /\
2901  ~(x' = y) ==> s = {x', y} `);
2902 STRIP_TAC;
2903 SUBGOAL_THEN` IMAGE (f: real^3 -> real^3 ) s IN E' ` ASSUME_TAC;
2904 DOWN;
2905 ASM_REWRITE_TAC[IMAGE_CLAUSES];
2906 EXPAND_TAC "E'";
2907 REWRITE_TAC[IN_ELIM_THM];
2908 STRIP_TAC;
2909 EXISTS_TAC `v: real^3 `;
2910 ASM_REWRITE_TAC[];
2911 UNDISCH_TAC` FAN (vec 0,V': real^3 -> bool,E') `;
2912 REWRITE_TAC[FAN; fan6];
2913 STRIP_TAC;
2914 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` IMAGE (f:real^3 -> real^3) s `));
2915 DOWN;
2916 UNDISCH_TAC` s = {x', y:real^3} `;
2917 SIMP_TAC[IMAGE_CLAUSES; Local_lemmas.INSERT_UNION2; UNION_EMPTY];
2918 ASM_REWRITE_TAC[INSERT_INSERT; COLLINEAR_2];
2919 NHANH ORD_PAIRS_INJ_IMAGE;
2920 REWRITE_TAC[GSYM ord_pairs];
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931 SUBGOAL_THEN` (IMAGE (\s. IMAGE (f:real^3 -> real^3) s) E) = E': (real^3 -> bool) -> bool ` MP_TAC;
2932 REWRITE_TAC[EXTENSION; IN_IMAGE];
2933 GEN_TAC;
2934 EQ_TAC;
2935 STRIP_TAC;
2936 FIRST_ASSUM (ASSUME_TAC o (SPEC` a: real^3 `));
2937 EXPAND_TAC "E'";
2938 REWRITE_TAC[IN_ELIM_THM];
2939 DOWN THEN DOWN;
2940 EXPAND_TAC "E";
2941 REWRITE_TAC[IN_ELIM_THM];
2942 REPEAT STRIP_TAC;
2943 EXISTS_TAC` v: real^3 `;
2944 ASM_REWRITE_TAC[];
2945 REPLICATE_TAC 4 DOWN THEN PHA;
2946 CONV_TAC SET_RULE;
2947
2948
2949
2950
2951 EXPAND_TAC "E'";
2952 REWRITE_TAC[IN_ELIM_THM];
2953 STRIP_TAC;
2954 EXISTS_TAC` {v, rho_node1 FF v }`;
2955 ASM_REWRITE_TAC[];
2956 EXPAND_TAC "E";
2957 DOWN THEN DOWN;
2958 CONV_TAC SET_RULE;
2959 SIMP_TAC[];
2960 ASM_REWRITE_TAC[];
2961 STRIP_TAC;
2962 SUBGOAL_THEN` self_pairs E (V:real^3 -> bool) = {} ` MP_TAC;
2963 REWRITE_TAC[self_pairs; EE; SET_RULE` s = {} <=> ! x. ~ ( x IN s) `; IN_ELIM_THM];
2964 GEN_TAC;
2965 STRIP_TAC;
2966 FIRST_X_ASSUM (MP_TAC o (SPEC` rho_node1 FF v `));
2967 PHA;
2968 EXPAND_TAC "E";
2969 REWRITE_TAC[IN_ELIM_THM];
2970 EXISTS_TAC` v: real^3 `;
2971 ASM_REWRITE_TAC[];
2972 UNDISCH_TAC` darts_of_hyp E V = FF UNION {(v:real^3),w | w,v IN FF} `;
2973 DISCH_THEN (SUBST1_TAC o SYM);
2974 SIMP_TAC[darts_of_hyp; UNION_EMPTY];
2975
2976
2977 MP_TAC BIJ_AND_MAP_COMM;
2978 ANTS_TAC;
2979 ASM_REWRITE_TAC[BIJ];
2980
2981 MP_TAC NODE_EDGE_COMM_LEMMA;
2982 ANTS_TAC;
2983 ASM_REWRITE_TAC[BIJ];
2984 ASM_REWRITE_TAC[];
2985 SIMP_TAC[];
2986 REPEAT STRIP_TAC;
2987 DOWN;
2988 NHANH (ISPEC `ff: real^3 # real^3 -> real^3 # real^3 ` FUN_IN_IMAGE);
2989 STRIP_TAC;
2990 ASM_REWRITE_TAC[Wrgcvdr_cizmrrh.ee_of_hyp2];
2991 UNDISCH_TAC` x' IN FF UNION {v,w | w:real^3,v IN FF} `;
2992 REWRITE_TAC[IN_ELIM_THM];
2993 SUBGOAL_THEN` x' IN FF UNION {v:real^3,w | w,v IN FF} ==> ? a b. x' = (a,b) ` MP_TAC;
2994 EXPAND_TAC "FF";
2995 REWRITE_TAC[IN_UNION; IN_ELIM_THM];
2996 MESON_TAC[];
2997 DISCH_THEN NHANH;
2998 STRIP_TAC;
2999 DOWN;
3000 SIMP_TAC[];
3001 EXPAND_TAC "ff";
3002 SIMP_TAC[]]);;
3003
3004
3005
3006
3007 let POWER_COMM = 
3008 REWRITE_RULE[IN_UNIV] (SPEC` (:A) ` Hypermap_iso.power_comm);;
3009
3010 let ITER_COMM = 
3011 REWRITE_RULE[Wrgcvdr_cizmrrh.POWER_TO_ITER] POWER_COMM;;
3012
3013
3014
3015
3016 let IMAGE_FACE_F = prove_by_refinement(
3017 ` hyp_iso (f: A -> B) (H,HH) ==> ! x . x IN dart H ==> IMAGE f (face H x ) = face HH ( f x ) `,
3018 [REWRITE_TAC[hyp_iso];
3019 STRIP_TAC THEN GEN_TAC THEN STRIP_TAC;
3020 REWRITE_TAC[EXTENSION; face; orbit_map; IN_ELIM_THM];
3021 SUBGOAL_THEN`! x n. x IN dart H ==> (face_map HH POWER n) ((f:A -> B) x) = 
3022 f  ((face_map H POWER n) (x)) ` ASSUME_TAC;
3023 ONCE_REWRITE_TAC[EQ_SYM_EQ];
3024 MATCH_MP_TAC (
3025 REWRITE_RULE[TAUT` a ==> b ==> c <=> a /\ b ==> c `] Hypermap_iso.power_comm);
3026 ASM_SIMP_TAC[Hypermap.lemma_dart_invariant];
3027
3028
3029 ASM_SIMP_TAC[IN_IMAGE; IN_ELIM_THM];
3030 MESON_TAC[]]);;
3031
3032
3033
3034
3035
3036 let COMM_BIJ_HAS_SAME_ORDS = prove_by_refinement(`BIJ f (:A) (:B) /\ 
3037  (! x. (f o h) x = (g o (f: A -> B)) x ) 
3038 /\ has_orders h k
3039 ==> has_orders g k`,
3040 [REWRITE_TAC[has_orders];
3041 REPEAT STRIP_TAC;
3042 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` i: num `));
3043 DOWN;
3044 PHA;
3045 REWRITE_TAC[FUN_EQ_THM];
3046 GEN_TAC;
3047 UNDISCH_TAC` BIJ f (:A) (:B) `;
3048 REWRITE_TAC[BIJ; INJ];
3049 STRIP_TAC;
3050 FIRST_ASSUM MATCH_MP_TAC;
3051 REWRITE_TAC[IN_UNIV];
3052 UNDISCH_TAC` !x. (f o h) x = (g o (f:A -> B)) x `;
3053 REWRITE_TAC[o_THM];
3054 NHANH ITER_COMM;
3055 SIMP_TAC[];
3056 STRIP_TAC;
3057 ASM_REWRITE_TAC[I_THM];
3058
3059 DOWN_TAC;
3060 REWRITE_TAC[o_THM];
3061 NHANH ITER_COMM;
3062 STRIP_TAC;
3063 SIMP_TAC[FUN_EQ_THM];
3064 UNDISCH_TAC` BIJ f (:A) (:B) `;
3065 REWRITE_TAC[BIJ; INJ; SURJ];
3066 STRIP_TAC;
3067 GEN_TAC;
3068 SUBGOAL_THEN` x IN (:B) ` MP_TAC;
3069 REWRITE_TAC[IN_UNIV];
3070 FIRST_X_ASSUM NHANH;
3071 STRIP_TAC;
3072 EXPAND_TAC "x";
3073 UNDISCH_TAC` !x n. f (ITER n h x) = ITER n g ((f: A -> B) x) `;
3074 ONCE_REWRITE_TAC[EQ_SYM_EQ];
3075 SIMP_TAC[];
3076 STRIP_TAC;
3077 ASM_REWRITE_TAC[I_THM]]);;
3078
3079
3080
3081
3082
3083
3084 let DIH2K_HYP_ISO_LEMMA = prove_by_refinement
3085 (` BIJ f (:A) (:B) /\ 
3086 FINITE (dart (H: (A) hypermap) ) /\ dih2k H k /\ hyp_iso (f: A -> B) (H, HH)
3087 ==> dih2k HH k `,
3088 [NHANH IMAGE_FACE_F;
3089 REWRITE_TAC[dih2k; hyp_iso];
3090 STRIP_TAC;
3091 CONJ_TAC;
3092 SUBGOAL_THEN` CARD (dart (H: (A) hypermap )) = CARD (dart (HH:(B) hypermap)) ` MP_TAC;
3093 MATCH_MP_TAC (Local_lemmas.BIJ_IMP_CARD_EQ);
3094 ASM_REWRITE_TAC[];
3095
3096 ASM_REWRITE_TAC[];
3097 SIMP_TAC[];
3098 CONJ_TAC;
3099 GEN_TAC;
3100 LET_TAC;
3101 STRIP_TAC;
3102 UNDISCH_TAC` BIJ (f: A -> B) (dart H) (dart HH) `;
3103 NHANH Add_triangle.BIJ_IMAGE;
3104 REWRITE_TAC[BIJ; SURJ];
3105 STRIP_TAC;
3106 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` x: B `));
3107 DOWN THEN STRIP_TAC;
3108
3109
3110 SUBGOAL_THEN` (let S = face  (H: (A) hypermap) y in dart H = S UNION IMAGE (node_map H) S) ` MP_TAC;
3111 FIRST_ASSUM MATCH_MP_TAC;
3112 ASM_REWRITE_TAC[];
3113 LET_TAC;
3114
3115 SUBGOAL_THEN` IMAGE f (face H (y:A)) = face HH ((f: A -> B) (y:A)) ` MP_TAC;
3116 FIRST_ASSUM MATCH_MP_TAC;
3117 FIRST_X_ASSUM ACCEPT_TAC;
3118
3119 ASM_REWRITE_TAC[];
3120 DISCH_THEN (ASSUME_TAC o SYM);
3121 ASM_REWRITE_TAC[GSYM IMAGE_o];
3122 UNDISCH_TAC` (y:A) IN dart H ` ;
3123 NHANH Hypermap.lemma_face_subset;
3124 STRIP_TAC;
3125
3126 SUBGOAL_THEN` IMAGE (node_map HH o (f: A -> B)) S' = IMAGE (f o (node_map H )) S' ` ASSUME_TAC;
3127 MATCH_MP_TAC Lvducxu.IDE_ON_S_IMP_SAME_IMAGE;
3128 GEN_TAC THEN DOWN;
3129 ASM_SIMP_TAC[SUBSET];
3130 DISCH_THEN NHANH;
3131 ASM_SIMP_TAC[o_THM];
3132 ASM_REWRITE_TAC[];
3133
3134 REWRITE_TAC[IMAGE_o; GSYM IMAGE_UNION];
3135 SIMP_TAC[];
3136
3137 SUBGOAL_THEN`!x. (x:A) IN dart H <=> ((f x): B) IN dart HH ` ASSUME_TAC;
3138 UNDISCH_TAC` BIJ (f: A -> B) (dart H ) (dart HH ) ` ;
3139 UNDISCH_TAC ` BIJ f (:A) (:B) ` ;
3140 REWRITE_TAC[BIJ; INJ; SURJ];
3141 STRIP_TAC THEN STRIP_TAC;
3142 GEN_TAC THEN EQ_TAC;
3143 ASM_REWRITE_TAC[];
3144 FIRST_X_ASSUM NHANH;
3145 STRIP_TAC;
3146 FIRST_X_ASSUM (MP_TAC o (SPECL [` y: A `;` x: A `]));
3147 FIRST_X_ASSUM (MP_TAC o (SPECL [` y: A `;` x: A `]));
3148 ANTS_TAC;
3149 ASM_REWRITE_TAC[IN_UNIV];
3150 ASM_SIMP_TAC[];
3151 DISCH_THEN SUBST_ALL_TAC;
3152 FIRST_ASSUM ACCEPT_TAC;
3153
3154 CONJ_TAC;
3155 MATCH_MP_TAC (GEN_ALL COMM_BIJ_HAS_SAME_ORDS);
3156 EXISTS_TAC` f: A -> B `;
3157 EXISTS_TAC` face_map (H: (A) hypermap)`;
3158 ASM_REWRITE_TAC[];
3159 GEN_TAC;
3160 ASM_CASES_TAC` (x:A) IN dart H `;
3161 ASM_SIMP_TAC[o_THM];
3162
3163 DOWN;
3164 NHANH Lvducxu.NOT_IN_DART_IMP_IDE;
3165 ASM_REWRITE_TAC[];
3166 NHANH Lvducxu.NOT_IN_DART_IMP_IDE;
3167 SIMP_TAC[o_THM];
3168
3169 CONJ_TAC;
3170 MATCH_MP_TAC (GEN_ALL COMM_BIJ_HAS_SAME_ORDS);
3171 EXISTS_TAC` f: A -> B `;
3172 EXISTS_TAC` edge_map (H: (A) hypermap)`;
3173
3174 ASM_REWRITE_TAC[];
3175 GEN_TAC;
3176 ASM_CASES_TAC` (x:A) IN dart H `;
3177 ASM_SIMP_TAC[o_THM];
3178
3179 DOWN;
3180 NHANH Lvducxu.NOT_IN_DART_IMP_IDE;
3181 ASM_REWRITE_TAC[];
3182 NHANH Lvducxu.NOT_IN_DART_IMP_IDE;
3183 SIMP_TAC[o_THM];
3184
3185 MATCH_MP_TAC (GEN_ALL COMM_BIJ_HAS_SAME_ORDS);
3186 EXISTS_TAC` f: A -> B `;
3187 EXISTS_TAC` node_map (H: (A) hypermap)`;
3188
3189 ASM_REWRITE_TAC[];
3190 GEN_TAC;
3191 ASM_CASES_TAC` (x:A) IN dart H `;
3192 ASM_SIMP_TAC[o_THM];
3193
3194 DOWN;
3195 NHANH Lvducxu.NOT_IN_DART_IMP_IDE;
3196 ASM_REWRITE_TAC[];
3197 NHANH Lvducxu.NOT_IN_DART_IMP_IDE;
3198 SIMP_TAC[o_THM]]);;
3199
3200
3201
3202
3203
3204
3205 let AUTOMAP_IMP_ALL_ITER_IN2 = 
3206 MESON[IN; Trigonometry2.AUTOMAP_IMP_ALL_ITER_IN] `
3207 p IN W /\ (!x. x IN W ==> f x IN W) ==> ITER N f p IN W `;;
3208
3209
3210 let ITER_COMM_RESTRICTED = prove_by_refinement(` (!(x:A). x IN V ==> f x IN V') /\
3211  (!x. h x IN V <=> x IN V) /\
3212   (!(y:B). g y IN V' <=> y IN V') /\
3213 (!x. x IN V ==> f (h x) = g (f x)) 
3214 ==> ! x. x IN V ==> f (ITER n h x) = ITER n g ( f x ) `,
3215 [
3216 STRIP_TAC;
3217 SPEC_TAC (`n:num `,`n:num `);
3218 INDUCT_TAC;
3219 REWRITE_TAC[ITER];
3220
3221 GEN_TAC THEN STRIP_TAC;
3222 REWRITE_TAC[ITER];
3223 SUBGOAL_THEN` ITER n h (x:A) IN V ` ASSUME_TAC;
3224 MATCH_MP_TAC AUTOMAP_IMP_ALL_ITER_IN2;
3225 ASM_REWRITE_TAC[];
3226 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` x:A `));
3227 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` ITER n h (x:A) `));
3228 ASM_REWRITE_TAC[]]);;
3229
3230
3231
3232 let HAS_THE_SAME_ORD_LEM = prove_by_refinement(` (! x. ~( x IN V ) ==> h x = x ) /\
3233 (! y. ~( y IN V') ==> g y = y ) /\
3234 BIJ (f: A -> B) V V' /\
3235 (! x. (h x IN V) <=> x IN V ) /\
3236 (! y. (g y IN V') <=> y IN V' ) /\
3237 (!x. x IN V ==> (f (h  x )) = (g (f x ))) /\ has_orders h k
3238      ==> has_orders g k `,
3239 [REWRITE_TAC[BIJ; INJ; SURJ; has_orders];
3240 REPEAT STRIP_TAC;
3241 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` i:num `));
3242 DOWN;
3243 PHA;
3244 REWRITE_TAC[FUN_EQ_THM];
3245 GEN_TAC;
3246 ASM_CASES_TAC` (x:A) IN V `;
3247 UNDISCH_TAC` !x y. x IN V /\ y IN V /\ (f: A -> B) x = f y ==> x = y ` ;
3248 DISCH_THEN MATCH_MP_TAC;
3249 ASM_REWRITE_TAC[I_THM];
3250 CONJ_TAC;
3251 MATCH_MP_TAC AUTOMAP_IMP_ALL_ITER_IN2;
3252 ASM_REWRITE_TAC[];
3253 MP_TAC (SPEC `i:num ` (GEN `n:num ` ITER_COMM_RESTRICTED));
3254 ANTS_TAC;
3255 ASM_REWRITE_TAC[];
3256 DISCH_THEN (ASSUME_TAC2 o (SPEC` x: A `));
3257 ASM_REWRITE_TAC[I_THM];
3258
3259 REWRITE_TAC[I_THM];
3260 MATCH_MP_TAC ITER_FIXPOINT;
3261 DOWN;
3262 ASM_REWRITE_TAC[];
3263
3264 REWRITE_TAC[FUN_EQ_THM; I_THM];
3265 GEN_TAC;
3266 ASM_CASES_TAC` x IN (V': B -> bool) `;
3267
3268
3269 DOWN;
3270 UNDISCH_TAC` !x. x IN V' ==> (?y. y IN V /\ (f: A -> B) y = x) `;
3271 DISCH_THEN NHANH;
3272 STRIP_TAC;
3273
3274 MP_TAC (let tt = GEN` n: num ` ITER_COMM_RESTRICTED in SPEC` k: num ` tt);
3275 ANTS_TAC;
3276 ASM_REWRITE_TAC[];
3277 DISCH_THEN (ASSUME_TAC2 o (SPEC` y: A `));
3278 DOWN;
3279 ASM_REWRITE_TAC[I_THM];
3280 MESON_TAC[];
3281 MATCH_MP_TAC ITER_FIXPOINT;
3282 ASM_SIMP_TAC[]]);;
3283
3284
3285
3286
3287 let COMM_THEN_IMAGE_IMAGE_EQ = 
3288 SET_RULE ` (! x. x IN S ==> f ( g x ) = h ( f x )) /\ A SUBSET S 
3289 ==> IMAGE f ( IMAGE g A ) = IMAGE h ( IMAGE f A ) `;;
3290
3291
3292 let IN_DART_PRESERVED = prove(` (!x: A. face_map H x IN dart H <=> x IN dart H) /\
3293 (!x: A. node_map H x IN dart H <=> x IN dart H) /\
3294 (!x: A. edge_map H x IN dart H <=> x IN dart H)`,
3295 MESON_TAC [Hypermap_iso.h_map_outside; Hypermap.lemma_dart_invariant]);;
3296
3297
3298 let HYP_ISO_DIH2K_PRESERVED = prove_by_refinement
3299 (`FINITE (dart H) /\ dih2k H k /\ hyp_iso (f: A -> B) (H,HH)
3300        ==> dih2k HH k `,
3301 [NHANH Hypermap_iso.iso_components;
3302 REWRITE_TAC[dih2k; hyp_iso];
3303 STRIP_TAC;
3304 CONJ_TAC;
3305 ASSUME_TAC2 (
3306 let tt = GEN_ALL Local_lemmas.BIJ_IMP_CARD_EQ in
3307 ISPECL [` f: A -> B `;` dart (H: (A) hypermap) `;` dart (HH: (B) hypermap) `] tt);
3308 DOWN;
3309 ASM_SIMP_TAC[];
3310
3311 CONJ_TAC;
3312 GEN_TAC THEN STRIP_TAC;
3313 DOWN;
3314 UNDISCH_TAC ` BIJ (f: A -> B) ( dart H ) ( dart HH ) `;
3315 REWRITE_TAC[BIJ; SURJ];
3316 STRIP_TAC;
3317 FIRST_ASSUM NHANH;
3318 STRIP_TAC;
3319 LET_TAC;
3320 SUBGOAL_THEN` (let S = face H (y:A) in dart H = S UNION IMAGE (node_map H) S) ` MP_TAC;
3321 FIRST_ASSUM MATCH_MP_TAC;
3322 FIRST_ASSUM ACCEPT_TAC;
3323 LET_TAC;
3324 SUBGOAL_THEN` node HH (f y) = IMAGE f (node H y) /\
3325               face HH (f y) = IMAGE f (face H y) /\
3326               edge HH ((f: A -> B) y) = IMAGE f (edge H y) ` MP_TAC;
3327 FIRST_ASSUM MATCH_MP_TAC;
3328 FIRST_ASSUM ACCEPT_TAC;
3329 ASM_REWRITE_TAC[];
3330
3331 SIMP_TAC[];
3332 PHA THEN STRIP_TAC;
3333 SUBGOAL_THEN` IMAGE (f: A -> B) (IMAGE (node_map H) S') = IMAGE (node_map HH) (IMAGE f S') ` ASSUME_TAC;
3334 MATCH_MP_TAC (GEN_ALL COMM_THEN_IMAGE_IMAGE_EQ);
3335 EXISTS_TAC` dart (H: (A) hypermap ) `;
3336 UNDISCH_TAC` !x. x IN dart H
3337           ==> edge_map HH ((f: A -> B) x) = f (edge_map H x) /\
3338               node_map HH (f x) = f (node_map H x) /\
3339               face_map HH (f x) = f (face_map H x) `;
3340 SIMP_TAC[];
3341 STRIP_TAC;
3342 EXPAND_TAC "S'";
3343 MATCH_MP_TAC Hypermap.lemma_face_subset;
3344 ASM_REWRITE_TAC[];
3345 FIRST_X_ASSUM (SUBST1_TAC o SYM);
3346 REWRITE_TAC[GSYM IMAGE_UNION];
3347 SUBGOAL_THEN` BIJ (f: A -> B) (dart H ) (dart HH ) ` MP_TAC;
3348 ASM_REWRITE_TAC[BIJ; SURJ];
3349 NHANH Add_triangle.BIJ_IMAGE;
3350 SIMP_TAC[];
3351 ASM_REWRITE_TAC[];
3352
3353 ASSUME_TAC Hypermap_iso.h_map_outside;
3354
3355 CONJ_TAC;
3356 MATCH_MP_TAC (GEN_ALL HAS_THE_SAME_ORD_LEM);
3357 EXISTS_TAC` dart (HH: (B) hypermap) `;
3358 EXISTS_TAC` dart (H: (A) hypermap) `;
3359 EXISTS_TAC` f: A -> B `;
3360 EXISTS_TAC` face_map (H: (A) hypermap ) `;
3361 ASM_REWRITE_TAC[];
3362 DOWN THEN SIMP_TAC[];
3363 DISCH_THEN NHANH;
3364
3365 NHANH (
3366 ISPECL [` HH: (B) hypermap `;` y:B `] Hypermap_iso.h_map_outside);
3367 SIMP_TAC[IN_DART_PRESERVED];
3368 ASM_SIMP_TAC[];
3369
3370
3371 CONJ_TAC;
3372 MATCH_MP_TAC (GEN_ALL HAS_THE_SAME_ORD_LEM);
3373 EXISTS_TAC` dart (HH: (B) hypermap) `;
3374 EXISTS_TAC` dart (H: (A) hypermap) `;
3375 EXISTS_TAC` f: A -> B `;
3376 EXISTS_TAC` edge_map (H: (A) hypermap ) `;
3377 ASM_REWRITE_TAC[];
3378 DOWN THEN SIMP_TAC[];
3379 DISCH_THEN NHANH;
3380
3381 NHANH (
3382 ISPECL [` HH: (B) hypermap `;` y:B `] Hypermap_iso.h_map_outside);
3383 SIMP_TAC[IN_DART_PRESERVED];
3384 ASM_SIMP_TAC[];
3385
3386 MATCH_MP_TAC (GEN_ALL HAS_THE_SAME_ORD_LEM);
3387 EXISTS_TAC` dart (HH: (B) hypermap) `;
3388 EXISTS_TAC` dart (H: (A) hypermap) `;
3389 EXISTS_TAC` f: A -> B `;
3390 EXISTS_TAC` node_map (H: (A) hypermap ) `;
3391 ASM_REWRITE_TAC[];
3392 DOWN THEN SIMP_TAC[];
3393 DISCH_THEN NHANH;
3394
3395 NHANH (
3396 ISPECL [` HH: (B) hypermap `;` y:B `] Hypermap_iso.h_map_outside);
3397 SIMP_TAC[IN_DART_PRESERVED];
3398 ASM_SIMP_TAC[]]);;
3399
3400
3401
3402
3403
3404 let CONT_ATREAL_INJ_PRESERVED = prove_by_refinement(
3405 ` FINITE V /\ (!v. v IN V  ==> (ff: real^N -> real -> real^M) v continuous atreal r) /\
3406 INJ (\v. ff v r ) V (IMAGE (\v. ff v r ) V )
3407 ==> ? e. &0 < e /\ (! t. abs ( t - r) < e ==>
3408 INJ (\v. ff v t ) V (IMAGE (\v. ff v t ) V )) `,
3409 [REWRITE_TAC[INJ];
3410 STRIP_TAC;
3411 MP_TAC (SPEC_ALL Local_lemmas1.CONTINUOUS_ATREAL_INJ_PRESERVED);
3412 ANTS_TAC;
3413 ASM_REWRITE_TAC[];
3414 ANTS_TAC;
3415 ASM_REWRITE_TAC[];
3416 DOWN;
3417 MESON_TAC[];
3418 STRIP_TAC;
3419 EXISTS_TAC` d : real `;
3420 ASM_REWRITE_TAC[];
3421 GEN_TAC;
3422 FIRST_X_ASSUM NHANH;
3423 REWRITE_TAC[IN_IMAGE];
3424 MESON_TAC[]]);;
3425
3426
3427 let INJ_BIJ_IMAGE = prove(` INJ f S S' /\ A SUBSET S ==> BIJ f A (IMAGE f A) `,
3428 REWRITE_TAC[BIJ; INJ; SURJ] THEN CONV_TAC SET_RULE);;
3429
3430
3431
3432
3433
3434 let XRECQNS_UPDATE = prove_by_refinement(`  deformation f V (a,b) /\ local_fan (V,E,FF) 
3435            ==> (?e. &0 < e /\
3436                     (!t. abs t < e
3437                          ==> local_fan (IMAGE (\v. f v t) V,
3438 IMAGE (\s. IMAGE (\v. f v t) s ) E , 
3439 IMAGE (\(u,v). (f u t, f v t )) FF) )) `,
3440
3441 [NHANH_PAT `\x. x ==> y ` Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
3442 STRIP_TAC;
3443 ASSUME_TAC2 Deformation.XRECQNS;
3444 DOWN THEN PHA;
3445 REWRITE_TAC[REAL_BOUNDS_LT];
3446 STRIP_TAC;
3447 DOWN_TAC;
3448 REWRITE_TAC[deformation];
3449 STRIP_TAC;
3450 UNDISCH_TAC` FAN (vec 0, V:real^3 -> bool, E ) `;
3451 REWRITE_TAC[FAN; fan1; fan2];
3452 STRIP_TAC;
3453 SUBGOAL_THEN` FINITE V /\
3454      (!v. v IN V ==> (f: real^3 -> real -> real^3) v continuous atreal (&0)) /\
3455      INJ (\v. f v (&0)) V (IMAGE (\v. f v (&0)) V) ` MP_TAC;
3456 ASM_REWRITE_TAC[];
3457 CONJ_TAC;
3458 GEN_TAC THEN STRIP_TAC;
3459 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [` v:real^3 `;` &0 `]));
3460 DOWN THEN SIMP_TAC[];
3461 UNDISCH_TAC` !v. v IN V ==> f v (&0) = v:real^3 `;
3462 REWRITE_TAC[INJ; IN_IMAGE];
3463 MESON_TAC[];
3464 NHANH (
3465 ISPECL [` f: real^3 -> real -> real^3 `;` &0 `] (
3466 GENL [` ff: real^N -> real -> real^M `;` r: real `] CONT_ATREAL_INJ_PRESERVED));
3467 STRIP_TAC;
3468 DOWN THEN REWRITE_TAC[REAL_ARITH` a - &0 = a `];
3469 STRIP_TAC;
3470 EXISTS_TAC ` min e e' `;
3471 ASM_REWRITE_TAC[REAL_LT_MIN];
3472 FIRST_ASSUM NHANH;
3473 SUBGOAL_THEN` ! f s. INJ (f:real^3 -> real^3) s (IMAGE f s) <=> BIJ f s (IMAGE f s ) ` ASSUME_TAC;
3474 REWRITE_TAC[BIJ; SURJ; IN_IMAGE];
3475 MESON_TAC[];
3476
3477
3478 ASM_REWRITE_TAC[];
3479 GEN_TAC THEN STRIP_TAC;
3480 ABBREV_TAC` V' = IMAGE (\v. (f:real^3 -> real -> real^3) v t) V `;
3481 ABBREV_TAC` E' = IMAGE (\s. IMAGE (\v. (f: real^3 -> real -> real^3) v t) s) E `;
3482 ABBREV_TAC` ff = (\(x,y). (f:real^3 -> real -> real^3) x t, f y t) `;
3483
3484 MP_TAC (SPEC` (\v. (f:real^3 -> real -> real^3) v t ) ` (
3485 GEN ` f: real^3 -> real^3 ` HYP_ISO_LEMMAA));
3486 ANTS_TAC;
3487 ASM_REWRITE_TAC[];
3488 SUBGOAL_THEN` FAN (vec 0,IMAGE (\v. (f: real^3 -> real -> real^3) v t) V,IMAGE (IMAGE (\v. f v t)) E) ` MP_TAC;
3489 FIRST_X_ASSUM MATCH_MP_TAC;
3490 ASM_REWRITE_TAC[];
3491
3492 EXPAND_TAC "V'";
3493 EXPAND_TAC "E'";
3494 SIMP_TAC[ETA_AX];
3495
3496 SUBGOAL_THEN` FAN (vec 0,IMAGE (\v. (f: real^3 -> real -> real^3) v t) V,IMAGE (IMAGE (\v. f v t)) E) ` MP_TAC;
3497 FIRST_X_ASSUM MATCH_MP_TAC;
3498 ASM_REWRITE_TAC[];
3499 DOWN THEN DOWN THEN DOWN;
3500 SIMP_TAC[ETA_AX; local_fan];
3501 REPEAT STRIP_TAC;
3502
3503
3504 LET_TAC;
3505 UNDISCH_TAC` local_fan (V,E,FF) `;
3506 REWRITE_TAC[local_fan];
3507 LET_TAC;
3508 STRIP_TAC;
3509 UNDISCH_TAC` hyp_iso (ff: real^3 # real^3 -> real^3 # real^3) (H',H) `;
3510 NHANH IMAGE_FACE_F;
3511 STRIP_TAC;
3512 CONJ_TAC;
3513 EXISTS_TAC ` (ff: real^3 # real^3 -> real^3 # real^3) x `;
3514 DOWN THEN DOWN;
3515 REWRITE_TAC[hyp_iso; BIJ; INJ];
3516 ASM_SIMP_TAC[];
3517
3518 MATCH_MP_TAC (
3519 let tt = GEN_ALL HYP_ISO_DIH2K_PRESERVED in
3520 ISPECL [` (ff: real^3 # real^3 -> real^3 # real^3  ) `;` H': (real^3 #real^3) hypermap `; ` H: (real^3 #real^3) hypermap `; ` k: num `] tt);
3521 ASM_REWRITE_TAC[];
3522
3523 ASSUME_TAC2 (ISPEC` vec 0: real^3 ` (
3524 GEN` x: real^N ` Wrgcvdr_cizmrrh.FAN_IMP_FIMITE_DARTS));
3525 UNDISCH_TAC` FAN (vec 0, V:real^3 -> bool , E ) `;
3526 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
3527 ASM_SIMP_TAC[];
3528 STRIP_TAC;
3529 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` x: real^3 # real^3 `));
3530 FIRST_X_ASSUM (SUBST1_TAC o SYM);
3531 UNDISCH_TAC` (x: real^3 # real^3) IN dart H' `;
3532 NHANH Hypermap.lemma_face_subset;
3533 STRIP_TAC;
3534 SUBGOAL_THEN` FINITE (face H' (x:real^3 # real^3 )) ` MP_TAC;
3535 REWRITE_TAC[Hypermap.FACE_FINITE];
3536 UNDISCH_TAC` hyp_iso (ff: real^3 # real^3 -> real^3 # real^3 ) (H', H) `;
3537 REWRITE_TAC[hyp_iso; BIJ];
3538 NHANH INJ_IMP_BIJ_IMAGE;
3539 STRIP_TAC;
3540 STRIP_TAC;
3541
3542 UNDISCH_TAC` face H' (x: real^3 # real^3) SUBSET dart H' `;
3543 UNDISCH_TAC`  INJ (ff: real^3 # real^3 -> real^3 # real^3 ) (dart H') (dart H) `;
3544 PHA;
3545 NHANH INJ_BIJ_IMAGE;
3546 STRIP_TAC;
3547 DOWN;
3548 UNDISCH_TAC` FINITE (face H' (x: real^3 # real^3)) `;
3549 PHA;
3550 NHANH Misc_defs_and_lemmas.BIJ_CARD;
3551 STRIP_TAC;
3552 FIRST_X_ASSUM (SUBST1_TAC o SYM);
3553 UNDISCH_TAC` dih2k (H': (real^3 # real^3) hypermap) (CARD (FF: real^3 # real^3 -> bool)) `;
3554 ASM_REWRITE_TAC[]]);;
3555
3556
3557
3558
3559
3560
3561 let NORM_CROSS_LE = prove_by_refinement(` norm ( u cross v) <= norm u * norm v `,
3562 [MP_TAC (SPEC_ALL Trigonometry1.cross_mag);
3563 SIMP_TAC[];
3564 MP_TAC SIN_BOUNDS;
3565 ONCE_REWRITE_TAC[REAL_ARITH` a <= b <=> &0 <= b - a `];
3566 REWRITE_TAC[REAL_ARITH` a * b - a * b * c = a * b * ( &1 - c ) `];
3567 MP_TAC NORM_POS_LE;
3568 REPEAT STRIP_TAC;
3569 ASM_MESON_TAC[REAL_LE_MUL; NORM_POS_LE]]);;
3570
3571
3572
3573
3574
3575 let CONT_ATREAL_REAL_CONTS = prove_by_refinement (` f continuous atreal r 
3576 ==> (\r. ((f r) cross y ) dot ( x cross y)) real_continuous atreal r `,
3577 [REWRITE_TAC[real_continuous_atreal; continuous_atreal];
3578 REPEAT STRIP_TAC;
3579 REWRITE_TAC[GSYM DOT_LSUB];
3580 REWRITE_TAC[VEC3_RULE` x cross y - z cross y = ( x - z) cross y `];
3581 ASM_CASES_TAC` (y:real^3) = vec 0 `;
3582 ASM_REWRITE_TAC[CROSS_RZERO; DOT_RZERO; REAL_ABS_0];
3583 EXISTS_TAC` e: real `;
3584 ASM_REWRITE_TAC[];
3585 ASM_CASES_TAC` (x:real^3) = vec 0 `;
3586 ASM_REWRITE_TAC[CROSS_LZERO; DOT_RZERO; REAL_ABS_0];
3587 EXISTS_TAC` e:real `;
3588 ASM_REWRITE_TAC[];
3589 FIRST_X_ASSUM (MP_TAC o (SPEC` e / (norm (x:real^3) * norm (y:real^3) * norm (y:real^3) ) `));
3590 ANTS_TAC;
3591 MATCH_MP_TAC REAL_LT_DIV;
3592 ASM_REWRITE_TAC[];
3593 MATCH_MP_TAC REAL_LT_MUL;
3594 ASM_REWRITE_TAC[NORM_POS_LT];
3595 MATCH_MP_TAC REAL_LT_MUL;
3596 ASM_REWRITE_TAC[NORM_POS_LT];
3597 STRIP_TAC;
3598 EXISTS_TAC` d:real `;
3599 FIRST_X_ASSUM NHANH;
3600 ASM_REWRITE_TAC[];
3601
3602 REPEAT STRIP_TAC;
3603 MP_TAC (ISPECL [` ( f (x': real) - f r ) cross y `;` x cross y `] NORM_CAUCHY_SCHWARZ_ABS);
3604 ASSUME_TAC (SPECL [` (f:real -> real^3) x' - f r `;` y: real^3 `] (GEN_ALL NORM_CROSS_LE));
3605 MATCH_MP_TAC (REAL_ARITH` b < c ==> a <= b ==> a < c `);
3606
3607 SUBGOAL_THEN` norm ((f (x':real) - f r) cross y) * norm (x cross y) <= (norm ( f x' - f r) * norm y ) * norm (x cross y ) ` ASSUME_TAC;
3608 MATCH_MP_TAC REAL_LE_RMUL;
3609 ASM_REWRITE_TAC[NORM_POS_LE];
3610
3611 DOWN;
3612 MATCH_MP_TAC (REAL_ARITH` b < c ==> a <= b ==> a < c `);
3613
3614 MP_TAC (
3615 SPECL [` x:real^3 `;` y: real^3 `] (GEN_ALL NORM_CROSS_LE));
3616 STRIP_TAC;
3617 SUBGOAL_THEN` &0 <= norm ((f: real -> real^3) x' - f r) * norm (y:real^3) ` ASSUME_TAC;
3618 MATCH_MP_TAC REAL_LE_MUL;
3619 REWRITE_TAC[NORM_POS_LE];
3620 UNDISCH_TAC` norm (x cross y) <= norm x * norm y `;
3621 DOWN THEN PHA;
3622 NHANH Real_ext.REAL_LE_RMUL_IMP;
3623 DOWN THEN DOWN;
3624 REWRITE_TAC[dist];
3625 REPEAT STRIP_TAC;
3626 ONCE_REWRITE_TAC[REAL_MUL_SYM];
3627 DOWN;
3628 MATCH_MP_TAC (REAL_ARITH` b < c ==> a <= b ==> a < c `);
3629 SUBGOAL_THEN ` &0 < norm (x:real^3) /\ &0 < norm (y:real^3) ` MP_TAC;
3630 ASM_REWRITE_TAC[NORM_POS_LT];
3631 STRIP_TAC;
3632 ONCE_REWRITE_TAC[REAL_ARITH` (x * y ) * a * y = a * x * y * y `];
3633 SUBGOAL_THEN` &0 < norm (x:real^3) * norm y * norm (y:real^3) ` MP_TAC;
3634 DOWN THEN DOWN;
3635 MESON_TAC[REAL_LT_MUL];
3636 UNDISCH_TAC` norm ((f:real -> real^3) x' - f r) < e / (norm (x:real^3) * norm y * norm (y:real^3)) `;
3637 PHA;
3638 NHANH REAL_LT_RMUL;
3639 STRIP_TAC THEN DOWN;
3640 ASM_SIMP_TAC[REAL_FIELD` &0 < a ==> e / a * a = e `]]);;
3641
3642
3643
3644
3645
3646
3647
3648
3649 let CONTINUOUS_POS_PRES = prove_by_refinement (
3650 ` ~ collinear {(x:real^3),y, vec 0} /\ f r = a % x + b % y /\ &0 < a /\
3651 f continuous atreal r
3652 ==> ? e. &0 < e /\ ! t. abs t < e ==> ! t1 t2. f ( r + t ) = t1 % x + t2 % y ==> &0 < t1 `,
3653 [NHANH  CONT_ATREAL_REAL_CONTS;
3654 REWRITE_TAC[real_continuous_atreal];
3655 STRIP_TAC;
3656 FIRST_ASSUM (MP_TAC o (SPEC` a * norm ( x cross y ) * norm ( x cross y ) `));
3657 ANTS_TAC;
3658 MATCH_MP_TAC REAL_LT_MUL;
3659 ASM_REWRITE_TAC[];
3660 MATCH_MP_TAC REAL_LT_MUL;
3661 REWRITE_TAC[TAUT` a /\ a <=> a `];
3662 REWRITE_TAC[NORM_POS_LT; CROSS_EQ_0];
3663 UNDISCH_TAC` ~collinear {x, y:real^3, vec 0} `;
3664 SIMP_TAC[INSERT_COMM];
3665 STRIP_TAC;
3666 EXISTS_TAC` d: real `; ASM_REWRITE_TAC[] ;
3667 GEN_TAC;
3668 REPEAT STRIP_TAC;
3669 FIRST_ASSUM (MP_TAC o (SPEC` r + (t:real) `));
3670 ANTS_TAC;
3671 ASM_REWRITE_TAC[REAL_ARITH` (a + b) - a = b `];
3672
3673 ASM_REWRITE_TAC[GSYM DOT_LSUB; VEC3_RULE` x cross z - y cross z = ( x - y) cross z `];
3674 REWRITE_TAC[VECTOR_ARITH` (t1 % x + t2 % y) - (a % x + b % y) = ( t1 - a ) % x + ( t2 - b ) % y `; CROSS_LADD; CROSS_LMUL; CROSS_REFL];
3675 REWRITE_TAC[VECTOR_ARITH` x + a % vec 0 = x `; DOT_LMUL; REAL_ABS_MUL; DOT_SQUARE_NORM];
3676 SUBGOAL_THEN` &0 <= norm (x cross y) pow 2 ` MP_TAC;
3677 REWRITE_TAC[REAL_LE_POW_2];
3678
3679 REWRITE_TAC[GSYM REAL_ABS_REFL];
3680 SIMP_TAC[REAL_POW_2];
3681
3682 REWRITE_TAC[REAL_ABS_REFL];
3683 REWRITE_TAC[REAL_ARITH` &0 <= a <=> a = &0 \/ &0 < a `];
3684 STRIP_TAC;
3685 ASM_SIMP_TAC[];
3686 REAL_ARITH_TAC;
3687 ASM_SIMP_TAC[REAL_LT_RMUL_EQ];
3688 UNDISCH_TAC` &0 < a `;
3689 REAL_ARITH_TAC]);;
3690
3691
3692
3693
3694
3695 let IVS_RHO_NODE_V_IN_FF = prove_by_refinement(` local_fan (V,E,FF) /\ v IN V ==> ivs_rho_node1 FF v, v IN FF `,
3696 [NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
3697 STRIP_TAC;
3698 FIRST_X_ASSUM (MP_TAC o (SPEC`ivs_rho_node1 FF v `));
3699 ANTS_TAC;
3700 MATCH_MP_TAC Local_lemmas1.LOCAL_FAN_IVS_IN_V;
3701 ASM_REWRITE_TAC[];
3702 ASSUME_TAC2 Local_lemmas1.LOCAL_FAN_RHO_NODE_IVS;
3703 ASM_REWRITE_TAC[]]);;
3704
3705
3706
3707
3708
3709 let IN_AFF_GT_IMP_AZIMEQ = prove_by_refinement(
3710 ` x IN aff_gt {u,v} {y} ==> azim u v w  x = azim u v w y `,
3711 [
3712 ASM_CASES_TAC` collinear {u,v,w:real^3} `;
3713 ASM_SIMP_TAC[AZIM_DEGENERATE];
3714 ASM_CASES_TAC` collinear {u,v,y:real^3} `;
3715 ASM_SIMP_TAC[AZIM_DEGENERATE];
3716 DOWN_TAC;
3717 NHANH Fan.th3b;
3718 STRIP_TAC;
3719 DOWN THEN DOWN;
3720 ASM_SIMP_TAC[COLLINEAR_3_AFFINE_HULL];
3721 MP_TAC (ISPECL [` {u, v:real^3} `;` {y:real^3} `] AFF_GT_SUBSET_AFFINE_HULL);
3722 REWRITE_TAC[SUBSET];
3723 DISCH_THEN NHANH;
3724 REPEAT STRIP_TAC;
3725 SUBGOAL_THEN` affine hull ({u, v:real^3} UNION {y}) = affine hull {u,v} ` ASSUME_TAC;
3726 MATCH_MP_TAC AFFINE_HULLS_EQ;
3727 REWRITE_TAC[SET_RULE` {a,b} UNION {c} = {c,a,b} `];
3728 CONJ_TAC;
3729 ONCE_REWRITE_TAC[INSERT_SUBSET];
3730 ASM_REWRITE_TAC[];
3731 REWRITE_TAC[Qzksykg.SET_SUBSET_AFFINE_HULL];
3732 MP_TAC (SPEC` {u,v:real^3} ` Qzksykg.SET_SUBSET_AFFINE_HULL);
3733 MATCH_MP_TAC (SET_RULE` a SUBSET b ==> c SUBSET a ==> c SUBSET b `);
3734 MATCH_MP_TAC HULL_MONO;
3735 CONV_TAC SET_RULE;
3736 FIRST_X_ASSUM SUBST_ALL_TAC;
3737 DOWN;
3738 ASM_SIMP_TAC[GSYM COLLINEAR_3_AFFINE_HULL; AZIM_DEGENERATE];
3739 DOWN_TAC;
3740 REWRITE_TAC[AZIM_EQ_IMP]]);;
3741
3742
3743
3744
3745 let IN_AFF_GT_IMP_AZIMEQ2 = 
3746 MESON[IN_AFF_GT_IMP_AZIMEQ]` x IN aff_gt {u, v} {y} ==> 
3747 ! w. azim u v w x = azim u v w y `;;
3748
3749
3750
3751
3752
3753 let NOT_COLL_IMP_ZERO_DETER = prove_by_refinement(` ~ collinear {vec 0, u, v } ==>
3754 (! a b. a % u + b % v = vec 0 <=> a = &0 /\ b = &0) `,
3755 [REWRITE_TAC[Local_lemmas1.COLL_EQ_DEPENDENT];
3756 STRIP_TAC;
3757 GEN_TAC THEN GEN_TAC;
3758 EQ_TAC;
3759 DOWN;
3760 MESON_TAC[];
3761 SIMP_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID]]);;
3762
3763
3764
3765 let CROSS_IN_SAME_DIRECTION = prove_by_refinement (` local_fan (V,E,FF) /\
3766      v IN V /\
3767      {ITER n (rho_node1 FF) v | n <= l} = U /\
3768      plane P /\
3769      vec 0 IN P /\
3770      U SUBSET P /\
3771 v cross rho_node1 FF v = e
3772      ==> (!i. i < l 
3773               ==> ? k. &0 < k /\
3774 ITER i (rho_node1 FF) v cross ITER ( i + 1) (rho_node1 FF ) v = k % e ) `,
3775 [NHANH Local_lemmas.RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT;
3776 ASM_CASES_TAC` l = 0 `;
3777 ASM_REWRITE_TAC[ARITH_RULE` ~( n < 0) `];
3778 STRIP_TAC;
3779 SUBGOAL_THEN` {vec 0, v, rho_node1 FF v } SUBSET P ` ASSUME_TAC;
3780 ONCE_REWRITE_TAC[INSERT_SUBSET];
3781 ASM_REWRITE_TAC[];
3782 MATCH_MP_TAC SUBSET_TRANS;
3783 EXISTS_TAC` U: real^3 -> bool `;
3784 ASM_REWRITE_TAC[];
3785 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
3786 EXPAND_TAC "U";
3787 REWRITE_TAC[IN_ELIM_THM];
3788 CONJ_TAC;
3789 EXISTS_TAC` 0 `;
3790 REWRITE_TAC[ITER; ARITH_RULE` 0 <= l `];
3791 EXISTS_TAC` 1 `;
3792 REWRITE_TAC[ITER1];
3793 MATCH_MP_TAC (ARITH_RULE` ~( l = 0) ==> 1 <= l `);
3794 ASM_REWRITE_TAC[];
3795 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
3796 DOWN THEN DOWN;
3797 PHA;
3798 UNDISCH_TAC` plane  (P: real^3 -> bool) `;
3799 PHA;
3800 NHANH Local_lemmas.THREE_NOT_COLL_DETER_PLANE;
3801 STRIP_TAC;
3802 NHANH (ARITH_RULE` i < (l:num) ==> i <= l /\ i + 1 <= l `);
3803 GEN_TAC THEN STRIP_TAC;
3804 SUBGOAL_THEN` ITER i (rho_node1 FF) v IN U /\ ITER (i + 1) (rho_node1 FF) v IN U` ASSUME_TAC;
3805 EXPAND_TAC "U";
3806 REWRITE_TAC[IN_ELIM_THM];
3807 DOWN THEN DOWN;
3808 MESON_TAC[];
3809
3810 DOWN;
3811 UNDISCH_TAC` U SUBSET (P: real^3 -> bool) `;
3812 REWRITE_TAC[SUBSET];
3813 DISCH_THEN NHANH ;
3814 EXPAND_TAC "P";
3815 REWRITE_TAC[IN_ELIM_THM; AFFINE_HULL_3];
3816 STRIP_TAC;
3817 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC ` i:num `));
3818 DOWN;
3819 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID; CROSS_LADD; CROSS_RADD];
3820 REWRITE_TAC[CROSS_LMUL; CROSS_RMUL; CROSS_REFL; VECTOR_MUL_LZERO; VECTOR_MUL_RZERO];
3821 REWRITE_TAC[VECTOR_ADD_LID; VECTOR_ADD_RID];
3822 ASM_REWRITE_TAC[VECTOR_MUL_ASSOC];
3823 ONCE_REWRITE_TAC[CROSS_SKEW];
3824 ASM_REWRITE_TAC[VECTOR_ARITH` (v' * w') % e + (w * v'') % --e = ((v' * w') - (w * v'')) % e `];
3825 REWRITE_TAC[DOT_LMUL];
3826 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF v} `;
3827 ASM_REWRITE_TAC[GSYM CROSS_EQ_0];
3828 REWRITE_TAC[GSYM DOT_POS_LT];
3829 SIMP_TAC[REAL_LT_MUL_EQ];
3830 STRIP_TAC;
3831 MESON_TAC[]]);;
3832
3833
3834
3835
3836
3837 let ITER_CROSS_SAME_DIRECTION = prove_by_refinement
3838 (`local_fan (V,E,FF) /\
3839      v IN V /\
3840      {ITER n (rho_node1 FF) v | n <= l} = U /\
3841      plane P /\
3842      vec 0 IN P /\
3843      U SUBSET P 
3844      ==> (!i j. i < l /\ j < l
3845                ==> ? k. &0 < k /\
3846 ITER i (rho_node1 FF) v cross ITER ( i + 1) (rho_node1 FF ) v = 
3847 k % (ITER j (rho_node1 FF) v cross ITER ( j + 1) (rho_node1 FF ) v) ) `,
3848 [STRIP_TAC;
3849 ABBREV_TAC ` e = v cross rho_node1 FF v `;
3850 ASSUME_TAC2 CROSS_IN_SAME_DIRECTION;
3851 FIRST_X_ASSUM NHANH;
3852 REPEAT STRIP_TAC;
3853 ASM_REWRITE_TAC[];
3854 EXISTS_TAC` k / (k': real) `;
3855 CONJ_TAC;
3856 MATCH_MP_TAC REAL_LT_DIV;
3857 ASM_REWRITE_TAC[];
3858 ASM_SIMP_TAC[REAL_FIELD` &0 < a ==> x / a * a = x `; VECTOR_MUL_ASSOC]]);;
3859
3860
3861
3862 let ITER_IN_AFF_GT_2_1 = prove_by_refinement(` local_fan (V,E,FF) /\
3863      v IN V /\
3864      {ITER n (rho_node1 FF) v | n <= l} = U /\
3865      plane P /\
3866      vec 0 IN P /\
3867      U SUBSET P
3868 ==> (! i. i < l - 1 ==> 
3869 ITER ( i + 2) (rho_node1 FF) v IN aff_lt {vec 0, ITER (i + 1) (rho_node1 FF) v } {ITER i (rho_node1 FF ) v } ) `,
3870 [STRIP_TAC;
3871 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE3;
3872 GEN_TAC;
3873 FIRST_X_ASSUM (ASSUME_TAC o (SPEC` i:num `));
3874 STRIP_TAC;
3875 SUBGOAL_THEN` {vec 0, ITER i (rho_node1 FF) v, ITER ( i + 1) (rho_node1 FF) v} SUBSET P` ASSUME_TAC;
3876 ONCE_REWRITE_TAC[INSERT_SUBSET];
3877 ASM_REWRITE_TAC[];
3878 MATCH_MP_TAC SUBSET_TRANS;
3879 EXISTS_TAC` U: real^3 -> bool`;
3880 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
3881 EXPAND_TAC "U";
3882 REWRITE_TAC[IN_ELIM_THM];
3883 CONJ_TAC;
3884 EXISTS_TAC` i:num `;
3885 ASM_REWRITE_TAC[];
3886 DOWN;
3887 ARITH_TAC;
3888
3889 EXISTS_TAC` i + 1 `;
3890 ASM_REWRITE_TAC[];
3891 DOWN;
3892 ARITH_TAC;
3893 UNDISCH_TAC` ~collinear
3894        {vec 0, ITER i (rho_node1 FF) v, ITER (i + 1) (rho_node1 FF) v} `;
3895 UNDISCH_TAC` {vec 0, ITER i (rho_node1 FF) v, ITER (i + 1) (rho_node1 FF) v} SUBSET
3896       P `;
3897 UNDISCH_TAC` plane   (P:real^3 -> bool) `;
3898 PHA;
3899 NHANH Local_lemmas.THREE_NOT_COLL_DETER_PLANE;
3900 STRIP_TAC;
3901 SUBGOAL_THEN` ITER (i + 2) (rho_node1 FF) v IN U ` MP_TAC;
3902 EXPAND_TAC "U";
3903 REWRITE_TAC[IN_ELIM_THM];
3904 EXISTS_TAC` i + 2 `;
3905 REWRITE_TAC[];
3906 UNDISCH_TAC` i < l - 1 `;
3907 ARITH_TAC;
3908 UNDISCH_TAC` (U:real^3 -> bool) SUBSET P `;
3909 REWRITE_TAC[SUBSET];
3910 STRIP_TAC;
3911 FIRST_ASSUM NHANH;
3912 EXPAND_TAC "P";
3913 REWRITE_TAC[IN_ELIM_THM; AFFINE_HULL_3];
3914 STRIP_TAC;
3915 MP_TAC ITER_CROSS_SAME_DIRECTION;
3916 ANTS_TAC;
3917 ASM_REWRITE_TAC[SUBSET];
3918 DISCH_THEN (MP_TAC o (SPECL [` i + 1`;` i:num `]));
3919 ASSUME_TAC2 (ARITH_RULE` i < l - 1 ==> i + 1 < l `);
3920 ASSUME_TAC2 (ARITH_RULE` i < l - 1 ==> i < l `);
3921 ANTS_TAC;
3922 ASM_REWRITE_TAC[];
3923 ASM_REWRITE_TAC[ARITH_RULE` (a + 1) + 1 = a + 2 `; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
3924 REWRITE_TAC[CROSS_RADD; CROSS_RMUL; CROSS_REFL; VECTOR_MUL_RZERO; VECTOR_ADD_RID];
3925 STRIP_TAC;
3926 DOWN;
3927 ABBREV_TAC` e1 = ITER i (rho_node1 FF) v cross ITER (i + 1) (rho_node1 FF) v `;
3928 ONCE_REWRITE_TAC[CROSS_SKEW; VECTOR_ARITH` a % -- x = ( -- a ) % x `];
3929 ASM_REWRITE_TAC[];
3930 SUBGOAL_THEN` ~( e1:real^3 = vec 0) ` MP_TAC;
3931 EXPAND_TAC "e1";
3932 REWRITE_TAC[CROSS_EQ_0];
3933 ASM_REWRITE_TAC[];
3934 SIMP_TAC[VECTOR_MUL_RCANCEL; VECTOR_ARITH` a % -- x = ( -- a ) % x `];
3935 STRIP_TAC THEN STRIP_TAC;
3936
3937
3938 UNDISCH_TAC` ~collinear
3939        {vec 0, ITER i (rho_node1 FF) v, ITER (i + 1) (rho_node1 FF) v} `;
3940 ONCE_REWRITE_TAC[Collect_geom.PER_SET2];
3941 NHANH Fan.th3a;
3942 NHANH AFF_LT_2_1;
3943 SIMP_TAC[Collect_geom.PER_SET2];
3944 STRIP_TAC;
3945 REWRITE_TAC[IN_ELIM_THM];
3946 EXISTS_TAC `u: real `;
3947 EXISTS_TAC` w: real `;
3948 EXISTS_TAC` v':real`;
3949 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
3950 CONJ_TAC;
3951 UNDISCH_TAC` --v' = (k: real) `;
3952 UNDISCH_TAC ` &0 < k `;
3953 REAL_ARITH_TAC;
3954 CONJ_TAC;
3955 UNDISCH_TAC` u + v' + w = &1 `;
3956 REAL_ARITH_TAC;
3957 CONV_TAC VECTOR_ARITH]);;
3958
3959
3960
3961 (*
3962 search[` v cross rho_node1 FF v `];;
3963 *)
3964
3965 let AZIM_PI_ITER_LOCAL_FAN = prove_by_refinement
3966 (`local_fan (V,E,FF) /\
3967      v IN V /\
3968      {ITER n (rho_node1 FF) v | n <= l} = U /\
3969      plane P /\
3970      vec 0 IN P /\
3971      U SUBSET P
3972 ==> (!i. i < l - 1
3973               ==> azim (vec 0) (ITER (i + 1) (rho_node1 FF ) v ) (ITER (i) (rho_node1 FF ) v ) (ITER (i + 2) (rho_node1 FF ) v )  = pi ) `,
3974 [NHANH ITER_IN_AFF_GT_2_1;
3975 STRIP_TAC;
3976 GEN_TAC;
3977 FIRST_X_ASSUM NHANH;
3978 STRIP_TAC;
3979 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE3;
3980 FIRST_ASSUM (MP_TAC o (SPEC` i: num `));
3981 FIRST_ASSUM (MP_TAC o (SPEC` i + 1`));
3982 STRIP_TAC;
3983 ONCE_REWRITE_TAC[Collect_geom.PER_SET2];
3984 DOWN THEN DOWN;
3985 DOWN;
3986 REWRITE_TAC[ARITH_RULE` (a + 1) + 1 = a + 2 `];
3987 MESON_TAC[AZIM_EQ_PI_ALT]]);;
3988
3989
3990
3991
3992 let LOCAL_CONVEX_NOT_COLLINEAR = prove_by_refinement
3993 (`convex_local_fan (V,E,FF) /\ lunar (v,w) V E
3994      ==> (!u. u IN V /\ ~(u = v) /\ ~(u = w)
3995               ==> ~ collinear {vec 0, v, u}) `,
3996 [NHANH LUNAR_IMP_IN_TWO_HAFLS_PLANE;
3997 REWRITE_TAC[lunar; INSERT_SUBSET];
3998 NHANH Local_lemmas.CVX_LO_IMP_LO;
3999 STRIP_TAC;
4000 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
4001 ASSUME_TAC2 Local_lemmas.LOFA_IMP_NOT_COLL_IVS;
4002 FIRST_X_ASSUM NHANH;
4003 GEN_TAC;
4004 DOWN THEN DOWN;
4005 MESON_TAC[Planarity.aff_gt_imp_not_collinear]]);;
4006
4007
4008 let LOCAL_CONVEX_NOT_COLLINEAR2 = prove(` convex_local_fan (V,E,FF) /\ lunar (v,w) V E
4009      ==> (!u. u IN V /\ ~(u = v) /\ ~(u = w) ==> ~collinear {vec 0, w, u})`,
4010 ONCE_REWRITE_TAC[Local_lemmas.LUNAR_COMM] THEN 
4011 NHANH LOCAL_CONVEX_NOT_COLLINEAR THEN MESON_TAC[]);;
4012
4013
4014
4015 let LOCAL_FAN_RHO_NODE_PROS2 = prove(` local_fan (V,E,FF)
4016      ==> (!x. x IN V ==> x,rho_node1 FF x IN FF) `, NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS THEN SIMP_TAC[]);;
4017
4018
4019
4020 (* ============================= 
4021 -======================================
4022 ================================
4023
4024 *)
4025
4026 let MHAEYJN_CONVEX_LOCAL_FAN = prove_by_refinement (
4027 `!a b V E FF f v w u.
4028      convex_local_fan (V,E,FF) /\
4029      lunar (v,w) V E /\
4030      deformation f V (a,b) /\
4031      interior_angle1 (vec 0) FF v < pi /\
4032      u IN V /\
4033      ~(u = v) /\
4034      ~(u = w) /\
4035      (!u' t. u' IN V /\ ~(u = u') /\ t IN real_interval (a,b) ==> f u' t = u') /\
4036      (!t. t IN real_interval (a,b) ==> f u t IN affine hull {vec 0, v, w, u})
4037      ==> (?e. &0 < e /\
4038               (!t. --e < t /\ t < e
4039                    ==> convex_local_fan
4040                        (IMAGE (\v. f v t) V,
4041                         IMAGE (IMAGE (\v. f v t)) E,
4042                         IMAGE (\uv. f (FST uv) t,f (SND uv) t) FF)
4043                        ))`,
4044 [REPEAT GEN_TAC;
4045 NHANH_PAT`\x. x ==> y ` Local_lemmas.CVX_LO_IMP_LO;
4046 NHANH_PAT`\x. x ==> y ` Local_lemmas.LOCAL_FAN_FINITE_V;
4047 NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
4048 REWRITE_TAC[FAN; UNIONS_SUBSET];
4049 STRIP_TAC;
4050 MP_TAC SUB_LUNAR_DEFORM_LEMMA;
4051 ANTS_TAC;
4052 ASM_REWRITE_TAC[];
4053 UNDISCH_TAC` deformation f (V:real^3 -> bool) (a,b) `;
4054 REWRITE_TAC[deformation; real_interval; IN_ELIM_THM];
4055 ASM_SIMP_TAC[];
4056 REWRITE_TAC[REAL_BOUNDS_LT];
4057 STRIP_TAC;
4058 ASSUME_TAC2 XRECQNS_UPDATE;
4059 ASSUME_TAC2 HKIRPEP_ALT;
4060 DOWN THEN DOWN THEN STRIP_TAC;
4061 STRIP_TAC;
4062
4063 SUBGOAL_THEN` ! x y. x IN V /\ y IN V /\ ~ collinear {vec 0, x, y} /\
4064 (? a b .
4065 (f:real^3 -> real -> real^3) u (&0) = a % x + b % y /\ &0 < a ) ==>
4066 (?e. &0 < e /\
4067                   (!t. abs t < e
4068                        ==> (!t1 t2. f u (t) = t1 % x + t2 % y ==> &0 < t1))) ` ASSUME_TAC;
4069
4070 SUBGOAL_THEN` deformation (f:real^3 -> real -> real^3) V (a,b) ` MP_TAC;
4071 ASM_REWRITE_TAC[];
4072 REWRITE_TAC[deformation];
4073 STRIP_TAC;
4074 REPEAT GEN_TAC THEN STRIP_TAC;
4075 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`u: real^3 `;` &0 `]));
4076 REPEAT GEN_TAC;
4077
4078 ONCE_REWRITE_TAC[MESON[REAL_ARITH` t = &0 + t `]` f u t = A <=> f u ( &0 + t ) = A `];
4079 MATCH_MP_TAC (GEN_ALL CONTINUOUS_POS_PRES);
4080 EXISTS_TAC` b': real `;
4081 EXISTS_TAC` a': real `;
4082 UNDISCH_TAC` ~ collinear {vec 0, x, y:real^3} `;
4083 ASM_REWRITE_TAC[INSERT_COMM];
4084 ABBREV_TAC` ss = { (x,y) | x IN V /\
4085           y IN V /\
4086           ~collinear {vec 0, x, y} /\
4087           (?a b. (f:real^3 -> real -> real^3) u (&0) = a % x + b % y /\ &0 < a) } ` ;
4088 SUBGOAL_THEN` ss SUBSET { (x,y) | x IN (V:real^3 -> bool) /\ y IN V} ` MP_TAC;
4089 EXPAND_TAC "ss";
4090 CONV_TAC SET_RULE;
4091 STRIP_TAC;
4092 SUBGOAL_THEN` FINITE {x,y | x IN (V:real^3 -> bool) /\ y IN V} ` ASSUME_TAC;
4093 MATCH_MP_TAC FINITE_PRODUCT;
4094 ASM_REWRITE_TAC[];
4095 UNDISCH_TAC` ss SUBSET {x,y | x IN V /\ (y:real^3) IN V} `;
4096 UNDISCH_TAC` FINITE {x,y | x IN V /\ y:real^3 IN V} `;
4097 PHA;
4098 NHANH FINITE_SUBSET;
4099 STRIP_TAC;
4100
4101 SUBGOAL_THEN`  (!x. (x:real^3 # real^3) IN ss ==> 
4102 (?e. &0 < e /\ (!t. abs t < e
4103                         ==> (!t1 t2. (f:real^3 -> real -> real^3) u t = t1 % (FST x) + t2 % (SND x) ==> &0 < t1))))` MP_TAC;
4104 EXPAND_TAC "ss";
4105 REWRITE_TAC[IN_ELIM_THM];
4106 GEN_TAC;
4107 STRIP_TAC;
4108 ASM_SIMP_TAC[];
4109 FIRST_X_ASSUM MATCH_MP_TAC;
4110 ASM_REWRITE_TAC[];
4111 EXISTS_TAC` a': real `;
4112 EXISTS_TAC` b': real `;
4113 ASM_REWRITE_TAC[];
4114 DOWN;
4115 PHA;
4116 NHANH Deformation.MINIMIZE_OVER_MEMBERS;
4117 STRIP_TAC;
4118 EXISTS_TAC` min b ( min (-- a) ( min e (min e' e''))) `;
4119 SUBGOAL_THEN` deformation f (V: real^3 -> bool) (a,b) ` MP_TAC;
4120 ASM_REWRITE_TAC[];
4121 REWRITE_TAC[deformation; real_interval; IN_ELIM_THM];
4122 STRIP_TAC;
4123 REWRITE_TAC[REAL_LT_MIN];
4124 CONJ_TAC;
4125 ASM_REWRITE_TAC[REAL_ARITH` &0 < -- a <=> a < &0 `];
4126
4127 REWRITE_TAC[convex_local_fan];
4128 GEN_TAC THEN STRIP_TAC;
4129 ABBREV_TAC` IV = IMAGE (\v. (f:real^3 -> real -> real^3) v t) V `;
4130 ABBREV_TAC` IE = IMAGE (IMAGE (\v. (f: real^3 -> real -> real^3) v t)) E`;
4131 ABBREV_TAC` IF = IMAGE (\uv. (f: real^3 -> real -> real^3) (FST uv) t,f (SND uv) t) FF `;
4132 SUBGOAL_THEN` local_fan (IV, IE , IF) ` MP_TAC;
4133 UNDISCH_TAC` !t. abs t < e'
4134           ==> local_fan
4135               (IMAGE (\v. f v t) V,
4136                IMAGE (\s. IMAGE (\v. f v t) s) E,
4137                IMAGE (\(u,v). (f: real^3 -> real -> real^3) u t,f v t) FF) `;
4138 DISCH_THEN (ASSUME_TAC2 o SPEC_ALL);
4139 DOWN;
4140 UNDISCH_TAC` v = ITER j (rho_node1 FF) w `;
4141 DISCH_THEN (ASSUME_TAC o SYM);
4142 ASM_REWRITE_TAC[ETA_AX];
4143 SUBGOAL_THEN`! (fg: real^3 -> real^3). (\(u:real^3,v:real^3). fg u,fg v) = (\uv. fg (FST uv),fg (SND uv)) ` ASSUME_TAC;
4144 REWRITE_TAC[FUN_EQ_THM; BETA_THM];
4145 GEN_TAC THEN GEN_TAC;
4146 PAT_ONCE_REWRITE_TAC`\x. f x = y ` [GSYM PAIR];
4147 PURE_ONCE_REWRITE_TAC[BETA_THM];
4148 ABBREV_TAC` x1 = FST (x:real^3 # real^3) `;
4149 ABBREV_TAC` x2 = SND (x:real^3 # real^3) `;
4150 REWRITE_TAC[BETA_THM];
4151 ASM_REWRITE_TAC[];
4152
4153 SIMP_TAC[] THEN STRIP_TAC;
4154 GEN_TAC;
4155
4156 UNDISCH_TAC` local_fan (IV, IE, IF) `;
4157 PHA;  PAT_ONCE_REWRITE_TAC`\x. y /\ x ==> z ` [GSYM PAIR];
4158 ABBREV_TAC` xx = FST (x:real^3 # real^3) `;
4159 NHANH Local_lemmas.LOCAL_FAN_IMP_IN_V;
4160 NHANH Local_lemmas.DETER_RHO_NODE;
4161 STRIP_TAC;
4162 ONCE_REWRITE_TAC[GSYM PAIR];
4163 ABBREV_TAC` xy = SND (x:real^3 # real^3) `;
4164 UNDISCH_TAC` xx:real^3 IN IV `;
4165 UNDISCH_TAC` local_fan (IV,IE,IF) `;
4166 PHA;
4167 UNDISCH_TAC` rho_node1 IF xx = xy `;
4168 DISCH_THEN (ASSUME_TAC o SYM);
4169 ASM_REWRITE_TAC[];
4170
4171
4172 NHANH Local_lemmas1.AZIM_IN_FAN_RHOND_IVS_RHOND;
4173 NHANH Local_lemmas1.WEDGE_IN_FAN_RHOND_IVS_RHOND;
4174 SIMP_TAC[];
4175 STRIP_TAC;
4176 ASSUME_TAC2 LOCAL_FAN_FACE_FF;
4177 SUBGOAL_THEN` lunar (v:real^3,w) V E ` MP_TAC;
4178 FIRST_ASSUM ACCEPT_TAC;
4179 REWRITE_TAC[lunar; INSERT_SUBSET];
4180 STRIP_TAC;
4181 ASSUME_TAC2 Localization.LOFA_IMP_LT_CARD_SET_V_ALT;
4182 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE;
4183 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` u: real^3 `));
4184 DOWN THEN STRIP_TAC;
4185 ASSUME_TAC2 (SPEC`u: real^3 ` Local_lemmas1.IVS_RHO_NODE_DIFF_ID);
4186 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_IMP_NOT_SEMI_IDE;
4187 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` u: real^3 `));
4188 SUBGOAL_THEN`! v:real^3. v IN V ==> ivs_rho_node1 FF (rho_node1 FF v) = v ` ASSUME_TAC;
4189 GEN_TAC;
4190 STRIP_TAC;
4191 MATCH_MP_TAC Local_lemmas.IVS_RHO_IDD;
4192 ASM_REWRITE_TAC[];
4193 SUBGOAL_THEN`!v. v IN V ==> rho_node1 FF (ivs_rho_node1 FF v) = v ` MP_TAC;
4194 GEN_TAC;
4195 STRIP_TAC;
4196 MATCH_MP_TAC Local_lemmas1.LOCAL_FAN_RHO_NODE_IVS;
4197 ASM_REWRITE_TAC[];
4198 STRIP_TAC;
4199
4200 SUBGOAL_THEN` ! v. v: real^3 IN V ==> rho_node1 FF v IN V ` ASSUME_TAC;
4201 GEN_TAC THEN STRIP_TAC;
4202 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
4203 ASM_SIMP_TAC[];
4204 SUBGOAL_THEN` deformation f (V: real^3 -> bool) (a,b) ` MP_TAC;
4205 ASM_REWRITE_TAC[];
4206 REWRITE_TAC[deformation];
4207 STRIP_TAC;
4208 SUBGOAL_THEN` t IN real_interval (a,b) ` ASSUME_TAC;
4209 REWRITE_TAC[IN_ELIM_THM; real_interval];
4210 ASM_REWRITE_TAC[];
4211 UNDISCH_TAC` abs t < b `;
4212 UNDISCH_TAC` abs t < -- a `;
4213 REAL_ARITH_TAC;
4214 ASSUME_TAC2 Polar_fan.IVS_RHO_NODE1_IN_V;
4215 SUBGOAL_THEN` (f:real^3 -> real -> real^3) (rho_node1 FF u) t = rho_node1 FF u ` ASSUME_TAC;
4216 FIRST_ASSUM MATCH_MP_TAC;
4217 ASM_SIMP_TAC[];
4218 SUBGOAL_THEN` (f:real^3 -> real -> real^3) (rho_node1 FF (rho_node1 FF u)) t = rho_node1 FF (rho_node1 FF u )` ASSUME_TAC;
4219 FIRST_ASSUM MATCH_MP_TAC;
4220 ASM_SIMP_TAC[];
4221 SUBGOAL_THEN` (f:real^3 -> real -> real^3) (ivs_rho_node1 FF u) t = ivs_rho_node1 FF u ` ASSUME_TAC;
4222 FIRST_ASSUM MATCH_MP_TAC;
4223 ASM_SIMP_TAC[];
4224
4225 ASSUME_TAC2 Nkezbfc_local.CONVEX_LOFA_IMP_INANGLE_EQ_AZIM_IVS;
4226 DOWN THEN DISCH_THEN (ASSUME_TAC o GSYM);
4227 UNDISCH_TAC` xx: real^3 IN IV `;
4228 EXPAND_TAC "IV";
4229 REWRITE_TAC[IN_IMAGE];
4230 STRIP_TAC;
4231 SUBGOAL_THEN` ! (v:real^3). v IN V ==> (f:real^3 -> real -> real^3) v t, f (rho_node1 FF v) t IN IF ` ASSUME_TAC;
4232 EXPAND_TAC "IF";
4233 REWRITE_TAC[IN_IMAGE];
4234 EXPAND_TAC "FF";
4235 REWRITE_TAC[IN_ELIM_THM];
4236 GEN_TAC THEN STRIP_TAC;
4237 EXISTS_TAC` v', rho_node1 FF v' `;
4238 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
4239 DISCH_THEN (ASSUME_TAC o SYM);
4240 ASM_REWRITE_TAC[];
4241 EXISTS_TAC` v': real^3 `;
4242 ASM_REWRITE_TAC[];
4243
4244 SUBGOAL_THEN` ! (v:real^3). v IN V ==> rho_node1 IF ((f:real^3 -> real -> 
4245 real^3) v t ) = f ( rho_node1 FF v ) t ` ASSUME_TAC;
4246 GEN_TAC THEN STRIP_TAC;
4247 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v': real^3 `));
4248 DOWN;
4249 UNDISCH_TAC` local_fan (IV, IE, IF) `;
4250 PHA;
4251 NHANH Local_lemmas.DETER_RHO_NODE;
4252 SIMP_TAC[];
4253 SUBGOAL_THEN` ! (v:real^3). v IN V ==> ivs_rho_node1 IF ((f:real^3 -> real -> 
4254 real^3) v t ) = f ( ivs_rho_node1 FF v ) t ` ASSUME_TAC;
4255 GEN_TAC THEN STRIP_TAC;
4256 SUBGOAL_THEN` f (ivs_rho_node1 FF v') t, (f:real^3 -> real -> real^3) v' t IN IF ` ASSUME_TAC;
4257 FIRST_X_ASSUM (MP_TAC o (SPEC` ivs_rho_node1 FF v' `));
4258 FIRST_X_ASSUM (MP_TAC o (SPEC` ivs_rho_node1 FF v' `));
4259 ANTS_TAC;
4260 ASM_SIMP_TAC[];
4261 ASM_SIMP_TAC[];
4262 DOWN;
4263 UNDISCH_TAC` local_fan (IV, IE, IF) `;
4264 PHA;
4265 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
4266 SIMP_TAC[];
4267 SUBGOAL_THEN` IV SUBSET (f:real^3 -> real -> real^3) u t INSERT V ` ASSUME_TAC;
4268 REWRITE_TAC[SUBSET];
4269 EXPAND_TAC "IV";
4270 REWRITE_TAC[IN_IMAGE];
4271 GEN_TAC THEN STRIP_TAC;
4272 ASM_CASES_TAC` x''' = (u: real^3) `;
4273 ASM_REWRITE_TAC[IN_INSERT];
4274 ASM_SIMP_TAC[IN_INSERT];
4275
4276 UNDISCH_TAC` x': real^3 IN V `;
4277 ASM_REWRITE_TAC[];
4278 SUBGOAL_THEN` (f:real^3 -> real -> real^3) (ivs_rho_node1 FF (ivs_rho_node1 FF u)) t = ivs_rho_node1 FF (ivs_rho_node1 FF u) ` ASSUME_TAC;
4279 FIRST_ASSUM MATCH_MP_TAC;
4280 ASM_REWRITE_TAC[];
4281 CONJ_TAC;
4282 ASM_SIMP_TAC[];
4283 ASM_SIMP_TAC[];
4284 UNDISCH_TAC` !v. v IN V ==> ~(rho_node1 FF (rho_node1 FF v) = v) `;
4285 DISCH_THEN (MP_TAC o (SPEC` ivs_rho_node1 FF (ivs_rho_node1 FF u) `));
4286 ANTS_TAC;
4287 ASM_SIMP_TAC[];
4288 ASM_SIMP_TAC[];
4289
4290 SUBGOAL_THEN` convex_local_fan (V,E,FF) ` MP_TAC;
4291 FIRST_X_ASSUM ACCEPT_TAC;
4292 REWRITE_TAC[convex_local_fan];
4293 STRIP_TAC;
4294
4295
4296 ASSUME_TAC2 LOCAL_FAN_RHO_NODE_PROS2;
4297 SUBGOAL_THEN` ! v. v IN V
4298      ==> wedge_in_fan_ge  (v ,rho_node1 FF v) E =
4299          wedge_ge  (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) ` ASSUME_TAC;
4300 GEN_TAC;
4301 STRIP_TAC;
4302 MATCH_MP_TAC Local_lemmas1.WEDGE_IN_FAN_RHOND_IVS_RHOND;
4303 ASM_REWRITE_TAC[];
4304 SUBGOAL_THEN` ! v. v IN V
4305      ==> azim_in_fan (v,rho_node1 FF v) E =
4306          azim (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) ` ASSUME_TAC;
4307 GEN_TAC;
4308 STRIP_TAC;
4309 MATCH_MP_TAC Local_lemmas1.AZIM_IN_FAN_RHOND_IVS_RHOND;
4310 ASM_REWRITE_TAC[];
4311
4312 (* ----- *)
4313 ASSUME_TAC2 Local_lemmas.LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
4314 DOWN;
4315 NHANH IN_CONV0_IMP_AFF_EQ1;
4316 STRIP_TAC;
4317 SUBGOAL_THEN` w IN aff {vec 0, v:real^3 } ` ASSUME_TAC;
4318 UNDISCH_TAC` w = ITER i (rho_node1 FF ) v `;
4319 DISCH_THEN (ASSUME_TAC o SYM);
4320 ASM_REWRITE_TAC[];
4321 MP_TAC (SPEC` {vec 0, w:real^3} ` Qzksykg.SET_SUBSET_AFFINE_HULL);
4322 REWRITE_TAC[SUBSET; Sphere.aff];
4323 DISCH_THEN MATCH_MP_TAC;
4324 REWRITE_TAC[IN_INSERT];
4325
4326
4327 SUBGOAL_THEN` ! v:real^3. v IN V ==> ~collinear {vec 0, v, ivs_rho_node1 FF v} ` ASSUME_TAC;
4328 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w `;
4329 DISCH_THEN (ASSUME_TAC o SYM);
4330 GEN_TAC THEN STRIP_TAC;
4331 MATCH_MP_TAC Local_lemmas.LOFA_IMP_NOT_COLL_IVS;
4332 ASM_REWRITE_TAC[];
4333
4334
4335 ASSUME_TAC2 LUNAR_IMP_IN_TWO_HAFLS_PLANE;
4336 SUBGOAL_THEN` ! x. x IN V /\ ~( x = v ) /\ ~( x = w:real^3) ==>
4337 ~ collinear {vec 0, v, x} ` ASSUME_TAC;
4338 DOWN THEN PHA;
4339 STRIP_TAC;
4340 FIRST_ASSUM NHANH;
4341 GEN_TAC;
4342
4343
4344
4345 SUBGOAL_THEN` ~collinear {vec 0, v, ivs_rho_node1 FF v} /\
4346 ~collinear {vec 0, v, rho_node1 FF v} ` MP_TAC;
4347 ASM_SIMP_TAC[];
4348 MESON_TAC[Planarity.aff_gt_imp_not_collinear];
4349 ASM_SIMP_TAC[];
4350
4351
4352
4353
4354
4355
4356 SUBGOAL_THEN` ! x. x IN V /\ ~( x = v ) /\ ~( x = w:real^3) ==>
4357 rho_node1 FF x IN aff_ge {vec 0, v} {x} /\ ivs_rho_node1 FF x IN aff_ge {vec 0, v} {x} ` ASSUME_TAC;
4358 DOWN THEN DOWN THEN PHA THEN STRIP_TAC;
4359 GEN_TAC;
4360 FIRST_ASSUM NHANH;
4361 STRIP_TAC;
4362 SUBGOAL_THEN` x'': real^3 IN V ` MP_TAC;
4363 FIRST_ASSUM ACCEPT_TAC;
4364 EXPAND_TAC "V";
4365 REWRITE_TAC[IN_ELIM_THM];
4366 STRIP_TAC;
4367 UNDISCH_TAC` ~collinear {vec 0, v, x'':real^3} `;
4368 NHANH Fan.th3a;
4369 STRIP_TAC;
4370 DOWN;
4371 MP_TAC (SET_RULE` {} SUBSET {x'':real^3}`);
4372 PHA;
4373 NHANH AFF_GE_MONO_RIGHT;
4374 REWRITE_TAC[AFF_GE_EQ_AFFINE_HULL; GSYM aff];
4375 STRIP_TAC;
4376 ASM_CASES_TAC` n = 0 `;
4377 UNDISCH_TAC` x'' = ITER n (rho_node1 FF) v `;
4378 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w `;
4379 DISCH_THEN (ASSUME_TAC o SYM);
4380 ASM_REWRITE_TAC[ITER];
4381 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w `;
4382 DISCH_THEN (ASSUME_TAC o SYM);
4383 UNDISCH_TAC` w = ITER i (rho_node1 FF ) v `;
4384 DISCH_THEN (ASSUME_TAC o SYM);
4385 ASM_CASES_TAC` n = (i:num) `;
4386 UNDISCH_TAC` x'' = ITER n (rho_node1 FF) v `;
4387 ASM_REWRITE_TAC[];
4388 ASSUME_TAC AFF_GT_SUBSET_AFF_GE;
4389
4390
4391 ASM_CASES_TAC` n < (i:num) `;
4392 SUBGOAL_THEN` x'' IN {ITER l (rho_node1 FF) v | 0 < l /\ l < i} ` MP_TAC;
4393 REWRITE_TAC[IN_ELIM_THM];
4394 EXISTS_TAC` n: num` ;
4395 ASM_REWRITE_TAC[ARITH_RULE` 0 < n <=> ~( n = 0) `];
4396
4397 ASM_REWRITE_TAC[IN_INTER];
4398 UNDISCH_TAC` x'' = ITER n (rho_node1 FF) v `;
4399 DISCH_THEN (ASSUME_TAC o SYM);
4400 ASM_REWRITE_TAC[];
4401
4402 SUBGOAL_THEN` ~ collinear {vec 0, v, rho_node1 FF v} ` MP_TAC;
4403 ASM_SIMP_TAC[];
4404 NHANH Fan.th3a;
4405 NHANH Local_lemmas1.DIJ_AFF_GE_PARTITION;
4406 STRIP_TAC;
4407 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF v} `;
4408 PHA;
4409 NHANH Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
4410 ONCE_REWRITE_TAC[EQ_SYM_EQ];
4411 STRIP_TAC;
4412 ASM_REWRITE_TAC[];
4413 SUBGOAL_THEN` ~ collinear {vec 0, v, x'': real^3} ` MP_TAC;
4414 ASM_SIMP_TAC[];
4415 NHANH Fan.th3a;
4416 NHANH Local_lemmas1.DIJ_AFF_GE_PARTITION;
4417 ASM_SIMP_TAC[];
4418
4419
4420 STRIP_TAC;
4421 UNDISCH_TAC` aff {vec 0, v} = aff {vec 0, w: real^3} `;
4422 DISCH_THEN (ASSUME_TAC o SYM);
4423 ASM_REWRITE_TAC[];
4424 CONJ_TAC;
4425 ASM_CASES_TAC` n = (i - 1) `;
4426 EXPAND_TAC "x''";
4427 REWRITE_TAC[GSYM ITER];
4428 ASM_SIMP_TAC[ARITH_RULE` ~( i = 0) ==> SUC ( i - 1) = i `; IN_UNION];
4429 SUBGOAL_THEN` rho_node1 FF x'' IN {ITER l (rho_node1 FF) v | 0 < l /\ l < i} ` MP_TAC;
4430 REWRITE_TAC[IN_ELIM_THM];
4431 EXISTS_TAC` SUC n `;
4432 EXPAND_TAC "x''";
4433 REWRITE_TAC[GSYM ITER];
4434 REWRITE_TAC[ARITH_RULE` 0 < SUC n `];
4435 MATCH_MP_TAC (ARITH_RULE` n < i /\ ~( n = i - 1) ==> SUC n < i `);
4436 ASM_REWRITE_TAC[];
4437 ASM_REWRITE_TAC[IN_UNION; IN_INTER];
4438 SIMP_TAC[];
4439 ASM_CASES_TAC` n = 1`;
4440 DOWN;
4441 EXPAND_TAC "x''";
4442 SIMP_TAC[ITER1];
4443 ASM_SIMP_TAC[];
4444 SIMP_TAC[IN_UNION];
4445 REWRITE_TAC[aff];
4446 STRIP_TAC;
4447 DISJ1_TAC;
4448 MESON_TAC[HULL_SUBSET; IN_INSERT; SUBSET];
4449
4450 SUBGOAL_THEN` ivs_rho_node1 FF x'' IN {ITER l (rho_node1 FF) v | 0 < l /\ l < i} ` MP_TAC;
4451 REWRITE_TAC[IN_ELIM_THM];
4452 EXISTS_TAC` n - 1 `;
4453 EXPAND_TAC "x''";
4454 ASSUME_TAC2 (ARITH_RULE`~( n = 0) ==> SUC ( n - 1) = n `);
4455 EXPAND_TAC "n";
4456 REWRITE_TAC[ITER];
4457 SUBGOAL_THEN` ITER (n - 1) (rho_node1 FF) v IN V ` ASSUME_TAC;
4458 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_VITER;
4459 ASM_SIMP_TAC[];
4460
4461 ASM_SIMP_TAC[];
4462 UNDISCH_TAC` ~( n = 0) `;
4463 UNDISCH_TAC` ~( n = 1) `;
4464 UNDISCH_TAC` n < (i:num) `;
4465 ARITH_TAC;
4466 ASM_REWRITE_TAC[IN_INTER; IN_UNION];
4467 SIMP_TAC[];
4468
4469 ASSUME_TAC2 (ARITH_RULE`  ~( n < (i:num) ) ==> (n - i) + i = n `);
4470 SUBGOAL_THEN` x'' IN {ITER l (rho_node1 FF) w | 0 < l /\ l < j} ` MP_TAC;
4471 REWRITE_TAC[IN_ELIM_THM];
4472 EXISTS_TAC` n - (i:num) `;
4473 ASM_REWRITE_TAC[];
4474 EXPAND_TAC "n";
4475 REWRITE_TAC[GSYM ITER_ADD];
4476 ASM_REWRITE_TAC[];
4477 CONJ_TAC;
4478 UNDISCH_TAC` ~( n = (i:num)) `;
4479 UNDISCH_TAC` ~( n < (i:num)) `;
4480 ARITH_TAC;
4481 ASM_SIMP_TAC[ARITH_RULE` ~( n < (i:num)) ==> ( n - i < j <=> n < i + j )`];
4482
4483 UNDISCH_TAC` x'' = ITER n (rho_node1 FF) v `;
4484 DISCH_THEN (ASSUME_TAC o SYM);
4485 ASM_REWRITE_TAC[IN_INTER];
4486
4487 SUBGOAL_THEN` ~ collinear {vec 0, v, ivs_rho_node1 FF v}` MP_TAC;
4488 ASM_SIMP_TAC[];
4489 PHA;
4490 NHANH Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
4491 ONCE_REWRITE_TAC[EQ_SYM_EQ];
4492 STRIP_TAC;
4493 SUBGOAL_THEN` ~ collinear {vec 0, v, x'':real^3} ` MP_TAC;
4494 ASM_SIMP_TAC[];
4495 NHANH Fan.th3a;
4496 NHANH Local_lemmas1.DIJ_AFF_GE_PARTITION;
4497 SIMP_TAC[];
4498 STRIP_TAC;
4499 CONJ_TAC;
4500 ASM_REWRITE_TAC[];
4501 ASM_CASES_TAC` n = (i + j) - 1 `;
4502 EXPAND_TAC "x''";
4503 REWRITE_TAC[GSYM ITER];
4504 ASM_SIMP_TAC[];
4505 ASSUME_TAC2 (ARITH_RULE` n < CARD (V:real^3 -> bool) ==> SUC (CARD V - 1) = CARD V `);
4506 ASM_REWRITE_TAC[];
4507 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
4508 FIRST_ASSUM (ASSUME_TAC2 o SPEC_ALL);
4509 ASM_REWRITE_TAC[IN_UNION];
4510 UNDISCH_TAC` aff {vec 0, v:real^3} = aff {vec 0, w} `;
4511 DISCH_THEN (SUBST1_TAC o SYM);
4512 REWRITE_TAC[aff];
4513 MESON_TAC[HULL_SUBSET; IN_INSERT; SUBSET];
4514
4515
4516 SUBGOAL_THEN` rho_node1 FF x'' IN {ITER l (rho_node1 FF) w | 0 < l /\ l < j} ` MP_TAC;
4517 REWRITE_TAC[IN_ELIM_THM];
4518 EXPAND_TAC "x''";
4519 REWRITE_TAC[GSYM ITER];
4520 ASM_SIMP_TAC[ARITH_RULE` ~( n < i ) ==> SUC n = SUC ( n - i ) + i `];
4521 REWRITE_TAC[GSYM ITER_ADD];
4522 ASM_REWRITE_TAC[];
4523 EXISTS_TAC ` SUC ( n - i ) `;
4524 REWRITE_TAC[];
4525 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
4526 UNDISCH_TAC` i + j = CARD (V: real^3 -> bool) `;
4527 DISCH_THEN (ASSUME_TAC o SYM);
4528 ASM_REWRITE_TAC[];
4529 UNDISCH_TAC` ~( n < (i:num)) `;
4530 UNDISCH_TAC` ~ ( n = ( i + j ) - 1) `;
4531 ARITH_TAC;
4532 ASM_REWRITE_TAC[IN_INTER; IN_UNION];
4533 SIMP_TAC[];
4534
4535 ASM_CASES_TAC` n = i + 1 `;
4536 REWRITE_TAC[IN_UNION];
4537 EXPAND_TAC "x''";
4538 FIRST_ASSUM SUBST1_TAC;
4539 REWRITE_TAC[GSYM ADD1; ITER];
4540 ASM_SIMP_TAC[aff];
4541 MESON_TAC[HULL_SUBSET; SUBSET; IN_INSERT];
4542
4543
4544 SUBGOAL_THEN` ivs_rho_node1 FF x'' IN {ITER l (rho_node1 FF) w | 0 < l /\ l < j} ` ASSUME_TAC;
4545 REWRITE_TAC[IN_ELIM_THM];
4546 EXPAND_TAC "x''";
4547 ASSUME_TAC2 (ARITH_RULE` ~( n < (i:num) ) /\ ~(n = i + 1) /\ ~( n = i ) ==> SUC ( n - 1 - i ) + i = n `);
4548 EXPAND_TAC "n";
4549 REWRITE_TAC[GSYM ITER_ADD; ITER];
4550 ASM_REWRITE_TAC[];
4551 SUBGOAL_THEN` ITER (n - 1 - i) (rho_node1 FF) w IN V ` ASSUME_TAC;
4552 ASM_SIMP_TAC[];
4553 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_VITER;
4554 FIRST_X_ASSUM MATCH_MP_TAC;
4555 ASM_REWRITE_TAC[];
4556
4557
4558 ASM_SIMP_TAC[];
4559 EXISTS_TAC` n - 1 - i `;
4560 ASM_REWRITE_TAC[];
4561 CONJ_TAC;
4562 UNDISCH_TAC` ~(n = i + 1) `;
4563 UNDISCH_TAC` ~( n < (i:num) ) `;
4564 UNDISCH_TAC` ~( n = (i:num)) `;
4565 ARITH_TAC;
4566 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
4567 UNDISCH_TAC` i + j = CARD (V:real^3 -> bool) `;
4568 DISCH_THEN (ASSUME_TAC o SYM);
4569 ASM_REWRITE_TAC[];
4570 UNDISCH_TAC` ~( n < i:num ) `;
4571 UNDISCH_TAC` ~( n = i:num ) `;
4572 ARITH_TAC;
4573 DOWN;
4574 ASM_REWRITE_TAC[IN_INTER; IN_UNION];
4575 SIMP_TAC[];
4576
4577 SUBGOAL_THEN` ! u:real^3. affine hull {vec 0, v, w, u} = affine hull {vec 0, v, u} ` ASSUME_TAC;
4578 GEN_TAC;
4579 REWRITE_TAC[GSYM SUBSET_ANTISYM_EQ];
4580 CONJ_TAC;
4581 MATCH_MP_TAC HULL_MINIMAL;
4582 REWRITE_TAC[AFFINE_AFFINE_HULL];
4583 MP_TAC (SPEC` {vec 0, v, u': real^3} ` Qzksykg.SET_SUBSET_AFFINE_HULL);
4584 SIMP_TAC[INSERT_SUBSET];
4585 STRIP_TAC;
4586 SUBGOAL_THEN` affine hull {vec 0, v:real^3} SUBSET affine hull {vec 0, v, u'}` MP_TAC;
4587 MATCH_MP_TAC HULL_MONO;
4588 CONV_TAC SET_RULE;
4589 REWRITE_TAC[SUBSET];
4590 DISCH_THEN MATCH_MP_TAC;
4591 UNDISCH_TAC` w = ITER i (rho_node1 FF ) v `;
4592 ASM_REWRITE_TAC[GSYM aff];
4593 DISCH_THEN (ASSUME_TAC o SYM);
4594 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w `;
4595 DISCH_THEN (ASSUME_TAC o SYM);
4596 ASM_REWRITE_TAC[];
4597 UNDISCH_TAC` aff {vec 0, v} = aff { vec 0, w:real^3} `;
4598 DISCH_THEN (SUBST1_TAC o SYM);
4599 ASM_REWRITE_TAC[];
4600
4601
4602 MATCH_MP_TAC HULL_MONO;
4603 CONV_TAC SET_RULE;
4604
4605
4606
4607 SUBGOAL_THEN`! x'. x' IN V ==> (f:real^3 -> real -> real^3) u t IN
4608 wedge_ge  (vec 0) (x') (rho_node1 FF x')
4609      (ivs_rho_node1 FF x') ` ASSUME_TAC;
4610 GEN_TAC;
4611 STRIP_TAC;
4612 ASM_CASES_TAC` x'' = (v:real^3) `;
4613 UNDISCH_TAC` w = ITER i (rho_node1 FF ) v `;
4614 DISCH_THEN (ASSUME_TAC o SYM);
4615 ASM_REWRITE_TAC[];
4616 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w `;
4617 DISCH_THEN (ASSUME_TAC o SYM);
4618 ASM_REWRITE_TAC[wedge_ge; IN_ELIM_THM];
4619 FIRST_ASSUM (MP_TAC o (SPEC` v, rho_node1 FF v ` ));
4620 ANTS_TAC;
4621 ASM_SIMP_TAC[];
4622 REWRITE_TAC[SUBSET];
4623 STRIP_TAC;
4624 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` u: real^3 `));
4625 DOWN;
4626 UNDISCH_TAC` !v. v IN V
4627           ==> wedge_in_fan_ge  (v,rho_node1 FF v) E =
4628               wedge_ge  (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
4629 DISCH_TAC;
4630 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
4631 ASM_REWRITE_TAC[wedge_ge; IN_ELIM_THM];
4632 SUBGOAL_THEN` ~ collinear {vec 0, v , u:real^3 } ` MP_TAC;
4633 ASM_SIMP_TAC[];
4634 STRIP_TAC;
4635 SUBGOAL_THEN` (!x. x IN (ss:real^3 # real^3 -> bool)
4636                    ==> (!t1 t2. (f:real^3 -> real -> real^3) u t = t1 % FST x + t2 % SND x ==> &0 < t1)) ` ASSUME_TAC;
4637 FIRST_X_ASSUM MATCH_MP_TAC;
4638 ASM_REWRITE_TAC[];
4639 FIRST_ASSUM (MP_TAC o (SPEC` (u:real^3, v:real^3) `));
4640 ANTS_TAC;
4641 EXPAND_TAC "ss";
4642 REWRITE_TAC[IN_ELIM_THM];
4643 EXISTS_TAC` u:real^3 `;
4644 EXISTS_TAC` v: real^3 `;
4645 ASM_REWRITE_TAC[];
4646 UNDISCH_TAC` ~collinear {vec 0, v, u:real^3} `;
4647 SIMP_TAC[INSERT_COMM];
4648 STRIP_TAC;
4649
4650 ASM_SIMP_TAC[];
4651 EXISTS_TAC` &1 `;
4652 EXISTS_TAC` &0 `;
4653 CONJ_TAC;
4654 CONV_TAC VECTOR_ARITH;
4655 REAL_ARITH_TAC;
4656 REWRITE_TAC[];
4657 STRIP_TAC;
4658 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN affine hull {vec 0, v, w, u} ` MP_TAC;
4659 FIRST_ASSUM MATCH_MP_TAC;
4660 ASM_REWRITE_TAC[];
4661 ASM_REWRITE_TAC[];
4662 REWRITE_TAC[IN_ELIM_THM; AFFINE_HULL_3];
4663 STRIP_TAC;
4664 DOWN;
4665 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
4666 ONCE_REWRITE_TAC[VECTOR_ADD_SYM];
4667 FIRST_ASSUM NHANH;
4668 STRIP_TAC;
4669 UNDISCH_TAC` ~collinear {vec 0, v, u:real^3} `;
4670 NHANH Fan.th3a;
4671 NHANH AFF_GT_2_1;
4672 STRIP_TAC;
4673 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN aff_gt {vec 0, v} {u} ` ASSUME_TAC;
4674 ASM_REWRITE_TAC[IN_ELIM_THM];
4675 EXISTS_TAC` u': real `;
4676 EXISTS_TAC` v': real `;
4677 EXISTS_TAC` w': real`;
4678 ASM_REWRITE_TAC[];
4679 CONV_TAC VECTOR_ARITH;
4680 DOWN;
4681 NHANH IN_AFF_GT_IMP_AZIMEQ2;
4682 SIMP_TAC[];  
4683 ASM_CASES_TAC` x'' = w:real^3 `;
4684 UNDISCH_TAC` w = ITER i (rho_node1 FF)  v `;
4685 DISCH_THEN (ASSUME_TAC o SYM);
4686 UNDISCH_TAC` v = ITER j (rho_node1 FF) w `;
4687 DISCH_THEN (ASSUME_TAC o SYM);
4688 ASM_REWRITE_TAC[wedge_ge; IN_ELIM_THM];
4689 FIRST_ASSUM (MP_TAC o (SPEC` w, rho_node1 FF w `));
4690 ANTS_TAC;
4691 ASM_SIMP_TAC[];
4692
4693 UNDISCH_TAC` !v. v IN V
4694           ==> wedge_in_fan_ge  (v,rho_node1 FF v) E =
4695               wedge_ge  (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
4696 STRIP_TAC;
4697 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w: real^3 `));
4698 DOWN;
4699 SIMP_TAC[];
4700 STRIP_TAC;
4701 REWRITE_TAC[SUBSET];
4702 STRIP_TAC;
4703 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` u:real^3 `));
4704 DOWN;
4705 REWRITE_TAC[wedge_ge; IN_ELIM_THM];
4706 SUBGOAL_THEN` ~collinear {vec 0, v, u:real^3} ` MP_TAC;
4707 ASM_SIMP_TAC[];
4708 ASM_REWRITE_TAC[Fan.collinear_fan];
4709 PHA THEN STRIP_TAC;
4710 SUBGOAL_THEN` ~( w = vec 0: real^3) ` MP_TAC;
4711 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
4712 ASM_SIMP_TAC[];
4713 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
4714 ONCE_REWRITE_TAC[EQ_SYM_EQ];
4715 UNDISCH_TAC` ~(u IN aff {vec 0, w: real^3}) `;
4716 PHA;
4717 REWRITE_TAC[GSYM Fan.collinear_fan];
4718 NHANH Fan.th3a;
4719 NHANH AFF_GT_2_1;
4720 STRIP_TAC;
4721 SUBGOAL_THEN` (!x. x IN ss
4722                    ==> (!t1 t2. (f: real^3 -> real -> real^3) u t = t1 % FST x + t2 % SND x ==> &0 < t1)) ` MP_TAC;
4723 FIRST_X_ASSUM MATCH_MP_TAC;
4724 ASM_REWRITE_TAC[];
4725 STRIP_TAC;
4726 FIRST_ASSUM (MP_TAC o (SPEC` (u:real^3, w:real^3) `));
4727 ANTS_TAC;
4728 EXPAND_TAC "ss";
4729 REWRITE_TAC[IN_ELIM_THM];
4730 EXISTS_TAC` u:real^3 `;
4731 EXISTS_TAC` w:real^3 `;
4732 ASM_REWRITE_TAC[];
4733 UNDISCH_TAC` ~collinear {vec 0, w, u: real^3} `;
4734 SIMP_TAC[INSERT_COMM];
4735 ASM_SIMP_TAC[];
4736 STRIP_TAC;
4737 EXISTS_TAC` &1 `;
4738 EXISTS_TAC` &0 `;
4739
4740
4741 CONJ_TAC;
4742 CONV_TAC VECTOR_ARITH;
4743 REAL_ARITH_TAC;
4744
4745
4746 REWRITE_TAC[];
4747 STRIP_TAC;
4748
4749 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN affine hull {vec 0, v, w, u }` ASSUME_TAC;
4750 FIRST_X_ASSUM MATCH_MP_TAC;
4751 ASM_REWRITE_TAC[];
4752 SUBGOAL_THEN` affine hull {vec 0, v, w, u} SUBSET affine hull {vec 0, w, u:real^3} ` MP_TAC;
4753 MATCH_MP_TAC HULL_MINIMAL;
4754 REWRITE_TAC[AFFINE_AFFINE_HULL];
4755 MP_TAC (ISPEC` {vec 0, w, u: real^3} ` Qzksykg.SET_SUBSET_AFFINE_HULL);
4756 SIMP_TAC[INSERT_SUBSET];
4757 STRIP_TAC;
4758 MP_TAC (SET_RULE` {vec 0, w:real^3} SUBSET {vec 0, w, u} `);
4759 NHANH (ISPEC` affine ` HULL_MONO);
4760 REWRITE_TAC[SUBSET];
4761 STRIP_TAC;
4762 FIRST_X_ASSUM MATCH_MP_TAC;
4763 UNDISCH_TAC` aff {vec 0, v} = aff {vec 0, w:real^3} `;
4764 REWRITE_TAC[aff];
4765 DISCH_THEN (SUBST1_TAC o SYM);
4766
4767
4768 MESON_TAC[HULL_SUBSET; IN_INSERT; SUBSET];
4769 REWRITE_TAC[SUBSET];
4770 STRIP_TAC;
4771 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` (f:real^3 -> real -> real^3) u t `));
4772 DOWN;
4773 REWRITE_TAC[IN_ELIM_THM; AFFINE_HULL_3; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
4774 STRIP_TAC;
4775 FIRST_ASSUM (MP_TAC o (SPECL [` w': real `;` v': real `]));
4776 ANTS_TAC;
4777 ASM_REWRITE_TAC[];
4778 CONV_TAC VECTOR_ARITH;
4779 STRIP_TAC;
4780 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN aff_gt {vec 0, w} {u}  ` MP_TAC;
4781 ASM_REWRITE_TAC[IN_ELIM_THM];
4782 EXISTS_TAC` u': real `;
4783 EXISTS_TAC` v': real `;
4784 EXISTS_TAC` w': real `;
4785 ASM_REWRITE_TAC[];
4786 CONV_TAC VECTOR_ARITH;
4787 STRIP_TAC;
4788 UNDISCH_TAC` &0 <= azim (vec 0) w (rho_node1 FF w) u `;
4789 UNDISCH_TAC` azim (vec 0) w (rho_node1 FF w) u <=
4790       azim (vec 0) w (rho_node1 FF w) (ivs_rho_node1 FF w) `;
4791 PHA;
4792 DOWN;
4793 NHANH IN_AFF_GT_IMP_AZIMEQ2;
4794 SIMP_TAC[];
4795 SUBGOAL_THEN` interior_angle1 (vec 0) FF x'' = pi /\
4796               rho_node1 FF x'' IN aff {x'', v, w} /\
4797               ivs_rho_node1 FF x'' IN aff {x'', v, w} ` MP_TAC;
4798 FIRST_ASSUM MATCH_MP_TAC;
4799 REWRITE_TAC[IN_DIFF; IN_INSERT; NOT_IN_EMPTY];
4800 ASM_REWRITE_TAC[];
4801 UNDISCH_TAC` w = ITER i (rho_node1 FF) v `;
4802 DISCH_THEN (ASSUME_TAC o SYM);
4803 UNDISCH_TAC` v = ITER j (rho_node1 FF) w `;
4804 DISCH_THEN (ASSUME_TAC o SYM);
4805 ASM_REWRITE_TAC[];
4806 SUBGOAL_THEN` azim (vec 0) x'' (rho_node1 FF x'') (ivs_rho_node1 FF x'') =
4807               interior_angle1 (vec 0) FF x'' ` MP_TAC;
4808 ASM_SIMP_TAC[];
4809 DISCH_THEN (SUBST1_TAC o SYM);
4810 NHANH Local_lemmas.AZIM_PI_WEDGE_GE_CROSS_DOT;
4811 SIMP_TAC[];  
4812 STRIP_TAC;
4813 FIRST_ASSUM (MP_TAC o (SPEC` x'', rho_node1 FF x'' `));
4814 ANTS_TAC;
4815 ASM_SIMP_TAC[];
4816 ASM_REWRITE_TAC[];
4817 UNDISCH_TAC` !v. v IN V
4818           ==> wedge_in_fan_ge  (v,rho_node1 FF v) E =
4819               wedge_ge  (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
4820 STRIP_TAC;
4821 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` x'': real^3 `));
4822 ASM_REWRITE_TAC[VECTOR_ARITH` x - vec 0 = x `; SUBSET; IN_ELIM_THM];
4823 STRIP_TAC;
4824 ABBREV_TAC` e1 = x'' cross rho_node1 FF x'' `;
4825 SUBGOAL_THEN` e1 dot v = &0 /\ e1 dot (w:real^3) = &0 ` MP_TAC;
4826 UNDISCH_TAC` vec 0 IN conv0 {v, w:real^3} `;
4827 REWRITE_TAC[Collect_geom.CONV0_SET2; IN_ELIM_THM];
4828 STRIP_TAC;
4829 MP_TAC (ISPEC` e1: real^3 ` DOT_RZERO);
4830 ASM_REWRITE_TAC[DOT_RADD; DOT_RMUL];
4831 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
4832 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
4833 DOWN THEN DOWN;
4834 UNDISCH_TAC` &0 < a' `;
4835 UNDISCH_TAC` &0 < b' `;
4836 REWRITE_TAC[REAL_ARITH` &0 <= a <=> a = &0 \/ &0 < a `];
4837 MESON_TAC[REAL_LT_ADD; REAL_LT_MUL; REAL_ARITH` &0 < a ==> ~(a = &0) `; REAL_ARITH` &0 < a ==> ~( a + x * &0 = &0 \/ x * &0 + a = &0) `];
4838 STRIP_TAC;
4839 UNDISCH_TAC` !u. u IN V
4840           ==> ~(u = v)
4841           ==> ~(u = w)
4842           ==> u IN aff_gt {vec 0, v} {rho_node1 FF v} \/
4843               u IN aff_gt {vec 0, v} {ivs_rho_node1 FF v} `;
4844 PHA THEN STRIP_TAC;
4845 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` u:real^3 `));
4846 SUBGOAL_THEN` rho_node1 FF v IN V /\ ivs_rho_node1 FF v IN V ` MP_TAC;
4847 ASM_SIMP_TAC[];
4848 SUBGOAL_THEN` ~ collinear { vec 0, v,  rho_node1 FF v } /\ ~ collinear {vec 0, v, ivs_rho_node1 FF v } ` MP_TAC;
4849 ASM_SIMP_TAC[];
4850 NHANH Fan.th3a;
4851 NHANH AFF_GT_2_1;
4852 DOWN THEN STRIP_TAC;
4853 STRIP_TAC;
4854 STRIP_TAC;
4855 UNDISCH_TAC` u IN aff_gt {vec 0, v} {rho_node1 FF v} `;
4856 ASM_REWRITE_TAC[IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
4857 STRIP_TAC;
4858 SUBGOAL_THEN` (!x. x IN ss
4859                    ==> (!t1 t2. (f:real^3 -> real -> real^3) u t = t1 % FST x + t2 % SND x ==> &0 < t1)) ` MP_TAC;
4860 FIRST_X_ASSUM MATCH_MP_TAC;
4861
4862
4863 ASM_REWRITE_TAC[];
4864 STRIP_TAC;
4865 FIRST_X_ASSUM (MP_TAC o (SPEC` rho_node1 FF v, v `));
4866 ANTS_TAC;
4867 EXPAND_TAC "ss";
4868 REWRITE_TAC[IN_ELIM_THM];
4869 EXISTS_TAC` rho_node1 FF v `;
4870 EXISTS_TAC` v: real^3 `;
4871 ASM_REWRITE_TAC[];
4872 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF v}  `;
4873 SIMP_TAC[INSERT_COMM];
4874 STRIP_TAC;
4875 UNDISCH_TAC` u = t2 % v + t3 % rho_node1 FF v `;
4876 DISCH_THEN (ASSUME_TAC o SYM);
4877 ASM_SIMP_TAC[];
4878 EXISTS_TAC` t3: real `;
4879 EXISTS_TAC` t2:real `;
4880 ASM_REWRITE_TAC[];
4881 EXPAND_TAC "u";
4882 CONV_TAC VECTOR_ARITH;
4883 REWRITE_TAC[];
4884 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t  IN affine hull {vec 0, v, w, u } ` MP_TAC;
4885 ASM_SIMP_TAC[];
4886 FIRST_X_ASSUM (ASSUME_TAC o SYM);
4887 ASM_REWRITE_TAC[];
4888 REWRITE_TAC[IN_ELIM_THM; AFFINE_HULL_3];
4889 EXPAND_TAC "u";
4890 REWRITE_TAC[VECTOR_ARITH` u % vec 0 + v % v' + w % (t2 % v' + t3 % ax)  = ( v  + w * t2 ) % v' + ( w * t3) % ax`];
4891 ASM_REWRITE_TAC[];
4892 ONCE_REWRITE_TAC[VECTOR_ARITH` a + b = b + (a:real^N) `];
4893 PHA THEN STRIP_TAC;
4894 UNDISCH_TAC` (f:real^3 -> real -> real^3) u t = (w' * t3) % rho_node1 FF v + (v' + w' * t2) % v `;
4895 ONCE_REWRITE_TAC[VECTOR_ARITH` a + b = b + (a:real^N) `];
4896 FIRST_ASSUM NHANH;
4897 SIMP_TAC[DOT_RADD; DOT_RMUL];
4898 ASM_REWRITE_TAC[REAL_ARITH` a * &0 + x = x `];
4899 STRIP_TAC;
4900 SUBGOAL_THEN` &0 <= e1 dot rho_node1 FF v ` ASSUME_TAC;
4901 FIRST_X_ASSUM MATCH_MP_TAC;
4902 ASM_REWRITE_TAC[];
4903 MATCH_MP_TAC REAL_LE_MUL;
4904 ASM_REWRITE_TAC[];
4905 UNDISCH_TAC` &0 < w' * t3 `;
4906 REAL_ARITH_TAC;  STRIP_TAC;
4907 STRIP_TAC;
4908 UNDISCH_TAC` u IN aff_gt {vec 0, v} {ivs_rho_node1 FF v} `;
4909 ASM_REWRITE_TAC[IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
4910 STRIP_TAC;
4911 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN affine hull {vec 0, v, w, u} ` MP_TAC;
4912 FIRST_ASSUM MATCH_MP_TAC;
4913 ASM_REWRITE_TAC[];
4914 ASM_REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM];
4915 REWRITE_TAC[VECTOR_ARITH` u % vec 0 + v % vv + w % (t2 % vv + t3 % vc) =
4916 ( v + w * t2 ) % vv + (w * t3 ) % vc `];
4917 FIRST_X_ASSUM (ASSUME_TAC o SYM);
4918 ASM_REWRITE_TAC[];
4919 STRIP_TAC;
4920 SUBGOAL_THEN` (!x. x IN ss
4921                    ==> (!t1 t2. (f:real^3 -> real -> real^3) u t = t1 % FST x + t2 % SND x ==> &0 < t1)) ` ASSUME_TAC;
4922 FIRST_X_ASSUM MATCH_MP_TAC;
4923 ASM_REWRITE_TAC[];
4924 FIRST_X_ASSUM (MP_TAC o (SPEC` ivs_rho_node1 FF v, v `));
4925 ANTS_TAC;
4926 EXPAND_TAC "ss";
4927 REWRITE_TAC[IN_ELIM_THM];
4928 EXISTS_TAC` ivs_rho_node1 FF v `;
4929 EXISTS_TAC` v: real^3 `;
4930 ASM_REWRITE_TAC[];
4931 ASM_SIMP_TAC[];
4932 UNDISCH_TAC` ~collinear {vec 0, v, ivs_rho_node1 FF v} `;
4933 SIMP_TAC[INSERT_COMM];
4934 STRIP_TAC;
4935 EXISTS_TAC` t3: real`;
4936 EXISTS_TAC` t2: real `;
4937 ASM_REWRITE_TAC[];
4938 EXPAND_TAC "u";
4939 CONV_TAC VECTOR_ARITH;
4940 REWRITE_TAC[];
4941 ONCE_REWRITE_TAC[VECTOR_ADD_SYM];
4942 DISCH_THEN (ASSUME_TAC2 o (SPECL [` w' * t3: real `; ` v' + w' * t2: real`]));
4943 ASM_REWRITE_TAC[DOT_RADD; DOT_RMUL; REAL_MUL_RZERO; REAL_ADD_LID];
4944 UNDISCH_TAC` !x. x IN V ==> &0 <= e1 dot (x: real^3) `;
4945 DISCH_THEN (ASSUME_TAC2 o (SPEC` ivs_rho_node1 FF v `));
4946 MATCH_MP_TAC REAL_LE_MUL;
4947 ASM_REWRITE_TAC[];
4948 UNDISCH_TAC` &0 < w' * t3 `;
4949 CONV_TAC REAL_ARITH;  
4950 ASM_CASES_TAC` ~( x' = (u:real^3)) /\ ~( rho_node1 FF x' = u ) /\ ~( ivs_rho_node1 FF x' = u ) ` ;
4951 DOWN THEN STRIP_TAC;
4952 UNDISCH_TAC` w = ITER i (rho_node1 FF ) v `;
4953 DISCH_THEN (ASSUME_TAC o SYM);
4954 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w `;
4955 DISCH_THEN (ASSUME_TAC o SYM);
4956 ASM_SIMP_TAC[];
4957 STRIP_TAC;
4958 UNDISCH_TAC` !x. (x:real^3 # real^3) IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E `;
4959 DISCH_THEN (MP_TAC o (SPEC` x', rho_node1 FF x' `));
4960 ANTS_TAC;
4961 ASM_SIMP_TAC[];
4962 ASM_SIMP_TAC[];
4963 STRIP_TAC;
4964 MATCH_MP_TAC SUBSET_TRANS;
4965 EXISTS_TAC` (f:real^3 -> real -> real^3) u t INSERT V `;
4966 ASM_REWRITE_TAC[INSERT_SUBSET];
4967 ASM_SIMP_TAC[];
4968
4969 STRIP_TAC; 
4970 ASM_CASES_TAC` x' = u:real^3 `;
4971 ASM_SIMP_TAC[];
4972 SUBGOAL_THEN` rho_node1 FF u IN aff_ge {vec 0, v} {u} /\
4973               ivs_rho_node1 FF u IN aff_ge {vec 0, v} {u} ` ASSUME_TAC;
4974 ASM_SIMP_TAC[];
4975 SUBGOAL_THEN` ~collinear {vec 0, v, u:real^3} ` ASSUME_TAC;
4976 ASM_SIMP_TAC[];
4977 SUBGOAL_THEN` (f: real^3 -> real -> real^3) (ivs_rho_node1 FF u) t IN IV ` ASSUME_TAC;
4978 EXPAND_TAC "IV";
4979 REWRITE_TAC[IN_IMAGE];
4980 EXISTS_TAC` ivs_rho_node1 FF u `;
4981 ASM_SIMP_TAC[];
4982 ABBREV_TAC` UU = {ITER n (rho_node1 IF) ( (f: real^3 -> real -> real^3) (ivs_rho_node1 FF u) t ) | n <= 2} `;
4983 ABBREV_TAC` P = affine hull {vec 0, v, u:real^3} `;
4984 ASSUME_TAC (ISPECL [` {vec 0, v:real^3 }`;` {u:real^3} `] AFF_GE_SUBSET_AFFINE_HULL);
4985 SUBGOAL_THEN` plane  (P:real^3 -> bool) ` ASSUME_TAC;
4986 REWRITE_TAC[plane];
4987 EXISTS_TAC` vec 0: real^3 `;
4988 EXISTS_TAC` v: real^3 `;
4989 EXISTS_TAC` u: real^3 `;
4990 ASM_REWRITE_TAC[];
4991 SUBGOAL_THEN` vec 0 IN (P:real^3 -> bool) ` ASSUME_TAC;
4992 MP_TAC (
4993 prove(` {vec 0, v, u:real^3} SUBSET affine hull {vec 0, v, u}  `,
4994 REWRITE_TAC[HULL_SUBSET]));
4995 UNDISCH_TAC` w = ITER i (rho_node1 FF ) v ` ;
4996 DISCH_THEN (ASSUME_TAC o SYM);
4997 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w ` ;
4998 DISCH_THEN (ASSUME_TAC o SYM);
4999 ASM_REWRITE_TAC[SUBSET];
5000 DISCH_THEN MATCH_MP_TAC;
5001 REWRITE_TAC[IN_INSERT];
5002 SUBGOAL_THEN` UU SUBSET (P: real^3 -> bool) ` ASSUME_TAC;
5003 EXPAND_TAC "UU";
5004 REWRITE_TAC[SUBSET; IN_ELIM_THM];
5005 GEN_TAC;
5006 REWRITE_TAC[ARITH_RULE` n <= 2 <=> n = 0 \/ n = 1 \/ n = 2 `];
5007 STRIP_TAC;
5008 DOWN;
5009 ASM_REWRITE_TAC[ITER];
5010 STRIP_TAC;
5011 UNDISCH_TAC` aff_ge {vec 0, v:real^3} {u} SUBSET affine hull ({vec 0, v} UNION {u}) `;
5012 UNDISCH_TAC` w = ITER i (rho_node1 FF)  v `;
5013 DISCH_THEN (ASSUME_TAC o SYM);
5014 UNDISCH_TAC` v = ITER j (rho_node1 FF)  w `;
5015 DISCH_THEN (ASSUME_TAC o SYM);
5016 ASM_REWRITE_TAC[SET_RULE` {a,b} UNION {c} = {a,b,c} `; SUBSET];
5017 DISCH_THEN MATCH_MP_TAC;
5018 ASM_REWRITE_TAC[];
5019 DOWN;
5020 DOWN;
5021 SIMP_TAC[ITER1];
5022 SUBGOAL_THEN`  rho_node1 IF ((f: real^3 -> real -> real^3) (ivs_rho_node1 FF u) t) = f (rho_node1 FF (ivs_rho_node1 FF u)) t` MP_TAC;
5023 FIRST_X_ASSUM MATCH_MP_TAC;
5024 ASM_SIMP_TAC[];
5025 SIMP_TAC[];
5026 ASM_SIMP_TAC[];
5027
5028
5029 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN affine hull {vec 0, v, w, u} ` MP_TAC;
5030 FIRST_X_ASSUM MATCH_MP_TAC;
5031 ASM_REWRITE_TAC[];
5032 ASM_REWRITE_TAC[];
5033 SIMP_TAC[];
5034 UNDISCH_TAC` x'' = ITER n (rho_node1 IF) ((f: real^3 -> real -> real^3) (ivs_rho_node1 FF u) t) ` ;
5035 DOWN THEN SIMP_TAC[];
5036 REWRITE_TAC[Lvducxu.ITER12];
5037 SUBGOAL_THEN` rho_node1 IF (f (ivs_rho_node1 FF u) (t:real)) = f (rho_node1 FF (ivs_rho_node1 FF u)) t ` MP_TAC;
5038 FIRST_X_ASSUM MATCH_MP_TAC;
5039 ASM_SIMP_TAC[];
5040 SIMP_TAC[];
5041 PHA THEN STRIP_TAC;
5042 ASM_SIMP_TAC[];
5043 UNDISCH_TAC` aff_ge {vec 0, v} {u} SUBSET affine hull ({vec 0, v} UNION {u:real^3}) `;
5044 UNDISCH_TAC` w = ITER i (rho_node1 FF ) v `;
5045 DISCH_THEN (ASSUME_TAC o SYM);
5046 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w `;
5047 DISCH_THEN (ASSUME_TAC o SYM);
5048 ASM_REWRITE_TAC[SET_RULE` {a,b} UNION {c} = {a,b,c} `; SUBSET];
5049 DISCH_THEN MATCH_MP_TAC;
5050 ASM_REWRITE_TAC[];
5051 ASSUME_TAC2 (
5052 SPECL [` IE: (real^3 -> bool) -> bool `;` IV: real^3 -> bool `;` UU: real^3 ->
5053  bool `;` P: real^3  -> bool `;` 2 `;` IF: real^3 # real^3 -> bool `; `((f:real
5054  ^3 -> real -> real^3) (ivs_rho_node1 FF u) t) `] (GEN_ALL
5055  AZIM_PI_ITER_LOCAL_FAN));
5056 FIRST_X_ASSUM (MP_TAC o (SPEC` 0 `));
5057 ANTS_TAC;
5058 ARITH_TAC;
5059
5060 UNDISCH_TAC` w = ITER i (rho_node1 FF ) v `;
5061 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w `;
5062 DISCH_THEN (ASSUME_TAC o SYM);
5063 DISCH_THEN (ASSUME_TAC o SYM);
5064 REWRITE_TAC[ADD; ITER; ITER1; Lvducxu.ITER12];
5065 SUBGOAL_THEN` rho_node1 IF (f (ivs_rho_node1 FF u) (t:real)) = f (rho_node1 FF (ivs_rho_node1 FF u)) t ` MP_TAC;
5066 ASM_SIMP_TAC[];
5067 SIMP_TAC[];
5068 ASM_SIMP_TAC[];
5069 NHANH (MESON[PI_POS]` x = pi ==> &0 < x `);
5070 NHANH Local_lemmas1.AZIM_POS_IMP_SUM_2PI;
5071 STRIP_TAC;
5072 DOWN;
5073 ASM_REWRITE_TAC[REAL_ARITH` a + x = &2 * a <=> x = a `];
5074 SIMP_TAC[REAL_LE_REFL];
5075 STRIP_TAC;
5076
5077
5078
5079 SUBGOAL_THEN` wedge_ge  (vec 0) (f u (t:real)) (rho_node1 FF u) (ivs_rho_node1 FF u) =
5080 wedge_ge  (vec 0) u (rho_node1 FF u) (ivs_rho_node1 FF u) ` ASSUME_TAC;
5081 DOWN;
5082 SUBGOAL_THEN` interior_angle1 (vec 0) FF u = pi ` ASSUME_TAC;
5083 FIRST_X_ASSUM MATCH_MP_TAC;
5084 ASM_REWRITE_TAC[IN_DIFF; IN_INSERT; NOT_IN_EMPTY];
5085 SUBGOAL_THEN` azim (vec 0) u (rho_node1 FF u) (ivs_rho_node1 FF u) = pi ` MP_TAC;
5086 DOWN;
5087 ASM_SIMP_TAC[];
5088 NHANH Local_lemmas.AZIM_PI_WEDGE_GE_CROSS_DOT;
5089 SIMP_TAC[VECTOR_SUB_RZERO];
5090 PHA THEN STRIP_TAC;
5091 SUBGOAL_THEN` affine hull {vec 0, v, u} = affine hull {vec 0, u, rho_node1 FF u } ` ASSUME_TAC;
5092 MATCH_MP_TAC Local_lemmas.SUBSET_NOT_COLLINEAR_AFFINE_HULL_EQ ;
5093 ASM_SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET];
5094 CONJ_TAC;
5095 EXPAND_TAC "P";
5096 MP_TAC (ISPECL [` affine: (real^3 -> bool) -> bool `;
5097 ` { vec 0, v, u:real^3} `] HULL_SUBSET);
5098 REWRITE_TAC[SUBSET];
5099 DISCH_THEN MATCH_MP_TAC;
5100 REWRITE_TAC[IN_INSERT];
5101 UNDISCH_TAC` aff_ge {vec 0, v} {u} SUBSET affine hull ({vec 0, v} UNION {u:real^3}) `;
5102 REWRITE_TAC[SUBSET;SET_RULE` {a,b} UNION {c} = {a,b,c} `];
5103 ASM_REWRITE_TAC[];
5104 DISCH_THEN MATCH_MP_TAC;
5105 ASM_REWRITE_TAC[];
5106 SUBGOAL_THEN` f u (t:real) IN affine hull {vec 0, v, w, u:real^3} ` MP_TAC;
5107 FIRST_ASSUM MATCH_MP_TAC;
5108 ASM_REWRITE_TAC[];
5109 DOWN;
5110 ASM_REWRITE_TAC[];
5111 SIMP_TAC[IN_ELIM_THM; AFFINE_HULL_3];
5112 PHA THEN STRIP_TAC;
5113 SUBGOAL_THEN` (!x. x IN ss
5114                    ==> (!t1 t2. (f:real^3 -> real -> real^3) u t = t1 % FST x + t2 % SND x ==> &0 < t1)) ` ASSUME_TAC;
5115 FIRST_X_ASSUM MATCH_MP_TAC;
5116 ASM_REWRITE_TAC[];
5117 FIRST_ASSUM (MP_TAC o (SPEC` u, rho_node1 FF u `));
5118 ANTS_TAC;
5119 EXPAND_TAC "ss";
5120 REWRITE_TAC[IN_ELIM_THM];
5121 EXISTS_TAC` u: real^3 `;
5122 EXISTS_TAC` rho_node1 FF u `;
5123 ASM_REWRITE_TAC[];
5124 ASM_SIMP_TAC[];
5125 EXISTS_TAC` &1 `;
5126 EXISTS_TAC` &0 `;
5127 CONJ_TAC;
5128 CONV_TAC VECTOR_ARITH;
5129 REAL_ARITH_TAC;
5130 REWRITE_TAC[];
5131 DISCH_THEN (MP_TAC o (SPECL [` v': real `;` w': real `]));
5132 ANTS_TAC;
5133 ASM_REWRITE_TAC[];
5134 CONV_TAC VECTOR_ARITH;
5135 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID; CROSS_LADD; CROSS_LMUL; CROSS_REFL; VECTOR_ADD_RID; DOT_LMUL];
5136 SIMP_TAC[REAL_LE_MUL_EQ];
5137
5138
5139 ASM_REWRITE_TAC[];
5140 FIRST_ASSUM (MP_TAC o (SPEC` u, rho_node1 FF u `));
5141 ANTS_TAC;
5142 ASM_SIMP_TAC[];
5143 ASM_SIMP_TAC[];
5144 UNDISCH_TAC` !v. v IN V
5145           ==> wedge_in_fan_ge  (v,rho_node1 FF v) E =
5146               wedge_ge  (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
5147 DISCH_THEN (ASSUME_TAC2 o (SPEC` u:real^3 `));
5148 DOWN;
5149 SIMP_TAC[];
5150
5151 STRIP_TAC;
5152 MATCH_MP_TAC SUBSET_TRANS;
5153 EXISTS_TAC` (f:real^3 -> real -> real^3) u t INSERT V `;
5154 ASM_REWRITE_TAC[];
5155 ASM_SIMP_TAC[INSERT_SUBSET];
5156 SUBGOAL_THEN`  azim_in_fan (u, rho_node1 FF u) E <= pi /\ V SUBSET wedge_in_fan_ge   (u, rho_node1 FF u) E ` ASSUME_TAC;
5157 FIRST_X_ASSUM MATCH_MP_TAC;
5158 ASM_SIMP_TAC[];
5159 DOWN THEN STRIP_TAC;
5160 DOWN;
5161 UNDISCH_TAC` wedge_in_fan_ge  (u,rho_node1 FF u) E =
5162       wedge_ge  (vec 0) u (rho_node1 FF u) (ivs_rho_node1 FF u) `;
5163 SIMP_TAC[];
5164
5165 SUBGOAL_THEN` (!x. (x :real^3 # real^3) IN ss
5166                    ==> (!t1 t2. (f:real^3 -> real -> real^3) u t = t1 % FST x + t2 % SND x ==> &0 < t1)) ` ASSUME_TAC;
5167 FIRST_X_ASSUM MATCH_MP_TAC;
5168 ASM_REWRITE_TAC[];
5169
5170 UNDISCH_TAC` w = ITER i (rho_node1 FF ) v ` ;
5171 UNDISCH_TAC` v = ITER j (rho_node1 FF ) w ` ;
5172 DISCH_THEN (ASSUME_TAC o SYM);
5173 DISCH_THEN (ASSUME_TAC o SYM);
5174 ASM_CASES_TAC` rho_node1 FF x' = u `;
5175 ASM_SIMP_TAC[];
5176 SUBGOAL_THEN` ~(rho_node1 FF (rho_node1 FF ( ivs_rho_node1 FF x')) = (ivs_rho_node1 FF x')) ` MP_TAC;
5177 FIRST_ASSUM MATCH_MP_TAC;
5178 ASM_SIMP_TAC[];
5179
5180 SUBGOAL_THEN` rho_node1 FF (ivs_rho_node1 FF x') = x' ` SUBST1_TAC;
5181 ASM_SIMP_TAC[];
5182 ASM_SIMP_TAC[];
5183 STRIP_TAC;
5184 SUBGOAL_THEN` affine hull {vec 0, v, u} = affine hull {vec 0, u, ivs_rho_node1 FF u }` MP_TAC;
5185 MATCH_MP_TAC Local_lemmas.SUBSET_NOT_COLLINEAR_AFFINE_HULL_EQ;
5186 ASM_SIMP_TAC[];
5187 ASSUME_TAC2 (ISPECL [` {vec 0, v:real^3} `;` {u:real^3} `] AFF_GE_SUBSET_AFFINE_HULL);
5188 MP_TAC (ISPECL [` affine: (real^3 -> bool) -> bool `;` {vec 0, v, u:real^3} `] HULL_SUBSET);
5189 SIMP_TAC[INSERT_SUBSET];
5190 STRIP_TAC;
5191 UNDISCH_TAC` aff_ge {vec 0, v} {u} SUBSET affine hull ({vec 0, v} UNION {u: real^3}) `;
5192 REWRITE_TAC[SET_RULE` {a,b} UNION {c} = {a,b,c} `; SUBSET];
5193 DISCH_THEN MATCH_MP_TAC; 
5194 ASM_SIMP_TAC[];
5195 STRIP_TAC;
5196 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN affine hull {vec 0, v, w, u} ` MP_TAC;
5197 FIRST_X_ASSUM MATCH_MP_TAC;
5198 ASM_REWRITE_TAC[];
5199 ASM_REWRITE_TAC[IN_ELIM_THM; AFFINE_HULL_3; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
5200 STRIP_TAC;
5201
5202 SUBGOAL_THEN` ~ collinear {vec 0, u, ivs_rho_node1 FF u } ` ASSUME_TAC;
5203 ASM_SIMP_TAC[];
5204 FIRST_ASSUM (MP_TAC o (SPEC` u, ivs_rho_node1 FF u ` ));
5205 ANTS_TAC;
5206 EXPAND_TAC "ss"; 
5207 REWRITE_TAC[IN_ELIM_THM];
5208 EXISTS_TAC` u:real^3 `;
5209 EXISTS_TAC` ivs_rho_node1 FF u `;
5210 ASM_REWRITE_TAC[];
5211 ASM_SIMP_TAC[];
5212 EXISTS_TAC` &1 `;
5213 EXISTS_TAC` &0 `;
5214 CONJ_TAC;
5215 CONV_TAC VECTOR_ARITH;
5216 REAL_ARITH_TAC;
5217 REWRITE_TAC[];
5218 DISCH_THEN (ASSUME_TAC2 o (SPECL [` v': real `;` w': real `]));
5219 DOWN THEN DOWN;
5220 ONCE_REWRITE_TAC[SET_RULE` {a,b} = {b,a} `];
5221 DOWN;
5222 SUBGOAL_THEN` ivs_rho_node1 FF u = x' ` ASSUME_TAC;
5223 EXPAND_TAC  "u";
5224 ASM_SIMP_TAC[];
5225 ASM_REWRITE_TAC[];
5226 PHA THEN STRIP_TAC;
5227 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN aff_gt {vec 0, x'} {u:real^3} ` MP_TAC;
5228 DOWN THEN DOWN;
5229 NHANH Fan.th3a;
5230 NHANH AFF_GT_2_1;
5231 SIMP_TAC[IN_ELIM_THM];
5232 STRIP_TAC;
5233 STRIP_TAC;
5234 EXISTS_TAC` u': real `;
5235 EXISTS_TAC` w': real `;
5236 EXISTS_TAC` v': real` ;
5237 ASM_REWRITE_TAC[];
5238 CONJ_TAC;
5239 UNDISCH_TAC` u' + v' + w' = &1 `;
5240 REAL_ARITH_TAC;
5241 CONV_TAC VECTOR_ARITH;
5242 NHANH IN_AFF_GT_IMP_AZIMEQ2;
5243 REWRITE_TAC[GSYM Rogers.AZIM_EQ_SYM];
5244 SIMP_TAC[wedge_ge];
5245 STRIP_TAC;
5246 UNDISCH_TAC` !x. x IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E `;
5247 STRIP_TAC;
5248 FIRST_ASSUM (MP_TAC o (SPEC` x', rho_node1 FF x' `));
5249 ANTS_TAC;
5250 ASM_SIMP_TAC[];
5251 DOWN THEN PHA;
5252 ASM_SIMP_TAC[GSYM wedge_ge];
5253 UNDISCH_TAC` !v. v IN V
5254           ==> azim (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) =
5255               interior_angle1 (vec 0) FF v `;
5256 DISCH_THEN (ASSUME_TAC o GSYM);
5257 ASM_SIMP_TAC[];
5258 STRIP_TAC;
5259
5260 MATCH_MP_TAC SUBSET_TRANS;
5261 EXISTS_TAC` (f:real^3 -> real -> real^3) u t INSERT V `;
5262 UNDISCH_TAC` (f: real^3 -> real -> real^3) u t = v' % u + w' % x' `;
5263 DISCH_THEN (ASSUME_TAC o SYM);
5264 ASM_SIMP_TAC[];
5265 UNDISCH_TAC` rho_node1 FF x' = u `;
5266 DISCH_THEN (ASSUME_TAC o SYM);
5267 ASM_SIMP_TAC[INSERT_SUBSET];
5268 SUBGOAL_THEN` (f: real^3 -> real -> real^3) u t IN
5269                wedge_ge  (vec 0) x' (rho_node1 FF x') (ivs_rho_node1 FF x') ` MP_TAC;
5270 FIRST_X_ASSUM MATCH_MP_TAC;
5271 FIRST_ASSUM ACCEPT_TAC;
5272 DOWN;
5273 SIMP_TAC[];
5274
5275 ASM_CASES_TAC` ivs_rho_node1 FF x' = u `;
5276 ASM_REWRITE_TAC[];
5277 SUBGOAL_THEN` x' = rho_node1 FF u ` ASSUME_TAC;
5278 FIRST_X_ASSUM (SUBST1_TAC o SYM);
5279 ASM_SIMP_TAC[];
5280 ASM_SIMP_TAC[];
5281 UNDISCH_TAC`!x. x IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E `;
5282 DISCH_THEN (MP_TAC o (SPEC` x', rho_node1 FF x' `));
5283 ANTS_TAC;
5284 ASM_SIMP_TAC[];
5285 ASM_SIMP_TAC[];
5286 UNDISCH_TAC` !v. v IN V
5287           ==> azim (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) =
5288               interior_angle1 (vec 0) FF v `;
5289 DISCH_THEN (ASSUME_TAC2 o (SPEC` x': real^3 `));
5290 FIRST_X_ASSUM (MP_TAC o SYM);
5291 ASM_REWRITE_TAC[];
5292 SIMP_TAC[];
5293 STRIP_TAC;
5294 FIRST_X_ASSUM (MP_TAC o (SPEC` u, rho_node1 FF u `));
5295 ANTS_TAC;
5296 EXPAND_TAC "ss";
5297 REWRITE_TAC[IN_ELIM_THM];
5298 EXISTS_TAC` u: real^3 `;
5299 EXISTS_TAC` rho_node1 FF u `;
5300 ASM_SIMP_TAC[];
5301
5302
5303
5304 EXISTS_TAC` &1 `;
5305 EXISTS_TAC` &0 `;
5306 CONJ_TAC;
5307 CONV_TAC VECTOR_ARITH;
5308 REAL_ARITH_TAC;
5309 ASM_REWRITE_TAC[];
5310 STRIP_TAC;
5311 SUBGOAL_THEN` affine hull {vec 0, v, u} = affine hull {vec 0, u, rho_node1 FF u } ` ASSUME_TAC;
5312 MATCH_MP_TAC Local_lemmas.SUBSET_NOT_COLLINEAR_AFFINE_HULL_EQ;
5313 ASM_SIMP_TAC[];
5314 MP_TAC (ISPEC ` {vec 0, v, u:real^3} ` Qzksykg.SET_SUBSET_AFFINE_HULL);
5315 SIMP_TAC[INSERT_SUBSET];
5316 ASM_SIMP_TAC[];
5317 STRIP_TAC;
5318 MP_TAC (ISPECL [` {vec 0, v:real^3} `;` {u: real^3} `] AFF_GE_SUBSET_AFFINE_HULL);
5319 REWRITE_TAC[SET_RULE` {a,b} UNION {c} = {a,b,c} `; SUBSET];
5320 DISCH_THEN MATCH_MP_TAC;
5321 ASM_SIMP_TAC[];
5322 SUBGOAL_THEN` (f:real^3 -> real -> real^3) u t IN affine hull {vec 0, v, w, u} ` MP_TAC;
5323 FIRST_X_ASSUM MATCH_MP_TAC;
5324 FIRST_ASSUM ACCEPT_TAC;
5325 ASM_REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
5326 STRIP_TAC;
5327 SUBGOAL_THEN` &0 < v' ` ASSUME_TAC;
5328 FIRST_X_ASSUM MATCH_MP_TAC;
5329 EXISTS_TAC` w': real`;
5330 ASM_REWRITE_TAC[];
5331 SUBGOAL_THEN` ~ collinear {vec 0, u, rho_node1 FF u } ` MP_TAC;
5332 ASM_SIMP_TAC[];
5333 ONCE_REWRITE_TAC[Collect_geom.PER_SET2];
5334 NHANH Fan.th3a;
5335 NHANH AFF_GT_2_1;
5336 STRIP_TAC;
5337 SUBGOAL_THEN` (f:real ^3 -> real -> real^3) u t IN aff_gt {vec 0, rho_node1 FF u } {u} ` MP_TAC;
5338 ASM_REWRITE_TAC[IN_ELIM_THM];
5339 EXISTS_TAC` u': real `;
5340 EXISTS_TAC` w': real `;
5341 EXISTS_TAC` v': real `;
5342 ASM_REWRITE_TAC[];
5343 CONJ_TAC;
5344 UNDISCH_TAC` u' + v' + w' = &1 `;
5345 REAL_ARITH_TAC;
5346 CONV_TAC VECTOR_ARITH;
5347 NHANH IN_AFF_GT_IMP_AZIMEQ2;
5348 SIMP_TAC[];
5349 STRIP_TAC THEN STRIP_TAC;
5350 MATCH_MP_TAC SUBSET_TRANS;
5351 EXISTS_TAC` (f: real^3 -> real -> real^3) u t INSERT V `;
5352 UNDISCH_TAC` (f: real^3 -> real -> real^3) u t = v' % u + w' % rho_node1 FF u `;
5353 DISCH_THEN (ASSUME_TAC o SYM);
5354 ASM_REWRITE_TAC[];
5355 ASM_REWRITE_TAC[INSERT_SUBSET; wedge_ge];
5356 ASM_SIMP_TAC[GSYM wedge_ge];
5357 UNDISCH_TAC` !x'. x' IN V
5358            ==> (f: real^3 -> real -> real^3) u t IN
5359                wedge_ge  (vec 0) x' (rho_node1 FF x') (ivs_rho_node1 FF x') `;
5360 DISCH_THEN (MP_TAC o (SPEC` rho_node1 FF u `));
5361 ANTS_TAC;
5362 ASM_SIMP_TAC[];
5363 ASM_SIMP_TAC[];
5364 UNDISCH_TAC` ~(~(x' = u) /\ ~(rho_node1 FF x' = u) /\ ~(ivs_rho_node1 FF x' = u)) `;
5365 ASM_REWRITE_TAC[]]);;
5366
5367 let MHAEYJN = prove_by_refinement(
5368 `!a b V E FF f v w u.
5369      convex_local_fan (V,E,FF) /\
5370      lunar (v,w) V E /\
5371      deformation f V (a,b) /\
5372      interior_angle1 (vec 0) FF v < pi /\
5373      u IN V /\
5374      ~(u = v) /\
5375      ~(u = w) /\
5376      (!u' t. u' IN V /\ ~(u = u') /\ t IN real_interval (a,b) ==> f u' t = u') /\
5377      (!t. t IN real_interval (a,b) ==> f u t IN affine hull {vec 0, v, w, u})
5378      ==> (?e. &0 < e /\
5379               (!t. --e < t /\ t < e
5380                    ==> convex_local_fan
5381                        (IMAGE (\v. f v t) V,
5382                         IMAGE (IMAGE (\v. f v t)) E,
5383                         IMAGE (\uv. f (FST uv) t,f (SND uv) t) FF) /\
5384                        lunar (v,w) (IMAGE (\v. f v t) V)
5385                        (IMAGE (IMAGE (\v. f v t)) E)))`,
5386   (* {{{ proof *)
5387   [
5388   REPEAT WEAKER_STRIP_TAC;
5389   INTRO_TAC (GEN_ALL SUB_LUNAR_DEFORM_LEMMA) [`FF`;`a`;`b`;`u`;`v`;`w`;`V`;`f`;`E`];
5390   ANTS_TAC;
5391     ASM_REWRITE_TAC[];
5392     RULE_ASSUM_TAC(REWRITE_RULE[Localization.deformation;IN_REAL_INTERVAL]);
5393     ASM_SIMP_TAC[];
5394     TYPIFY `local_fan (V,E,FF)` (C SUBGOAL_THEN ASSUME_TAC);
5395       BY(ASM_SIMP_TAC[Local_lemmas.CVX_LO_IMP_LO]);
5396     CONJ_TAC;
5397       MATCH_MP_TAC Local_lemmas.LOCAL_FAN_FINITE_V;
5398       BY(ASM_REWRITE_TAC[]);
5399     RULE_ASSUM_TAC(REWRITE_RULE[Localization.local_fan;Fan.FAN;LET_DEF;LET_END_DEF]);
5400     FIRST_X_ASSUM MP_TAC THEN REPEAT WEAKER_STRIP_TAC;
5401     BY(FIRST_X_ASSUM MP_TAC THEN FIRST_X_ASSUM_ST `UNIONS` MP_TAC THEN SET_TAC[]);
5402   REPEAT WEAKER_STRIP_TAC;
5403   INTRO_TAC MHAEYJN_CONVEX_LOCAL_FAN [`a`;`b`;`V`;`E`;`FF`;`f`;`v`;`w`;`u`];
5404   ASM_REWRITE_TAC[];
5405   REPEAT WEAKER_STRIP_TAC;
5406   TYPIFY `if e < e' then e else e'` EXISTS_TAC;
5407   REPEAT WEAKER_STRIP_TAC;
5408   CONJ_TAC;
5409     BY(COND_CASES_TAC THEN ASM_REWRITE_TAC[]);
5410   REPEAT WEAKER_STRIP_TAC;
5411   CONJ_TAC;
5412     FIRST_X_ASSUM MATCH_MP_TAC;
5413     BY(ASM_TAC THEN REAL_ARITH_TAC);
5414   FIRST_X_ASSUM MATCH_MP_TAC;
5415   BY(ASM_TAC THEN REAL_ARITH_TAC)
5416   ]);;
5417   (* }}} *)
5418
5419
5420
5421 end;;