2 (* ============================================================= *)
3 (* ============================================================= *)
4 (* ============================================================= *)
5 (* =============================================================
6 #use "/home/user1/flyspeck/working/boot.hl";;
7 needs "/home/user1/flyspeck/working/local_lemmas1.hl";;
8 ============================================================= *)
17 "leg/enclosed_def.hl";
18 "leg/collect_geom.hl";
19 (* flyspeck_needs "leg/collect_geom2.hl";*) (* slow and rarely needed *)
21 "jordan/refinement.hl";
23 "jordan/hash_term.hl";
24 "jordan/parse_ext_override_interface.hl";
25 "jordan/goal_printer.hl";
27 "jordan/tactics_jordan.hl";
28 "jordan/num_ext_nabs.hl";
29 "jordan/taylor_atn.hl";
31 "jordan/flyspeck_constants.hl";
32 "jordan/misc_defs_and_lemmas.hl";
34 "nonlinear/ineqdata3q1h.hl";
36 "nonlinear/parse_ineq.hl";
37 "nonlinear/vukhacky_tactics.hl" ;
39 "trigonometry/trig1.hl";
40 "trigonometry/trig2.hl";
41 "nonlinear/compute_2158872499.hl"; (* need trig1.hl trig2.hl *)
43 "trigonometry/trigonometry.hl";
44 "trigonometry/delta_x.hl";
45 "trigonometry/euler_complement.hl";
46 "trigonometry/euler_multivariate.hl";
47 "trigonometry/euler_main_theorem.hl";
50 "hypermap/hypermap.hl"; (* svn 1898 not compatible with other files *)
53 "fan/introduction.hl";
56 "fan/planarity.hl"; (* svn 1717 -- 1792 has errors. Build fails. *)
58 "fan/HypermapAndFan.hl";
63 "packing/pack_defs.hl";
64 "packing/pack_concl.hl";
65 "packing/pack3.hl"; (* needs pack_defs.hl *)
68 "packing/TARJJUW.hl"; (* weakly_saturated def. modified in svn 1912. *)
72 "packing/BBDTRGC_def.hl";
73 "packing/NOPZSEH_def.hl";
74 "packing/JNRJQSM_def.hl";
77 "packing/JJGTQMN_def.hl";
78 "packing/PHZVPFY_def.hl";
81 "packing/beta_pair_thm.hl";
82 "packing/lemma_negligible.hl";
85 (* "local/local_defs.hl"; *)
86 "local/WRGCVDR_CIZMRRH.hl";
89 "local/LOCAL_LEMMAS.hl"];;
91 (* 1897 has an error Unbound value ivs_rho_node1*)
94 (* (needs "Multivariate/flyspeck.ml"; *)
95 map flyspeck_needs build_sequence;;
100 (* ============================================================== *)
101 (* ============================================================== *)
102 (* ============================================================== *)
104 module Local_lemmas1 = struct
113 open Prove_by_refinement;;
114 open Wrgcvdr_cizmrrh;;
123 (* deprecated 2013-02-22:
125 let spherical_map = new_definition ` spherical_map (e1,e2,e3) (r,theta, phi) =
126 (r * cos theta * sin phi) % e1 +
127 (r * sin theta * sin phi ) % e2 + (r * cos phi) % e3 `;;
129 ` spherical_coor v0 (e1,e2,e3) v = (dist (v0,v), azim v0 (v0 + e3) (v0 + e1) v, arcV v0 (v0 + e3) v)`;;
133 let lunar_deform = new_definition ` lunar_deform (e1,e2,e3) t x =
134 (norm x * cos (( &1 - t) * (azim (vec 0) e3 e1 x )) * sin (arcV (vec 0) e3 x)) % e1 +
135 (norm x * sin ( ( &1 - t ) * (azim (vec 0) e3 e1 x )) * sin (arcV (vec 0) e3 x)) % e2 +
136 (norm x * cos (arcV (vec 0) e3 x )) % e3`;;
138 let normize = new_definition` normize (v:real^N) = (&1 / norm v) % v`;;
140 let deformation = new_definition
141 ` deformation ff V (a,b) <=> (&0) IN real_interval (a,b) /\
142 (! v r. v IN V /\ r IN real_interval (a,b) ==> (ff v) continuous atreal r) /\
143 (!v. v IN V ==> ff v (&0) = v )`;;
145 let localization = new_definition `localization (V, E) FF = (v_prime V FF, e_prime E FF) `;;
149 (* deprecated 2013-02-22:
150 let v_slice = new_definition ` v_slice f (v,w) =
151 { ITER i f v | ! j. j < i ==> ~( ITER j f v = w ) }`;;
154 let e_slice = new_definition ` e_slice f (v,w) =
156 { {ITER i f v, ITER (i + 1) f v} | ! j. j < i + 1 ==> ~( ITER j f v = w)} `;;
159 let f_slice = new_definition ` f_slice f (v,w) =
161 { (ITER i f v, ITER (i + 1) f v) | ! j. j < i + 1 ==> ~ (ITER j f v = w)} `;;
167 let LUNAR_DEFORM_PRESERVE_NORM = prove(`orthonormal e1 e2 e3 ==>
168 norm (lunar_deform (e1,e2,e3) t x) = norm x `,
169 SIMP_TAC[NORM_EQ; lunar_deform; orthonormal; DOT_RADD; DOT_LADD; DOT_RMUL;
170 DOT_LMUL; DOT_SYM; REAL_MUL_RZERO; Collect_geom.ZERO_NEUTRAL] THEN
171 ABBREV_TAC` aa = ((&1 - t) * azim (vec 0) e3 e1 x) ` THEN
172 ABBREV_TAC` bb = arcV (vec 0) e3 (x:real^3)` THEN REWRITE_TAC[
173 REAL_ARITH` (norm x * cos aa * sin bb) * (norm x * cos aa * sin bb) * &1 +
174 (norm x * sin aa * sin bb) * (norm x * sin aa * sin bb) * &1 +
175 (norm x * cos bb) * (norm x * cos bb) * &1 =
176 (norm x pow 2 ) * (sin bb pow 2 * ( sin aa pow 2 + cos aa pow 2 ) + cos bb pow 2 )`] THEN
177 REWRITE_TAC[SIN_CIRCLE; REAL_MUL_RID; DOT_SQUARE_NORM]);;
182 let ACR_REFL = prove(` ~( u = v ) ==> arcV u v v = &0 `,
183 REWRITE_TAC[arcV; DOT_SQUARE_NORM; GSYM POW_2] THEN
184 NHANH (NORM_ARITH` ~( u = v ) ==> ~(norm (v - u) = &0)`) THEN
185 SIMP_TAC[REAL_FIELD` ~(x = &0) ==> x pow 2 / x pow 2 = &1 `; ACS_1]);;
190 let ARC_OPPOSITE = prove(` ~(u = v) ==> arcV u v (&2 % u - v ) = pi `,
191 REWRITE_TAC[arcV; VECTOR_ARITH` &2 % u - v - u = -- (v - u)`; DOT_RNEG;
192 NORM_NEG; DOT_SQUARE_NORM; GSYM POW_2] THEN
193 NHANH (NORM_ARITH` ~(u = v) ==> ~( norm (v - u)= &0 )`) THEN
194 SIMP_TAC[ACS_NEG_1; REAL_FIELD` ~( x = &0 ) ==> -- ( x pow 2) / ( x pow 2 ) = -- &1 `]);;
201 let ARCV_EQ_0 = prove(` ~(u = v) /\ &0 < t ==> arcV u v (u + t % (v - u)) = &0`,
202 NHANH ACR_REFL THEN ONCE_REWRITE_TAC[Trigonometry2.ARCV_VEC0_FORM] THEN
203 SIMP_TAC[VECTOR_ARITH`(a + b) - a:real^N = b`; GSYM
204 Trigonometry2.WHEN_K_POS_ARCV_STABLE]);;
206 let ARCV_EQ_0_ORIGIN = prove(`~( u = vec 0) /\ &0 < t ==> arcV (vec 0) u (t % u) = &0`,
207 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN NHANH ARCV_EQ_0 THEN
208 SIMP_TAC[VECTOR_ARITH` vec 0 + t % (u - vec 0) = t % u`]);;
211 let ARCV_PI_OPPOSITE = prove(`~(u = v) /\ t < &0 ==> arcV u v (u + t % (v - u)) = pi`,
212 NHANH ARC_OPPOSITE THEN ONCE_REWRITE_TAC[Trigonometry2.ARCV_VEC0_FORM] THEN
213 SIMP_TAC[VECTOR_ARITH`(a + b) - a:real^N = b`; VECTOR_ARITH` &2 % u - v - u = -- (v - u)`] THEN
214 ONCE_REWRITE_TAC[VECTOR_ARITH` a % x = (-- a) % ( -- x)`] THEN
215 SIMP_TAC[GSYM Trigonometry2.WHEN_K_POS_ARCV_STABLE; REAL_ARITH` t < &0 <=> &0 < -- t `]);;
223 let DOT_0_ARCV = prove(` (v - u) dot (w - u) = &0 ==> arcV u v w = pi / &2 `,
224 SIMP_TAC[arcV; Collect_geom.REAL_DIV_LZERO; ACS_0]);;
226 let ARCV_DEGENERATE = prove(` arcV u u v = pi / &2 /\ arcV u v u = pi / &2 `,
227 CONJ_TAC THENL [MATCH_MP_TAC DOT_0_ARCV THEN
228 REWRITE_TAC[VECTOR_SUB_REFL; DOT_LZERO];
229 MATCH_MP_TAC DOT_0_ARCV THEN
230 REWRITE_TAC[VECTOR_SUB_REFL; DOT_RZERO]]);;
236 let ARCV_DIRECTIONS = prove(`~( u = v) ==>
237 (arcV u v (u + t % (v - u)) = &0 <=> &0 < t) /\
238 (arcV u v (u + t % (v - u)) = pi <=> t < &0)`,
239 ASM_CASES_TAC` t = &0` THENL [
240 ASM_REWRITE_TAC[REAL_LT_REFL; VECTOR_MUL_LZERO; VECTOR_ADD_RID; ARCV_DEGENERATE]
241 THEN STRIP_TAC THEN MP_TAC PI_NZ THEN REAL_ARITH_TAC;
242 DOWN THEN REWRITE_TAC[REAL_ARITH` ~(a = &0) <=> &0 < a \/ a < &0`] THEN
243 MESON_TAC[ARCV_EQ_0; ARCV_PI_OPPOSITE; PI_NZ]]);;
249 let ARCV_ORI_DIRECTIONS = prove(` ~( v = vec 0) ==>
250 (arcV (vec 0) v (t % v) = &0 <=> &0 < t) /\
251 (arcV (vec 0) v (t % v) = pi <=> t < &0)`,
252 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN NHANH ARCV_DIRECTIONS THEN
253 SIMP_TAC[EQ_SYM_EQ; VECTOR_ADD_LID; VECTOR_SUB_RZERO]);;
258 let REAL_NEG_MUL_EQ = prove(` a < &0 ==> ( a * x < &0 <=> &0 < x ) /\
259 (&0 < a * x <=> x < &0) `,
260 REWRITE_TAC[REAL_ARITH` a < &0 <=> &0 < -- a `; REAL_ARITH` -- ( a * x) = -- a * x `] THEN
261 SIMP_TAC[REAL_LT_MUL_EQ] THEN
262 ONCE_REWRITE_TAC[REAL_ARITH` a * b = -- a * -- b `] THEN
263 SIMP_TAC[REAL_LT_MUL_EQ]);;
269 let NOT_EQ_0 = REAL_ARITH` ~( x = &0 ) <=> &0 < x \/ x < &0 `;;
272 let SIN_ARCV_EQ_0 = prove(` ~( u = v) /\ ~( t = &0) ==> sin (arcV u v (u + t % (v - u))) = &0`,
273 REWRITE_TAC[NOT_EQ_0] THEN STRIP_TAC THENL [
274 ASM_SIMP_TAC[ARCV_EQ_0; SIN_0];
275 ASM_SIMP_TAC[ARCV_PI_OPPOSITE; SIN_PI]]);;
278 let COLLINEAR_SIN_ARCV_0 = prove(` collinear {u,v,x} /\ ~(u = x) /\ ~(u = v) ==> sin (arcV u v (x:real^N)) = &0`,
279 REWRITE_TAC[Local_lemmas.collinear_fan22; AFF2; IN_ELIM_THM] THEN
282 ASM_REWRITE_TAC[] THEN UNDISCH_TAC` x = t % u + (&1 - t) % (v:real^N)` THEN
283 ASM_CASES_TAC` t = &1 ` THENL [
284 ASM_REWRITE_TAC[REAL_SUB_REFL; VECTOR_ADD_RID; VECTOR_MUL_LZERO; VECTOR_MUL_LID];
286 REWRITE_TAC[VECTOR_ARITH` t % u + (&1 - t) % v = u + (&1 - t) % ( v - u)`] THEN
287 STRIP_TAC THEN MATCH_MP_TAC SIN_ARCV_EQ_0 THEN
288 ASM_REWRITE_TAC[REAL_ARITH` a - b = &0 <=> b = a`]];
290 DOWN THEN ASM_REWRITE_TAC[]]);;
302 let COLL_AFF_GT_2_1 = prove(`!x v w:real^N.
304 ==> aff_gt {x, v} {w} =
308 y = t1 % x + t2 % v + t3 % w}`,
309 NHANH Fan.th3a THEN SIMP_TAC[AFF_GT_2_1]);;
314 let COLL_EQ_DEPENDENT = prove_by_refinement (
315 ` collinear {vec 0, x, y:real^N} <=> ? tx ty. ~( tx = &0 /\ ty = &0) /\ tx % x + ty % y = vec 0`,
317 REWRITE_TAC[COLLINEAR_LEMMA_ALT];
321 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
324 EXISTS_TAC` -- (c:real)`;
326 ASM_REWRITE_TAC[VECTOR_MUL_LID; REAL_ARITH` ~( &1 = &0)`];
329 SPEC_TAC (`y:real^N`,`y:real^N`);
330 SPEC_TAC (`x:real^N`,`x:real^N`);
332 MESON[]` (!x y tx ty. P x y tx ty ==> P y x ty tx) /\
333 (!x y. Q x y ==> Q y x) /\
334 (!x y tx ty. ~(ty = &0) /\ P x y tx ty ==> Q x y)
335 ==> ! x y. (?tx ty. ~(tx = &0 /\ ty = &0) /\ P x y tx ty)
337 SIMP_TAC[VECTOR_ADD_SYM; INSERT_COMM];
338 REWRITE_TAC[SIMP_RULE[INSERT_COMM] COLLINEAR_LEMMA_ALT];
341 EXISTS_TAC` ( -- tx ) / ty `;
343 NHANH_PAT`\x. x ==> y` (MESON[]` x = y ==> &1 / ty % x = &1 / ty % y`);
344 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; VECTOR_MUL_RZERO];
345 ASM_SIMP_TAC[REAL_FIELD` ~(x = &0) ==> &1 / x * x = &1 `; VECTOR_MUL_LID];
346 SIMP_TAC[VECTOR_ARITH` a + b = vec 0 <=> b = -- a `];
357 let NOT_COLL_ORTHONORMAL = prove_by_refinement (
358 ` ~ collinear {vec 0, x, y:real^N} ==> ?u. u IN aff {vec 0, x, y} /\
359 norm u = &1 /\ x dot u = &0 `,
361 REWRITE_TAC[COLL_EQ_DEPENDENT; NOT_EXISTS_THM; DE_MORGAN_THM];
363 EXISTS_TAC` normize ((x dot y) % x + -- (x dot x) % (y:real^N))`;
364 REWRITE_TAC[aff; AFFINE_HULL_3; IN_ELIM_THM];
366 REWRITE_TAC[normize; Local_lemmas.VECTOR_ADD_LDISTRIB1; VECTOR_MUL_RZERO;
368 MESON_TAC[REAL_ARITH`&1 - a + a = &1 `];
370 REWRITE_TAC[normize; GSYM Trigonometry2.NOT_VEC0_UNITABLE];
372 SUBGOAL_THEN` ~(x dot (x:real^N) = &0)` MP_TAC;
373 ASM_REWRITE_TAC[DOT_EQ_0];
374 ONCE_REWRITE_TAC[REAL_ARITH` a = &0 <=> -- a = &0`];
377 REWRITE_TAC[DOT_RADD; DOT_RMUL; REAL_ARITH` a * b + -- b * a = &0`; REAL_MUL_RZERO]]);;
387 let NORM1_NOT_0 = prove(` norm x = &1 ==> ~( x = vec 0) `,
388 NHANH (REAL_ARITH` x = &1 ==> &0 < x `) THEN SIMP_TAC[NORM_POS_LT]);;
393 let ARCV_DETER_DIRECTION = prove_by_refinement (
394 ` (x:real^N) = tu % u + ty % y /\ &0 < ty /\
395 ~( collinear {vec 0, u, y}) /\ norm x = &1 /\ norm y = &1 /\
396 arcV (vec 0) u x = arcV (vec 0) u y ==> x = y`,
397 [NHANH NOT_COLL_ORTHONORMAL;
401 MP_TAC (ISPECL [`u' :real^N`;` u:real^N` ] Rogers.IN_PLANE_NOT_COLLINEAR);
406 UNDISCH_TAC` u' IN aff {vec 0, u, y:real^N}`;
407 REWRITE_TAC[aff; AFFINE_HULL_3; IN_ELIM_THM];
409 ASM_CASES_TAC` w = &0`;
410 UNDISCH_TAC` u dot (u':real^N) = &0`;
411 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_MUL_LZERO; VECTOR_ADD_LID;
412 VECTOR_ADD_RID; DOT_RMUL; REAL_ENTIRE; DOT_EQ_0];
413 DISCH_THEN SUBST_ALL_TAC;
414 UNDISCH_TAC` u' = u'' % vec 0 + &0 % u + w % (y:real^N)`;
415 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_MUL_LZERO; VECTOR_ADD_LID;
418 UNDISCH_TAC`u' = u'' % vec 0 + v % u + w % (y:real^N) `;
419 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
420 ONCE_REWRITE_TAC[VECTOR_ARITH` a = u % x + (y:real^N) <=> y = ( -- u) % x + a`];
421 ABBREV_TAC` tt <=> x = (y:real^N)`;
422 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE; VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC];
424 UNDISCH_TAC` x = tu % u + ty % (y:real^N)`;
425 ASM_SIMP_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; VECTOR_ARITH` a % x + b % x + c = (a + b) % x + c`];
426 ABBREV_TAC` x1 = tu + ty * &1 / w * --v `;
427 ABBREV_TAC` x2 = ty * &1 / w `;
429 UNDISCH_TAC` arcV (vec 0) u x = arcV (vec 0) u (y:real^N)`;
430 NHANH (MESON[]` a = b ==> cos a = cos b `);
431 SWITCH_TAC` ~(y:real^N = vec 0)`;
432 ASSUME_TAC2 (ISPEC`x:real^N` (GEN_ALL NORM1_NOT_0));
433 SWITCH_TAC` ~(x:real^N = vec 0)`;
434 SWITCH_TAC` x = x1 % u + x2 % (u':real^N)`;
435 SWITCH_TAC` (y:real^N) = (&1 / w * --v) % u + &1 / w % u'`;
436 ASM_SIMP_TAC[Trigonometry2.NOT_EQ_IMPCOS_ARC; VECTOR_SUB_RZERO; REAL_MUL_RID];
438 SUBGOAL_THEN` &0 < norm (u:real^N)` MP_TAC;
439 ASM_REWRITE_TAC[NORM_POS_LT];
440 SIMP_TAC[REAL_FIELD` &0 < x ==> (a / x = b / x <=> a = b )`];
443 REWRITE_TAC[DOT_RADD; DOT_RMUL];
444 ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_RID];
448 SIMP_TAC[NORM_POS_LT; GSYM DOT_EQ_0; REAL_EQ_MUL_RCANCEL];
450 SUBGOAL_THEN` x dot (x:real^N) = y dot (y:real^N)` MP_TAC;
451 ASM_REWRITE_TAC[DOT_SQUARE_NORM];
456 REWRITE_TAC[DOT_LADD; DOT_RADD; DOT_LMUL; DOT_RMUL];
457 ASM_REWRITE_TAC[DOT_SYM; REAL_MUL_RZERO; REAL_ADD_LID; REAL_ADD_RID;
458 REAL_ARITH` a + b = a + c <=> b = c`];
459 ASM_REWRITE_TAC[REAL_EQ_MUL_RCANCEL; REAL_RING`a * b * c = (a*b)*c`;
461 REWRITE_TAC[REAL_ARITH` a * a = b * b <=> (a - b) * ( a + b ) = &0`; REAL_ENTIRE; REAL_SUB_0];
466 REPLICATE_TAC 2 (FIRST_X_ASSUM SUBST1_TAC);
472 REWRITE_TAC[REAL_ARITH` a * x + x = ( a + &1) * x `; REAL_ENTIRE];
473 ASM_SIMP_TAC[REAL_ARITH` &0 < a ==> ~( a + &1 = &0) `; REAL_FIELD` ~( x = &0)
474 ==> ~( &1 / x = &0) `]]);;
483 let NORM_NORMIZE = REWRITE_RULE[GSYM normize] Trigonometry2.NOT_VEC0_UNITABLE;;
487 let ARCV_EQ_IMP_NORMIZE = prove_by_refinement (
488 ` (x:real^N) IN aff_gt {vec 0, u} {y} /\ ~ collinear {vec 0, u, y} /\
489 arcV (vec 0) u x = arcV (vec 0) u y ==> normize x = normize y `,
490 [NHANH COLL_AFF_GT_2_1;
492 UNDISCH_TAC` x IN aff_gt {vec 0, u} {y:real^N} `;
493 ASM_REWRITE_TAC[IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
494 NHANH_PAT`\x. x ==> y` (MESON[]` x = y ==> (&1 /norm x) % x = (&1 / norm x) % y `);
496 MP_TAC (ISPECL [`&1 `;` &1 / norm (y:real^N)`;`u:real^N`;` y:real^N`] COLLINEAR_SCALE_ALL);
497 SUBGOAL_THEN` &0 < norm (y:real^N) /\ &0 < norm (x:real^N)` ASSUME_TAC;
498 REWRITE_TAC[NORM_POS_LT];
499 UNDISCH_TAC` ~ collinear {vec 0, u, y:real^N}`;
500 NHANH Trigonometry2.NOT_COLLINEAR_IMP_2_UNEQUAL;
503 UNDISCH_TAC` x = t2 % u + t3 % (y:real^N)`;
505 ASSUME_TAC2 (REAL_ARITH` &0 < t3 ==> ~( t3 = &0) `);
506 ASM_MESON_TAC[COLL_EQ_DEPENDENT];
513 SUBGOAL_THEN `&0 < &1 / norm (x:real^N) * t3 ` MP_TAC;
514 REWRITE_TAC[REAL_ARITH` &1 / a * b = b / a `];
515 MATCH_MP_TAC REAL_LT_DIV;
520 REWRITE_TAC[VECTOR_MUL_LID];
522 DISCH_THEN (ASSUME_TAC o SYM);
523 DOWN THEN DOWN THEN DOWN;
524 ONCE_REWRITE_TAC[Collect_geom.POS_EQ_INV_POS];
525 NHANH (ISPECL [`u:real^N`;` &1 / norm (v:real^N)`;`v:real^N`] (GEN_ALL
526 Trigonometry2.WHEN_K_POS_ARCV_STABLE));
527 REWRITE_TAC[GSYM Collect_geom.POS_EQ_INV_POS];
529 REWRITE_TAC[NORM_POS_LT; Trigonometry2.NOT_VEC0_UNITABLE; VECTOR_ADD_LDISTRIB;
532 REWRITE_TAC[normize];
533 MATCH_MP_TAC (GEN_ALL ARCV_DETER_DIRECTION);
534 EXISTS_TAC` (&1 / norm (x:real^N) * t2)`;
535 EXISTS_TAC` (&1 / norm (x:real^N) * t3) * (norm (y:real^N)) `;
536 EXISTS_TAC` u:real^N`;
537 FIRST_X_ASSUM (SUBST1_TAC o SYM);
538 ABBREV_TAC` nx = &1 / norm x % (x:real^N)`;
539 ABBREV_TAC` ny = &1 / norm y % (y:real^N)`;
540 SWITCH_TAC` x = t2 % u + t3 % (y:real^N)`;
541 SWITCH_TAC` nx = (&1 / norm (x:real^N) * t2) % u + (&1 / norm x * t3) % (y:real^N)`;
546 REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH` (a*b)*c = a*b*c`];
547 SUBGOAL_THEN` norm (y:real^N) * &1 / norm y = &1 ` SUBST1_TAC;
548 MATCH_MP_TAC (REAL_FIELD` &0 < a ==> a * &1 / a = &1 `);
549 UNDISCH_TAC` norm (ny:real^N) = &1 `;
551 REWRITE_TAC[NORM_POS_LT; GSYM normize; NORM_NORMIZE];
552 ASM_REWRITE_TAC[REAL_MUL_RID];
555 MATCH_MP_TAC REAL_LT_MUL;
556 UNDISCH_TAC` norm (ny:real^N) = &1 `;
558 SIMP_TAC[NORM_POS_LT; GSYM normize; NORM_NORMIZE];
567 let AZIM_AND_ARCV_EQ_IMP_PARA = prove_by_refinement (
568 ` ~ collinear {v0,u,v} /\ azim v0 u v x = azim v0 u v y /\
569 arcV v0 u x = arcV v0 u y ==> y = v0 \/ (? t. &0 <= t /\ x - v0 = t % (y - v0)) `,
570 [ASM_CASES_TAC` collinear {v0,u,y:real^3}`;
571 ASM_SIMP_TAC[AZIM_DEGENERATE];
572 ASM_CASES_TAC` collinear {v0,u,x:real^3}`;
574 NHANH (REWRITE_RULE[GSYM RIGHT_IMP_FORALL_THM]
575 Trigonometry2.NOT_EQ_IMP_AFF_AND_COLL3);
577 SWITCH_TAC` !u'. u' IN aff {v0, u} <=> collinear {v0, u, u':real^3}`;
578 UNDISCH_TAC` collinear {v0, u, y:real^3}`;
579 UNDISCH_TAC` collinear {v0, u, x:real^3}`;
580 ASM_REWRITE_TAC[Trigonometry2.AFF2; IN_ELIM_THM];
582 ASM_REWRITE_TAC[VECTOR_ARITH` (t % v0 + (&1 - t) % u) - v0 = (&1 - t) % ( u - v0)`];
584 ASM_CASES_TAC` t' = &1 `;
586 ASM_REWRITE_TAC[REAL_SUB_REFL; VECTOR_MUL_LZERO; VECTOR_MUL_LID; VECTOR_ADD_RID];
590 EXISTS_TAC` ( &1 - t ) / ( &1 - t')`;
591 ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_FIELD` ~(t' = &1) ==>
592 ((&1 - t) / (&1 - t')) * (&1 - t') = &1 - t `];
593 UNDISCH_TAC` arcV v0 u x = arcV v0 (u:real^3) y `;
594 ONCE_REWRITE_TAC[Trigonometry2.ARCV_VEC0_FORM];
595 ASM_REWRITE_TAC[VECTOR_ARITH` (t % v0 + (&1 - t) % u) - v0 = (&1 - t) % (u - v0)`];
597 ASSUME_TAC2 (REAL_FIELD` ~( t' = &1 ) ==>
598 &1 - t = ((&1 - t)/ (&1 - t')) * ( &1 - t')`);
599 ABBREV_TAC` tt = (&1 - t) / (&1 - t') `;
601 ASSUME_TAC2 (REAL_ARITH`~( t' = &1 ) ==> &0 < &1 - t' \/ &1 - t' < &0 `);
602 FIRST_X_ASSUM DISJ_CASES_TAC;
603 SUBGOAL_THEN` arcV (vec 0) (u:real^3 - v0) ((&1 - t') % (u - v0)) = &0` SUBST1_TAC;
604 MATCH_MP_TAC ARCV_EQ_0_ORIGIN;
605 ASM_REWRITE_TAC[VECTOR_ARITH` a - b = vec 0 <=> b = a `];
606 UNDISCH_TAC` ~(v0 = u:real^3)`;
607 ONCE_REWRITE_TAC[VECTOR_ARITH`a = b <=> b - a = vec 0`];
608 SIMP_TAC[ARCV_ORI_DIRECTIONS];
610 UNDISCH_TAC` &0 < &1 - t'`;
611 SIMP_TAC[REAL_LT_MUL_EQ; REAL_LT_IMP_LE];
612 ASSUME_TAC2 (ISPECL [`&1 - t'`;` u:real^3`;`v0:real^3`] (GEN_ALL
613 ( ONCE_REWRITE_RULE[Trigonometry2.ARCV_VEC0_FORM] ARCV_PI_OPPOSITE)));
615 SIMP_TAC[VECTOR_ARITH`(a + b:real^N) - a = b `];
617 UNDISCH_TAC` ~( v0 = u:real^3)`;
618 ONCE_REWRITE_TAC[VECTOR_ARITH` a = b <=> b - a = vec 0`];
619 SIMP_TAC[ARCV_ORI_DIRECTIONS];
621 UNDISCH_TAC` &1 - t' < &0 `;
622 SIMP_TAC[ONCE_REWRITE_RULE[REAL_MUL_SYM] REAL_NEG_MUL_EQ; REAL_LT_IMP_LE];
630 UNDISCH_TAC` collinear {v0, u, y:real^3}`;
632 ASM_CASES_TAC` y = v0:real^3`;
637 SUBGOAL_THEN` sin (arcV v0 u (y:real^3)) = &0` MP_TAC;
638 MATCH_MP_TAC COLLINEAR_SIN_ARCV_0;
640 SUBGOAL_THEN` ~(sin (arcV v0 u (x:real^3)) = &0 )` MP_TAC;
641 MATCH_MP_TAC Trigonometry2.NOT_COLLINEAR_IMP_NOT_SIN0;
646 ASM_CASES_TAC` x = v0:real^3`;
650 ASM_REWRITE_TAC[REAL_LE_REFL; VECTOR_SUB_REFL; VECTOR_MUL_LZERO];
653 ASM_CASES_TAC` collinear {v0, u, x:real^3}`;
655 SUBGOAL_THEN` sin (arcV v0 u (x:real^3)) = &0` MP_TAC;
656 MATCH_MP_TAC COLLINEAR_SIN_ARCV_0;
658 MATCH_MP_TAC Fan.th3b;
659 EXISTS_TAC` v:real^3`;
660 FIRST_ASSUM ACCEPT_TAC;
661 UNDISCH_TAC` ~collinear {v0, u, y:real^3}`;
662 ASM_SIMP_TAC[Trigonometry2.NOT_COLLINEAR_IMP_NOT_SIN0];
665 ASSUME_TAC2 (ISPECL [`v0:real^3`;` u:real^3`;`v:real^3`; ` x:real^3`;`
666 y:real^3`] AZIM_EQ_ALT);
667 UNDISCH_TAC` ~collinear {v0, u, y:real^3}`;
668 NHANH COLL_AFF_GT_2_1;
671 UNDISCH_TAC` azim v0 u v x = azim v0 u v (y:real^3)`;
672 ASM_REWRITE_TAC[IN_ELIM_THM; REAL_ARITH` a + b = &1 <=> a = &1 - b`];
675 ASM_REWRITE_TAC[VECTOR_ARITH` x = (&1 - (t2 + t3)) % v0 + t2 % u + t3 % y <=>
676 x - v0 = t2 % ( u - v0) + t3 % (y - v0) `];
677 ABBREV_TAC` xx = x - v0:real^3`;
678 ABBREV_TAC` uu = u - v0:real^3 `;
679 ABBREV_TAC` yy = y - v0:real^3`;
681 EXISTS_TAC` t3:real`;
683 UNDISCH_TAC` arcV v0 u x = arcV v0 u (y:real^3)`;
684 NHANH (MESON[]`arcV v0 u x = arcV v0 u y ==> cos (arcV v0 u x) = cos (arcV v0 u y)`);
685 ASSUME_TAC2 (ISPECL [`v0:real^3`;`u:real^3`;` x:real^3`]
686 Collect_geom.NOT_COL3_IMP_DIFF);
687 ASSUME_TAC2 (ISPECL [`v0:real^3`;`u:real^3`;` y:real^3`]
688 Collect_geom.NOT_COL3_IMP_DIFF);
690 REWRITE_TAC[DE_MORGAN_THM];
691 ASM_SIMP_TAC[Trigonometry2.NOT_EQ_IMPCOS_ARC];
693 STRIP_TAC THEN STRIP_TAC;
694 SUBGOAL_THEN` &0 < norm (xx:real^3) /\ &0 < norm (uu:real^3) /\
695 &0 < norm (yy:real^3)` MP_TAC;
696 REWRITE_TAC[NORM_POS_LT];
700 REWRITE_TAC[VECTOR_SUB_EQ];
704 ASM_SIMP_TAC[REAL_LT_IMP_LE];
706 SUBGOAL_THEN` normize (xx:real^3) = normize (yy:real^3)` MP_TAC;
707 MATCH_MP_TAC (GEN_ALL ARCV_EQ_IMP_NORMIZE);
708 EXISTS_TAC` uu:real^3`;
710 UNDISCH_TAC` ~collinear {v0, u, y:real^3}`;
711 ONCE_REWRITE_TAC[Trigonometry2.COLLINEAR_TRANSABLE];
712 NHANH_PAT`\x. x ==> y` COLL_AFF_GT_2_1;
715 REWRITE_TAC[IN_ELIM_THM];
716 EXISTS_TAC` t1:real`;
717 EXISTS_TAC` t2:real`;
718 EXISTS_TAC` t3:real`;
719 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
722 UNDISCH_TAC` ~ collinear {v0, u, y:real^3}`;
723 UNDISCH_TAC` arcV v0 u x = arcV v0 u (y:real^3)`;
724 ONCE_REWRITE_TAC[Trigonometry2.ARCV_VEC0_FORM];
725 ONCE_REWRITE_TAC[Trigonometry2.COLLINEAR_TRANSABLE];
726 ASM_SIMP_TAC[VECTOR_SUB_RZERO];
730 ASM_REWRITE_TAC[normize; VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC];
731 ONCE_REWRITE_TAC[VECTOR_ARITH` a + x % b = y % b <=> a + (x - y) % b = vec 0`];
733 ASM_CASES_TAC` ~( (&1 / norm (t2 % uu + t3 % (yy:real^3)) * t2) = &0)`;
735 SUBGOAL_THEN` collinear {vec 0, uu, yy:real^3}` MP_TAC;
736 REWRITE_TAC[COLL_EQ_DEPENDENT];
737 DOWN THEN DOWN THEN MESON_TAC[];
741 UNDISCH_TAC` ~ collinear {v0, u, y:real^3}`;
742 ONCE_REWRITE_TAC[Trigonometry2.COLLINEAR_TRANSABLE];
743 ASM_SIMP_TAC[VECTOR_SUB_RZERO];
748 SIMP_TAC[REAL_ENTIRE];
749 ASSUME_TAC2 (REAL_FIELD` &0 < norm (xx:real^3) ==> ~( &1 / norm xx = &0) `);
751 ASM_SIMP_TAC[VECTOR_MUL_LZERO; REAL_SUB_REFL; VECTOR_ADD_LID]]);;
759 let NORM_CAUCHY_SCHWARZ_FRAC2 = prove(` -- &1 <= (u dot v) / (norm u * norm v) /\
760 (u dot v) / (norm u * norm (v:real^N)) <= &1 `,
761 ASM_CASES_TAC`~((u:real^N) = vec 0) /\ ~((v: real^N) = vec 0)` THEN
762 ASM_SIMP_TAC[Trigonometry1.NORM_CAUCHY_SCHWARZ_FRAC] THEN
763 DOWN THEN REWRITE_TAC[DE_MORGAN_THM] THEN STRIP_TAC THENL [
764 ASM_REWRITE_TAC[DOT_LZERO] THEN REAL_ARITH_TAC;
765 ASM_REWRITE_TAC[DOT_RZERO] THEN REAL_ARITH_TAC]);;
768 let COS_ARCV_EQ_ARCV = prove(
769 ` cos (arcV x y z) = cos (arcV xx yy zz) <=> arcV x y z = arcV xx yy zz `,
770 EQ_TAC THENL [REWRITE_TAC[arcV] THEN STRIP_TAC THEN MATCH_MP_TAC COS_INJ_PI THEN
771 DOWN THEN MESON_TAC[ACS_BOUNDS; NORM_CAUCHY_SCHWARZ_FRAC2];SIMP_TAC[]]);;
775 let ARCV_BOUNDS = prove(` &0 <= arcV (x:real^N) y z /\ arcV x y z <= pi `,
776 REWRITE_TAC[arcV] THEN MATCH_MP_TAC ACS_BOUNDS THEN
777 REWRITE_TAC[NORM_CAUCHY_SCHWARZ_FRAC2]);;
783 let SIN_ARCV_EQ_0_EQ_LAP = prove(
784 ` sin (arcV x y (z:real^N)) = &0 <=> arcV x y z = &0 \/ arcV x y z = pi `,
785 MP_TAC ARCV_BOUNDS THEN MP_TAC PI_POS THEN
786 MESON_TAC[REAL_ARITH` &0 < x /\ &0 <= a ==> -- x < a`; Trigonometry1.SIN_NEGPOS_PI]);;
793 let ORTHONORMAL_NOT_COLLINEAR = prove(
794 ` orthonormal e1 e2 e3 ==> ~ collinear {vec 0, e3, e1} `,
795 REWRITE_TAC[orthonormal; GSYM CROSS_EQ_0] THEN
796 ONCE_REWRITE_TAC[GSYM CROSS_TRIPLE] THEN REPEAT STRIP_TAC THEN
797 FIRST_X_ASSUM SUBST_ALL_TAC THEN DOWN THEN
798 REWRITE_TAC[DOT_LZERO; REAL_LT_REFL]);;
803 let LUNAR_DEFORM_INJ = prove_by_refinement (
804 ` orthonormal e1 e2 e3 /\ &0 <= t /\ t < &1 ==>
805 (! x y. lunar_deform (e1,e2,e3) t x = lunar_deform (e1,e2,e3) t y ==> x = y )`,
807 ASM_CASES_TAC` (x:real^3) = vec 0`;
808 ASSUME_TAC2 (SPEC` y:real^3 ` (GEN `x:real^3 ` LUNAR_DEFORM_PRESERVE_NORM));
809 ASSUME_TAC2 LUNAR_DEFORM_PRESERVE_NORM;
812 ASM_SIMP_TAC[NORM_0; NORM_EQ_0];
816 NHANH_PAT`\a. a ==> b ` (MESON[]` a = b ==> norm a = norm b `);
817 ASM_SIMP_TAC[LUNAR_DEFORM_PRESERVE_NORM];
818 REWRITE_TAC[lunar_deform];
819 ASM_SIMP_TAC[ORTHONORMAL_IMP_INDEPENDENT_EXPLICIT; GSYM NORM_POS_LT];
821 UNDISCH_TAC` norm (x:real^3) * cos (arcV (vec 0) e3 x) = norm y * cos (arcV (vec 0) e3 (y:real^3))`;
822 ASM_SIMP_TAC[REAL_EQ_MUL_LCANCEL; REAL_POS_NZ; COS_ARCV_EQ_ARCV];
824 ASM_CASES_TAC` sin (arcV (vec 0) e3 (x:real^3)) = &0`;
828 NHANH (REWRITE_RULE[CONTRAPOS_THM] Trigonometry2.NOT_COLLINEAR_IMP_NOT_SIN0);
830 NHANH (REWRITE_RULE[CONTRAPOS_THM] Trigonometry2.NOT_COLLINEAR_IMP_NOT_SIN0);
831 REWRITE_TAC[COLLINEAR_LEMMA_ALT];
832 SUBGOAL_THEN` ~(e3:real^3 = vec 0) ` MP_TAC;
833 UNDISCH_TAC` orthonormal e1 e2 e3`;
834 REWRITE_TAC[orthonormal];
836 FIRST_X_ASSUM SUBST_ALL_TAC;
837 UNDISCH_TAC` vec 0 dot (vec 0: real^3) = &1`;
838 REWRITE_TAC[DOT_LZERO];
840 SIMP_TAC[SIN_ARCV_EQ_0_EQ_LAP];
841 STRIP_TAC THEN STRIP_TAC;
843 SUBGOAL_THEN` arcV (vec 0) e3 (x:real^3) = &0` MP_TAC;
845 UNDISCH_TAC` arcV (vec 0) e3 (y:real^3) = &0`;
847 UNDISCH_TAC` ~( (e3:real^3) = vec 0) `;
849 SIMP_TAC[ARCV_ORI_DIRECTIONS];
851 UNDISCH_TAC` norm (x:real^3) = norm (y:real^3)`;
852 ASM_SIMP_TAC[NORM_MUL; Trigonometry2.LT_IMP_ABS_REFL; REAL_EQ_MUL_RCANCEL; NORM_EQ_0];
854 SUBGOAL_THEN` arcV (vec 0) e3 (x:real^3) = pi` MP_TAC;
856 UNDISCH_TAC` arcV (vec 0) e3 (y:real^3) = pi`;
858 UNDISCH_TAC` ~( (e3:real^3) = vec 0) `;
860 SIMP_TAC[ARCV_ORI_DIRECTIONS];
862 UNDISCH_TAC` norm (x:real^3) = norm (y:real^3)`;
863 ASM_REWRITE_TAC[NORM_MUL];
864 ONCE_REWRITE_TAC[GSYM REAL_ABS_NEG];
866 REWRITE_TAC[REAL_ARITH` a < &0 <=> &0 < -- a `];
867 ASM_SIMP_TAC[NORM_MUL; Trigonometry2.LT_IMP_ABS_REFL; REAL_EQ_MUL_RCANCEL; NORM_EQ_0];
868 SIMP_TAC[REAL_ARITH` -- a = -- b <=> a = b `];
870 UNDISCH_TAC` norm x *
871 sin ((&1 - t) * azim (vec 0) e3 e1 x) *
872 sin (arcV (vec 0) e3 x) =
874 sin ((&1 - t) * azim (vec 0) e3 e1 y) *
875 sin (arcV (vec 0) e3 y)`;
876 UNDISCH_TAC` norm x *
877 cos ((&1 - t) * azim (vec 0) e3 e1 x) *
878 sin (arcV (vec 0) e3 x) =
880 cos ((&1 - t) * azim (vec 0) e3 e1 y) *
881 sin (arcV (vec 0) e3 y)`;
883 ASM_SIMP_TAC[REAL_EQ_MUL_RCANCEL; REAL_EQ_MUL_LCANCEL; REAL_POS_NZ];
885 SUBGOAL_THEN` (&1 - t) * azim (vec 0) e3 e1 x = (&1 - t) * azim (vec 0) e3 e1 y` MP_TAC;
886 MATCH_MP_TAC SIN_COS_INJ;
888 MATCH_MP_TAC (REAL_FIELD` &0 <= x /\ x < a /\ &0 <= y /\ y < a ==> abs ( x - y) < a `);
889 SPEC_TAC (`x:real^3`,`x:real^3`);
890 SPEC_TAC (`y:real^3`,`y:real^3`);
892 MATCH_MP_TAC (MESON[]`(! x. P x /\ L x ) ==> (! y x. P x /\ L x /\ P y /\ L y)`);
895 MATCH_MP_TAC REAL_LE_MUL;
896 REWRITE_TAC[AZIM_RANGE];
897 UNDISCH_TAC` t < &1 ` THEN REAL_ARITH_TAC;
898 REWRITE_TAC[REAL_SUB_RDISTRIB; REAL_MUL_LID];
900 REAL_FIELD` azim (vec 0) e3 e1 x' < &2 * pi /\ &0 <= t * azim (vec 0) e3 e1 x'
901 ==> azim (vec 0) e3 e1 x' - t * azim (vec 0) e3 e1 x' < &2 * pi`);
902 REWRITE_TAC[AZIM_RANGE];
903 MATCH_MP_TAC REAL_LE_MUL;
904 ASM_REWRITE_TAC[AZIM_RANGE];
906 ASM_SIMP_TAC[REAL_EQ_MUL_LCANCEL; REAL_ARITH` t < a ==> ~( a - t = &0)`];
907 ASSUME_TAC2 ORTHONORMAL_NOT_COLLINEAR;
910 SPECL[`e1:real^3`;`e3:real^3`;`x:real^3`;`y:real^3`;` vec 0:real^3`]
911 (GEN_ALL AZIM_AND_ARCV_EQ_IMP_PARA));
913 ASM_SIMP_TAC[GSYM NORM_EQ_0; REAL_POS_NZ; VECTOR_SUB_RZERO];
916 UNDISCH_TAC` norm (x:real^3) = norm (y:real^3)`;
917 ASM_SIMP_TAC[NORM_MUL; REAL_ARITH` a * x = x <=> ( a - &1 ) * x = &0`; REAL_ENTIRE; REAL_POS_NZ];
918 UNDISCH_TAC` &0 <= t'`;
919 SIMP_TAC[GSYM REAL_ABS_REFL; REAL_SUB_0; VECTOR_MUL_LID]]);;
925 let GRAPH_IMAGE_IMAGE = prove_by_refinement (
926 `graph E /\ (! x y. (f:real^N -> real^M) x = f y ==> x = y)
927 ==> graph (IMAGE (IMAGE f) E)`,
928 [REWRITE_TAC[graph; HAS_SIZE_2_EXISTS; IMAGE; IN_ELIM_THM; IN];
932 EXISTS_TAC` (f:real^N -> real^M) x' `;
933 EXISTS_TAC` (f:real^N -> real^M) y `;
937 ASM_REWRITE_TAC[IN_ELIM_THM];
945 let LUNAR_DEFORM_ORIGIN = prove(` lunar_deform (e1,e2,e3) t (vec 0) = vec 0`,
946 REWRITE_TAC[lunar_deform; NORM_0; REAL_MUL_LZERO; VECTOR_MUL_LZERO;
953 let orthonormal1 = prove(`!e1 e2 e3.
954 orthonormal e1 e2 e3 <=>
961 &0 < (e1 cross e2) dot e3 `,
962 REWRITE_TAC[orthonormal; NORM_EQ_1]);;
970 let ORTHO_SPHERICAL_AZIM = prove_by_refinement(`orthonormal e1 e2 e3 /\
971 x = ( r * cos theta) % e1 + (r * sin theta) % e2 + h % e3 /\
973 &0 <= theta /\ theta < &2 * pi
974 ==> azim (vec 0) e3 e1 x = theta `,
976 MP_TAC (ISPECL [` vec 0:real^3 `;` e3: real^3 `;` e1: real^3 `;` x:real^3 `;` &0 `;
977 `h:real`;` &1 `;` r:real`;` e1:real^3 `;` e2: real^3`;` e3:real^3`;` &0`;
978 `theta: real`] AZIM_UNIQUE);
980 ASM_REWRITE_TAC[VECTOR_SUB_RZERO; dist; SIN_0; COS_0; REAL_ADD_LID;
981 VECTOR_MUL_LZERO; REAL_MUL_RZERO; VECTOR_ADD_RID; REAL_MUL_RID; VECTOR_MUL_LID];
982 REWRITE_TAC[REAL_ARITH` &0 < &1 `];
984 SIMP_TAC[orthonormal1; VECTOR_MUL_LID; GSYM NORM_EQ_0; REAL_ARITH` ~(&1 = &0)`];
991 let COS_ARCV = prove_by_refinement(`cos (arcV v0 u (w:real^N)) =
992 ((u - v0) dot (w - v0)) / (norm (u - v0) * norm (w - v0))`,
993 [ASM_CASES_TAC` ~(v0 = u) /\ ~(v0 = w:real^N)`;
994 DOWN THEN REWRITE_TAC[Trigonometry2.NOT_EQ_IMPCOS_ARC]; DOWN;
995 REWRITE_TAC[DE_MORGAN_THM]; STRIP_TAC;
996 ASM_SIMP_TAC[VECTOR_SUB_REFL; arcV; DOT_LZERO; REAL_ARITH` &0 / x = &0`; ACS_0;
998 ASM_SIMP_TAC[VECTOR_SUB_REFL; arcV; DOT_RZERO; REAL_ARITH` &0 / x = &0`; ACS_0;
1006 let LUNAR_DEFORM_ARCV_PRESERVED = prove(`orthonormal e1 e2 e3 ==>
1007 arcV (vec 0) e3 x = arcV (vec 0) e3 (lunar_deform (e1,e2,e3) t x) `,
1008 ASM_CASES_TAC` (x:real^3) = vec 0 ` THENL [
1009 ASM_REWRITE_TAC[LUNAR_DEFORM_ORIGIN];
1010 SIMP_TAC[LUNAR_DEFORM_PRESERVE_NORM; arcV; orthonormal; VECTOR_SUB_RZERO] THEN
1011 SIMP_TAC[lunar_deform; DOT_RADD; DOT_RMUL; DOT_SYM; REAL_MUL_RZERO; REAL_ADD_LID; REAL_MUL_RID; COS_ARCV; VECTOR_SUB_RZERO; GSYM NORM_EQ_1; REAL_MUL_LID] THEN
1012 DOWN THEN SIMP_TAC[GSYM NORM_EQ_0; REAL_FIELD` ~( a = &0) ==> a * b / a = b`; NORM_EQ_1; REAL_MUL_RID]]);;
1016 (* ========================================================================= *)
1017 (* ========================================================================= *)
1021 Local_lemmas.LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;;
1022 Local_lemmas.interior_angle1;;
1023 Wrgcvdr_cizmrrh.lunar;;
1024 Local_lemmas.HKIRPEP;;
1026 (* because interior_angle1 (vec 0) FF v <= pi and
1027 interior_angle1 x FF v = azim x v (rho_node1 FF v) (@a. a,v IN FF)
1028 , the condition theta (ivs_rho_node1 FF v) <= &0
1029 is satisfied automatically *)
1032 g ` convex_local_fan (V,E,FF) /\ lunar (v,w) V E /\
1033 orthonormal e1 e2 e3 /\ v = a % e3 /\ &0 < a /\
1034 rho_node1 FF v IN aff_gt {vec 0, e3} {e1} /\
1035 lunar_deform (e1,e2,e3) t = f /\ &0 <= t /\ t < &1
1037 convex_local_fan (IMAGE f V, IMAGE (\S. IMAGE f S) E, IMAGE (\ (m,n). f m, f n) FF)
1039 lunar (v,w) (IMAGE f V) (IMAGE (\S. IMAGE f S) E) /\
1040 CARD (IMAGE f V) = CARD V`;;
1045 g ` convex_local_fan (V,E,FF) /\ lunar (v,w) V E /\
1046 orthonormal e1 e2 e3 /\ v = a % e3 /\ &0 < a /\
1047 rho_node1 FF v IN aff_gt {vec 0, e3} {e1} /\
1048 lunar_deform (e1,e2,e3) t = f /\ &0 <= t /\ t < &1
1049 ==> FAN (vec 0,IMAGE f V,IMAGE ( IMAGE f ) E) `;;
1050 e (REWRITE_TAC[convex_local_fan]);;
1051 e (NHANH Local_lemmas.LOCAL_FAN_ORBIT_MAP_V);;
1052 e (REWRITE_TAC[local_fan; FAN]);;
1056 e (UNDISCH_TAC` UNIONS E SUBSET (V:real^3 -> bool) `);;
1057 e (REWRITE_TAC[GSYM IMAGE_UNIONS]);;
1061 e (MATCH_MP_TAC GRAPH_IMAGE_IMAGE);;
1062 e (ASM_REWRITE_TAC[]);;
1063 e (EXPAND_TAC "f");;
1064 e (MATCH_MP_TAC LUNAR_DEFORM_INJ);;
1065 e (ASM_REWRITE_TAC[]);;
1067 e (REWRITE_TAC[fan1; fan2; fan6; fan7]);;
1070 e (UNDISCH_TAC` fan1 ((vec 0:real^3),(V:real^3 -> bool),(E:(real^3 -> bool) -> bool))`);;
1071 e (REWRITE_TAC[fan1]);;
1072 e (SIMP_TAC[FINITE_IMAGE]);;
1074 e (ASSUME_TAC2 LUNAR_DEFORM_INJ);;
1077 e (UNDISCH_TAC` fan2 (vec 0,V: real^3 -> bool,(E:(real^3 -> bool) -> bool)) `);;
1078 e (REWRITE_TAC[fan2]);;
1080 e (MP_TAC LUNAR_DEFORM_ORIGIN);;
1081 e (ASM_REWRITE_TAC[IN_IMAGE]);;
1086 e (UNDISCH_TAC` fan6 (vec 0,V:real^3 -> bool,E:(real^3 -> bool) -> bool ) `);;
1087 e (REWRITE_TAC[IN_IMAGE; IMAGE; fan6]);;
1089 e (FIRST_ASSUM NHANH);;
1091 e (MP_TAC Local_lemmas.HKIRPEP);;
1093 e (ASM_REWRITE_TAC[convex_local_fan; local_fan]);;
1094 e (CONV_TAC (ONCE_DEPTH_CONV let_CONV));;
1095 e (SWITCH_TAC ` FF = face H (x:real^3 # real^3 )`);;
1096 e (ASM_REWRITE_TAC[FAN; fan6]);;
1097 e (EXISTS_TAC `x:(real^3 #real^3)`);;
1098 e (ASM_REWRITE_TAC[]);;
1100 e (UNDISCH_TAC` graph (E: (real^3 -> bool) -> bool) `);;
1101 e (REWRITE_TAC[graph]);;
1103 e (UNDISCH_TAC`(x': real^3 -> bool) IN E `);;
1104 e (REWRITE_TAC[IN]);;
1105 e (FIRST_ASSUM NHANH);;
1106 e (REWRITE_TAC[HAS_SIZE]);;
1107 e (NHANH Rogers.CARD_2_IMP_DOUBLE);;
1110 e (UNDISCH_TAC` v = ITER j (rho_node1 FF) w`);;
1111 e (USE_FIRST `w = ITER i (rho_node1 FF) v` (fun x -> REWRITE_TAC[x; ITER_ADD]));;
1112 e (ASSUME_TAC2 (ARITH_RULE` ~(j = 0) ==> 0 < j + i `));;
1114 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
1115 e (NHANH Lvducxu.ITER_CYCLIC_ORBIT);;
1119 ` special_fan (V,E,FF,S) <=>
1121 V SUBSET ball (vec 0, &1) /\
1122 convex_local_fan (V,E,FF) /\
1124 (! v w. {v,w} IN S ==> dist (v,w) = &2 * t0 ) /\
1125 (! v w. {v,w} IN E ==> dist (v,w) <= &2 * t0 ) /\
1127 v IN V /\ w IN V /\ ~( v = w ) /\ ~( {v,w} IN E )
1128 ==> &2 * t0 <= dist (v,w)) /\
1129 let r = CARD E - CARD S in
1131 3 - CARD S <= r /\ r <= 6 - 2 * (CARD S)`;;
1134 (* ================================================== *)
1142 let AFF_CONV0_INTERSECTION_LEMMA = prove_by_refinement
1143 (`! u x y (z:real^3).
1144 coplanar {u,x,y,z} /\
1145 ~ collinear {u,x,y} /\
1146 ~ collinear {u,y,z} /\
1148 ==> ~ ( aff {u,x} INTER conv0 {y,z} = {} /\
1149 aff {u,y} INTER conv0 {x,z} = {} /\
1150 aff {u,z} INTER conv0 {x,y} = {} ) `,
1151 [REWRITE_TAC[coplanar];
1153 SUBGOAL_THEN` affine hull {u', v, w} = affine hull {u,x,y:real^3}` MP_TAC;
1154 MATCH_MP_TAC Local_lemmas.SUBSET_NOT_COLLINEAR_AFFINE_HULL_EQ;
1156 MATCH_MP_TAC SUBSET_TRANS;
1157 EXISTS_TAC` {u,x,y,z:real^3}` ;
1158 ASM_REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET];
1160 SUBGOAL_THEN` {z:real^3} SUBSET affine hull {u', v, w} ` MP_TAC;
1161 MATCH_MP_TAC SUBSET_TRANS;
1162 EXISTS_TAC` {u,x,y,z:real^3}`;
1163 ASM_REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET];
1165 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; AFFINE_HULL_3; IN_ELIM_THM];
1167 ASM_CASES_TAC` &0 < v' /\ &0 < w' `;
1168 ABBREV_TAC` tt = &0 % u + &1 % (z:real^3) `;
1169 SUBGOAL_THEN` (?tt. tt IN aff {u, z:real^3} /\ tt IN conv0 {x, y})` MP_TAC;
1170 MATCH_MP_TAC (GEN_ALL Local_lemmas.CONDS_FOR_INTER_AFF_CONV0);
1171 EXISTS_TAC` u'': real` ;
1172 EXISTS_TAC` v': real `;
1173 EXISTS_TAC` w': real`;
1175 EXISTS_TAC` tt: real^3 `;
1178 ASM_REWRITE_TAC[REAL_ADD_LID];
1180 REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO; VECTOR_ADD_LID];
1182 UNDISCH_TAC` aff {u, z} INTER conv0 {x, y:real^3} = {}`;
1183 REWRITE_TAC[Local_lemmas.INTER_EQ_EM_EXPAND];
1186 SPEC_TAC (`v':real`,`v':real`);
1187 SPEC_TAC (`w':real`,`w':real`);
1188 SPEC_TAC (`x:real^3`,` x:real^3 `);
1189 SPEC_TAC (`y:real^3`,` y:real^3`);
1190 MATCH_MP_TAC (MESON[REAL_ARITH` a <= b \/ b <= a`]` (! y x b a. P y x b a
1191 ==> P x y a b) /\ (! y x b a. b <= a ==> P y x b a) ==>
1192 (! y x b a. P y x b a) `);
1193 SIMP_TAC[INSERT_COMM; REAL_ADD_SYM; VECTOR_ADD_SYM; CONJ_SYM];
1198 ASM_CASES_TAC` &0 < w' `;
1199 UNDISCH_TAC` w' <= v':real`;
1200 DOWN THEN DOWN THEN PHA;
1203 ASM_CASES_TAC` w' = &0 `;
1204 FIRST_X_ASSUM SUBST_ALL_TAC;
1206 REWRITE_TAC[REAL_ADD_RID; VECTOR_MUL_LZERO; VECTOR_ADD_RID;
1207 Local_lemmas.collinear_fan22; Collect_geom.AFF_2POINTS_INTERPRET;
1210 UNDISCH_TAC` z = u'' % u + v' % (x:real^3)`;
1211 UNDISCH_TAC` u'' + v' = &1 `;
1212 UNDISCH_TAC` ~((?ta tb. ta + tb = &1 /\ z = ta % u + tb % x) \/ u = (x:real^3))`;
1215 ASM_CASES_TAC` v' = &0 `;
1216 FIRST_X_ASSUM SUBST_ALL_TAC;
1218 REWRITE_TAC[REAL_ADD_LID; VECTOR_MUL_LZERO; VECTOR_ADD_LID;
1219 Local_lemmas.collinear_fan22; Collect_geom.AFF_2POINTS_INTERPRET;
1225 REWRITE_TAC[REAL_ARITH` a = &0 <=> ~( &0 < a \/ a < &0 )`];
1227 UNDISCH_TAC` z = u'' % u + v' % x + w' % (y:real^3)`;
1228 PURE_ONCE_REWRITE_TAC[VECTOR_ARITH` z = a % x + b + w' % (y:real^N) <=>
1229 b = ( -- a) % x + ( -- w') % y + &1 % z `];
1231 SUBGOAL_THEN` (?tt. tt IN aff {u, x:real^3} /\ tt IN conv0 {y, z})` MP_TAC;
1232 MATCH_MP_TAC (GEN_ALL Local_lemmas.CONDS_FOR_INTER_AFF_CONV0);
1233 EXISTS_TAC` -- u'':real `;
1234 EXISTS_TAC` -- w':real `;
1236 EXISTS_TAC` v': real `;
1237 EXISTS_TAC` v' % x:real^3 `;
1239 EXISTS_TAC` v':real`;
1240 ASM_REWRITE_TAC[REAL_ARITH` &0 < &1 `; REAL_ADD_LID; VECTOR_MUL_LZERO;
1243 UNDISCH_TAC` aff {u, x} INTER conv0 {y, z:real^3} = {}`;
1244 REWRITE_TAC[Local_lemmas.INTER_EQ_EM_EXPAND];
1249 UNDISCH_TAC` z = u'' % u + v' % x + w' % (y:real^3)`;
1250 PURE_ONCE_REWRITE_TAC[VECTOR_ARITH` z = u'' % u + v' % x + w' % y <=>
1251 -- z = ( -- u'') % u + ( -- v') % x + ( -- w') % y `];
1253 SUBGOAL_THEN` (?tt. tt IN aff {u, z:real^3} /\ tt IN conv0 {x, y})` MP_TAC;
1254 MATCH_MP_TAC (GEN_ALL Local_lemmas.CONDS_FOR_INTER_AFF_CONV0);
1255 EXISTS_TAC` -- u'':real `;
1256 EXISTS_TAC` -- v':real `;
1257 EXISTS_TAC` -- w' `;
1258 EXISTS_TAC` -- &1 `;
1259 EXISTS_TAC` -- z :real^3 `;
1262 ASM_REWRITE_TAC[REAL_ADD_LID; VECTOR_MUL_LZERO; VECTOR_ADD_LID];
1263 ASM_REWRITE_TAC[VECTOR_ARITH` -- &1 % x = -- (x:real^N)`];
1265 UNDISCH_TAC` aff {u, z} INTER conv0 {x, y:real^3} = {}`;
1266 REWRITE_TAC[Local_lemmas.INTER_EQ_EM_EXPAND]]);;
1276 let CVLF_COLLINEAR_CIRCULAR_LUNAR = prove(
1277 ` convex_local_fan (V,E,FF) /\ {v,w} SUBSET V /\ collinear {vec 0, v, w} /\
1278 ~ (v = w) ==> circular V E \/ lunar (v,w) V E `,
1279 ASM_CASES_TAC` circular (V:real^3 -> bool) E` THENL [
1280 ASM_REWRITE_TAC[]; STRIP_TAC THEN DISJ2_TAC THEN
1281 REWRITE_TAC[lunar] THEN ASM_REWRITE_TAC[]]);;
1287 let CVLF_FLAT_ANGLE_LEMMA = prove_by_refinement(
1288 ` convex_local_fan (V,E,FF) /\
1290 collinear {vec 0, v, w} /\
1292 ! z. z IN V /\ ~( z = v ) /\ ~( z = w ) ==>
1293 interior_angle1 (vec 0) FF z = pi `,
1294 [NHANH CVLF_COLLINEAR_CIRCULAR_LUNAR;
1296 ASSUME_TAC2 Local_lemmas.KCHMAMG;
1298 DISCH_TAC THEN REMOVE_TAC;
1300 ASSUME_TAC2 Local_lemmas.HKIRPEP;
1302 SIMP_TAC[IN_DIFF; IN_INSERT; DE_MORGAN_THM; NOT_IN_EMPTY]]);;
1307 (* ============================================================== *)
1312 let TOW_REAL_EXISTS_COMBINED = prove_by_refinement
1313 (` (? e1. &0 < e1 /\ (! t. -- e1 < t /\ t < e1 ==> P t )) /\
1314 (? e1. &0 < e1 /\ (! t. -- e1 < t /\ t < e1 ==> Q t ))
1315 ==> (? e1. &0 < e1 /\ (! t. -- e1 < t /\ t < e1 ==> P t /\ Q t ))`,
1317 ASM_CASES_TAC` e1 < e1':real `;
1318 EXISTS_TAC` e1:real `;
1322 SUBGOAL_THEN` -- e1' < -- (e1:real) ` MP_TAC;
1325 ASM_MESON_TAC[REAL_LT_TRANS];
1327 EXISTS_TAC` e1':real`;
1331 SUBGOAL_THEN` ~(-- e1' < -- e1:real) ` MP_TAC;
1334 ASM_MESON_TAC[REAL_ARITH` ~( a < b) /\ a < c ==> b < (c:real) `]]);;
1343 let CONTINUOUS_FUNS_DISTINCT_POINTS = prove_by_refinement
1344 (`f continuous atreal r /\ g continuous atreal rr /\ ~ ((f:real -> real^N) r = g rr)
1346 (! x y. abs (x - r) < d /\ abs ( y - rr) < d ==> ~( f x = g y) )`,
1347 [REWRITE_TAC[continuous_atreal];
1349 FIRST_X_ASSUM (MP_TAC o (SPEC` dist ((f:real -> real^N) r, g (rr:real)) / &2`));
1350 FIRST_X_ASSUM (MP_TAC o (SPEC` dist ((f:real -> real^N) r, g (rr:real)) / &2`));
1351 SUBGOAL_THEN` &0 < dist ((f:real -> real^N) r,g (rr:real)) / &2 ` ASSUME_TAC;
1352 ASM_REWRITE_TAC[REAL_ARITH` &0 < a / &2 <=> &0 < a `; GSYM DIST_NZ];
1355 FIRST_ASSUM ACCEPT_TAC;
1359 FIRST_ASSUM ACCEPT_TAC;
1362 EXISTS_TAC` min d d' `;
1363 ASM_REWRITE_TAC[REAL_LT_MIN];
1364 FIRST_X_ASSUM NHANH;
1365 FIRST_X_ASSUM NHANH;
1368 MP_TAC (SPECL [` (f:real -> real^N) r`; `(f:real -> real^N) x`;
1369 `(g:real -> real^N) rr `] DIST_TRIANGLE);
1370 MP_TAC (SPECL [` (f:real -> real^N) x`; `(g:real -> real^N) y`;
1371 `(g:real -> real^N) rr `] DIST_TRIANGLE);
1373 NHANH (REAL_ARITH` a <= b + c /\ x <= y + a ==> x - y - c <= b `);
1376 SUBGOAL_THEN` &0 < dist ((f:real -> real^N) x,(g:real -> real^N) y)` MP_TAC;
1378 MATCH_MP_TAC (REAL_ARITH` &0 < b ==> b <= a ==> &0 < a `);
1379 MATCH_MP_TAC (REAL_ARITH` a < x / &2 /\ b < x / &2 ==> &0 < x - a - b `);
1380 UNDISCH_TAC` dist ((f:real -> real^N) x,f (r:real)) < dist ((f:real ->
1381 real^N) r,g (rr:real)) / &2`;
1382 ASM_REWRITE_TAC[DIST_SYM];
1384 ASM_REWRITE_TAC[GSYM DIST_NZ]]);;
1389 let CONTINUOUS_TWO_POINTS_DISTINCT =
1390 MESON[CONTINUOUS_FUNS_DISTINCT_POINTS]
1391 ` ff (v1:real^N) continuous atreal r /\ ff v2 continuous atreal r /\
1392 ~(ff v1 r = ff v2 r ) ==>
1394 (! t. abs ( t - r ) < d ==> ~( ff v1 t = ((ff v2 t ):real^M))) `;;
1401 let CONTINUOUS_FUN_DISTINCT_FINITE_SET = prove_by_refinement
1402 (`! V. FINITE (V:real^N -> bool) ==>
1403 (! v1. v1 IN V /\ ~( v0 = v1) ==> ~ (ff v0 r = ff v1 r)) /\
1404 (! v. v IN v0 INSERT V ==> ff v continuous atreal r )
1406 (! t. abs (t - r) < d ==>
1407 (! v1. v1 IN V /\ ~(v0 = v1 ) ==>
1408 ~( ff v0 t = ((ff v1 t):real^M))))`,
1409 [MATCH_MP_TAC FINITE_INDUCT_STRONG;
1410 REWRITE_TAC[NOT_IN_EMPTY];
1418 UNDISCH_TAC` (!v1. (v1:real^N) IN V /\ ~(v0 = v1) ==> ~((ff v0 r):real^M = ff v1 r)) /\
1419 (!v. v IN v0 INSERT V ==> ff v continuous atreal r)
1421 (!t. abs (t - r) < d
1422 ==> (!v1. v1 IN V /\ ~(v0 = v1) ==> ~(ff v0 t = ff v1 t)))) `;
1424 DOWN THEN DOWN THEN PHA;
1425 SIMP_TAC[IN_INSERT];
1429 ASM_CASES_TAC` v0 = x:real^N `;
1430 EXISTS_TAC` d:real `;
1431 ASM_REWRITE_TAC[IN_INSERT];
1432 DOWN THEN DOWN THEN PHA;
1434 SUBGOAL_THEN` ff (v0:real^N) continuous atreal r /\
1435 ff x continuous atreal r /\
1436 ~(ff v0 r = (ff x r):real^M) ` MP_TAC;
1438 REWRITE_TAC[IN_INSERT];
1441 NHANH CONTINUOUS_TWO_POINTS_DISTINCT;
1443 EXISTS_TAC` min d d'`;
1444 ASM_REWRITE_TAC[REAL_LT_MIN; IN_INSERT];
1453 let CONTINUOUS_ATREAL_INJ_PRESERVED = prove_by_refinement
1454 (`! V. FINITE (V:real^N -> bool) ==>
1455 (! v1 v2. v1 IN V /\ v2 IN V /\ ~( v1 = v2) ==> ~ (ff v1 r = ff v2 r)) /\
1456 (! v. v IN V ==> ff v continuous atreal r )
1458 (! t. abs (t - r) < d ==>
1459 (! v1 v2. v1 IN V /\ v2 IN V /\ ~(v1 = v2 ) ==>
1460 ~( ff v1 t = ((ff v2 t):real^M))))`,
1461 [MATCH_MP_TAC FINITE_INDUCT_STRONG;
1462 REWRITE_TAC[NOT_IN_EMPTY];
1468 SUBGOAL_THEN` (!v1 v2. (v1:real^N) IN V /\ v2 IN V /\ ~(v1 = v2) ==> ~(ff v1 r = (ff v2 r):real^M)) /\
1469 (!v. v IN V ==> ff v continuous atreal r) ` MP_TAC;
1470 DOWN THEN DOWN THEN PHA;
1471 SIMP_TAC[IN_INSERT];
1474 SUBGOAL_THEN` (?d. &0 < d /\
1475 (!t. abs (t - r) < d
1477 v1 IN V /\ v2 IN V /\ ~(v1 = (v2:real^N))
1478 ==> ~(ff v1 t = (ff v2 t):real^M))))` MP_TAC;
1480 FIRST_X_ASSUM ACCEPT_TAC;
1484 ISPECL [`r:real `;` x:real^N `] (GEN_ALL CONTINUOUS_FUN_DISTINCT_FINITE_SET)));
1487 UNDISCH_TAC `!(v1:real^N) v2.
1488 v1 IN x INSERT V /\ v2 IN x INSERT V /\ ~(v1 = v2)
1489 ==> ~(ff v1 (r:real) = (ff v2 r):real^M) `;
1490 ASM_SIMP_TAC[IN_INSERT];
1493 EXISTS_TAC` min d d' `;
1494 REWRITE_TAC[REAL_LT_MIN];
1496 FIRST_X_ASSUM NHANH;
1498 FIRST_X_ASSUM NHANH;
1499 SIMP_TAC[IN_INSERT];
1508 let CONTINUOUS_ATREAL_DISTINCT = prove_by_refinement
1509 (`ff v continuous atreal r /\ ~((ff: real^N -> real -> real^M) v r = v0)
1510 ==> (?d. &0 < d /\ (!t. abs (t - r) < d ==> ~(ff v t = v0)))`,
1511 [REWRITE_TAC[continuous_atreal; DIST_NZ];
1513 DISCH_THEN (NHANH_PAT`\x. x ==> y `);
1515 EXISTS_TAC` d:real `;
1517 FIRST_X_ASSUM NHANH;
1520 MP_TAC (ISPECL[` (ff:real^N -> real -> real^M ) v r `;`
1521 (ff:real^N -> real -> real^M ) v t `; `v0:real^M `] DIST_TRIANGLE);
1523 REWRITE_TAC[DIST_SYM];
1530 let CONTINUOUS_ATREAL_DISTINCT_FINITE = prove_by_refinement
1531 (`! V. FINITE (V:real^N -> bool)
1532 ==> (!v1. v1 IN V ==> ~(ff v1 r = (v0:real^M))) /\
1533 (!v. v IN V ==> ff v continuous atreal r)
1535 (!t. abs (t - r) < d
1536 ==> (!v1. v1 IN V ==> ~(ff v1 t = v0))))`,
1537 [MATCH_MP_TAC FINITE_INDUCT;
1538 REWRITE_TAC[NOT_IN_EMPTY];
1543 UNDISCH_TAC ` (!v1. (v1:real^N) IN s ==> ~(ff v1 r = (v0:real^M))) /\
1544 (!v. v IN s ==> ff v continuous atreal r)
1546 (!t. abs (t - r) < d ==> (!v1. v1 IN s ==> ~(ff v1 t = v0)))) `;
1549 SIMP_TAC[IN_INSERT];
1551 MP_TAC (SPEC`x:real^N ` (GEN`v:real^N` CONTINUOUS_ATREAL_DISTINCT));
1554 SIMP_TAC[IN_INSERT];
1556 EXISTS_TAC` min d d' `;
1557 ASM_REWRITE_TAC[REAL_LT_MIN];
1558 FIRST_X_ASSUM NHANH;
1560 FIRST_X_ASSUM NHANH;
1561 SIMP_TAC[IN_INSERT];
1569 let REAL_CONTINUOUS_SUM_FUNS = prove_by_refinement
1570 (` f real_continuous at x /\ g real_continuous at x
1571 ==> (\x. f x + g x) real_continuous at x `,
1572 [REWRITE_TAC[real_continuous_at];
1575 PAT_ONCE_REWRITE_TAC`\x. x ==> y `[REAL_ARITH` &0 < a <=> &0 < a / &2 `];
1576 FIRST_X_ASSUM (NHANH_PAT`\x. x ==> y `);
1577 FIRST_X_ASSUM (NHANH_PAT`\x. x /\ z ==> y `);
1579 EXISTS_TAC` min d d' `;
1580 ASM_REWRITE_TAC[REAL_LT_MIN];
1581 FIRST_X_ASSUM NHANH;
1583 FIRST_X_ASSUM NHANH;
1584 STRIP_TAC THEN GEN_TAC;
1588 let REAL_CON_IMP_OPP_FUN_TOO = prove_by_refinement(
1589 ` f real_continuous at (x:real^N) ==> (\x. -- f x) real_continuous at x`,
1590 [REWRITE_TAC[real_continuous_at];
1592 SUBGOAL_THEN` (?d. &0 < d /\ (!x'. dist (x',(x:real^N)) < d ==> abs (f x' - f x) < e))` MP_TAC;
1593 DOWN; ASM_REWRITE_TAC[]; STRIP_TAC; EXISTS_TAC` d:real `;
1594 ASM_REWRITE_TAC[REAL_ARITH` -- x - -- y = -- (x - y ) `; REAL_ABS_NEG]]);;
1597 let REAL_CONTINUOUS_SUB_FUNS = prove(
1598 ` f real_continuous at (x:real^N) /\
1599 g real_continuous at x ==>
1600 (\x. f x - g x) real_continuous at x `,
1601 STRIP_TAC THEN DOWN THEN NHANH_PAT`\x. x ==> y ` REAL_CON_IMP_OPP_FUN_TOO THEN
1602 STRIP_TAC THEN REWRITE_TAC[REAL_ARITH` a - b = a + -- b `] THEN
1603 MATCH_MP_TAC REAL_CONTINUOUS_SUM_FUNS THEN ASM_REWRITE_TAC[]);;
1609 let INV_VNI = prove(` inv x = &1 / x `,
1610 PAT_ONCE_REWRITE_TAC `\x. inv x = y` [REAL_ARITH` x = x / &1 `]
1611 THEN REWRITE_TAC[REAL_INV_DIV]);;
1617 let INV_INEQUAL_GENERAL = prove(
1618 ` &0 < e /\ &0 < x /\ x < y ==> e / y < e / x `,
1619 NHANH REAL_LT_INV2 THEN ONCE_REWRITE_TAC[REAL_ARITH` a / b = a * ( &1 / b ) `]
1620 THEN REWRITE_TAC[INV_VNI] THEN STRIP_TAC THEN MATCH_MP_TAC REAL_LT_LMUL THEN
1621 ASM_REWRITE_TAC[]);;
1627 let REAL_CONTINUOUS_IMP_MUL_FUN = prove_by_refinement
1628 (` f real_continuous at (x:real^N) /\
1629 g real_continuous at x ==>
1630 (\x. (f x) * (g x)) real_continuous at x `,
1631 [REWRITE_TAC[real_continuous_at];
1633 ONCE_REWRITE_TAC[REAL_RING` a * b - x * y = (a - x ) * b + (b - y) * x`];
1640 FIRST_X_ASSUM (MP_TAC o (SPEC` e / (&2 * max (abs (f (x:real^N))) (&1))`));
1642 MATCH_MP_TAC REAL_LT_DIV;
1643 ASM_REWRITE_TAC[REAL_LT_MAX; REAL_ARITH` &0 < &2 * z <=> &0 < z `];
1647 FIRST_X_ASSUM (MP_TAC o (SPEC` e / (&2 * (abs (g (x:real^N)) + e / (&2 * max (abs (f (x:real^N))) (&1))) )`));
1649 MATCH_MP_TAC REAL_LT_DIV;
1650 ASM_REWRITE_TAC[REAL_LT_MAX; REAL_ARITH` &0 < &2 * z <=> &0 < z `];
1651 MATCH_MP_TAC (REAL_ARITH` &0 < x ==> &0 < abs a + x `);
1652 MATCH_MP_TAC REAL_LT_DIV;
1653 ASM_REWRITE_TAC[REAL_LT_MAX; REAL_ARITH` &0 < &2 * z <=> &0 < z `];
1659 EXISTS_TAC `min d d'`;
1660 ASM_REWRITE_TAC[REAL_LT_MIN];
1662 FIRST_X_ASSUM NHANH;
1663 FIRST_X_ASSUM NHANH;
1665 SUBGOAL_THEN` abs (g (x':real^N)) < abs (g x) + e / (&2 * max (abs (f (x:real^N))) (&1))` MP_TAC;
1667 ASM_CASES_TAC` f (x:real^N) = &0 `;
1668 FIRST_X_ASSUM SUBST_ALL_TAC;
1670 SIMP_TAC[REAL_MUL_RZERO; REAL_ADD_RID; REAL_SUB_RZERO];
1671 UNDISCH_TAC` &0 < e `;
1672 REWRITE_TAC[REAL_ABS_MUL];
1674 SUBGOAL_THEN` abs (f (x':real^N)) * abs (g (x':real^N)) < ( e / (&2 * (abs (g x) + e / (&2 * max (abs (&0)) (&1))))) * (abs (g x) + e / (&2 * max (abs (&0)) (&1)))` MP_TAC;
1676 MATCH_MP_TAC REAL_LT_MUL2;
1677 ASM_REWRITE_TAC[REAL_ABS_POS; REAL_ABS_0; real_max; REAL_ARITH` &0 <= &1 `; REAL_MUL_RID];
1678 ASSUME_TAC2 (REAL_ARITH` &0 < e ==> &0 < abs (g (x:real^N)) + e / &2`);
1680 UNDISCH_TAC` &0 < e `;
1681 SIMP_TAC[REAL_FIELD` &0 < a ==> e / (&2 * a) * a = e / &2 `; REAL_ABS_0; real_max; REAL_ARITH` &0 <= &1 `; REAL_MUL_RID];
1686 MATCH_MP_TAC (REAL_ARITH` abs a + abs b < e ==> abs ( a + b ) < e `);
1687 REWRITE_TAC[REAL_ABS_MUL];
1688 MATCH_MP_TAC (REAL_ARITH` a < e / &2 /\ b < e / &2 ==> a + b < e `);
1690 SUBGOAL_THEN` abs (f x' - f (x:real^N)) * abs (g x') < ( e / (&2 * (abs (g x) +
1691 e / (&2 * max (abs (f x)) (&1))))) * (abs (g x) + e / (&2 * max (abs (f x)) (&1)))` MP_TAC;
1692 MATCH_MP_TAC REAL_LT_MUL2;
1693 ASM_REWRITE_TAC[REAL_ABS_POS];
1694 SUBGOAL_THEN` &0 < abs (g (x:real^N)) + e / (&2 * max (abs (f x)) (&1))` MP_TAC;
1695 MATCH_MP_TAC (REAL_ARITH` &0 < b ==> &0 < abs a + b `);
1696 MATCH_MP_TAC REAL_LT_DIV;
1700 SIMP_TAC[REAL_FIELD` &0 < a ==> e / ( &2 * a ) * a = e / &2 `];
1701 ASM_CASES_TAC` max (abs (f x)) (&1) = abs (f (x:real^N)) `;
1706 UNDISCH_TAC` ~( f (x:real^N) = &0) `;
1707 REWRITE_TAC[REAL_ABS_NZ];
1708 UNDISCH_TAC` abs (g x' - g (x:real^N)) < e / (&2 * max (abs (f (x:real^N))) (&1))`;
1713 SIMP_TAC[REAL_FIELD` &0 < a ==> x / (&2 * a ) * a = x / &2 `];
1719 SUBGOAL_THEN` e / &2 / max (abs (f x)) (&1) < e / &2 / abs (f (x:real^N))` MP_TAC;
1720 MATCH_MP_TAC INV_INEQUAL_GENERAL;
1721 ASM_REWRITE_TAC[REAL_ARITH`&0 < a / &2 <=> &0 < a `; GSYM REAL_ABS_NZ];
1724 UNDISCH_TAC` abs (g x' - g (x:real^N)) < e / (&2 * max (abs (f (x:real^N))) (&1))`;
1726 REWRITE_TAC[REAL_FIELD` a / &2 / c = a / ( &2 * c ) `];
1727 NHANH (REAL_ARITH` a < b /\ b < c ==> a < c `);
1729 UNDISCH_TAC` ~( f (x:real^N) = &0)`;
1730 REWRITE_TAC[REAL_ABS_NZ];
1734 SIMP_TAC[REAL_FIELD` &0 < a ==> e / (&2 * a ) * a = e / &2 `]]);;
1742 (* tch 2013/07/27. renamed variables t0 -> t in CON_ATREAL_REAL_CON CON_ATREAL_REAL_CON2
1743 to avoid clash with constant t0 in Geomdetail. *)
1745 let CON_ATREAL_REAL_CON = prove(`! f (v0:real^N). f continuous atreal t ==>
1746 (\t. dist ( f t, v0)) real_continuous atreal t `,
1747 REWRITE_TAC[continuous_atreal; real_continuous_atreal] THEN
1748 REPEAT STRIP_TAC THEN DOWN THEN
1749 FIRST_X_ASSUM (NHANH_PAT `\x. x ==> y `) THEN STRIP_TAC THEN
1750 EXISTS_TAC` d:real` THEN ASM_REWRITE_TAC[] THEN
1751 FIRST_X_ASSUM NHANH THEN STRIP_TAC THEN CONV_TAC NORM_ARITH);;
1755 let CON_ATREAL_REAL_CON2 = prove(
1756 `! f (v0:real^N). f continuous atreal t /\ g continuous atreal t ==>
1757 (\t. dist ( f t, g t)) real_continuous atreal t `,
1758 REWRITE_TAC[continuous_atreal; real_continuous_atreal] THEN
1759 REPEAT STRIP_TAC THEN DOWN THEN
1760 PAT_ONCE_REWRITE_TAC`\x. x ==> y `[REAL_ARITH` &0 < a <=> &0 < a / &2 `] THEN
1761 REPEAT (FIRST_X_ASSUM (NHANH_PAT `\x. x ==> y `)) THEN
1762 STRIP_TAC THEN EXISTS_TAC `min d d'` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
1763 REPEAT (FIRST_X_ASSUM NHANH) THEN STRIP_TAC THEN CONV_TAC NORM_ARITH);;
1767 (* ============================================================== *)
1782 let SET2_HAS_SIZE2 = prove_by_refinement (` {(a: A),b} HAS_SIZE 2 <=> ~( a = b) `,
1783 [REWRITE_TAC[HAS_SIZE_2_EXISTS; IN_INSERT; NOT_IN_EMPTY];
1784 (* !s. s HAS_SIZE 2 <=>
1785 (?x y. ~(x = y) /\ (!z. z IN s <=> z = x \/ z = y))) *)
1786 EQ_TAC; STRIP_TAC; DOWN_TAC; MESON_TAC[]; STRIP_TAC;
1787 EXISTS_TAC` a: A`; EXISTS_TAC` b:A`; ASM_REWRITE_TAC[]]);;
1799 let DIJ_AFF_GE_PARTITION = prove_by_refinement (` DISJOINT {u,v} {w} ==>
1800 aff_ge {u,v} {w} = aff {u,v} UNION aff_gt {u, v} {w} `,
1801 [SIMP_TAC[Fan.AFF_GE_2_1; AFF2; AFF_GT_2_1];
1803 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM; REWRITE_RULE[IN] IN_UNION];
1807 ASM_CASES_TAC` t3 = &0 `;
1809 EXISTS_TAC `t1: real `;
1810 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_RID];
1811 UNDISCH_TAC` t1 + t2 + t3 = &1 `;
1812 ASM_SIMP_TAC[REAL_ADD_RID; REAL_ARITH` a + b = &1 <=> b = &1 - a `];
1814 ASM_MESON_TAC[REAL_ARITH` &0 <= a /\ ~( a = &0) ==> &0 < a `];
1817 EXISTS_TAC` t: real `;
1818 EXISTS_TAC` &1 - t `;
1820 ASM_REWRITE_TAC[REAL_LE_REFL; VECTOR_MUL_LZERO; VECTOR_ADD_RID];
1822 ASM_MESON_TAC[REAL_LT_IMP_LE]]);;
1830 let AFF_GE_WEDGE_DISJOINTION = prove_by_refinement (
1831 ` aff_ge {v0, v1} {w1} INTER wedge v0 v1 w1 w2 = {} /\
1832 aff_ge {v0, v1} {w2} INTER wedge v0 v1 w1 w2 = {}`,
1833 [ASM_CASES_TAC` collinear {v0, v1, w1:real^3} `;
1834 ASM_SIMP_TAC[WEDGE_DEGENERATE; INTER_EMPTY];
1839 ASM_SIMP_TAC[Local_lemmas.INTER_EQ_EM_EXPAND; GSYM Local_lemmas.AZIM_EQ_0_GE_ALT2];
1840 REWRITE_TAC[IN_ELIM_THM];
1846 ASM_CASES_TAC` collinear {v0, v1, w2:real^3 } `;
1847 ASM_SIMP_TAC[AZIM_DEGENERATE; Local_lemmas.INTER_EQ_EM_EXPAND; IN_ELIM_THM];
1848 REWRITE_TAC[REAL_ARITH` ~( a < x /\ x < a )`];
1852 NHANH DIJ_AFF_GE_PARTITION;
1853 SIMP_TAC[IN_UNION; Local_lemmas.INTER_EQ_EM_EXPAND; IN_ELIM_THM];
1854 NHANH (REWRITE_RULE[CONTRAPOS_THM] Fan.th3c);
1857 ASM_SIMP_TAC[AZIM_DEGENERATE];
1859 ASSUME_TAC2 (SPECL [`v0:real^3 `;` v1:real^3`;` w1: real^3 `;`x:real^3 `;` w2: real^3 `]AZIM_EQ_ALT);
1860 ASM_MESON_TAC[REAL_ARITH` ~( a < a ) `]]);;
1869 let HAS_SIZE_2_EXISTS2 = prove(
1870 ` S HAS_SIZE 2 <=> ? x y. ~( x = y) /\ S = {x,y} `,
1871 REWRITE_TAC[HAS_SIZE_2_EXISTS] THEN SET_TAC[]);;
1878 let FAN_E_SUB_V = prove(
1879 ` FAN (vec 0, V, E) /\ {x,y} IN E ==> x IN V /\ y IN V `,
1880 REWRITE_TAC[FAN; UNIONS_SUBSET; SUBSET] THEN STRIP_TAC THEN
1881 DOWN THEN FIRST_ASSUM NHANH THEN SIMP_TAC[IN_INSERT]);;
1884 let LOCAL_E_SUB_V = prove(
1885 ` local_fan (V,E,FF) /\ {x,y} IN E ==> x IN V /\ y IN V `,
1886 REWRITE_TAC[local_fan] THEN LET_TAC THEN MESON_TAC[FAN_E_SUB_V]);;
1892 let EDGE_NOT_INTER_WITH_WEDGE
1893 = prove(` aff {v0, v1} INTER wedge v0 v1 w1 w2 = {} `,
1894 REWRITE_TAC[wedge; Local_lemmas.INTER_EQ_EM_EXPAND; IN_ELIM_THM]
1895 THEN NHANH Fan.th3c THEN MESON_TAC[]);;
1902 let AFF_GE11_SUB_AFF2 = prove(` aff_ge {v0} {v1} SUBSET aff {v0, v1} `,
1903 REWRITE_TAC[HALFLINE; AFF2; SUBSET; IN_ELIM_THM] THEN
1904 REPEAT STRIP_TAC THEN EXISTS_TAC` &1 - t ` THEN
1905 ASM_REWRITE_TAC[REAL_ARITH` a - (a - b) = b `]);;
1912 let PROVE_SLICING_FAN = prove_by_refinement
1913 (`local_fan (V,E,FF) /\
1914 v IN V /\ w IN V /\ ~( v = w) /\
1915 (! z t. z IN {v, w} /\ t IN (V DIFF {z}) ==> ~ collinear {vec 0, z, t}) /\
1916 (! x. x IN FF ==> aff_gt {vec 0} {v,w} SUBSET wedge_in_fan_gt x E)
1917 ==> FAN (vec 0, V, E UNION {{v,w}}) `,
1918 [REWRITE_TAC[FAN; local_fan; UNIONS_UNION; UNIONS_1; UNION_SUBSET];
1920 SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET; graph; SET_RULE` (A UNION B) x <=>
1921 A x \/ B x `; MESON[]`(!x. P x \/ Q x ==> L x) <=> (! x. P x ==> L x ) /\
1922 (! x. Q x ==> L x )`];
1924 SIMP_TAC[SET2_HAS_SIZE2; Geomdetail.IN_ACT_SING];
1925 ONCE_REWRITE_TAC[EQ_SYM_EQ];
1926 SIMP_TAC[SET2_HAS_SIZE2; fan1; fan2; fan6; fan7; IN_UNION; MESON[]`
1927 (!x. P x \/ Q x ==> L x) <=> (! x. P x ==> L x) /\ (!x. Q x ==> L x) `; Geomdetail.IN_ACT_SING];
1931 SIMP_TAC[Local_lemmas.INSERT_UNION2; UNION_EMPTY];
1934 FIRST_X_ASSUM MATCH_MP_TAC;
1935 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
1937 ONCE_REWRITE_TAC[TAUT` (a \/ b) \/ c <=> b \/ a \/ c `];
1938 ONCE_REWRITE_TAC[TAUT` (a \/ b) /\ (x \/ y) ==> l <=> ( a /\ x ==> l) /\
1939 ( a /\ y ==> l ) /\ ( b /\ x ==> l) /\ (b /\ y ==> l) `];
1940 ASM_SIMP_TAC[INTER_IDEMPOT];
1943 MESON[]` (! e1 e2. L e1 e2 ==> L e2 e1) /\ (! e1 e2. e1 = x /\ Q e2 ==> L x e2)
1944 ==> (! e1 e2. (e1 = x /\ Q e2 ==> L x e2) /\ (Q e1 /\ e2 = x ==> L e1 x))`);
1945 SIMP_TAC[INTER_COMM];
1949 SUBGOAL_THEN` (e2: real^3 -> bool) HAS_SIZE 2` ASSUME_TAC;
1951 ASM_REWRITE_TAC[IN];
1954 REWRITE_TAC[HAS_SIZE_2_EXISTS2];
1957 SUBGOAL_THEN` (x':real^3, y:real^3) IN FF \/ (y,x') IN FF ` MP_TAC;
1958 MATCH_MP_TAC Local_lemmas.LOFA_IN_E_IMP_IN_FF;
1959 ASM_REWRITE_TAC[local_fan];
1961 ASM_REWRITE_TAC[FAN; graph; fan1; fan6; fan7; fan2; IN_UNION];
1963 EXISTS_TAC` x:real^3 # real^3 `;
1965 FIRST_X_ASSUM (SUBST1_TAC o SYM);
1966 FIRST_ASSUM ACCEPT_TAC;
1970 DOWN THEN DOWN THEN PHA;
1971 SPEC_TAC (`x':real^3 `,` x': real^3 `);
1972 SPEC_TAC (`y:real^3 `,` y: real^3 `);
1973 REWRITE_TAC[TAUT` a /\ b /\ c <=> (a/\b) /\ c `];
1974 MATCH_MP_TAC (MESON[]`(! x y. Q x y ==> Q y x) /\
1975 (! x y. Q x y /\ P x y ==> L x y ) /\ (! x y. L x y ==> L y x)
1976 ==> (! (x:real^3) (y:real^3). Q x y /\ (P x y \/ P y x) ==> L x y )`);
1977 SIMP_TAC[INSERT_COMM];
1980 SUBGOAL_THEN `~collinear {vec 0, v, w:real^3}` ASSUME_TAC;
1981 FIRST_X_ASSUM MATCH_MP_TAC;
1982 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; DE_MORGAN_THM; NOT_IN_EMPTY];
1984 NHANH Planarity.aff_ge_eq_aff_gt_union_aff_ge;
1985 SIMP_TAC[UNION_OVER_INTER];
1988 UNDISCH_TAC `y':real^3, y:real^3 IN FF `;
1990 REWRITE_TAC[wedge_in_fan_gt];
1992 SUBGOAL_THEN` local_fan (V,E,FF)` MP_TAC;
1993 ASM_REWRITE_TAC[IN_UNION; local_fan; FAN; fan1; fan2; fan6; fan7; graph];
1996 EXISTS_TAC` x:real^3 # real^3 `;
2000 ASSUME_TAC2 (SPEC`y': real^3 ` (GEN `x:real^3 `
2001 Local_lemmas.LOCAL_FAN_IMP_IN_V));
2003 SUBGOAL_THEN` CARD (EE (y':real^3) E) = 2 ` ASSUME_TAC;
2004 MATCH_MP_TAC Local_lemmas.LOFA_CARD_EE_V_1;
2006 FIRST_X_ASSUM SUBST_ALL_TAC;
2007 DOWN THEN DOWN THEN PHA;
2008 REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2011 MP_TAC (REWRITE_RULE[EMPTY_SUBSET; INSERT_SUBSET; IN_INSERT]
2012 (ISPECL [` {y':real^3} `;` {vec 0, y':real^3}`; `{y:real^3 }`]
2013 (GEN_ALL Local_lemmas.AFF_GE_MONO_TRANS)));
2014 SUBGOAL_THEN` ~ (y':real^3 = vec 0 )` MP_TAC;
2015 UNDISCH_TAC` y':real^3 IN V `;
2016 UNDISCH_TAC` ~( vec 0 IN (V:real^3 -> bool)) `;
2019 SIMP_TAC[SET_RULE` ~( y' = vec 0) ==> {vec 0, y'} DIFF {y'} = {vec 0} `];
2020 REWRITE_TAC[Local_lemmas.INSERT_UNION2; UNION_EMPTY];
2023 MP_TAC (SPECL [` vec 0:real^3 `;` y':real^3`;` y:real^3 `;
2024 ` (azim_cycle (EE y' E) (vec 0) y' y) `] (GEN_ALL AFF_GE_WEDGE_DISJOINTION));
2026 SUBGOAL_THEN` aff_ge {vec 0} {y:real^3, y'} INTER aff_gt {vec 0} {v, w} = {} ` MP_TAC;
2027 REPLICATE_TAC 3 DOWN THEN PHA;
2030 SIMP_TAC[UNION_EMPTY];
2034 UNDISCH_TAC` !e1 e2.
2035 (e1 IN E \/ e1 IN {{v:real^3} | v IN V}) /\
2036 (e2 IN E \/ e2 IN {{v} | v IN V})
2037 ==> aff_ge {vec 0} e1 INTER aff_ge {vec 0} e2 =
2038 aff_ge {vec 0} (e1 INTER e2) `;
2040 SUBGOAL_THEN` ({y, y'} IN E \/ {y, y'} IN {{v:real^3} | v IN V}) /\
2041 ({v} IN E \/ {v} IN {{v} | v IN V})` MP_TAC;
2042 UNDISCH_TAC` (e2:real^3 -> bool) IN E `;
2043 ASM_SIMP_TAC[IN_ELIM_THM];
2047 EXISTS_TAC` v:real^3 `;
2053 SUBGOAL_THEN` ({y, y'} IN E \/ {y, y'} IN {{v:real^3} | v IN V}) /\
2054 ({w} IN E \/ {w} IN {{v} | v IN V})` MP_TAC;
2055 UNDISCH_TAC` (e2:real^3 -> bool) IN E `;
2056 ASM_SIMP_TAC[IN_ELIM_THM];
2059 EXISTS_TAC` w:real^3 `;
2065 ASM_CASES_TAC` {y, y'} INTER {v, w:real^3} = {} `;
2067 NHANH (SET_RULE` S INTER {a,b} = {} ==> S INTER {a} = {} /\ S INTER {b} = {}`);
2069 SIMP_TAC[UNION_IDEMPOT];
2074 ASM_CASES_TAC` {y, y': real^3} INTER {v} = {} \/
2075 {y, y': real^3} INTER {w} = {}`;
2077 SPEC_TAC (`w:real^3 `,` w:real^ 3 `);
2078 SPEC_TAC (`v:real^3 `,` v:real^ 3 `);
2079 MATCH_MP_TAC (MESON[]` (! x y. A x y ==> A y x) /\
2080 (! x y. B x y ==> B y x ) /\
2081 (! x y. A x y ==> M x ==> B x y)
2082 ==> (! x y. A x y ==> M x \/ M y ==> B x y ) `);
2084 SIMP_TAC[INSERT_COMM; UNION_COMM];
2087 NHANH (SET_RULE` ~({y, y'} INTER {v, w} = {}) /\ {y, y'} INTER {v} = {}
2088 ==> {y, y'} INTER {v, w} = {w} /\ {y, y'} INTER {w} = {w}`);
2091 REWRITE_TAC[AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
2092 MATCH_MP_TAC (SET_RULE` x IN S ==> {x} UNION S = S `);
2093 REWRITE_TAC[IN_ELIM_THM; HALFLINE];
2095 REWRITE_TAC[REAL_LE_REFL];
2098 DOWN THEN DOWN THEN PHA;
2099 UNDISCH_TAC` ~ ( w = v:real^3)`;
2102 NHANH (SET_RULE `~(w = v) /\
2103 ~({y, y'} INTER {v, w} = {}) /\
2104 ~({y, y'} INTER {v} = {} \/ {y, y'} INTER {w} = {})
2105 ==> {y,y'} = {v, w} `);
2107 UNDISCH_TAC` aff_ge {vec 0} {y, y'} INTER aff_gt {vec 0} {v:real^3, w} = {}`;
2109 NHANH (SET_RULE` (A UNION B) INTER A = {} ==> A = {} `);
2111 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3 }` MP_TAC;
2112 UNDISCH_TAC` ~( vec 0 IN (V:real^3 -> bool)) `;
2113 UNDISCH_TAC` (v:real^3) IN V `;
2114 UNDISCH_TAC` (w:real^3) IN V `;
2115 REWRITE_TAC[DISJOINT; Trigonometry2.INSERT_INTER_EMPTY; IN_INSERT; NOT_IN_EMPTY];
2118 NHANH Planarity.AFF_GT_1_2;
2122 REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY];
2123 DISCH_THEN (MP_TAC o (SPEC` (&1 / &2) % v + (&1 / &2 ) % (w:real^3)`));
2124 REWRITE_TAC[NOT_EXISTS_THM];
2125 DISCH_THEN (MP_TAC o (SPECL [` &0 `;` &1 / &2`;` &1 / &2 `]));
2126 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID; REAL_ARITH` &0 < &1 / &2 /\
2127 &0 + &1 / &2 + &1 / &2 = &1`];
2138 REWRITE_TAC[IN_ELIM_THM];
2140 SUBGOAL_THEN` local_fan (V,E, FF) ` MP_TAC;
2141 ASM_REWRITE_TAC[local_fan; FAN; fan1; fan2; fan6; fan7; graph];
2143 ASM_REWRITE_TAC[IN_UNION];
2144 EXISTS_TAC` x: real^3 # real^3 `;
2146 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
2148 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`v': real^3`));
2149 UNDISCH_TAC` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E`;
2150 DISCH_THEN (ASSUME_TAC2 o (SPEC `v',rho_node1 FF v' `));
2152 SUBGOAL_THEN` ~((v:real^3 ) = vec 0)/\ ~( (w:real^3) = vec 0) ` MP_TAC;
2153 UNDISCH_TAC` v:real^3 IN V `;
2154 UNDISCH_TAC` w:real^3 IN V `;
2155 UNDISCH_TAC` ~( vec 0 IN (V:real^3 -> bool)) `;
2157 NHANH Wrgcvdr_cizmrrh.AFF_GE_TO_AFF_GT2_GE1;
2160 REWRITE_TAC[wedge_in_fan_gt];
2163 SPEC` v':real^3 ` (GEN `v:real^3 ` Local_lemmas.LOFA_CARD_EE_V_1));
2164 ASM_REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2166 MP_TAC (SPECL [` vec 0: real^3 `;` v': real^3 `; ` rho_node1 FF v' `;
2167 `(azim_cycle (EE v' E) (vec 0) v' (rho_node1 FF v')) `]
2168 (GEN_ALL EDGE_NOT_INTER_WITH_WEDGE));
2169 MP_TAC (ISPECL [` vec 0:real^3 `;` v':real^3`] (GEN_ALL AFF_GE11_SUB_AFF2));
2171 NHANH (SET_RULE` a SUBSET B /\ B INTER S = {} /\ l ==> a INTER S = {} `);
2173 ASM_REWRITE_TAC[UNION_OVER_INTER];
2175 SUBGOAL_THEN` aff_ge {vec 0} {v'} INTER aff_gt {vec 0} {v, w:real^3} = {}` ASSUME_TAC;
2177 MATCH_MP_TAC (SET_RULE` a SUBSET b ==> x INTER b = {} ==> x INTER a = {} `);
2178 FIRST_X_ASSUM ACCEPT_TAC;
2179 ASM_REWRITE_TAC[UNION_EMPTY];
2181 UNDISCH_TAC` !e1 e2.
2182 (e1 IN E \/ e1 IN {{v:real^3} | v IN V}) /\
2183 (e2 IN E \/ e2 IN {{v} | v IN V})
2184 ==> aff_ge {vec 0} e1 INTER aff_ge {vec 0} e2 =
2185 aff_ge {vec 0} (e1 INTER e2)`;
2187 FIRST_ASSUM (MP_TAC o (SPECL [` {v':real^3} `;` {v:real^3}`]));
2189 ASM_REWRITE_TAC[IN_ELIM_THM];
2190 UNDISCH_TAC` v:real^3 IN V `;
2191 UNDISCH_TAC` v':real^3 IN V `;
2195 FIRST_ASSUM (MP_TAC o (SPECL [` {v':real^3} `;` {w:real^3}`]));
2197 ASM_REWRITE_TAC[IN_ELIM_THM];
2198 UNDISCH_TAC` w:real^3 IN V `;
2199 UNDISCH_TAC` v':real^3 IN V `;
2205 ASM_CASES_TAC` {v'} INTER {v, w} = {v':real^3} `;
2208 UNDISCH_TAC` ~( w = (v:real^3) )`;
2210 NHANH (SET_RULE`{v'} INTER {v, w} = {v'}
2211 ==> v = v' \/ w = v' `);
2212 NHANH (SET_RULE` ~( a = b ) ==> {a} INTER {b} = {} `);
2215 FIRST_X_ASSUM SUBST_ALL_TAC;
2216 DOWN THEN DOWN THEN PHA;
2217 SIMP_TAC[INTER_IDEMPOT; INTER_COMM; AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
2220 MP_TAC (ISPECL [` {vec 0:real^3 }`;` {v': real^3 }`]
2221 AFFINE_HULL_SUBSET_AFF_GE);
2223 UNDISCH_TAC` ~((v':real^3) = vec 0) `;
2224 REWRITE_TAC[DISJOINT];
2227 REWRITE_TAC[AFFINE_HULL_SING];
2231 FIRST_X_ASSUM SUBST_ALL_TAC;
2233 DOWN THEN DOWN THEN PHA;
2234 SIMP_TAC[INTER_IDEMPOT; INTER_COMM; AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
2237 MP_TAC (ISPECL [` {vec 0:real^3 }`;` {v': real^3 }`]
2238 AFFINE_HULL_SUBSET_AFF_GE);
2240 UNDISCH_TAC` ~((v':real^3) = vec 0) `;
2241 REWRITE_TAC[DISJOINT];
2243 REWRITE_TAC[AFFINE_HULL_SING];
2248 NHANH (SET_RULE` ~({v'} INTER {v, w} = {v'})
2249 ==> {v'} INTER {v} = {} /\ {v'} INTER {w} = {} /\ {v, w} INTER {v'} = {}`);
2250 SIMP_TAC[UNION_IDEMPOT; INTER_COMM]]);;
2259 let FACE_MAP_ADD_SET2_EQ = prove_by_refinement
2260 (` (x,y) IN darts_of_hyp ( E UNION {{a,b}}) V /\
2261 ~( y = a) /\ ~ ( y = b ) /\
2262 FAN (vec 0, V, E) /\
2263 FAN (vec 0, V, E UNION {{a,b}} )
2264 ==> (face_map (hypermap ( HYP (vec 0, V, (E UNION {{a,b}}))))) (x,y) =
2265 (face_map (hypermap (HYP (vec 0, V, E)))) (x,y) `,
2266 [NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2270 SUBGOAL_THEN` (x,y) IN darts_of_hyp ( E UNION {{a,b:real^3}}) V ` MP_TAC;
2272 REWRITE_TAC[darts_of_hyp; IN_UNION];
2274 SUBGOAL_THEN` (x,y) IN darts_of_hyp E (V:real^3 -> bool) ` MP_TAC;
2275 REWRITE_TAC[darts_of_hyp; IN_UNION];
2276 DOWN THEN STRIP_TAC;
2279 REWRITE_TAC[ord_pairs; IN_ELIM_THM; IN_UNION];
2281 EXISTS_TAC` a': real^3 `;
2282 EXISTS_TAC` b': real^3 `;
2287 REWRITE_TAC[IN_SING; PAIR_EQ; Collect_geom.PAIR_EQ_EXPAND];
2289 UNDISCH_TAC` ~( y = b:real^3 ) `;
2292 UNDISCH_TAC` ~( y = a:real^3) `;
2295 REWRITE_TAC[self_pairs; IN_ELIM_THM];
2298 EXISTS_TAC` v:real^3 `;
2301 SIMP_TAC[EE; IN_UNION];
2305 ASM_SIMP_TAC[ff_of_hyp];
2306 SUBGOAL_THEN` (EE y (E UNION {{a, b}})) = (EE (y:real^3) E)` SUBST1_TAC;
2307 REWRITE_TAC[EE; EXTENSION; IN_ELIM_THM; IN_UNION];
2309 MATCH_MP_TAC (TAUT` (a ==> b) ==> ( b \/ a <=> b )`);
2310 REWRITE_TAC[IN_SING; Collect_geom.PAIR_EQ_EXPAND];
2316 (* ========================================================== *)
2317 (* ========================================================== *)
2323 let LOCAL_FACE_MAP_RHO_NODE1 = prove_by_refinement
2324 (` local_fan (V,E,FF) /\
2326 ==> face_map ( hypermap (HYP (vec 0,V,E))) (x,y) =
2327 (rho_node1 FF x, rho_node1 FF y ) `,
2328 [NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
2329 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2331 NHANH Local_lemmas.LOFA_DARTS_FF_UNION_SWITCH_FF;
2333 SUBGOAL_THEN` x,y IN darts_of_hyp E (V:real^3 -> bool) ` MP_TAC;
2334 ASM_REWRITE_TAC[IN_UNION];
2336 SIMP_TAC[ff_of_hyp];
2338 ASSUME_TAC2 (SPECL [` x:real^3 `;` y:real^3 `] (
2339 GENL [`v: real^3 `;` w:real^3 `] Local_lemmas.DETER_RHO_NODE));
2340 ASM_REWRITE_TAC[PAIR_EQ];
2341 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_IMP_IN_V;
2342 DOWN THEN STRIP_TAC;
2343 ASSUME_TAC2 (SPECL [`x:real^3 `;` y:real^3 `] (
2344 GENL [`vv: real^ 3 `;` v: real^3 `] Local_lemmas.LOFA_IMP_EE_TWO_ELMS));
2345 ASM_REWRITE_TAC[ivs_azim_cycle; SET_RULE` ~( x INSERT S = {} )`];
2346 ABBREV_TAC` tt = (@x'. x' IN {rho_node1 FF y, x} /\
2347 azim_cycle {rho_node1 FF y, x} (vec 0) y x' = x)` ;
2348 SUBGOAL_THEN`tt IN {rho_node1 FF y, x} /\
2349 azim_cycle {rho_node1 FF y, x} (vec 0) y tt = x` MP_TAC;
2351 REWRITE_TAC[MESON[EXISTS_THM]` (@x'. x' IN {rho_node1 FF y, x} /\
2352 azim_cycle {rho_node1 FF y, x} (vec 0) y x' = x) IN
2353 {rho_node1 FF y, x} /\
2354 azim_cycle {rho_node1 FF y, x} (vec 0) y
2355 (@x'. x' IN {rho_node1 FF y, x} /\
2356 azim_cycle {rho_node1 FF y, x} (vec 0) y x' = x) =
2359 <=> ? x'. x' IN {rho_node1 FF y, x} /\
2360 azim_cycle {rho_node1 FF y, x} (vec 0) y x' = x `];
2361 EXISTS_TAC` rho_node1 FF y `;
2362 REWRITE_TAC[IN_INSERT; Local_lemmas.AZIM_CYCLE_TWO_POINT_SET; IN_INSERT; NOT_IN_EMPTY];
2364 REWRITE_TAC[IN_INSERT; Local_lemmas.AZIM_CYCLE_TWO_POINT_SET; IN_INSERT; NOT_IN_EMPTY];
2370 ASM_REWRITE_TAC[INSERT_COMM; Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
2371 ASSUME_TAC2 (SPEC `y:real^3 ` (GEN `v:real^3 ` Local_lemmas.LOFA_CARD_EE_V_1));
2373 ASM_SIMP_TAC[Geomdetail.CARD2]]);;
2380 let IN_DARTS_EXTENSION = prove(
2381 ` {x:A,y} IN E ==> x,y IN darts_of_hyp (E UNION S) V `,
2382 REWRITE_TAC[darts_of_hyp; IN_UNION; ord_pairs; IN_ELIM_THM; PAIR_EQ] THEN
2383 STRIP_TAC THEN DISJ1_TAC THEN EXISTS_TAC` x:A` THEN EXISTS_TAC` y:A ` THEN
2384 ASM_REWRITE_TAC[]);;
2391 let LOCAL_RHO_NODE_PAIR_E = prove(
2392 `! v. local_fan (V,E,FF) /\ v IN V
2393 ==> {v, rho_node1 FF v} IN E `,
2394 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2 THEN
2395 REPEAT STRIP_TAC THEN DOWN THEN FIRST_X_ASSUM NHANH THEN
2396 ASM_MESON_TAC[Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2]);;
2402 let LOFA_HYP_UNION_CARD_GT2 = prove_by_refinement
2403 (`(local_fan (V,E,FF) /\
2407 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
2408 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
2409 HS = hypermap ( HYP (vec 0,V,E UNION {{v, w}})) /\
2410 fv = face HS (v, rho_node1 FF v)
2412 [NHANH PROVE_SLICING_FAN;
2413 NHANH Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE;
2414 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
2416 SUBGOAL_THEN` ~(rho_node1 FF v = w) ` ASSUME_TAC;
2417 USE_FIRST ` !x. x IN V ==> x,rho_node1 FF x IN FF ` (ASSUME_TAC2 o (SPEC`v: real^3 `));
2419 USE_FIRST` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E ` NHANH;
2420 REWRITE_TAC[wedge_in_fan_gt];
2421 ASSUME_TAC2 Local_lemmas.LOFA_CARD_EE_V_1;
2422 ASM_REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2426 MP_TAC (ISPECL [` {v:real^3} `; ` {vec 0, v:real^3} `;` {rho_node1 FF v} `]
2427 (GEN_ALL Local_lemmas.AFF_GE_MONO_TRANS));
2429 SIMP_TAC[SUBSET; IN_SING; IN_INSERT];
2431 SUBGOAL_THEN` FAN (vec 0,V,E UNION {{v:real^3, w}}) ` MP_TAC;
2432 FIRST_X_ASSUM ACCEPT_TAC;
2433 REWRITE_TAC[FAN; fan1; fan2];
2435 SUBGOAL_THEN ` ~( v:real^3 = vec 0) ` MP_TAC;
2437 SIMP_TAC[SET_RULE` ~( a = b) ==> {b,a} DIFF {a} = {b} `; SET_RULE` {a} UNION {b} = {b,a}`];
2440 MP_TAC (SPECL [`vec 0: real^3 `;` v: real^3 `;` rho_node1 FF v `;
2441 ` (azim_cycle (EE v E) (vec 0) v (rho_node1 FF v)) ` ]
2442 (GEN_ALL AFF_GE_WEDGE_DISJOINTION));
2443 ABBREV_TAC` tv = azim_cycle (EE v E) (vec 0) v (rho_node1 FF v) `;
2445 UNDISCH_TAC` aff_gt {vec 0} {v, w} SUBSET wedge (vec 0) v (rho_node1 FF v) tv `;
2446 UNDISCH_TAC` aff_ge {vec 0, v} {rho_node1 FF v} INTER
2447 wedge (vec 0) v (rho_node1 FF v) tv =
2449 MP_TAC (ISPECL [` {vec 0: real^ 3} `; ` {v, w:real^3} `] AFF_GT_SUBSET_AFF_GE);
2453 SET_RULE` ge12 SUBSET ge21 /\ ~( gt = {} ) ==>
2454 gt SUBSET ge12 ==> ge21 INTER we = {} ==> ~( gt SUBSET we ) `);
2455 UNDISCH_TAC` aff_ge {vec 0} {v, rho_node1 FF v} SUBSET
2456 aff_ge {vec 0, v} {rho_node1 FF v}`;
2459 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3}` MP_TAC;
2460 REWRITE_TAC[SET_RULE` DISJOINT {a} {x,y} <=> ~( x = a) /\ ~( y = a) `];
2462 UNDISCH_TAC` ~( vec 0:real^3 IN V ) `;
2463 UNDISCH_TAC` w:real^3 IN V `;
2466 SIMP_TAC[Planarity.AFF_GT_1_2; EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY];
2468 FIRST_ASSUM (MP_TAC o (SPEC` &1 / &2 % v + &1 / &2 % (w:real^3) `));
2471 EXISTS_TAC` &1 / &2 `;
2472 EXISTS_TAC` &1 / &2 `;
2473 REWRITE_TAC[REAL_ARITH` &0 < &1 / &2 /\
2475 &0 + &1 / &2 + &1 / &2 = &1 `];
2476 REWRITE_TAC[VECTOR_ARITH` &0 % v + x = x `];
2480 ASM_CASES_TAC` rho_node1 FF ( rho_node1 FF v) = v `;
2481 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_V;
2482 FIRST_ASSUM (ASSUME_TAC2 o (SPEC `v:real^3 `));
2483 REPLICATE_TAC 3 DOWN;
2484 NHANH (GEN_ALL Local_lemmas.ORD2_ORBIT_MAP);
2487 UNDISCH_TAC` w IN (V:real^3 -> bool) `;
2489 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
2491 ASSUME_TAC2 (SPEC_ALL LOCAL_RHO_NODE_PAIR_E);
2494 NHANH (ISPEC ` {{v, w:real^3}} ` (GEN `S: (A -> bool) -> bool` IN_DARTS_EXTENSION));
2495 DOWN THEN STRIP_TAC;
2496 ASSUME_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
2497 NHANH (ONCE_REWRITE_RULE[TAUT` a /\ b ==> c <=> a ==> b ==> c `] FACE_MAP_ADD_SET2_EQ);
2501 USE_FIRST` !v. v IN V
2502 ==> ~(rho_node1 FF v = v) /\
2503 v,rho_node1 FF v IN ord_pairs E /\
2504 ~collinear {vec 0, v, rho_node1 FF v} ` (ASSUME_TAC2 o SPEC_ALL);
2506 USE_FIRST` !x. x IN V ==> x,rho_node1 FF x IN FF ` (ASSUME_TAC2 o (SPEC` v:real^3 `));
2509 SPECL [` v:real^3 `;` rho_node1 FF v `] (
2510 GENL [`x:real^3`;` y:real^3 `] LOCAL_FACE_MAP_RHO_NODE1));
2513 SWITCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v, w:real^3}})) `;
2514 SWITCH_TAC` fv = face HS (v,rho_node1 FF (v:real^3))`;
2517 ASSUME_TAC2 Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2518 ASSUME_TAC2 (SPEC ` rho_node1 FF v` LOCAL_RHO_NODE_PAIR_E);
2520 NHANH (ISPEC ` {{v, w:real^3}} ` (GEN `S: (A -> bool) -> bool` IN_DARTS_EXTENSION));
2523 SUBGOAL_THEN` v, rho_node1 FF v IN fv /\
2524 rho_node1 FF v,rho_node1 FF (rho_node1 FF v) IN fv /\
2525 face_map HS (rho_node1 FF v,rho_node1 FF (rho_node1 FF v)) IN fv ` MP_TAC;
2527 SUBGOAL_THEN` v,rho_node1 FF v IN fv /\
2528 rho_node1 FF v,rho_node1 FF (rho_node1 FF v) IN fv ` MP_TAC;
2530 REWRITE_TAC[face; orbit_map; IN_ELIM_THM];
2533 REWRITE_TAC[ARITH_RULE` 0 >= 0`; POWER; I_THM];
2536 ASM_REWRITE_TAC[POWER_TO_ITER; ITER12; ARITH_RULE` 1 >= 0 `];
2540 SIMP_TAC[face; Wrgcvdr_cizmrrh.IN_ORBIT_MAP_IMP_F_Y];
2541 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
2542 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2545 UNDISCH_TAC` rho_node1 FF v,rho_node1 FF (rho_node1 FF v) IN
2546 darts_of_hyp (E UNION {{v, w}}) V `;
2547 SIMP_TAC[ff_of_hyp];
2548 ABBREV_TAC` rh1 = rho_node1 FF v `;
2549 ABBREV_TAC` rr2 = ivs_azim_cycle (EE (rho_node1 FF rh1) (E UNION {{v, w}})) (vec 0)
2554 SUBGOAL_THEN` ~((v:real^3, rh1 :real^3) = rh1,rho_node1 FF rh1) /\
2555 ~( rh1,rho_node1 FF rh1 = rho_node1 FF rh1, rr2 ) /\
2556 ~( v, rh1 = rho_node1 FF rh1, rr2 ) ` MP_TAC;
2557 ASM_REWRITE_TAC[PAIR_EQ];
2559 USE_FIRST` !v. v IN V
2560 ==> ~(rho_node1 FF v = v) /\
2561 v,rho_node1 FF v IN ord_pairs E /\
2562 ~collinear {vec 0, v, rho_node1 FF v} ` (MP_TAC o SPEC_ALL);
2564 FIRST_ASSUM ACCEPT_TAC;
2566 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` rh1: real^3 `));
2569 MP_TAC (ISPECL [` HS: (real^3#real^3)hypermap `; ` (v:real^3, rh1: real^3) `] Hypermap.FACE_FINITE);
2571 SUBGOAL_THEN` CARD {(v,rh1), (rh1,rho_node1 FF rh1), (rho_node1 FF rh1,rr2)} <= CARD (fv:real^3 # real^3 -> bool) ` MP_TAC;
2572 MATCH_MP_TAC CARD_SUBSET;
2574 ASM_SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET];
2576 SUBGOAL_THEN` CARD {(v,rh1), (rh1,rho_node1 FF rh1), (rho_node1 FF rh1,rr2)} = 3 ` SUBST1_TAC;
2577 ASM_REWRITE_TAC[Geomdetail.CARD3];
2584 let LOCAL_FAN_SIMPLE_HYP = prove_by_refinement
2585 (` local_fan (V,E,FF) ==> simple_hypermap (hypermap (HYP (vec 0, V,E))) `,
2586 [REWRITE_TAC[local_fan];
2589 ASM_CASES_TAC` CARD (FF:real^3 # real^3 -> bool) = 0 `;
2592 REWRITE_TAC[MATCH_MP (ISPEC` face H (x:A)` CARD_EQ_0) (SPEC_ALL Hypermap.FACE_FINITE)];
2593 REWRITE_TAC[EXTENSION; NOT_IN_EMPTY];
2594 MESON_TAC[Hypermap.face_refl];
2595 DOWN THEN DOWN THEN PHA;
2596 REWRITE_TAC[Lvducxu.DIH2K_IMP_SIMPLE_HYPERMAP2]]);;
2597 (* RITE_TAC[Lvducxu.DIH2K_IMP_SIMPLE_HYPERMAP2];; *)
2604 let EE_UNION = prove(` EE v ( E UNION S) = EE v E UNION EE v S `,
2605 REWRITE_TAC[EE; IN_UNION; EXTENSION; IN_ELIM_THM]);;
2613 let EE_SING_SING = prove(` EE v {{v,w}} = {w} `,
2614 REWRITE_TAC[EE; EXTENSION; IN_ELIM_THM; IN_SING; IN_INSERT] THEN MESON_TAC[]);;
2622 let CROSS_PAIR_NOT_IN_FF = prove_by_refinement
2623 (` local_fan (V,E,FF) /\
2627 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)
2628 ==> ~((v,w) IN FF) `,
2631 REWRITE_TAC[wedge_in_fan_gt];
2632 ASSUME_TAC2 Local_lemmas.LOFA_CARD_EE_V_1;
2633 ASM_REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2634 MP_TAC (SPECL [` vec 0: real^3 `;` v:real^3 `;`w:real^3 `;
2635 ` azim_cycle (EE v E) (vec 0) v w`] (GEN_ALL AFF_GE_WEDGE_DISJOINTION));
2637 SUBGOAL_THEN` &1 / &2 % v + &1 / &2 % (w:real^3) IN aff_ge {vec 0, v} {w} /\
2638 &1 / &2 % v + &1 / &2 % (w:real^3) IN aff_gt {vec 0} {v, w} ` MP_TAC;
2639 SUBGOAL_THEN` DISJOINT {vec 0, v:real^3} {w} /\
2640 DISJOINT {vec 0} {v, w:real^3} ` MP_TAC;
2641 REWRITE_TAC[DISJOINT];
2642 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
2643 REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_INSERT];
2646 SIMP_TAC[Fan.AFF_GE_2_1; Planarity.AFF_GT_1_2; IN_ELIM_THM];
2650 EXISTS_TAC` &1 / &2 `;
2651 EXISTS_TAC` &1 / &2 `;
2652 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
2656 EXISTS_TAC` &1 / &2 `;
2657 EXISTS_TAC` &1 / &2 `;
2658 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
2667 REWRITE_RULE[] (SPECL [`v:real^3`;` v:real^3`] (CONJUNCT1 AZIM_DEGENERATE));;
2672 let AZIM_POS_IMP_CYCLIC_SET = prove_by_refinement
2673 (` &0 < azim v0 v1 w1 w2 ==> cyclic_set {w1, w2} v0 v1 `,
2674 [REWRITE_TAC[cyclic_set];
2678 FIRST_X_ASSUM SUBST_ALL_TAC;
2680 REWRITE_TAC[AZ_REFL11];
2683 REWRITE_TAC[Geomdetail.FINITE6];
2684 ASM_CASES_TAC` v0 = v1:real^3 `;
2685 FIRST_X_ASSUM SUBST_ALL_TAC;
2687 REWRITE_TAC[AZ_REFL11; REAL_ARITH` ~( a < a ) `];
2689 ASM_CASES_TAC` w1 IN affine hull {v0, v1:real^3}`;
2691 NHANH (REWRITE_RULE[CONTRAPOS_THM; aff] Fan.th3c);
2693 UNDISCH_TAC` &0 < azim v0 v1 w1 w2 `;
2694 ASM_SIMP_TAC[AZIM_DEGENERATE; REAL_ARITH` ~( a < a ) `];
2697 ASM_CASES_TAC` w2 IN affine hull {v0, v1:real^3}`;
2699 NHANH (REWRITE_RULE[CONTRAPOS_THM; aff] Fan.th3c);
2701 UNDISCH_TAC` &0 < azim v0 v1 w1 w2 `;
2702 ASM_SIMP_TAC[AZIM_DEGENERATE; REAL_ARITH` ~( a < a ) `];
2704 REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY; IN_INSERT; IN_INTER];
2706 REWRITE_TAC[SET_RULE` ( {w1, w2} p /\ {w1, w2} q /\ L ==> p = q ) <=>
2707 ( p = w1 /\ q = w2 /\ L ==> p = q ) /\
2708 (p = w2 /\ q = w1 /\ L ==> p = q )`];
2711 MESON[]` ( ! h. w1 = w2 + h % (v0 - v1) ==> w1 = w2 ) /\
2712 (! h. w2 = w1 + h % (v0 - v1) ==> w1 = w2 + ( -- h) % ( v0 - v1 ))
2715 (p = w1 /\ q = w2 /\ p = q + h % (v0 - v1) ==> p = q) /\
2716 (p = w2 /\ q = w1 /\ p = q + h % (v0 - v1) ==> p = q)`);
2719 SUBGOAL_THEN` w1 IN aff_ge {v0, v1} {w2:real^3} ` MP_TAC;
2722 ASSUME_TAC2 (ISPECL [` v0:real^3 `;` v1:real^3 `; `w2:real^3 `] COLLINEAR_3_AFFINE_HULL);
2723 UNDISCH_TAC` ~(w2 IN affine hull {v0, v1: real^3})`;
2724 FIRST_X_ASSUM (SUBST1_TAC o SYM);
2726 NHANH Collect_geom.simp_def_ge;
2727 SIMP_TAC[IN_ELIM_THM];
2729 EXISTS_TAC` h:real` ;
2730 EXISTS_TAC` -- h:real` ;
2732 REWRITE_TAC[REAL_ARITH` a + -- a + b = b /\ &0 <= &1 `];
2734 ASSUME_TAC2 (ISPECL [` v1:real^3 `;` v0: real^3 `; ` w2:real ^3 `] (GSYM COLLINEAR_3_AFFINE_HULL));
2735 UNDISCH_TAC ` ~(w2 IN affine hull {v0, v1:real^3})`;
2737 ASM_SIMP_TAC[INSERT_COMM];
2738 SIMP_TAC[ GSYM Local_lemmas.AZIM_EQ_0_GE_ALT2];
2739 FIRST_X_ASSUM (SUBST_ALL_TAC o SYM);
2741 UNDISCH_TAC` &0 < azim v0 v1 w1 w2 `;
2743 ASM_SIMP_TAC[Local_lemmas.AZIM_EQ_0_SYM2; REAL_ARITH` ~( a < a ) `];
2747 REWRITE_TAC[DE_MORGAN_THM];
2757 let AZIM_POS_IMP_SUM_2PI = prove(
2758 ` &0 < azim a b c d ==> azim a b c d + azim a b d c = &2 * pi `,
2759 NHANH AZIM_POS_IMP_CYCLIC_SET THEN NHANH Trigonometry2.YVREJIS THEN
2760 MESON_TAC[REAL_ARITH` a < b ==> ~( b = a ) `]);;
2767 let FACE_MAP_AT_TURNING_DART = prove_by_refinement
2768 (` (local_fan (V,E,FF) /\
2772 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
2773 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
2775 ==> face_map (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (x,v)
2777 [NHANH PROVE_SLICING_FAN;
2778 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2781 ASSUME_TAC2 (SPECL [`x:real^3 `;` v:real^3 `] (
2782 GENL [`x:real^3 `;` y:real^3 `] Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2));
2784 DOWN THEN NHANH (ISPEC `{{v, w:real^3}} ` (GEN` S: (A -> bool) -> bool ` IN_DARTS_EXTENSION));
2785 SIMP_TAC[ff_of_hyp; PAIR_EQ];
2787 ASSUME_TAC2 (SET_RULE` {x,v:real^3} IN E ==> {x,v} IN E UNION {{v,w}} `);
2789 PAT_ONCE_REWRITE_TAC`\x. x IN Y ==> L ` [INSERT_COMM];
2790 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
2792 NHANH Wrgcvdr_cizmrrh.IVS_AZIM_EQ_INVERSE_SIGMA_FAN;
2794 NHANH (GSYM Wrgcvdr_cizmrrh.FAN_IMP_EE_EQ_SET_OF_EDGE);
2796 MATCH_MP_TAC (REWRITE_RULE[TAUT` a ==> b ==> c <=> a /\ b ==> c `] Wrgcvdr_cizmrrh.SIG_AND_INVERSE1_SIG);
2797 ASM_REWRITE_TAC[IN_UNION; IN_SING];
2798 MATCH_MP_TAC Fan.UNIQUE_SIGMA_FAN;
2800 ASSUME_TAC2 (SPECL [` x:real^3 `;` v:real^3 `]
2801 (GENL [` v:real^3 `;` w:real^3 `] Local_lemmas.DETER_RHO_NODE));
2803 SUBGOAL_THEN` x:real^3 IN V /\ v IN V ` MP_TAC;
2804 MATCH_MP_TAC Local_lemmas.LOCAL_FAN_IMP_IN_V;
2807 ASSUME_TAC2 (SPEC` x:real^3 ` (GEN `vv:real^3 ` Local_lemmas.LOFA_IMP_EE_TWO_ELMS));
2808 ASM_REWRITE_TAC[EE_UNION; EE_SING_SING; IN_UNION; IN_SING; IN_INSERT];
2811 SUBGOAL_THEN` ~( x = w:real^3 ) ` MP_TAC;
2813 FIRST_X_ASSUM SUBST_ALL_TAC;
2814 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
2815 DOWN THEN STRIP_TAC;
2819 UNDISCH_TAC` w:real^3 IN V `;
2825 MATCH_MP_TAC CROSS_PAIR_NOT_IN_FF;
2827 ONCE_REWRITE_TAC[INSERT_COMM];
2828 FIRST_ASSUM ACCEPT_TAC;
2833 DOWN THEN SET_TAC[];
2836 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
2837 DOWN THEN STRIP_TAC;
2838 UNDISCH_TAC` v:real^3 IN V `;
2840 USE_FIRST` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E`
2845 ASSUME_TAC2 Local_lemmas.LOFA_CARD_EE_V_1;
2846 DOWN THEN SIMP_TAC[wedge_in_fan_gt];
2847 REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2848 ASSUME_TAC2 (SPECL [` x:real^3 `]
2849 (GENL [` vv:real^3 `] Local_lemmas.LOFA_IMP_EE_TWO_ELMS));
2850 ASM_REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
2853 SUBGOAL_THEN` &1 / &2 % v + &1 / &2 % w IN aff_gt {vec 0} {v, w:real^3}` ASSUME_TAC;
2854 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3} ` MP_TAC;
2855 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
2856 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3`));
2857 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3`));
2858 DOWN THEN DOWN THEN PHA;
2859 REWRITE_TAC[DISJOINT; EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_INSERT];
2862 SIMP_TAC[Planarity.AFF_GT_1_2; IN_ELIM_THM];
2865 EXISTS_TAC` &1 / &2 `;
2866 EXISTS_TAC` &1 / &2 `;
2867 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
2869 ABBREV_TAC` vw: real^3 = &1 / &2 % v + &1 / &2 % w `;
2872 REWRITE_TAC[SUBSET];
2874 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` vw: real^3 `));
2876 REWRITE_TAC[wedge; IN_ELIM_THM];
2879 SUBGOAL_THEN` vw IN aff_gt {vec 0, v} {w:real^3} ` MP_TAC;
2880 SUBGOAL_THEN` DISJOINT {vec 0, v} {w:real^3} ` MP_TAC;
2881 ASM_REWRITE_TAC[DISJOINT; EXTENSION; IN_INSERT; IN_INTER; NOT_IN_EMPTY];
2883 UNDISCH_TAC` ~( v = w:real^3 ) `;
2884 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
2885 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
2889 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM];
2892 EXISTS_TAC` &1 / &2 `;
2893 EXISTS_TAC` &1 / &2 `;
2895 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
2899 SUBGOAL_THEN` ~ collinear {vec 0, v, rho_node1 FF v} /\
2900 ~ collinear {vec 0, v, vw} /\
2901 ~ collinear {vec 0, v, w} ` MP_TAC;
2902 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE;
2903 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
2906 USE_FIRST ` !z t. z IN {v:real^3, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}` MATCH_MP_TAC;
2907 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
2912 UNDISCH_TAC` azim (vec 0) v (rho_node1 FF v) vw < azim (vec 0) v (rho_node1 FF v) x `;
2913 NHANH REAL_LT_IMP_LE;
2916 SUBGOAL_THEN` azim (vec 0) v (rho_node1 FF v) x =
2917 azim (vec 0) v (rho_node1 FF v) w + azim (vec 0) v w x ` MP_TAC;
2918 MATCH_MP_TAC Fan.sum4_azim_fan;
2921 ASSUME_TAC2 (SPEC` x:real^3 ` (GEN` v:real^3 ` Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
2923 ASM_SIMP_TAC[INSERT_COMM];
2927 UNDISCH_TAC` &0 < azim (vec 0) v (rho_node1 FF v) vw `;
2928 UNDISCH_TAC` azim (vec 0) v (rho_node1 FF v) w < azim (vec 0) v (rho_node1 FF v) x `;
2931 NHANH (REAL_ARITH` a < b /\ &0 < a ==> &0 < b `);
2932 FIRST_ASSUM (SUBST1_TAC o SYM);
2933 NHANH AZIM_POS_IMP_SUM_2PI;
2934 SIMP_TAC[REAL_ARITH` a + b = c <=> b = c - a `];
2936 UNDISCH_TAC` azim (vec 0) v (rho_node1 FF v) x =
2937 azim (vec 0) v (rho_node1 FF v) w + azim (vec 0) v w x`;
2938 SIMP_TAC[REAL_ARITH` a = b + c <=> c = a - b `];
2940 UNDISCH_TAC` azim (vec 0) v x (rho_node1 FF v) =
2941 &2 * pi - azim (vec 0) v (rho_node1 FF v) x `;
2942 SIMP_TAC[REAL_ARITH` a = b - c <=> c = b + -- a `];
2944 MATCH_MP_TAC (REAL_ARITH` &0 <= a ==> ( x + -- a ) - y <= x - y `);
2945 REWRITE_TAC[AZIM_RANGE];
2947 ASM_REWRITE_TAC[REAL_LE_REFL];
2950 ASM_REWRITE_TAC[]]);;
2956 let WEDGE_IN_FAN_LOFA_DETER = prove_by_refinement
2957 (`local_fan (V,E,FF) /\ v IN V /\ rho_node1 FF v = w
2958 ==> wedge_in_fan_gt (w, rho_node1 FF w) E = wedge (vec 0) w (rho_node1 FF w) v`,
2959 [REWRITE_TAC[wedge_in_fan_gt];
2960 NHANH Local_lemmas.LOFA_IMP_EE_TWO_ELMS;
2962 ASSUME_TAC2 Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2966 ASSUME_TAC2 (SPEC` w:real^3 ` (GEN` v: real^3 ` Local_lemmas.LOFA_CARD_EE_V_1));
2968 ASM_SIMP_TAC[ARITH_RULE` 2 > 1 `];
2969 REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET]]);;
2977 let FACE_MAP_SLICING_HYP_TRANS_POINT = prove_by_refinement
2978 ( `(local_fan (V,E,FF) /\
2982 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
2983 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E))
2984 ==> face_map (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (v,w) = w, rho_node1 FF w `,
2985 [NHANH PROVE_SLICING_FAN;
2986 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2989 REPLICATE_TAC 4 (DOWN THEN REMOVE_TAC);
2990 REWRITE_TAC[ff_of_hyp];
2991 SUBGOAL_THEN` v,w IN darts_of_hyp (E UNION {{v, w:real^3}}) V ` MP_TAC;
2992 MATCH_MP_TAC (ONCE_REWRITE_RULE[UNION_COMM] IN_DARTS_EXTENSION);
2993 REWRITE_TAC[IN_SING];
2996 SUBGOAL_THEN` {v,w:real^3} IN E UNION {{v, w}} ` MP_TAC;
2997 REWRITE_TAC[IN_UNION; IN_SING];
2998 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
3000 NHANH (ONCE_REWRITE_RULE[INSERT_COMM] Wrgcvdr_cizmrrh.IVS_AZIM_EQ_INVERSE_SIGMA_FAN);
3003 MATCH_MP_TAC (REWRITE_RULE[TAUT` a ==> b ==> c <=> a /\ b ==> c `] Wrgcvdr_cizmrrh.SIG_AND_INVERSE1_SIG);
3004 ASSUME_TAC2 (SPEC `w:real^3 ` LOCAL_RHO_NODE_PAIR_E);
3006 ASM_REWRITE_TAC[IN_UNION];
3008 ASSUME_TAC2 Local_lemmas.LOFA_IMAGE_RHO_NODE_IDE;
3012 UNDISCH_TAC` w:real^3 IN V `;
3014 REWRITE_TAC[IN_ELIM_THM];
3016 MP_TAC (SPECL [`x:real^3 `;` w:real^3 `]
3017 (GENL [`vv:real^3 `;` v:real^3 `] Local_lemmas.LOFA_IMP_EE_TWO_ELMS));
3022 SWITCH_TAC` w = rho_node1 FF x`;
3023 SUBGOAL_THEN` EE w ( E UNION {{v,w:real^3}}) = {v, x, rho_node1 FF w}` MP_TAC;
3024 ASM_SIMP_TAC[EE_UNION];
3025 ONCE_REWRITE_TAC[INSERT_COMM];
3026 REWRITE_TAC[EE_SING_SING];
3027 ASM_REWRITE_TAC[SET_RULE` S UNION {x} = x INSERT S`; INSERT_COMM];
3033 SUBGOAL_THEN` rho_node1 FF w IN set_of_edge w V (E UNION {{v,w}})` MP_TAC;
3034 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}}) `;
3035 NHANH (ISPEC `w:real^3 `
3036 (GEN`v:real^N` (GSYM Wrgcvdr_cizmrrh.FAN_IMP_EE_EQ_SET_OF_EDGE)));
3037 ASM_SIMP_TAC[IN_INSERT];
3038 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
3040 NHANH (GSYM Wrgcvdr_cizmrrh.AZIM_CYCLE_EQ_SIGMA_FAN);
3044 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_IMP_NOT_SEMI_IDE;
3045 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` x:real^3 `));
3046 SUBGOAL_THEN` ~( {v, x, rho_node1 FF w} SUBSET {rho_node1 FF w}) /\
3047 FINITE {v, x, rho_node1 FF w}` MP_TAC;
3049 ASM_REWRITE_TAC[Geomdetail.FINITE6];
3051 NHANH (SPEC` vec 0: real^3` (GEN` v:real^3 ` Wrgcvdr_cizmrrh.AZIM_CYCLE_PROPERTIES));
3052 ABBREV_TAC` W = {v, x, rho_node1 FF w} `;
3053 ABBREV_TAC` az = azim_cycle W (vec 0) w (rho_node1 FF w) `;
3055 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
3056 DOWN THEN STRIP_TAC;
3057 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`w: real^3 `));
3059 USE_FIRST` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E` NHANH;
3060 ASSUME_TAC2 (SPEC` x:real^3` (GEN` v:real^3 ` WEDGE_IN_FAN_LOFA_DETER));
3061 ASM_REWRITE_TAC[SUBSET];
3062 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3}` MP_TAC;
3063 REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_INSERT];
3064 ASSUME_TAC2 (SPEC` x:real^3 ` (GEN` v:real^3 ` Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V));
3068 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
3069 UNDISCH_TAC` v:real^3 IN V `;
3074 SUBGOAL_THEN` &1 / &2 % v + &1 / &2 % (w:real^3) IN aff_gt { vec 0} {v, w}` MP_TAC;
3075 ASSUME_TAC2 (ISPEC` vec 0:real^3 ` Planarity.AFF_GT_1_2);
3076 FIRST_X_ASSUM SUBST1_TAC;
3077 REWRITE_TAC[IN_ELIM_THM];
3079 EXISTS_TAC` &1 / &2 `;
3080 EXISTS_TAC` &1 / &2 `;
3081 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
3084 FIRST_X_ASSUM NHANH;
3085 REWRITE_TAC[wedge; IN_ELIM_THM];
3087 SUBGOAL_THEN` ~ collinear {vec 0, w, rho_node1 FF w} /\
3088 ~ collinear {vec 0, v, w}` MP_TAC;
3090 ASSUME_TAC2 (SPEC` w:real^3` (GEN` v:real^3 ` Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
3092 USE_FIRST` !z t. z IN {v:real^3, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}` MATCH_MP_TAC;
3093 ASM_REWRITE_TAC[IN_DIFF; IN_SING; IN_INSERT; NOT_IN_EMPTY];
3095 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
3100 MP_TAC (SPECL [` vec 0: real^3 `;` w:real^3 `;` rho_node1 FF w `;
3101 ` &1 / &2 % v + &1 / &2 % (w:real^3) `; `v:real^3 ` ] AZIM_EQ_ALT);
3104 ASM_REWRITE_TAC[INSERT_COMM];
3105 ABBREV_TAC` vw = &1 / &2 % v + &1 / &2 % (w:real^3) `;
3107 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {a,c,b} `];
3108 NHANH COLL_AFF_GT_2_1;
3111 SUBGOAL_THEN` vw IN aff_gt {vec 0, w} {v:real^3} ` MP_TAC;
3112 ASM_REWRITE_TAC[IN_ELIM_THM];
3115 EXISTS_TAC` &1 / &2 `;
3116 EXISTS_TAC` &1 / &2 `;
3117 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID; VECTOR_ADD_SYM];
3120 FIRST_X_ASSUM (SUBST1_TAC o SYM);
3128 UNDISCH_TAC` (W:real^3 -> bool) (az:real^3)`;
3130 REWRITE_TAC[SET_RULE` (x INSERT s) y <=> y = x \/ y IN s`; IN_INSERT; NOT_IN_EMPTY];
3133 USE_FIRST` !q. ~(q = rho_node1 FF w) /\ W q
3134 ==> azim (vec 0) w (rho_node1 FF w) az <
3135 azim (vec 0) w (rho_node1 FF w) q \/
3136 azim (vec 0) w (rho_node1 FF w) az =
3137 azim (vec 0) w (rho_node1 FF w) q /\
3138 norm (projection (w - vec 0) (az - vec 0)) <=
3139 norm (projection (w - vec 0) (q - vec 0)) ` (MP_TAC o (SPEC` v:real^3 `));
3144 MP_TAC (SPECL [`w:real^3 `;` v:real^3 `]
3145 (GENL [` v:real^3 `;` w:real^3 `] CROSS_PAIR_NOT_IN_FF));
3150 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
3154 FIRST_X_ASSUM (SUBST1_TAC o SYM);
3155 ASM_REWRITE_TAC[INSERT_COMM];
3161 REWRITE_TAC[SET_RULE` (x INSERT S) y <=> y = x \/ y IN S`; IN_INSERT];
3164 UNDISCH_TAC` azim (vec 0) w (rho_node1 FF w) vw < azim (vec 0) w (rho_node1 FF w) x `;
3165 ASM_SIMP_TAC[REAL_ARITH` a < b ==> ~( b < a ) /\ ~( b = a)`];
3175 let FACE_MAP_AT_TURNING_DART1 = prove(
3176 ` (local_fan (V,E,FF) /\
3180 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
3181 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
3183 ==> face_map (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (x,w) = w, v`,
3184 STRIP_TAC THEN ONCE_REWRITE_TAC[INSERT_COMM] THEN
3185 MATCH_MP_TAC FACE_MAP_AT_TURNING_DART THEN DOWN_TAC THEN SIMP_TAC[INSERT_COMM]);;
3193 let LOCAL_FAN_ORBIT_MAP_VITERFF = prove(
3194 `local_fan (V,E,FF) /\ v IN V ==> (!n. ITER n (rho_node1 FF) v, ITER (n + 1) (rho_node1 FF) v IN FF)`,
3195 NHANH Local_lemmas.LOCAL_FAN_ORBIT_MAP_VITER THEN
3196 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2 THEN
3197 REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM ADD1; ITER] THEN
3206 let DETERMINE_FV = prove_by_refinement
3207 (`(local_fan (V,E,FF) /\
3211 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
3212 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
3213 HS = hypermap ( HYP (vec 0,V,E UNION {{v, w}})) /\
3214 fv = face HS (v, rho_node1 FF v)
3215 ==> fv = (w,v) INSERT
3216 { (ITER n (rho_node1 FF) v, ITER (n + 1) (rho_node1 FF) v) | n |
3217 ! m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w)} `,
3218 [NHANH FACE_MAP_SLICING_HYP_TRANS_POINT;
3221 REWRITE_RULE[RIGHT_FORALL_IMP_THM ] (
3223 (ONCE_REWRITE_RULE[TAUT` a /\ b ==> c <=> a ==> b ==> c`] FACE_MAP_AT_TURNING_DART)));
3225 DOWN THEN DOWN THEN PHA;
3226 ONCE_REWRITE_TAC[EQ_SYM_EQ];
3228 REWRITE_TAC[EXTENSION; IN_INSERT];
3230 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_V;
3232 NHANH Local_lemmas.LOOP_SET_DETER_FIRTS_ELMS;
3235 SUBGOAL_THEN` {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m < n + 1
3242 SUBSET fv ` ASSUME_TAC;
3243 REWRITE_TAC[SUBSET; IN_ELIM_THM];
3246 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3`));
3247 UNDISCH_TAC` w:real^3 IN V `;
3249 REWRITE_TAC[IN_ELIM_THM];
3256 SUBGOAL_THEN` ! j. j < n + 1 ==> ITER j (face_map HS) (v,rho_node1 FF v) =
3257 ITER j (rho_node1 FF) v,ITER (j + 1) (rho_node1 FF) v ` ASSUME_TAC;
3259 REWRITE_TAC[ITER; GSYM ADD1];
3261 NHANH (ARITH_RULE` SUC a < b + 1 ==> a < b + 1 `);
3262 FIRST_X_ASSUM NHANH;
3266 ABBREV_TAC` xi = ITER j (rho_node1 FF) v `;
3267 ABBREV_TAC` yi = ITER (j + 1) (rho_node1 FF) v`;
3269 SUBGOAL_THEN` xi,yi IN darts_of_hyp (E UNION {{v:real^3, w}}) V /\
3273 FAN (vec 0,V,E UNION {{v, w}}) ` MP_TAC;
3275 UNDISCH_TAC` !v. v IN V ==> orbit_map (rho_node1 FF) v = V `;
3276 DISCH_THEN (ASSUME_TAC2 o SPEC_ALL);
3277 MP_TAC (ISPECL [`rho_node1 FF `; `j:num `; `v:real^3` ] Local_lemmas.lemma_in_orbit_iter);
3280 ASSUME_TAC2 (SPEC` xi:real^3 ` LOCAL_RHO_NODE_PAIR_E);
3282 REWRITE_TAC[ITER; GSYM ADD1];
3285 REWRITE_TAC[IN_DARTS_EXTENSION];
3287 UNDISCH_TAC` SUC j < n + 1 `;
3289 SWITCH_TAC` w = ITER n' (rho_node1 FF) v `;
3291 ASSUME_TAC2 (Local_lemmas.LOFA_IMP_DIS_ELMS23);
3292 FIRST_X_ASSUM (MP_TAC o (SPECL [` 0 `;` j + 1 `]));
3295 STRIP_TAC THEN STRIP_TAC;
3296 ASM_CASES_TAC` n' < j + 1 `;
3297 ASSUME_TAC2 (ARITH_RULE` j + 1 < n + 1 /\ n' < j + 1 ==> n' < n + 1 `);
3299 FIRST_X_ASSUM NHANH;
3300 FIRST_X_ASSUM NHANH;
3302 ASSUME_TAC2 (ARITH_RULE` n' < CARD (V:real^3 -> bool) /\ ~( n' < j + 1) ==> j + 1 < CARD V `);
3304 FIRST_X_ASSUM NHANH;
3307 ASSUME_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
3309 MATCH_MP_TAC PROVE_SLICING_FAN;
3312 REWRITE_TAC[IN_ELIM_THM];
3319 NHANH FACE_MAP_ADD_SET2_EQ;
3321 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
3322 FIRST_X_ASSUM (MP_TAC o (SPEC` j:num `));
3324 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
3325 DOWN THEN STRIP_TAC;
3327 STRIP_TAC THEN STRIP_TAC;
3328 ASSUME_TAC2 (SPECL [` xi:real^3 `;` rho_node1 FF xi `] (GENL [`x:real^3 `;` y:real^3 `] LOCAL_FACE_MAP_RHO_NODE1));
3331 REWRITE_TAC[GSYM ITER; ADD1];
3338 FIRST_ASSUM (MP_TAC o (SPEC` n:num`));
3342 DISCH_THEN (SUBST1_TAC o SYM);
3344 REWRITE_TAC[face; orbit_map; Wrgcvdr_cizmrrh.POWER_TO_ITER; IN_ELIM_THM];
3348 REWRITE_TAC[ARITH_RULE` a >= 0 `];
3356 UNDISCH_TAC` w:real^3 IN V `;
3357 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
3359 REWRITE_TAC[IN_ELIM_THM];
3361 ABBREV_TAC` SS = {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
3369 SUBGOAL_THEN` ITER (n - 1) (rho_node1 FF) v, (w:real^3) IN SS ` MP_TAC;
3371 REWRITE_TAC[IN_ELIM_THM];
3372 EXISTS_TAC` n - 1 `;
3373 REWRITE_TAC[PAIR_EQ];
3374 ASM_CASES_TAC` n = 0 `;
3375 FIRST_X_ASSUM SUBST_ALL_TAC;
3377 ASM_REWRITE_TAC[ITER];
3379 ASM_SIMP_TAC[ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `];
3383 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3385 FIRST_X_ASSUM (MP_TAC o (SPECL [`m:num `;` n:num`]));
3390 ASM_CASES_TAC` n = 0`;
3391 FIRST_X_ASSUM SUBST_ALL_TAC;
3393 ASM_REWRITE_TAC[ITER];
3394 ABBREV_TAC` lp = ITER (n - 1) (rho_node1 FF) v `;
3395 SUBGOAL_THEN` lp IN (V:real^3 -> bool) ` MP_TAC;
3398 REWRITE_TAC[IN_ELIM_THM];
3399 EXISTS_TAC` n - 1 `;
3401 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
3403 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
3404 DOWN THEN STRIP_TAC;
3407 REWRITE_TAC[GSYM ITER; ADD1];
3408 SWITCH_TAC` w = ITER n (rho_node1 FF) v`;
3409 ASM_SIMP_TAC[ARITH_RULE` ~(n = 0) ==> n - 1 + 1 = n `];
3411 MP_TAC (SPEC` lp:real^3` (GEN `x:real^3` FACE_MAP_AT_TURNING_DART1));
3416 REWRITE_TAC[IN_ELIM_THM];
3419 DISCH_THEN (SUBST1_TAC o SYM);
3423 MATCH_MP_TAC Wrgcvdr_cizmrrh.IN_ORBIT_MAP_IMP_F_Y;
3424 MATCH_MP_TAC Hypermap.lemma_in_subset;
3425 EXISTS_TAC` SS:real^3 # real^3 -> bool`;
3426 ASM_REWRITE_TAC[GSYM face];
3427 DOWN THEN DOWN THEN PHA;
3428 REWRITE_TAC[Hypermap.lemma_in_subset];
3432 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3 `));
3433 SUBGOAL_THEN` w:real^3 IN V ` MP_TAC;
3434 FIRST_X_ASSUM ACCEPT_TAC;
3436 REWRITE_TAC[IN_ELIM_THM];
3439 SUBGOAL_THEN` ! j. j < n ==> ITER j (face_map HS ) (v, rho_node1 FF v) =
3440 ITER j (rho_node1 FF) v, ITER (j + 1) (rho_node1 FF) v` MP_TAC;
3442 REWRITE_TAC[ITER; GSYM ADD1];
3443 NHANH (ARITH_RULE` SUC j < n ==> j < n `);
3444 FIRST_X_ASSUM NHANH;
3446 ABBREV_TAC` vi = ITER j (rho_node1 FF) v `;
3447 ABBREV_TAC` vj = ITER (j + 1) (rho_node1 FF) v`;
3452 SUBGOAL_THEN` face_map (hypermap (HYP (vec 0,V,E UNION {{v, w:real^3}}))) (vi, vj) =
3453 face_map (hypermap (HYP (vec 0,V,E))) (vi, vj:real^3)` MP_TAC;
3454 MATCH_MP_TAC FACE_MAP_ADD_SET2_EQ;
3455 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
3456 FIRST_X_ASSUM (MP_TAC o (SPEC` j: num`));
3458 UNDISCH_TAC` local_fan (V,E,FF) `;
3460 NHANH Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2;
3461 SIMP_TAC[IN_DARTS_EXTENSION];
3463 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3464 FIRST_ASSUM (MP_TAC o (SPECL [`j + 1 `;` n: num `]));
3467 ASM_REWRITE_TAC[GSYM ADD1];
3470 FIRST_ASSUM (MP_TAC o (SPECL [` 0`;` j + 1 `]));
3474 MATCH_MP_TAC LT_TRANS;
3476 ASM_REWRITE_TAC[GSYM ADD1];
3479 ASSUME_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
3481 MATCH_MP_TAC PROVE_SLICING_FAN;
3482 SWITCH_TAC` w = ITER n (rho_node1 FF) v `;
3487 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
3489 FIRST_X_ASSUM (MP_TAC o (SPEC` j:num `));
3490 UNDISCH_TAC` local_fan (V,E,FF) `;
3492 NHANH LOCAL_FACE_MAP_RHO_NODE1;
3493 ASM_SIMP_TAC[GSYM ADD1];
3495 REWRITE_TAC[GSYM ADD1; ITER];
3500 SUBGOAL_THEN` face_map (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (w,v) =
3501 v,rho_node1 FF v` MP_TAC;
3502 ONCE_REWRITE_TAC[INSERT_COMM];
3503 MATCH_MP_TAC FACE_MAP_SLICING_HYP_TRANS_POINT;
3504 SWITCH_TAC` w = ITER n (rho_node1 FF) v `;
3505 ONCE_REWRITE_TAC[INSERT_COMM];
3507 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t:real^3}`;
3508 SIMP_TAC[INSERT_COMM];
3513 SWITCH_TAC` w = ITER n (rho_node1 FF) v `;
3516 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
3517 FIRST_ASSUM (MP_TAC o (SPEC `n - 1 `));
3518 ASM_CASES_TAC` n = 0 `;
3519 FIRST_X_ASSUM SUBST_ALL_TAC;
3520 REPLICATE_TAC 4 DOWN;
3521 ASM_REWRITE_TAC[ITER];
3522 ASSUME_TAC2 (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
3523 FIRST_ASSUM SUBST1_TAC;
3525 ABBREV_TAC` xx = ITER (n - 1) (rho_node1 FF) v `;
3527 MP_TAC (SPEC` xx:real^3 ` (GEN`x:real^3 ` FACE_MAP_AT_TURNING_DART1));
3534 SUBGOAL_THEN` ITER (n + 1) (face_map HS) (v, rho_node1 FF v) = (v, rho_node1 FF v ) ` MP_TAC;
3535 SUBGOAL_THEN` ITER (n - 1) (face_map HS) (v,rho_node1 FF v) =
3536 ITER (n - 1) (rho_node1 FF) v,ITER (n - 1 + 1) (rho_node1 FF) v` MP_TAC;
3537 FIRST_ASSUM MATCH_MP_TAC;
3538 MATCH_MP_TAC (ARITH_RULE` ~( n = 0) ==> n - 1 < n `);
3539 FIRST_X_ASSUM ACCEPT_TAC;
3540 ASM_REWRITE_TAC[GSYM ADD1];
3543 REWRITE_TAC[GSYM ADD1; ITER];
3548 MP_TAC (ARITH_RULE` 0 < n + 1 `);
3550 NHANH Lvducxu.ITER_CYCLIC_ORBIT;
3551 ASM_REWRITE_TAC[GSYM face];
3554 UNDISCH_TAC` x:real^3 # real^3 IN fv `;
3555 ASM_REWRITE_TAC[IN_ELIM_THM];
3558 ASM_CASES_TAC` n' = n:num `;
3560 FIRST_X_ASSUM SUBST_ALL_TAC;
3564 REWRITE_TAC[GSYM ADD1; ITER];
3565 ASSUME_TAC2 (ARITH_RULE`~( n = 0) ==> n - 1 < n `);
3567 FIRST_X_ASSUM NHANH;
3572 EXISTS_TAC` n':num`;
3573 ASSUME_TAC2 (ARITH_RULE` n' < n + 1 /\ ~(n' = n) ==> n' < n `);
3579 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3580 FIRST_X_ASSUM (MP_TAC o SPECL[`m:num `;` n:num `]);
3582 UNDISCH_TAC` n' < n + 1 `;
3583 UNDISCH_TAC` m< n' + 1 `;
3584 UNDISCH_TAC` ~( n' = n:num) `;
3587 FIRST_X_ASSUM ACCEPT_TAC;
3588 ASM_REWRITE_TAC[]]);;
3595 let TWO_EQ_SYSTEM_THM = prove_by_refinement (
3596 ` FAN (vec 0,V,E) /\ graph E /\ UNIONS E SUBSET V ==>
3598 res (e_fan_pair (V,E)) (dart1_of_fan (V,E)),
3599 res (n_fan_pair (V,E)) (dart1_of_fan (V,E)),
3600 res (f_fan_pair (V,E)) (dart1_of_fan (V,E)) =
3602 ee_of_hyp (vec 0,V,E),
3603 nn_of_hyp (vec 0,V,E),
3604 ff_of_hyp (vec 0,V,E)`,
3605 [REWRITE_TAC[PAIR_EQ];
3607 SUBGOAL_THEN` dart_of_fan (V,E) = darts_of_hyp E V ` MP_TAC;
3608 REWRITE_TAC[dart_of_fan; darts_of_hyp; ord_pairs; self_pairs];
3610 NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] (GEN `v: A` Wrgcvdr_cizmrrh.UNI_E_IMP_EE_EQ_SET_OF_EDGE));
3611 SIMP_TAC[EXTENSION; IN_UNION];
3616 REWRITE_TAC[res; FUN_EQ_THM; ee_of_hyp2];
3619 REWRITE_TAC[dart1_of_fan; darts_of_hyp; IN_UNION; ord_pairs];
3620 ASM_CASES_TAC` x IN {a,b | {a, b:real^3} IN E}`;
3622 PAT_ONCE_REWRITE_TAC`\p. P p = PP `[GSYM PAIR];
3623 PURE_ONCE_REWRITE_TAC[e_fan_pair];
3627 ASM_REWRITE_TAC[self_pairs; IN_ELIM_THM];
3628 MESON_TAC[PAIR_EQ; FST; SND];
3633 REWRITE_TAC[nn_of_hyp3; dart1_of_fan];
3635 ASM_CASES_TAC` x IN {v,w | {v:real^3, w} IN E}`;
3636 ASM_REWRITE_TAC[darts_of_hyp; ord_pairs; self_pairs; IN_UNION; EE];
3638 REWRITE_TAC[IN_ELIM_THM];
3640 ASM_REWRITE_TAC[n_fan_pair];
3644 FIRST_X_ASSUM (MP_TAC o (SPEC` {v, w:real^3}`));
3649 REWRITE_TAC[SET2_HAS_SIZE2];
3651 SUBGOAL_THEN` ~( {w | {v, w:real^3} IN E} = {} ) ` MP_TAC;
3652 UNDISCH_TAC` {v:real^3,w} IN E `;
3659 NHANH (MESON[PAIR_EQ]` (?v'. v' IN V /\ {w | {v', w} IN E} = {} /\ v,w = v',v')
3660 ==> {w | {v, w} IN E} = {} `);
3663 UNDISCH_TAC` {v, w:real^3} IN E `;
3664 UNDISCH_TAC` FAN (vec 0, V:real^3 -> bool, E) `;
3666 NHANH Wrgcvdr_cizmrrh.ITER_AZIM_CYCLE_EQ_ITER_SIGMA;
3668 FIRST_X_ASSUM (MP_TAC o (SPEC` w:real^3 `));
3670 REWRITE_TAC[EE; IN_ELIM_THM];
3671 FIRST_ASSUM ACCEPT_TAC;
3672 DISCH_THEN (MP_TAC o (SPEC` 1 `));
3673 SIMP_TAC[ITER12; EE];
3678 ASM_REWRITE_TAC[darts_of_hyp; IN_UNION; TAUT`~( a \/ b) \/ b <=> ~ a \/ b`];
3679 ASM_REWRITE_TAC[ord_pairs];
3680 (* ------------------ *)
3682 REWRITE_TAC[dart1_of_fan; f_fan_pair; Wrgcvdr_cizmrrh.ff_of_hyp3; f_fan_pair];
3683 ASM_CASES_TAC` (x:real^3#real^3) IN {v,w | {v, w} IN E}`;
3684 ASM_REWRITE_TAC[darts_of_hyp; IN_UNION; TAUT` ~(a \/ b) \/ b <=> ~ a \/ b `; ord_pairs];
3687 REWRITE_TAC[graph; IN_ELIM_THM];
3689 SUBGOAL_THEN` ~ ( x IN self_pairs E (V:real^3 -> bool))` MP_TAC;
3690 REWRITE_TAC[self_pairs; IN_ELIM_THM];
3691 DOWN THEN DOWN THEN PHA;
3693 FIRST_X_ASSUM NHANH;
3694 SIMP_TAC[SET2_HAS_SIZE2; PAIR_EQ];
3698 ASM_SIMP_TAC[f_fan_pair; PAIR_EQ];
3700 UNDISCH_TAC` {v, w:real^3} IN E `;
3701 UNDISCH_TAC` FAN (vec 0, V:real^3 -> bool, E) `;
3702 ONCE_REWRITE_TAC[INSERT_COMM];
3704 NHANH Fan_misc.INVERSE_SIGMA_FAN_EQ_INVERSE1_SIGMA_FAN;
3705 NHANH Wrgcvdr_cizmrrh.IVS_AZIM_EQ_INVERSE_SIGMA_FAN;
3707 FIRST_X_ASSUM (ASSUME_TAC o SYM);
3710 ASM_REWRITE_TAC[darts_of_hyp; IN_UNION; TAUT` ~( a \/ b) \/ b <=> ~ a \/ b `];
3711 ASM_REWRITE_TAC[ord_pairs]]);;
3717 let LOFA_FST_IDENTIFY = prove(
3718 ` local_fan (V,E,FF) /\ x IN FF /\ y IN FF /\ FST x = FST y ==> x = y `,
3719 NHANH Local_lemmas.LOFA_IMP_BIJ_FF_V THEN REWRITE_TAC[BIJ; INJ] THEN
3724 let CARD_IS_LEAST_CYCLE = prove_by_refinement (
3725 ` local_fan (V,E,FF) /\ v IN V /\
3726 ITER n (rho_node1 FF) v = v /\ ~( n = 0)
3729 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3730 ASM_CASES_TAC` n < CARD (V:real^3 -> bool) `;
3731 FIRST_X_ASSUM (MP_TAC o (SPECL [`0`;` n:num`]));
3736 ASM_REWRITE_TAC[ITER];
3745 let HAFL_CIRCLE_FORM_LOCAL_FAN = prove_by_refinement
3746 (`(local_fan (V,E,FF) /\
3750 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
3751 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
3752 HS = hypermap ( HYP (vec 0,V,E UNION {{v, w}})) /\
3753 fv = face HS (v, rho_node1 FF v)
3754 ==> local_fan (v_prime V fv, e_prime (E UNION {{v, w}}) fv, fv) `,
3755 [NHANH PROVE_SLICING_FAN;
3757 SUBGOAL_THEN` (v,rho_node1 FF v) IN darts_of_hyp (E UNION {{v,w}}) V` ASSUME_TAC;
3758 REWRITE_TAC[darts_of_hyp];
3759 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
3760 DOWN THEN STRIP_TAC;
3761 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
3763 UNDISCH_TAC` local_fan (V,E,FF) `;
3765 NHANH Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2;
3766 REWRITE_TAC[IN_ELIM_THM; IN_UNION; ord_pairs];
3769 EXISTS_TAC` v:real^3 `;
3770 EXISTS_TAC` rho_node1 FF v `;
3773 MP_TAC LOFA_HYP_UNION_CARD_GT2;
3780 SUBGOAL_THEN` simple_hypermap (hypermap (HYP (vec 0, v_prime V fv, e_prime (E UNION {{v, w}} ) fv)))` MP_TAC;
3781 REWRITE_TAC[simple_hypermap];
3782 SUBGOAL_THEN` FAN (vec 0:real^3,v_prime (V:real^3 -> bool) fv,e_prime (E UNION {{v,w}} ) fv) ` MP_TAC;
3783 MATCH_MP_TAC Wrgcvdr_cizmrrh.IMP_FAN_V_PRIME_E_PRIME;
3785 EXISTS_TAC` (v, rho_node1 FF v) `;
3787 UNDISCH_TAC `FAN (vec 0, V:real^3 -> bool, E UNION {{v, w}})`;
3788 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
3792 SWITCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v, w: real^3}})) `;
3793 SWITCH_TAC` fv = face HS (v,rho_node1 FF v) `;
3796 SUBGOAL_THEN` 1 < CARD (fv:real^3 # real^3 -> bool) ` MP_TAC;
3798 SUBGOAL_THEN` fv = face (hypermap (HYP (vec 0,V,(E UNION {{v,w:real^3}})))) (v,rho_node1 FF v)` MP_TAC;
3801 SUBGOAL_THEN` FAN (vec 0, V, E UNION {{v,w:real^3}}) ` MP_TAC;
3802 FIRST_X_ASSUM ACCEPT_TAC;
3804 NHANH Lvducxu.DARTS_E_PRIME_GT1_SWITCH;
3806 UNDISCH_TAC` FAN (vec 0,v_prime V fv,e_prime (E UNION {{v:real^3, w}}) fv) `;
3807 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
3811 face (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (v,rho_node1 FF v)`;
3815 REWRITE_TAC[IN_UNION];
3816 GEN_TAC THEN STRIP_TAC;
3818 ASSUME_TAC2 LOCAL_FAN_SIMPLE_HYP;
3820 MP_TAC DETERMINE_FV;
3825 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
3826 FIRST_X_ASSUM (ASSUME_TAC o SYM);
3829 MP_TAC (SPECL [`E UNION {{v,w:real^3 }} `; ` fv: real^3 # real^3 -> bool `;` v, rho_node1 FF v`;` vec 0: real^3 `] (
3830 GENL [`E:(real^3 -> bool) -> bool `;` FF: real^3 # real^3 -> bool`; `x:real^3 # real^3`;`v:real^3`] Lvducxu.LOCALIZE_PRESERVE_FACE));
3833 UNDISCH_TAC` v,rho_node1 FF v IN darts_of_hyp (E UNION {{v, w}}) V`;
3834 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
3835 NHANH Lvducxu.FAN_DART_DARTS;
3839 SUBGOAL_THEN` x IN face
3840 (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v, w}}) fv)))
3841 (v,rho_node1 FF v) ` MP_TAC;
3844 (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v, w}}) fv)))
3845 (v,rho_node1 FF v) `;
3846 DISCH_THEN (SUBST1_TAC o SYM);
3848 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
3851 NHANH Hypermap.lemma_face_identity;
3852 ONCE_REWRITE_TAC[EQ_SYM_EQ];
3855 REWRITE_TAC[EXTENSION; IN_INSERT; NOT_IN_EMPTY];
3859 (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v, w}}) fv)))
3860 (v,rho_node1 FF v) `;
3864 SIMP_TAC[IN_INTER; Wrgcvdr_cizmrrh.X_IN_HYP_ORBITS];
3865 MESON_TAC[Wrgcvdr_cizmrrh.X_IN_HYP_ORBITS];
3866 UNDISCH_TAC` x = w,v \/
3867 (?n. (!m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w)) /\
3868 x = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v)`;
3870 REWRITE_TAC[IN_INTER];
3871 UNDISCH_TAC` FAN (vec 0,v_prime V fv,e_prime (E UNION {{v, w:real^3}}) fv) `;
3874 NHANH Wrgcvdr_cizmrrh.IN_NODE_IMP_FIRST_EQ;
3877 USE_FIRST` (w,v) INSERT
3878 {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
3886 fv ` (SUBST1_TAC o SYM);
3887 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
3890 UNDISCH_TAC` FST (x':real^3 # real^3) = FST (x:real^3 # real^3)`;
3892 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num`));
3898 REWRITE_TAC[IN_INTER];
3899 UNDISCH_TAC` FAN (vec 0,v_prime V fv,e_prime (E UNION {{v, w:real^3}}) fv) `;
3902 NHANH Wrgcvdr_cizmrrh.IN_NODE_IMP_FIRST_EQ;
3905 USE_FIRST` (w,v) INSERT
3906 {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
3914 fv ` (SUBST1_TAC o SYM);
3915 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
3917 UNDISCH_TAC` FST (x':real^3 # real^3) = FST (x:real^3 # real^3)`;
3919 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num`));
3924 UNDISCH_TAC` FST (x':real^3 # real^3) = FST (x:real^3 # real^3)`;
3926 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_V;
3928 NHANH Local_lemmas.LOOP_SET_DETER_FIRTS_ELMS;
3930 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v: real^3 `));
3931 UNDISCH_TAC` w:real^3 IN V `;
3933 REWRITE_TAC[IN_ELIM_THM];
3935 ASM_CASES_TAC` ~( n < CARD (V:real^3 -> bool))`;
3936 ASSUME_TAC2 (ARITH_RULE` ~( n < CARD (V:real^3 -> bool)) /\ n'' < CARD V ==> n'' < n + 1 `);
3937 USE_FIRST` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w) ` (ASSUME_TAC2 o (SPEC`n'': num `));
3942 ASM_CASES_TAC` ~( n' < CARD (V:real^3 -> bool)) `;
3943 ASSUME_TAC2 (ARITH_RULE` ~( n' < CARD (V:real^3 -> bool)) /\ n'' < CARD V ==> n'' < n' + 1 `);
3944 USE_FIRST` !m. m < n' + 1 ==> ~(ITER m (rho_node1 FF) v = w) ` (ASSUME_TAC2 o (SPEC`n'': num `));
3948 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3950 ASM_CASES_TAC` n < n':num `;
3952 FIRST_X_ASSUM (MP_TAC o (SPECL[` n:num`;` n':num`]));
3953 DISCH_THEN ASSUME_TAC2;
3956 ASM_CASES_TAC` n' < n:num `;
3958 FIRST_X_ASSUM (MP_TAC o (SPECL[` n':num `;` n:num`]));
3959 DISCH_THEN ASSUME_TAC2;
3960 DOWN THEN ASM_REWRITE_TAC[];
3961 ASSUME_TAC2 (ARITH_RULE` ~( n < n':num) /\ ~(n' < n) ==> n' = n `);
3964 (* ================================== *)
3977 MP_TAC DETERMINE_FV;
3980 DISCH_THEN (ASSUME_TAC o SYM);
3982 (* ================================== *)
3987 UNDISCH_TAC` x IN {v,w | w,v IN (fv:real^3 # real^3 -> bool)} `;
3989 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
3999 SUBGOAL_THEN `x IN dart (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v, w}}) fv))) ` MP_TAC;
4000 ASM_REWRITE_TAC[IN_UNION; IN_ELIM_THM];
4002 EXISTS_TAC` v:real^3`;
4003 EXISTS_TAC` w:real^3 `;
4007 REWRITE_TAC[IN_INSERT];
4012 NHANH Hypermap.lemma_node_subset;
4015 REWRITE_TAC[EXTENSION; IN_INTER];
4020 ISPECL [`vec 0: real^3 `; ` v_prime (V:real^3 -> bool) (fv:real^3#real^3->bool) `;
4021 `e_prime (E UNION {{v:real^3, w}}) (fv: real^3#real^3->bool) `;` x': real^3#real^3`;
4022 `(v':real^3, w':real^3) `] (GEN_ALL Wrgcvdr_cizmrrh.IN_NODE_IMP_FIRST_EQ));
4025 REPLICATE_TAC 3 DOWN;
4026 REWRITE_TAC[SUBSET];
4029 REWRITE_TAC[IN_UNION];
4031 UNDISCH_TAC` w':real^3, v':real^3 = w:real^3, v:real^3 `;
4034 UNDISCH_TAC` x':real^3#real^3 IN fv `;
4035 UNDISCH_TAC` face (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (v,rho_node1 FF v) =
4039 NHANH Hypermap.lemma_face_identity;
4043 (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v, w}}) fv)))
4045 NHANH Hypermap.lemma_face_identity;
4049 face (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v, w}}) fv))) x'` MP_TAC;
4050 MATCH_MP_TAC Lvducxu.LOCALIZE_PRESERVE_FACE;
4052 SUBGOAL_THEN` v, rho_node1 FF v IN dart HS ` MP_TAC;
4054 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
4055 NHANH Lvducxu.FAN_DART_DARTS;
4058 MATCH_MP_TAC IN_DARTS_EXTENSION;
4059 MATCH_MP_TAC LOCAL_RHO_NODE_PAIR_E;
4061 NHANH_PAT`\x. x ==> y ` Hypermap.lemma_face_subset;
4062 ASM_REWRITE_TAC[SUBSET];
4066 SUBGOAL_THEN ` (v:real^3, w:real^3) IN
4068 (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v, w}}) fv)))
4070 REWRITE_TAC[Hypermap.face_refl];
4073 DISCH_THEN (ASSUME_TAC o SYM);
4074 DISCH_THEN (ASSUME_TAC o SYM);
4076 UNDISCH_TAC` (w,v) INSERT
4077 {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
4088 ASM_REWRITE_TAC[IN_INSERT; PAIR_EQ];
4090 REWRITE_TAC[IN_ELIM_THM];
4092 SUBGOAL_THEN` ~((v:real^3,w:real^3) IN FF) ` MP_TAC;
4093 MATCH_MP_TAC CROSS_PAIR_NOT_IN_FF;
4095 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
4098 (* ======================= *)
4101 STRIP_TAC THEN STRIP_TAC;
4102 UNDISCH_TAC` x' IN {(v:real^3 ,w:real^3) | w,v IN fv}`;
4104 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
4107 UNDISCH_TAC` w',v' = (w:real^3,v:real^3) `;
4108 ASM_SIMP_TAC[PAIR_EQ];
4110 UNDISCH_TAC` w'',v'' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v`;
4111 UNDISCH_TAC` FST (x':real^3#real^3) = v'`;
4112 ASM_SIMP_TAC[PAIR_EQ];
4113 UNDISCH_TAC` w',v' = w:real^3, v:real^3 `;
4116 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4118 ASSUME_TAC (ARITH_RULE` ~( n + 1 = 0) `);
4119 MP_TAC (SPEC` n + 1 ` (GEN `n:num ` CARD_IS_LEAST_CYCLE));
4123 SIMP_TAC[EQ_SYM_EQ];
4128 UNDISCH_TAC` w:real^3 IN V `;
4130 REWRITE_TAC[IN_ELIM_THM];
4133 ASSUME_TAC2 (ARITH_RULE` CARD (V:real^3 -> bool) <= n + 1 /\ n' < CARD V
4137 SIMP_TAC[IN_INSERT; NOT_IN_EMPTY; Wrgcvdr_cizmrrh.X_IN_HYP_ORBITS];
4150 (* =============================== *)
4152 REWRITE_TAC[EXTENSION; IN_INSERT; NOT_IN_EMPTY; IN_INTER];
4155 ONCE_REWRITE_TAC[CONJ_SYM];
4158 UNDISCH_TAC` FAN (vec 0,v_prime V fv,e_prime (E UNION {{v:real^3, w}}) fv)`;
4160 NHANH Wrgcvdr_cizmrrh.IN_NODE_IMP_FIRST_EQ;
4165 SUBGOAL_THEN` x IN dart
4166 (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v:real^3, w}}) fv)))` MP_TAC;
4167 ASM_REWRITE_TAC[IN_UNION];
4169 REWRITE_TAC[IN_ELIM_THM];
4170 EXISTS_TAC` ITER (n + 1) (rho_node1 FF) v `;
4171 EXISTS_TAC` ITER n (rho_node1 FF) v `;
4172 UNDISCH_TAC` w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4176 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4180 NHANH Hypermap.lemma_node_subset;
4181 REWRITE_TAC[SUBSET];
4184 ASM_REWRITE_TAC[IN_UNION];
4188 SUBGOAL_THEN` (v,rho_node1 FF v) IN dart (hypermap (HYP (vec 0,V,E UNION {{v, w}})))` MP_TAC;
4190 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}}) `;
4191 NHANH Lvducxu.FAN_DART_DARTS;
4195 UNDISCH_TAC` face HS (v,rho_node1 FF v) = fv `;
4196 DISCH_THEN (MP_TAC o SYM);
4198 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
4202 NHANH Lvducxu.LOCALIZE_PRESERVE_FACE;
4206 UNDISCH_TAC` x':real^3#real^3 IN fv `;
4207 FIRST_ASSUM (SUBST1_TAC);
4208 NHANH Hypermap.lemma_face_identity;
4210 FIRST_X_ASSUM (ASSUME_TAC o SYM);
4214 (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v, w}}) fv)))
4216 NHANH Hypermap.lemma_face_identity;
4219 MP_TAC (ISPECL [` (hypermap (HYP (vec 0,v_prime V fv,e_prime (E UNION {{v, w:real^3}}) fv))) `;` x:real^3# real^3 `] Hypermap.face_refl);
4221 FIRST_ASSUM (SUBST1_TAC o SYM);
4222 UNDISCH_TAC` (w,v) INSERT
4223 {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
4233 FIRST_ASSUM (SUBST1_TAC o SYM);
4234 REWRITE_TAC[IN_INSERT];
4236 UNDISCH_TAC`w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4239 STRIP_TAC THEN STRIP_TAC;
4241 ASM_REWRITE_TAC[GSYM ADD1; ITER];
4242 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
4243 DOWN THEN STRIP_TAC;
4244 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v: real^3`));
4247 ASSUME_TAC2 CROSS_PAIR_NOT_IN_FF;
4249 UNDISCH_TAC` v,rho_node1 FF v IN FF `;
4251 REPLICATE_TAC 3 DOWN;
4254 (* ============================ *)
4255 (* ============================ *)
4261 REWRITE_TAC[IN_ELIM_THM];
4264 UNDISCH_TAC` w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4265 REWRITE_TAC[PAIR_EQ; GSYM ADD1; ITER];
4268 (* 33 [`v' = rho_node1 FF (ITER n (rho_node1 FF) v)`]
4270 `v' = ITER n' (rho_node1 FF) v /\
4271 w' = rho_node1 FF (ITER n' (rho_node1 FF) v)
4278 DISCH_THEN (SUBST1_TAC o SYM);
4285 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_IMP_NOT_SEMI_IDE;
4286 FIRST_X_ASSUM (MP_TAC o (SPEC` ITER n (rho_node1 FF) v `));
4288 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_VITER;
4289 FIRST_X_ASSUM MATCH_MP_TAC;
4290 FIRST_X_ASSUM ACCEPT_TAC;
4300 (* =============== *)
4301 (* =============== *)
4304 REWRITE_TAC[IN_ELIM_THM];
4306 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
4309 UNDISCH_TAC` w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4313 MP_TAC (SPEC` n + 1 ` (GEN `n:num ` CARD_IS_LEAST_CYCLE));
4315 FIRST_X_ASSUM (SUBST1_TAC o SYM);
4316 ASM_REWRITE_TAC[ARITH_RULE` ~( n + 1 = 0) `];
4317 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4318 UNDISCH_TAC` (w:real^3) IN V `;
4320 REWRITE_TAC[IN_ELIM_THM];
4322 UNDISCH_TAC` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w) `;
4323 MESON_TAC[ARITH_RULE` a < b /\ b <= c ==> a < (c:num) `];
4331 ASM_CASES_TAC` CARD (V:real^3 -> bool) <= n + 1 `;
4332 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4333 UNDISCH_TAC` w:real^3 IN V `;
4335 REWRITE_TAC[IN_ELIM_THM];
4336 UNDISCH_TAC` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w)`;
4337 UNDISCH_TAC` CARD (V:real^3 -> bool) <= n + 1 `;
4338 MESON_TAC[ARITH_RULE` a < b /\ b <= n + 1 ==> a < n + 1 `];
4342 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
4343 FIRST_X_ASSUM (MP_TAC o (SPECL[` 0`; `n + 1 `]));
4347 DOWN THEN ARITH_TAC;
4355 ASM_CASES_TAC` CARD (V:real^3 -> bool) <= n' + 1 `;
4356 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4357 UNDISCH_TAC` w:real^3 IN V `;
4359 REWRITE_TAC[IN_ELIM_THM];
4360 UNDISCH_TAC` !m. m < n' + 1 ==> ~(ITER m (rho_node1 FF) v = w)`;
4361 UNDISCH_TAC` CARD (V:real^3 -> bool) <= n' + 1 `;
4362 MESON_TAC[ARITH_RULE` a < b /\ b <= n + 1 ==> a < n + 1 `];
4365 ASM_CASES_TAC` CARD (V:real^3 -> bool) <= n + 1 `;
4366 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4367 UNDISCH_TAC` w:real^3 IN V `;
4369 REWRITE_TAC[IN_ELIM_THM];
4370 UNDISCH_TAC` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w)`;
4371 UNDISCH_TAC` CARD (V:real^3 -> bool) <= n + 1 `;
4372 MESON_TAC[ARITH_RULE` a < b /\ b <= n + 1 ==> a < n + 1 `];
4382 REWRITE_TAC[ARITH_RULE` ~( a <= n + 1 ) <=> n + 1 < a `];
4384 UNDISCH_TAC` w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4388 ASM_CASES_TAC` n + 1 < n' + 1 \/ n' + 1 < n + 1 `;
4389 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
4390 REPLICATE_TAC 5 DOWN;
4394 REWRITE_TAC[DE_MORGAN_THM; ARITH_RULE` ~( a < b) /\ ~( b < a:num) <=> a = b `; ARITH_RULE` a + 1 = b + 1 <=> a = b `];
4399 SIMP_TAC[Wrgcvdr_cizmrrh.X_IN_HYP_ORBITS];
4407 MATCH_MP_TAC (prove(`!x. FAN (vec 0,V,E) /\
4408 x IN darts_of_hyp E V /\
4409 FF = face (hypermap (HYP (vec 0,V,E))) x
4411 simple_hypermap (hypermap (HYP (vec 0,v_prime V FF,e_prime E FF)))
4412 ==> local_fan (v_prime V FF,e_prime E FF,FF)`,
4413 NHANH Lvducxu.LVDUCXU THEN SIMP_TAC[]));
4414 EXISTS_TAC` v, rho_node1 FF v `;
4415 ASM_REWRITE_TAC[]]);;
4420 let HAFL_CIRCLE_FORM_LOCAL_FAN2 = prove_by_refinement
4421 (` (local_fan (V,E,FF) /\
4425 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
4426 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
4427 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
4428 fv = face HS (v,rho_node1 FF v) /\
4429 fw = face HS (w,rho_node1 FF w)
4430 ==> local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) /\
4431 local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) `,
4434 MATCH_MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN;
4436 MATCH_MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN;
4437 ASM_REWRITE_TAC[INSERT_COMM];
4438 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t:real^3} `;
4440 SIMP_TAC[INSERT_COMM]]);;
4446 let LOCAL_FAN_RHO_NODE_IVS = prove_by_refinement (
4447 ` local_fan (V,E,FF) /\ v IN V
4448 ==> rho_node1 FF (ivs_rho_node1 FF v ) = v `,
4449 [NHANH Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
4452 FIRST_X_ASSUM NHANH;
4454 FIRST_X_ASSUM (SUBST1_TAC o SYM);
4455 REWRITE_TAC[GSYM ITER];
4456 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_FINITE_V;
4457 DOWN THEN DOWN THEN PHA;
4458 REWRITE_TAC[SET_RULE` a IN X <=> {a} SUBSET X `];
4462 SUBST1_TAC (ISPEC`v:real^3` Trigonometry2.CARD_SING);
4463 NHANH (ARITH_RULE` 1 <= a ==> SUC (a - 1) = a`);
4466 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
4467 FIRST_X_ASSUM MATCH_MP_TAC;
4469 SIMP_TAC[INSERT_SUBSET]]);;
4475 let LOCAL_FAN_IVS_IN_V = prove(` local_fan (V,E,FF) /\ v IN V
4476 ==> ivs_rho_node1 FF v IN V `,
4477 NHANH Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V THEN
4478 NHANH Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1 THEN
4485 let LF_AZIM_CYCLE_EQ_IVS_ND = prove(` local_fan (V,E,FF) /\ v IN V
4486 ==> azim_cycle (EE v E) (vec 0) v (rho_node1 FF v) = ivs_rho_node1 FF v `,
4487 NHANH LOCAL_FAN_RHO_NODE_IVS THEN
4488 NHANH LOCAL_FAN_IVS_IN_V THEN
4489 ABBREV_TAC` vv = ivs_rho_node1 FF v ` THEN
4490 STRIP_TAC THEN ASSUME_TAC2 Local_lemmas.LOFA_IMP_EE_TWO_ELMS THEN
4491 ASM_REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET]);;
4498 let AZIM_IN_FAN_RHOND_IVS_RHOND = prove(` local_fan (V,E,FF) /\ v IN V
4499 ==> azim_in_fan (v, rho_node1 FF v) E = azim (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `, STRIP_TAC THEN
4500 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2 THEN DOWN THEN STRIP_TAC
4501 THEN FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3`)) THEN
4502 DOWN THEN UNDISCH_TAC` local_fan (V,E,FF)` THEN
4503 PHA THEN NHANH Local_lemmas.LOFA_DETERMINE_AZIM_IN_FA THEN
4504 SIMP_TAC[] THEN STRIP_TAC THEN
4505 ASSUME_TAC2 LF_AZIM_CYCLE_EQ_IVS_ND THEN ASM_REWRITE_TAC[]);;
4512 let LOFA_IMP_EE_TWO_ELMS_INS_ND = prove(` local_fan (V,E,FF) /\ v IN V
4513 ==> EE v E = {rho_node1 FF v, ivs_rho_node1 FF v} `,
4514 NHANH LOCAL_FAN_IVS_IN_V THEN NHANH LOCAL_FAN_RHO_NODE_IVS THEN
4515 STRIP_TAC THEN ABBREV_TAC `vv = ivs_rho_node1 FF v ` THEN
4516 ASSUME_TAC2 Local_lemmas.LOFA_IMP_EE_TWO_ELMS THEN
4517 FIRST_X_ASSUM ACCEPT_TAC);;
4522 let WEDGE_IN_FAN_RHOND_IVS_RHOND = prove(` local_fan (V,E,FF) /\ v IN V
4523 ==> wedge_in_fan_ge (v,rho_node1 FF v) E =
4524 wedge_ge (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `,
4525 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2 THEN STRIP_TAC THEN
4526 DOWN THEN FIRST_X_ASSUM NHANH THEN STRIP_TAC THEN
4527 DOWN THEN UNDISCH_TAC `local_fan (V,E,FF) ` THEN PHA THEN
4528 NHANH Local_lemmas.DETERMINE_WEDGE_IN_FAN THEN SIMP_TAC[] THEN
4529 STRIP_TAC THEN ASSUME_TAC2 LOFA_IMP_EE_TWO_ELMS_INS_ND THEN
4530 ASM_SIMP_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET]);;
4536 let FST_LST_IN_WEDGE_GE = prove(` w1 IN wedge_ge v0 v1 w1 w2 /\
4537 w2 IN wedge_ge v0 v1 w1 w2`,
4538 REWRITE_TAC[wedge_ge; IN_ELIM_THM; AZIM_REFL; Local_lemmas.AZIM_RANGE] THEN
4539 REWRITE_TAC[REAL_LE_REFL]);;
4544 let IVS_RHO_NODE_DIFF_ID = prove(`!v. local_fan (V,E,FF) /\ v IN V
4545 ==> ~(ivs_rho_node1 FF v = v)`,
4546 NHANH LOCAL_FAN_IVS_IN_V THEN NHANH Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE THEN
4547 REPEAT STRIP_TAC THEN FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` ivs_rho_node1 FF v `)) THEN
4548 ASSUME_TAC2 LOCAL_FAN_RHO_NODE_IVS THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN
4549 DOWN THEN ASM_REWRITE_TAC[]);;
4555 let POINT_PRESENTED_IN_RHOND1 = prove(
4556 ` local_fan (V,E,FF) /\ v IN V /\ w IN V ==> ? n. n < CARD V /\
4557 ITER n (rho_node1 FF) v = w /\ (! m. m < n ==> ~( ITER m (rho_node1 FF) v = w )) `,
4558 STRIP_TAC THEN ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V THEN
4559 UNDISCH_TAC ` w:real^3 IN V ` THEN EXPAND_TAC "V" THEN
4560 REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
4561 EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN
4562 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23 THEN GEN_TAC THEN
4563 STRIP_TAC THEN FIRST_X_ASSUM (MP_TAC o (SPECL [`m:num `;` n:num`])) THEN PHA
4564 THEN PHA THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; SIMP_TAC[]]);;
4572 let POINTS_IN_HAFL_CIRCLE = prove_by_refinement
4573 (` (local_fan (V,E,FF) /\
4577 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
4578 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
4579 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
4580 fv = face HS (v,rho_node1 FF v)
4581 ==> v_prime V fv = {ITER n (rho_node1 FF) v| n | ! m . m < n ==> ~(ITER m (rho_node1 FF ) v = w)} `,
4582 [NHANH DETERMINE_FV;
4583 REWRITE_TAC[v_prime];
4585 REWRITE_TAC[EXTENSION];
4588 REWRITE_TAC[IN_ELIM_THM];
4589 FIRST_X_ASSUM (ASSUME_TAC o SYM);
4591 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4594 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
4596 DOWN THEN STRIP_TAC;
4598 REPLICATE_TAC 4 DOWN THEN PHA;
4599 REWRITE_TAC[PAIR_EQ];
4604 REWRITE_TAC[PAIR_EQ];
4606 EXISTS_TAC` n:num `;
4610 NHANH (ARITH_RULE` a < (b:num) ==> a < b + 1 `);
4611 FIRST_X_ASSUM NHANH;
4615 REWRITE_TAC[IN_ELIM_THM];
4617 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4618 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num `));
4621 UNDISCH_TAC` fv = face HS (v,rho_node1 FF v) `;
4622 DISCH_THEN (ASSUME_TAC o SYM);
4623 UNDISCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v, w:real^3}}))`;
4624 DISCH_THEN (ASSUME_TAC o SYM);
4626 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4627 ASM_CASES_TAC` x = (w:real^3) `;
4628 EXISTS_TAC `v:real^3 `;
4630 FIRST_X_ASSUM (ASSUME_TAC o SYM);
4634 EXISTS_TAC` ITER (n + 1) (rho_node1 FF) v`;
4639 ASM_CASES_TAC` m = n:num `;
4640 UNDISCH_TAC` x = ITER n (rho_node1 FF) v `;
4642 DISCH_THEN (SUBST1_TAC o SYM);
4645 REWRITE_TAC[ARITH_RULE` ~(m = n) /\ m < n + 1 <=> m < n `];
4646 FIRST_X_ASSUM NHANH;
4651 let COVEX_OF_LOFA_HALF_CIRCLE = prove_by_refinement
4652 (`convex_local_fan (V,E,FF) /\
4653 (local_fan (V,E,FF) /\
4657 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
4658 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
4659 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
4660 fv = face HS (v,rho_node1 FF v)
4661 ==> convex_local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) `,
4662 [NHANH HAFL_CIRCLE_FORM_LOCAL_FAN;
4663 REWRITE_TAC[convex_local_fan];
4665 ONCE_REWRITE_TAC[EQ_SYM_EQ];
4670 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
4675 SUBGOAL_THEN ` (w:real^3,v:real^3) IN fv ` MP_TAC;
4677 REWRITE_TAC[IN_INSERT];
4678 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w:real^3}}) fv,fv)`;
4680 NHANH Local_lemmas.LOFA_DETERMINE_AZIM_IN_FA;
4684 SUBGOAL_THEN ` e_prime (E UNION {{v, w}}) fv = {{v,w:real^3} | v,w IN fv }` MP_TAC;
4685 REWRITE_TAC[EXTENSION];
4687 REWRITE_TAC[e_prime; IN_ELIM_THM];
4693 EXISTS_TAC` v':real^3`;
4694 EXISTS_TAC` w': real^3 `;
4696 UNDISCH_TAC` v':real^3, w': real^3 IN fv `;
4698 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4703 SIMP_TAC[PAIR_EQ; INSERT_COMM; IN_UNION; IN_INSERT];
4704 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
4705 FIRST_X_ASSUM (ASSUME_TAC o (SPEC`n: num`));
4707 UNDISCH_TAC` local_fan (V,E,FF) `;
4709 NHANH Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2;
4711 SIMP_TAC[PAIR_EQ; IN_UNION];
4719 SUBGOAL_THEN` EE w {{v, w} | v,w IN fv} = {v:real^3, ivs_rho_node1 FF w}` MP_TAC;
4720 REWRITE_TAC[EE; EXTENSION];
4723 REWRITE_TAC[IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY];
4725 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4727 DOWN THEN DOWN THEN PHA;
4728 REWRITE_TAC[PAIR_EQ];
4731 DOWN THEN REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
4733 REWRITE_TAC[PAIR_EQ];
4734 FIRST_ASSUM (MP_TAC o (SPEC` n: num `));
4741 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4742 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num `));
4743 UNDISCH_TAC ` local_fan (V,E,FF) `;
4745 NHANH Local_lemmas.IVS_RHO_IDD;
4746 REWRITE_TAC[GSYM ITER; ADD1];
4750 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; IN_ELIM_THM];
4752 EXISTS_TAC` w:real^3 `;
4753 EXISTS_TAC` v:real^3 `;
4755 REWRITE_TAC[IN_INSERT];
4756 FIRST_X_ASSUM SUBST1_TAC;
4758 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4759 UNDISCH_TAC` w:real^3 IN V `;
4761 REWRITE_TAC[IN_ELIM_THM];
4766 ASM_CASES_TAC` n = 0 `;
4767 FIRST_X_ASSUM SUBST_ALL_TAC;
4768 DOWN THEN REWRITE_TAC[ITER];
4772 EXISTS_TAC` ITER (n - 1) (rho_node1 FF) v `;
4773 EXISTS_TAC` ITER (n - 1 + 1) (rho_node1 FF) v `;
4775 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4778 EXISTS_TAC `n - 1 `;
4781 NHANH (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
4783 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
4786 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
4787 PHA THEN MESON_TAC[];
4790 MATCH_MP_TAC (SET_RULE` a = d /\ b = c ==> {a,b} = {c,d} `);
4793 NHANH (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
4797 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
4798 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4799 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num `));
4800 FIRST_X_ASSUM NHANH;
4801 REWRITE_TAC[ITER_ADD];
4804 ASM_CASES_TAC` n = 0 `;
4805 FIRST_X_ASSUM SUBST_ALL_TAC;
4807 ASM_REWRITE_TAC[ITER];
4810 ASSUME_TAC2 (SPEC` CARD (V:real^3 -> bool)` (ARITH_RULE`!m. n < m /\ ~( n = 0)
4811 ==> m - 1 + n = m + n - 1 `));
4813 REWRITE_TAC[GSYM ITER_ADD];
4815 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4816 FIRST_X_ASSUM (ASSUME_TAC o (SPEC` n - 1 `));
4818 UNDISCH_TAC` ITER (n - 1) (rho_node1 FF) v IN V `;
4819 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
4820 FIRST_X_ASSUM NHANH;
4823 SIMP_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
4829 ASSUME_TAC2 (SPEC` w:real^3 ` (GEN`v: real^3 ` WEDGE_IN_FAN_RHOND_IVS_RHOND));
4830 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
4831 DOWN THEN STRIP_TAC;
4832 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3`));
4834 UNDISCH_TAC` !x. (x:real^3#real^3) IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E`;
4838 ASSUME_TAC2 (SPEC` w:real^3` (GEN `v:real^3` AZIM_IN_FAN_RHOND_IVS_RHOND));
4841 REWRITE_TAC[wedge_ge; SUBSET];
4843 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
4845 REWRITE_TAC[IN_ELIM_THM];
4848 MP_TAC (SPECL [` vec 0: real^3 `;` w:real^3 `;` rho_node1 FF w `;` ivs_rho_node1 FF w`;
4849 ` v:real^3 `; ` ivs_rho_node1 FF w `]
4850 (GEN_ALL Local_lemmas.IN_WEDGE_IMP_AZIM_LE));
4852 ASM_REWRITE_TAC[FST_LST_IN_WEDGE_GE];
4853 UNDISCH_TAC` !z t. z IN {v:real^3, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}`;
4854 DISCH_THEN (ASSUME_TAC o (SPEC` w:real^3 `));
4855 FIRST_ASSUM (MP_TAC o (SPEC` v:real^3 `));
4857 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
4860 FIRST_ASSUM (MP_TAC o (SPEC` ivs_rho_node1 FF w `));
4862 REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
4863 ASSUME_TAC2 (SPEC` w:real^3` (GEN `v:real^3 ` LOCAL_FAN_IVS_IN_V));
4864 ASSUME_TAC2 (SPEC` w: real^3 ` IVS_RHO_NODE_DIFF_ID);
4868 FIRST_ASSUM (MP_TAC o (SPEC`rho_node1 FF w `));
4870 REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
4871 ASSUME_TAC2 (SPEC` w:real^3 ` (GEN`v: real^3 ` Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V));
4872 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE;
4873 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
4881 UNDISCH_TAC` azim (vec 0) w (rho_node1 FF w) (ivs_rho_node1 FF w) <= pi `;
4883 PHA THEN REWRITE_TAC[REAL_LE_TRANS];
4885 SUBGOAL_THEN `(w:real^3) IN v_prime V (fv: real^3#real^3 -> bool)` MP_TAC;
4886 MP_TAC POINTS_IN_HAFL_CIRCLE;
4889 SIMP_TAC[IN_ELIM_THM];
4890 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
4891 DOWN THEN STRIP_TAC;
4893 EXISTS_TAC` n: num `;
4895 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v:real^3, w}}) fv,fv) `;
4897 NHANH WEDGE_IN_FAN_RHOND_IVS_RHOND;
4899 UNDISCH_TAC` (w:real^3,v:real^3) IN fv`;
4900 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v:real^3, w}}) fv,fv)`;
4902 NHANH Local_lemmas.DETER_RHO_NODE;
4904 UNDISCH_TAC` wedge_in_fan_ge (w,rho_node1 fv w) (e_prime (E UNION {{v, w}}) fv) =
4905 wedge_ge (vec 0) w (rho_node1 fv w) (ivs_rho_node1 fv w) `;
4909 SUBGOAL_THEN` ivs_rho_node1 FF w, w IN fv ` MP_TAC;
4910 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
4911 DOWN THEN STRIP_TAC;
4913 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4915 EXISTS_TAC` n - 1 `;
4916 ASM_CASES_TAC` n = 0 `;
4917 FIRST_X_ASSUM SUBST_ALL_TAC;
4919 ASM_REWRITE_TAC[ITER];
4920 ASSUME_TAC2 (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
4921 ASM_REWRITE_TAC[PAIR_EQ];
4924 REWRITE_TAC[GSYM ADD1; ITER];
4925 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4926 FIRST_X_ASSUM (MP_TAC o (SPEC` n - 1 `));
4927 UNDISCH_TAC` local_fan (V,E,FF) `;
4929 NHANH Local_lemmas.IVS_RHO_IDD;
4930 SIMP_TAC[ADD1; ARITH_RULE` (a + 1) - 1 = a `];
4931 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) `;
4933 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
4934 SIMP_TAC[] THEN STRIP_TAC;
4936 MP_TAC (REWRITE_RULE[] (
4937 SPECL [` w:real^3 `;` CARD (V:real^3 -> bool) `;` \i. ITER i (rho_node1 FF) w `;` \i. azim (vec 0) w (ITER 1 (rho_node1 FF) w)
4938 (ITER i (rho_node1 FF) w) `]
4939 (GENL [` v0:real^3 `;` k: num `;` vv: num -> real^3 `;` bta: num -> real`] Local_lemmas.MONO_AZIM_AS_BTA_I)));
4941 ASM_REWRITE_TAC[convex_local_fan];
4944 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z:real^3} ==> ~collinear {vec 0, z, t} `;
4945 DISCH_THEN (MP_TAC o (SPEC` w:real^3 `));
4946 REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
4948 MP_TAC POINTS_IN_HAFL_CIRCLE;
4952 REWRITE_TAC[IN_ELIM_THM];
4954 MP_TAC (SPECL [` w:real^3 `;` v:real^3 `] (GENL [` v:real^3`;` w:real^3 `]
4955 POINT_PRESENTED_IN_RHOND1));
4960 ASM_CASES_TAC` CARD (V:real^3 -> bool) < n + n' `;
4962 UNDISCH_TAC` n' < CARD (V:real^3 -> bool) `;
4964 NHANH (ARITH_RULE` (c:num) < a /\ a < b + c ==> a - c < b `);
4965 UNDISCH_TAC` !m. m < n ==> ~(ITER m (rho_node1 FF) v = w) `;
4970 NHANH ( ARITH_RULE` b < CARD (V:real^3 -> bool) ==> CARD V - b + b = CARD V`);
4974 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
4975 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
4979 ASM_CASES_TAC` n + n' = CARD (V:real^3 -> bool) `;
4982 REWRITE_TAC[ITER_ADD];
4984 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
4985 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
4986 ASM_REWRITE_TAC[wedge_ge; IN_ELIM_THM; Local_lemmas.AZIM_SPEC_DEGENERATE];
4987 REWRITE_TAC[REAL_LE_REFL; Local_lemmas.AZIM_RANGE];
4989 ASM_CASES_TAC` n = 0 `;
4990 FIRST_X_ASSUM SUBST_ALL_TAC;
4991 UNDISCH_TAC` x' = ITER 0 (rho_node1 FF) v `;
4993 SIMP_TAC[wedge_ge; IN_ELIM_THM; AZIM_REFL; REAL_LE_REFL; Local_lemmas.AZIM_RANGE];
4997 FIRST_ASSUM (MP_TAC o (SPECL[` n':num `;` n + (n':num) `]));
4999 REPLICATE_TAC 3 DOWN THEN PHA;
5002 ASM_REWRITE_TAC[GSYM ITER_ADD];
5003 UNDISCH_TAC` x' = ITER n (rho_node1 FF) v `;
5004 DISCH_THEN (ASSUME_TAC o SYM);
5005 ASM_REWRITE_TAC[Wrgcvdr_cizmrrh.ITER1];
5008 REWRITE_TAC[wedge_ge; IN_ELIM_THM; Local_lemmas.AZIM_RANGE];
5010 ASM_CASES_TAC` n + n' = CARD (V:real^3 -> bool) - 1`;
5013 REWRITE_TAC[ITER_ADD];
5015 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
5016 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w: real^3 `));
5017 FIRST_X_ASSUM SUBST1_TAC;
5018 REWRITE_TAC[REAL_LE_REFL];
5021 FIRST_ASSUM (MP_TAC o (SPECL [` n + n':num `;` CARD (V:real^3 -> bool) - 1 `]));
5024 UNDISCH_TAC` ~(CARD (V:real^3 -> bool) < n + n')`;
5025 UNDISCH_TAC` ~(n + n' = CARD (V:real^3 -> bool))`;
5027 REWRITE_TAC[Wrgcvdr_cizmrrh.ITER1];
5029 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
5030 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`w:real^3 `));
5031 ASM_REWRITE_TAC[GSYM ITER_ADD];
5034 SUBGOAL_THEN` ~ (collinear {vec 0, w, v:real^3}) /\
5035 ~( collinear {vec 0, w, x'}) /\ ~( collinear {vec 0, w, rho_node1 FF w})` MP_TAC;
5037 FIRST_ASSUM MATCH_MP_TAC;
5038 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
5041 FIRST_ASSUM MATCH_MP_TAC;
5042 REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
5045 REWRITE_TAC[ITER_ADD];
5046 ASSUME_TAC2 (SPEC` w:real^3 ` (GEN` v:real^3 `
5047 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V));
5048 FIRST_X_ASSUM (MP_TAC o (SPEC` n + n': num `));
5051 MP_TAC (SPEC` w:real^3` (GEN` v:real^3 ` Local_lemmas.LOFA_IMP_DIS_ELMS23));
5054 DISCH_THEN (MP_TAC o (SPECL [`0 `;` n + n': num `]));
5056 UNDISCH_TAC` ~( n = 0) `;
5057 UNDISCH_TAC` ~(CARD (V:real^3 -> bool) < n + n')`;
5058 UNDISCH_TAC` ~(n + n' = CARD (V:real^3 -> bool))`;
5061 ASSUME_TAC2 (SPEC` w:real^3` (GEN` v:real^3 ` Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
5062 FIRST_X_ASSUM ACCEPT_TAC;
5066 UNDISCH_TAC` azim (vec 0) w (rho_node1 FF w) v <= azim (vec 0) w (rho_node1 FF w) x' `;
5068 NHANH Fan.sum4_azim_fan;
5071 SUBGOAL_THEN` ~ collinear {vec 0, w, v:real^3} /\
5072 ~ collinear {vec 0, w, ivs_rho_node1 FF w} /\
5073 ~ collinear {vec 0, w, rho_node1 FF w} ` MP_TAC;
5075 ASSUME_TAC2 (SPEC` w:real^3 ` Local_lemmas.LOFA_IMP_NOT_COLL_IVS);
5076 FIRST_X_ASSUM ACCEPT_TAC;
5077 SUBGOAL_THEN` azim (vec 0) w (rho_node1 FF w) v <= azim (vec 0) w (rho_node1 FF w) (ivs_rho_node1 FF w)` MP_TAC;
5078 MATCH_MP_TAC REAL_LE_TRANS;
5079 EXISTS_TAC` azim (vec 0) w (rho_node1 FF w) x' `;
5083 NHANH Fan.sum4_azim_fan;
5085 UNDISCH_TAC` azim (vec 0) w (rho_node1 FF w) x' <=
5086 azim (vec 0) w (rho_node1 FF w) (ivs_rho_node1 FF w) `;
5091 ASM_CASES_TAC` n = 0 `;
5092 FIRST_X_ASSUM SUBST_ALL_TAC;
5093 MP_TAC POINTS_IN_HAFL_CIRCLE;
5097 SUBGOAL_THEN` (v:real^3) IN v_prime V (fv:real^3 #real^3 -> bool) ` MP_TAC;
5098 ASM_REWRITE_TAC[IN_ELIM_THM];
5100 REWRITE_TAC[ITER; LT];
5101 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v:real^3, w}}) fv,fv)`;
5103 NHANH AZIM_IN_FAN_RHOND_IVS_RHOND;
5105 REWRITE_TAC[ITER; ADD; Lvducxu.ITER12];
5106 DISCH_THEN (ASSUME_TAC o SYM);
5107 DISCH_THEN (ASSUME_TAC o SYM);
5110 SUBGOAL_THEN` v,rho_node1 FF v IN fv ` MP_TAC;
5112 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5117 REWRITE_TAC[ITER; ADD; Lvducxu.ITER12];
5118 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w:real^3}}) fv,fv) `;
5120 NHANH Local_lemmas.DETER_RHO_NODE;
5122 SUBGOAL_THEN` (w:real^3, v:real^3) IN fv ` MP_TAC;
5124 REWRITE_TAC[IN_INSERT];
5125 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v:real^3, w}}) fv,fv) `;
5127 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5129 UNDISCH_TAC` azim_in_fan (v,rho_node1 fv v) (e_prime (E UNION {{v, w}}) fv) =
5130 azim (vec 0) v (rho_node1 fv v) (ivs_rho_node1 fv v) `;
5134 UNDISCH_TAC` !x. (x:real^3#real^3) IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E `;
5135 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
5136 DOWN THEN STRIP_TAC;
5138 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
5141 ASSUME_TAC2 AZIM_IN_FAN_RHOND_IVS_RHOND;
5142 ASSUME_TAC2 WEDGE_IN_FAN_RHOND_IVS_RHOND;
5143 ASM_REWRITE_TAC[SUBSET];
5145 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
5147 REWRITE_TAC[wedge_ge; IN_ELIM_THM];
5150 MATCH_MP_TAC REAL_LE_TRANS;
5151 EXISTS_TAC` azim (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
5156 UNDISCH_TAC` v IN v_prime V (fv:real^3#real^3 -> bool) `;
5157 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w:real^3}}) fv,fv) `;
5159 NHANH WEDGE_IN_FAN_RHOND_IVS_RHOND;
5162 SUBGOAL_THEN` (x':real^3) IN {ITER n (rho_node1 FF) v | n | !m. m < n
5163 ==> ~(ITER m (rho_node1 FF) v = w)}` MP_TAC;
5165 REWRITE_TAC[IN_ELIM_THM];
5167 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
5168 DOWN THEN STRIP_TAC;
5169 ASM_CASES_TAC` n'' < (n':num) `;
5171 UNDISCH_TAC` !m. m < n' ==> ~(ITER m (rho_node1 FF) v = w)`;
5174 ASM_CASES_TAC` n'' = (n': num) `;
5175 FIRST_X_ASSUM SUBST_ALL_TAC;
5176 ASM_REWRITE_TAC[FST_LST_IN_WEDGE_GE];
5179 SPEC` CARD (V:real^3 -> bool) ` (
5182 SPECL [`v:real^3 `; `\i. ITER i (rho_node1 FF) v `; `\i. azim (vec 0) v (rho_node1 FF v) ( ITER i (rho_node1 FF) v) `]
5183 (GENL [` v0:real^3`; ` vv: num -> real^3 `;` bta: num -> real`] Local_lemmas.MONO_AZIM_AS_BTA_I)))));
5185 ASM_REWRITE_TAC[convex_local_fan; Lvducxu.ITER12];
5186 GEN_TAC THEN STRIP_TAC;
5187 FIRST_X_ASSUM MATCH_MP_TAC;
5188 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
5190 DISCH_THEN (MP_TAC o (SPECL [` n':num `;` n'': num `]));
5193 DOWN THEN DOWN THEN ARITH_TAC;
5194 ASM_SIMP_TAC[wedge_ge; IN_ELIM_THM; Local_lemmas.AZIM_RANGE];
5198 DISCH_THEN (ASSUME_TAC o SYM);
5200 MP_TAC POINTS_IN_HAFL_CIRCLE;
5203 DISCH_THEN (ASSUME_TAC o SYM);
5204 SUBGOAL_THEN` ITER n (rho_node1 FF) v IN {ITER n (rho_node1 FF) v | n | !m. m < n
5205 ==> ~(ITER m (rho_node1 FF) v = w)} ` MP_TAC;
5206 REWRITE_TAC[IN_ELIM_THM];
5207 EXISTS_TAC` n: num `;
5209 NHANH (ARITH_RULE` m < n:num ==> m < n + 1 `);
5213 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v:real^3, w}}) fv,fv) `;
5215 NHANH AZIM_IN_FAN_RHOND_IVS_RHOND;
5217 SUBGOAL_THEN` (x:real^3 # real^3) IN fv ` MP_TAC;
5219 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5221 EXISTS_TAC` n:num `;
5225 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w:real^3}}) fv,fv) `;
5227 NHANH Local_lemmas.DETER_RHO_NODE;
5231 SUBGOAL_THEN` (ivs_rho_node1 FF (ITER n (rho_node1 FF) v)), ITER n (rho_node1 FF) v IN fv ` MP_TAC;
5233 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5235 EXISTS_TAC` n - 1 `;
5236 ASSUME_TAC2 (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
5238 NHANH (ARITH_RULE` m < n ==> m < n + 1 `);
5241 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
5242 REWRITE_TAC[PAIR_EQ];
5244 ONCE_REWRITE_TAC[ADD_SYM];
5245 REWRITE_TAC[GSYM ITER_ADD; Lvducxu.ITER12];
5246 FIRST_ASSUM (ASSUME_TAC o (SPEC` n - 1 `));
5248 SPEC` ITER (n - 1) (rho_node1 FF) v ` (GEN`v: real^3 ` Local_lemmas.IVS_RHO_IDD));
5249 ONCE_REWRITE_TAC[ADD_SYM];
5252 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w:real^3}}) fv,fv) `;
5254 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5256 UNDISCH_TAC` azim_in_fan
5257 (ITER n (rho_node1 FF) v,rho_node1 fv (ITER n (rho_node1 FF) v))
5258 (e_prime (E UNION {{v, w}}) fv) =
5259 azim (vec 0) (ITER n (rho_node1 FF) v)
5260 (rho_node1 fv (ITER n (rho_node1 FF) v))
5261 (ivs_rho_node1 fv (ITER n (rho_node1 FF) v)) `;
5266 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
5267 FIRST_ASSUM (MP_TAC o (SPEC` n:num `));
5268 UNDISCH_TAC` !x. (x:real^3#real^3) IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E`;
5271 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
5273 FIRST_ASSUM (MP_TAC o (SPEC` n:num `));
5274 UNDISCH_TAC` local_fan (V,E,FF) `;
5276 NHANH AZIM_IN_FAN_RHOND_IVS_RHOND;
5277 REWRITE_TAC[GSYM ITER; ADD1];
5279 FIRST_X_ASSUM (ASSUME_TAC o SYM);
5280 UNDISCH_TAC` azim_in_fan (ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v) E <= pi `;
5284 MP_TAC POINTS_IN_HAFL_CIRCLE;
5287 DISCH_THEN (ASSUME_TAC o SYM);
5288 SUBGOAL_THEN ` ITER n (rho_node1 FF) v IN v_prime V (fv:real^3#real^3 -> bool) ` MP_TAC;
5289 FIRST_X_ASSUM (SUBST1_TAC o SYM);
5290 REWRITE_TAC[IN_ELIM_THM];
5291 EXISTS_TAC` n:num `;
5293 UNDISCH_TAC` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w) `;
5294 MESON_TAC[ARITH_RULE` m < n ==> m < n + 1 `];
5295 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v:real^3, w}}) fv,fv) `;
5297 NHANH WEDGE_IN_FAN_RHOND_IVS_RHOND;
5300 ASSUME_TAC2 (SPEC` ITER n (rho_node1 FF) v ` (GEN`v:real^3 ` WEDGE_IN_FAN_RHOND_IVS_RHOND));
5301 FIRST_X_ASSUM (MP_TAC o SYM);
5304 ASM_REWRITE_TAC[GSYM ITER; ADD1];
5307 MATCH_MP_TAC SUBSET_TRANS;
5308 EXISTS_TAC` V:real^3 -> bool` ;
5310 UNDISCH_TAC` V SUBSET
5311 wedge_in_fan_ge (ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v)
5316 UNDISCH_TAC` {ITER n (rho_node1 FF) v | n | !m. m < n
5317 ==> ~(ITER m (rho_node1 FF) v = w)} =
5318 v_prime V (fv:real^3#real^3 -> bool) `;
5319 DISCH_THEN (SUBST1_TAC o SYM);
5320 REWRITE_TAC[SUBSET; IN_ELIM_THM];
5322 ASM_REWRITE_TAC[]]);;
5328 let COVEX_OF_LOFA_HALF_CIRCLE2 = prove(
5329 ` convex_local_fan (V,E,FF) /\
5330 (local_fan (V,E,FF) /\
5334 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5335 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5336 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5337 fv = face HS (v,rho_node1 FF v) /\
5338 fw = face HS (w, rho_node1 FF w)
5339 ==> convex_local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) /\
5340 convex_local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw)`,
5341 STRIP_TAC THEN CONJ_TAC THENL [MATCH_MP_TAC COVEX_OF_LOFA_HALF_CIRCLE THEN
5342 ASM_REWRITE_TAC[]; MATCH_MP_TAC COVEX_OF_LOFA_HALF_CIRCLE THEN DOWN_TAC THEN
5343 SIMP_TAC[INSERT_COMM]]);;
5346 (* ======================================================================== *)
5349 let CARD_V_TWO_HAFL_CIRCLE = prove_by_refinement
5350 (` local_fan (V,E,FF) /\ v IN V /\ w IN V /\
5352 ITER n (rho_node1 FF) v = w /\
5353 ITER n' (rho_node1 FF) w = v /\
5354 n < CARD V /\ n' < CARD V
5355 ==> n + n' = CARD V `,
5357 MP_TAC (SPEC` w:real^3 ` (GEN` v: real^3 ` Local_lemmas.LOFA_IMP_DIS_ELMS23));
5361 UNDISCH_TAC` ITER n (rho_node1 FF) v = w `;
5363 REWRITE_TAC[ITER_ADD];
5364 ASM_CASES_TAC` n + n': num = 0 `;
5366 REWRITE_TAC[ADD_EQ_0];
5368 FIRST_X_ASSUM SUBST_ALL_TAC;
5373 ASSUME_TAC2 (SPECL [` w:real^3 `;` n + n':num` ] (GENL [` v:real^3 `;` n: num `]
5374 CARD_IS_LEAST_CYCLE));
5375 ASM_CASES_TAC` CARD (V:real^3 -> bool) = n + n' `;
5377 FIRST_X_ASSUM (MP_TAC o (SPECL [` 0`;` (n + n') - CARD (V:real^3 -> bool) `]));
5380 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
5381 UNDISCH_TAC` n' < CARD (V:real^3 -> bool) `;
5383 ASM_REWRITE_TAC[ITER];
5384 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
5385 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_VITER;
5386 FIRST_X_ASSUM (ASSUME_TAC2 o (SPECL [` w:real^3 `;` (n + n') - CARD (V:real^3 -> bool) `]));
5388 FIRST_X_ASSUM NHANH;
5389 REWRITE_TAC[ITER_ADD];
5390 ASSUME_TAC2 (ARITH_RULE` CARD (V:real^3 -> bool) <= n + n' ==> CARD V + (n + n') - CARD V = n + n'`);
5399 let DIFFERENCE_IMP_LT_CARDV = prove_by_refinement
5400 (` local_fan (V,E,FF) /\ v IN V /\ w IN V /\
5401 (! n. n < m ==> ~(ITER n (rho_node1 FF) v = w))
5404 ASM_CASES_TAC` m < CARD (V:real^3 -> bool) `;
5405 FIRST_ASSUM ACCEPT_TAC;
5406 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
5407 UNDISCH_TAC` (w:real^3) IN V `;
5409 REWRITE_TAC[IN_ELIM_THM];
5414 ONCE_REWRITE_TAC[EQ_SYM_EQ];
5415 FIRST_X_ASSUM MATCH_MP_TAC;
5417 UNDISCH_TAC` ~(m < CARD (V:real^3 -> bool)) `;
5424 let LT_CARD_MONO_LOFA = prove(`local_fan (V,E,FF) /\ v IN V
5425 ==> (! i j. i < CARD V /\ j < CARD V /\
5426 ITER i (rho_node1 FF) v = ITER j (rho_node1 FF) v
5428 NHANH Local_lemmas.LOFA_IMP_DIS_ELMS23 THEN REPEAT STRIP_TAC THEN
5429 ASM_CASES_TAC` i = (j:num) ` THENL [FIRST_X_ASSUM ACCEPT_TAC; DOWN] THEN
5430 REWRITE_TAC[ARITH_RULE` ~( a = (b:num)) <=> a < b \/ b < a `] THEN
5431 DOWN_TAC THEN PHA THEN MESON_TAC[]);;
5437 let CONDS_IN_V_PRIME_NUM = prove_by_refinement
5438 (` (local_fan (V,E,FF) /\
5442 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5443 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5444 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5445 fv = face HS (v,rho_node1 FF v)
5447 ITER n (rho_node1 FF) v = w
5448 ==> ! i. i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fv <=> i < n + 1 `,
5449 [NHANH POINTS_IN_HAFL_CIRCLE;
5450 STRIP_TAC THEN STRIP_TAC;
5453 ASM_REWRITE_TAC[IN_ELIM_THM];
5455 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
5456 ASSUME_TAC2 (SPECL [` n': num `] (GENL [` m:num `] DIFFERENCE_IMP_LT_CARDV));
5457 ASSUME_TAC2 LT_CARD_MONO_LOFA;
5458 FIRST_X_ASSUM (MP_TAC o (SPECL [`i:num `;` n': num `]));
5462 DISCH_THEN (SUBST_ALL_TAC o SYM);
5463 ASM_CASES_TAC` i < n + 1 `;
5464 FIRST_X_ASSUM ACCEPT_TAC;
5465 ASSUME_TAC2 (ARITH_RULE` ~(i < n + 1) ==> n < i `);
5467 FIRST_X_ASSUM NHANH;
5472 REPLICATE_TAC 3 DOWN THEN PHA;
5474 ASM_REWRITE_TAC[IN_ELIM_THM];
5475 EXISTS_TAC`i: num `;
5478 ASSUME_TAC2 (ARITH_RULE` i < n + 1 /\ m < i ==> m < n `);
5479 MP_TAC Local_lemmas.LOFA_IMP_DIS_ELMS23;
5486 let LOFA_IMP_ITER_RHO_NODE_ID2 = MESON[
5487 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID]`
5488 local_fan (V,E,FF) /\ v IN V ==> ITER (CARD V) (rho_node1 FF) v = v`;;
5494 let CONDS_IN_V_PRIME_NUM2 = prove_by_refinement
5495 (`(local_fan (V,E,FF) /\
5499 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5500 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5501 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5502 fw = face HS (w,rho_node1 FF w)
5503 ==> n < CARD V /\ ITER n (rho_node1 FF) v = w
5504 ==> (!i. i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fw <=>
5505 i = 0 \/ n <= i /\ i < CARD V )`,
5507 ASSUME_TAC2 (SPECL [` w:real^3 `;` v:real^3 `] (GENL [`v:real^3 `;` w:real^3 `] POINT_PRESENTED_IN_RHOND1));
5508 DOWN THEN STRIP_TAC;
5511 MP_TAC (SPECL [` w:real^3 `;` v:real^3 `; ` fw: real^3#real^3 -> bool`;` n': num `] (GENL [` v: real^3`;` w:real^3 `;` fv: real^3#real^3 -> bool`; `n:num `] CONDS_IN_V_PRIME_NUM));
5514 SIMP_TAC[INSERT_COMM];
5520 UNDISCH_TAC` !i. i < CARD (V:real^3 -> bool) /\ ITER i (rho_node1 FF) w IN v_prime V (fw:real^3 # real^3 -> bool) <=>
5523 REWRITE_TAC[ITER_ADD];
5524 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
5525 ASM_CASES_TAC` i = 0 `;
5526 UNDISCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v:real^3, w}}))`;
5527 DISCH_THEN (ASSUME_TAC o SYM);
5528 UNDISCH_TAC` fw = face HS (w,rho_node1 FF w) `;
5529 DISCH_THEN (ASSUME_TAC o SYM);
5530 ASM_REWRITE_TAC[ITER];
5533 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
5534 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
5536 UNDISCH_TAC` n + n' = CARD (V:real^3 -> bool) `;
5537 DISCH_THEN (ASSUME_TAC o SYM);
5538 FIRST_ASSUM SUBST1_TAC;
5539 ONCE_REWRITE_TAC[ADD_SYM];
5543 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
5547 UNDISCH_TAC` n' < CARD (V:real^3 -> bool) `;
5548 UNDISCH_TAC` !i. i < CARD V /\ ITER (i + n) (rho_node1 FF) v IN v_prime V
5549 (fw:real^3#real^3 -> bool) <=> i < n' + 1 `;
5550 MP_TAC (ARITH_RULE` n' < n' + 1 `);
5555 ASM_CASES_TAC` i < CARD (V:real^3 -> bool) `;
5556 UNDISCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v:real^3, w}}))`;
5557 DISCH_THEN (ASSUME_TAC o SYM);
5558 UNDISCH_TAC` fw = face HS (w,rho_node1 FF w) `;
5559 DISCH_THEN (ASSUME_TAC o SYM);
5564 MP_TAC (SPECL [`w:real^3 `;` v:real^3 `;` fw: real^3 #real^3 -> bool`]
5565 ( GENL [`v:real^3 `;` w:real^3 `;` fv: real^3 #real^3 -> bool` ] POINTS_IN_HAFL_CIRCLE));
5568 SIMP_TAC[INSERT_COMM];
5569 DISCH_THEN (ASSUME_TAC o SYM);
5575 ASM_CASES_TAC` n <= (i:num) `;
5577 ASSUME_TAC2 (ARITH_RULE` n <= (i:num) ==> i = (i - n) + n `);
5578 ABBREV_TAC` nn = i - (n:num) `;
5580 SUBGOAL_THEN` nn + n < n + (n':num) ` MP_TAC;
5583 FIRST_X_ASSUM (SUBST1_TAC o SYM);
5586 NHANH (ARITH_RULE` a + b < b + (c:num) ==> a < c + 1 `);
5587 UNDISCH_TAC` !i. i < CARD V /\ ITER (i + n) (rho_node1 FF) v IN v_prime V
5588 (fw:real^3 #real^3 -> bool) <=> i < n' + 1`;
5589 DISCH_THEN (fun x -> REWRITE_TAC[GSYM x]);
5594 ASSUME_TAC2 (ARITH_RULE` ~(i = 0) ==> ~( i + n' < n' + 1 ) `);
5596 UNDISCH_TAC` !i. i < CARD V /\ ITER (i + n) (rho_node1 FF) v IN v_prime V
5597 (fw:real^3 #real^3 -> bool) <=> i < n' + 1`;
5598 DISCH_THEN (fun x -> REWRITE_TAC[GSYM x]);
5599 SUBGOAL_THEN` i + n' < n + (n':num) ` MP_TAC;
5600 DOWN THEN ARITH_TAC;
5603 ASM_SIMP_TAC[ARITH_RULE` (a + b) + (c:num) = a + c + b `];
5604 REWRITE_TAC[GSYM ITER_ADD];
5605 ASSUME_TAC2 LOFA_IMP_ITER_RHO_NODE_ID2;
5607 ASM_REWRITE_TAC[]]);;
5613 let DETERMINE_FV2 = prove_by_refinement
5614 (`(local_fan (V,E,FF) /\
5618 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5619 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5620 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5621 fv = face HS (v,rho_node1 FF v)
5622 ==> n < CARD V /\ ITER n (rho_node1 FF) v = w
5625 {ITER m (rho_node1 FF) v,ITER (m + 1) (rho_node1 FF) v | m |
5627 [NHANH DETERMINE_FV;
5630 MATCH_MP_TAC (SET_RULE` X = Y ==> a INSERT X = a INSERT Y `);
5631 REWRITE_TAC[EXTENSION; IN_ELIM_THM];
5635 EXISTS_TAC` n':num`;
5637 ASM_CASES_TAC` n' < (n:num) `;
5638 FIRST_ASSUM ACCEPT_TAC;
5639 ASSUME_TAC2 (ARITH_RULE` ~(n' < (n:num)) ==> n < n' + 1 `);
5641 FIRST_X_ASSUM NHANH;
5650 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
5651 FIRST_X_ASSUM (MP_TAC o (SPECL [`m': num `;` n:num`]));
5656 UNDISCH_TAC` m < n:num`;
5666 let INTERIOR_ANGLE_LEM_SLICING_FAN = prove_by_refinement
5667 (`convex_local_fan (V,E,FF) /\
5668 (local_fan (V,E,FF) /\
5672 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5673 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5674 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5675 fv = face HS (v,rho_node1 FF v) /\
5676 fw = face HS (w,rho_node1 FF w)
5677 ==> interior_angle1 (vec 0) fv v + interior_angle1 (vec 0) fw v = interior_angle1 (vec 0) FF v `,
5680 [REWRITE_TAC[convex_local_fan] THEN
5681 STRIP_TAC THEN ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1 THEN
5682 DOWN THEN STRIP_TAC THEN MP_TAC DETERMINE_FV2 THEN PHA THEN
5683 ANTS_TAC THENL [ASM_REWRITE_TAC[]; DISCH_THEN (ASSUME_TAC o SYM)] THEN
5684 ASSUME_TAC2 (SPECL [` w:real^3 `;` v:real^3 `] (GENL [` v:real^3 `;` w:real^3 `] POINT_PRESENTED_IN_RHOND1)) THEN DOWN THEN STRIP_TAC THEN
5686 MP_TAC (SPECL [` w:real^3`;` v:real^3 `;`n': num`;` fw: real^3 #real^3 -> bool`]
5687 (GENL [` v:real^3`;` w:real^3 `;`n: num`;` fv: real^3 #real^3 -> bool`] DETERMINE_FV2)) THEN
5689 ANTS_TAC THENL [ASM_REWRITE_TAC[INSERT_COMM] THEN
5690 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z:real^3, t} ` THEN
5691 DISCH_THEN NHANH THEN
5692 SIMP_TAC[INSERT_COMM];
5694 DISCH_THEN (ASSUME_TAC o SYM)] THEN
5695 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1] THEN
5696 MP_TAC2 HAFL_CIRCLE_FORM_LOCAL_FAN2 THEN
5698 SUBGOAL_THEN ` v, rho_node1 FF v IN fv /\ (w,v) IN fv ` MP_TAC;
5700 EXPAND_TAC "fv" THEN
5701 REWRITE_TAC[IN_INSERT; IN_ELIM_THM] THEN
5704 REWRITE_TAC[ITER; GSYM ADD1] THEN
5706 ASM_CASES_TAC` 0 < n ` THENL [FIRST_X_ASSUM ACCEPT_TAC; DOWN] THEN
5707 REWRITE_TAC[ARITH_RULE` ~( 0 < n) <=> n = 0 `] THEN
5708 DISCH_THEN SUBST_ALL_TAC THEN
5709 UNDISCH_TAC` ITER 0 (rho_node1 FF) v = w ` THEN
5710 ASM_REWRITE_TAC[ITER];
5713 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) `;
5715 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5717 UNDISCH_TAC` v,rho_node1 FF v IN fv `;
5718 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) `;
5720 NHANH Local_lemmas.DETER_RHO_NODE;
5722 UNDISCH_TAC` fw = face HS (w,rho_node1 FF w) `;
5723 DISCH_THEN (ASSUME_TAC o SYM);
5724 UNDISCH_TAC` fv = face HS (v,rho_node1 FF v) `;
5725 DISCH_THEN (ASSUME_TAC o SYM);
5731 SUBGOAL_THEN` (v,w) IN fw /\ ivs_rho_node1 FF v, v IN fw ` MP_TAC;
5732 UNDISCH_TAC`(v,w) INSERT
5733 {ITER m (rho_node1 FF) w,ITER (m + 1) (rho_node1 FF) w | m < n'} =
5738 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5740 EXISTS_TAC` n' - 1 `;
5741 ASM_CASES_TAC` n' = 0`;
5742 FIRST_X_ASSUM SUBST_ALL_TAC;
5743 UNDISCH_TAC` ITER 0 (rho_node1 FF) w = v `;
5744 ASM_REWRITE_TAC[ITER];
5745 ASSUME_TAC2 (ARITH_RULE` ~(n' = 0) ==> n' - 1 < n' /\ n' - 1 + 1 = n' `);
5746 ASM_REWRITE_TAC[PAIR_EQ];
5747 UNDISCH_TAC` ITER n (rho_node1 FF) v = w`;
5750 REWRITE_TAC[ITER_ADD];
5751 ASSUME_TAC2 (ARITH_RULE` ~( n' = 0) ==> n' - 1 + n = (n + n') - 1`);
5753 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
5754 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3 `));
5755 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
5761 UNDISCH_TAC` local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) `;
5763 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5765 UNDISCH_TAC` (v:real^3,w:real^3) IN fw`;
5766 UNDISCH_TAC` local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) `;
5768 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5769 NHANH Local_lemmas.DETER_RHO_NODE;
5773 ASSUME_TAC2 WEDGE_IN_FAN_RHOND_IVS_RHOND;
5774 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
5775 DOWN THEN STRIP_TAC;
5776 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3 `));
5778 UNDISCH_TAC` !x. x IN FF ==> azim_in_fan (x:real^3#real^3) E <= pi /\ V SUBSET wedge_in_fan_ge x E`;
5780 ASM_REWRITE_TAC[SUBSET];
5782 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
5784 REWRITE_TAC[wedge_ge; IN_ELIM_THM];
5786 SUBGOAL_THEN` ~ collinear {vec 0, v, w} /\ ~ collinear {vec 0, v, ivs_rho_node1 FF v} /\ ~ collinear {vec 0, v, rho_node1 FF v} ` MP_TAC;
5788 FIRST_X_ASSUM MATCH_MP_TAC;
5789 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
5790 ASSUME_TAC2 (SPEC` v:real^3 ` Local_lemmas.LOFA_IMP_NOT_COLL_IVS);
5791 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
5794 NHANH Fan.sum4_azim_fan;
5799 let INTERIOR_ANGLE_LEM_SLICING_FAN2 = prove_by_refinement
5800 (`convex_local_fan (V,E,FF) /\
5801 (local_fan (V,E,FF) /\
5805 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5806 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5807 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5808 fv = face HS (v,rho_node1 FF v) /\
5809 fw = face HS (w,rho_node1 FF w)
5810 ==> interior_angle1 (vec 0) fv v + interior_angle1 (vec 0) fw v = interior_angle1 (vec 0) FF v /\
5811 interior_angle1 (vec 0) fw w + interior_angle1 (vec 0) fv w = interior_angle1 (vec 0) FF w`,
5812 [NHANH INTERIOR_ANGLE_LEM_SLICING_FAN;
5815 FIRST_X_ASSUM ACCEPT_TAC;
5816 MATCH_MP_TAC (GENL [`w:real^3`] INTERIOR_ANGLE_LEM_SLICING_FAN);
5817 EXISTS_TAC` v:real^3 `;
5818 ASM_REWRITE_TAC[INSERT_COMM];
5819 FIRST_X_ASSUM NHANH;
5820 FIRST_X_ASSUM NHANH;
5821 SIMP_TAC[INSERT_COMM]]);;
5826 let INTERIOR_AGL_EQ = prove_by_refinement
5827 (`(local_fan (V,E,FF) /\
5831 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5832 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5833 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5834 fv = face HS (v,rho_node1 FF v)
5835 ==> n < CARD V /\ ITER n (rho_node1 FF) v = w
5836 ==> ! i. 0 < i /\ i < n
5837 ==> interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)
5838 = interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v) `,
5840 MP_TAC DETERMINE_FV2;
5844 DISCH_THEN (ASSUME_TAC o SYM);
5845 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1];
5846 SUBGOAL_THEN` ITER i (rho_node1 FF) v, rho_node1 FF (ITER i (rho_node1 FF) v) IN fv ` MP_TAC;
5848 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5851 ASM_REWRITE_TAC[ITER; GSYM ADD1];
5852 MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN;
5856 NHANH Local_lemmas.DETER_RHO_NODE;
5860 SUBGOAL_THEN` ivs_rho_node1 FF (ITER i (rho_node1 FF) v), ITER i (rho_node1 FF) v IN fv ` MP_TAC;
5862 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5864 EXISTS_TAC` i - 1 `;
5865 ABBREV_TAC ` i' = i - 1 `;
5866 ASSUME_TAC2 (ARITH_RULE` 0 < i ==> i = i - 1 + 1 `);
5869 SIMP_TAC[GSYM ADD1; ITER; PAIR_EQ];
5872 UNDISCH_TAC` i < (n:num) `;
5875 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
5876 FIRST_X_ASSUM (MP_TAC o (SPEC` i': num`));
5877 UNDISCH_TAC` local_fan (V,E,FF)`;
5879 NHANH Local_lemmas.IVS_RHO_IDD;
5881 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) `;
5883 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5890 let SUM_INTERIOR_AGL_LEMMA = prove_by_refinement
5891 (`convex_local_fan (V,E,FF) /\
5892 (local_fan (V,E,FF) /\
5896 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5897 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5898 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5899 fv = face HS (v,rho_node1 FF v) /\
5900 fw = face HS (w, rho_node1 FF w)
5901 ==> ! ff. sum {i | i < CARD V } (\i. (ff i) * (interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v))) =
5902 sum { i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fv} (\i. ff i * interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)) +
5903 sum { i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fw} (\i. ff i * interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)) `,
5906 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
5907 DOWN THEN STRIP_TAC;
5908 MP_TAC POINTS_IN_HAFL_CIRCLE;
5911 ASSUME_TAC2 (SPECL [`w:real^3 `;` v:real^3` ] (GENL [` v:real^3 `;` w:real^3 `]
5912 POINT_PRESENTED_IN_RHOND1));
5913 DOWN THEN STRIP_TAC;
5916 MP_TAC (SPECL [` w:real^3 `;` v:real^3`;` fw:real^3#real^3 -> bool` ] (GENL
5917 [` v:real^3 `;` w:real^3 `; `fv:real^3#real^3 -> bool`] POINTS_IN_HAFL_CIRCLE));
5919 ASM_REWRITE_TAC[INSERT_COMM];
5920 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t:real^3}`;
5922 SIMP_TAC[INSERT_COMM];
5925 MP_TAC CONDS_IN_V_PRIME_NUM;
5934 MP_TAC CONDS_IN_V_PRIME_NUM2;
5942 SUBGOAL_THEN` {i | i < n + 1} = {i | 0 < i /\ i < n} UNION {0, n} ` MP_TAC;
5943 REWRITE_TAC[EXTENSION];
5944 REWRITE_TAC[IN_UNION; IN_INSERT; NOT_IN_EMPTY; IN_ELIM_THM];
5950 SUBGOAL_THEN` {i | i = 0 \/ n <= i /\ i < CARD V} = {i | n < i /\ i < CARD (V:real^3 -> bool) }
5951 UNION {0, n} ` MP_TAC;
5952 REWRITE_TAC[EXTENSION; IN_UNION; IN_INSERT; NOT_IN_EMPTY; IN_ELIM_THM];
5954 SIMP_TAC[ARITH_RULE` (n:num) <= x <=> n < x \/ x = n `];
5955 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
5960 MP_TAC (SPEC` n + 1 ` FINITE_NUMSEG_LT);
5962 UNDISCH_TAC` fv = face HS (v,rho_node1 FF v) `;
5963 UNDISCH_TAC` fw = face HS (w,rho_node1 FF w) `;
5964 DISCH_THEN (ASSUME_TAC o SYM);
5965 DISCH_THEN (ASSUME_TAC o SYM);
5966 ASM_REWRITE_TAC[FINITE_UNION];
5967 SUBGOAL_THEN` {i | n < i /\ i < CARD (V:real^3 -> bool)} =
5968 {i | n < i } INTER {i | i < CARD V} ` MP_TAC;
5971 SUBGOAL_THEN` FINITE {i | n < i /\ i < CARD (V:real^3 -> bool)}` MP_TAC;
5974 MATCH_MP_TAC FINITE_INTER;
5976 REWRITE_TAC[FINITE_NUMSEG_LT];
5979 SUBGOAL_THEN` DISJOINT {m | 0 < m /\ m < n } {0, n} ` ASSUME_TAC;
5980 REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_INSERT; IN_ELIM_THM];
5984 SUBGOAL_THEN` DISJOINT {i | n < i /\ i < CARD (V:real^3 -> bool)} {0, n}` ASSUME_TAC;
5985 REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_INSERT; IN_ELIM_THM];
5989 MP_TAC (ISPECL [` (\i. ff i * interior_angle1 (vec 0) fv (ITER i (rho_node1 FF)
5990 v)) `; `{i | 0 < i /\ i < n} `; ` {0, n} `] SUM_UNION);
5995 MP_TAC (ISPECL [` (\i. ff i * interior_angle1 (vec 0) fw (ITER i (rho_node1 FF)
5996 v)) `; `{i | n < i /\ i < CARD (V:real^3 -> bool)}`; ` {0, n} `] SUM_UNION);
6000 STRIP_TAC THEN STRIP_TAC;
6003 SUBGOAL_THEN` sum {i | n < i /\ i < CARD (V:real^3 -> bool)}
6004 (\i. ff i * interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)) =
6005 sum {i | n < i /\ i < CARD V}
6006 (\i. ff i * interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v)) ` MP_TAC;
6007 MATCH_MP_TAC SUM_EQ;
6009 REWRITE_TAC[IN_ELIM_THM];
6011 REWRITE_TAC[REAL_EQ_MUL_LCANCEL];
6014 REWRITE_TAC[Local_lemmas.interior_angle1; GSYM ivs_rho_node1];
6016 MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN2;
6021 MP_TAC (SPECL [` w:real^3 `;` v:real^3 `;` n':num`; `fw:real^3#real^3 -> bool`]
6022 (GENL [` v:real^3`;` w:real^3 `;` n:num`;` fv:real^3#real^3 -> bool`] DETERMINE_FV2));
6027 SIMP_TAC[INSERT_COMM];
6029 DISCH_THEN (ASSUME_TAC o SYM);
6030 SUBGOAL_THEN` ITER x (rho_node1 FF) v, rho_node1 FF (ITER x (rho_node1 FF) v) IN fw ` MP_TAC;
6032 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
6034 EXISTS_TAC`(x:num) - n `;
6036 REWRITE_TAC[ITER_ADD];
6037 ASSUME_TAC2 (ARITH_RULE` n < (x:num) ==> x - n + n = x `);
6038 ASM_REWRITE_TAC[ARITH_RULE`(x - n + 1) + n = (x - n + n ) + 1 `; GSYM ITER; ADD1];
6039 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
6041 UNDISCH_TAC` x < CARD (V:real^3 -> bool) `;
6042 UNDISCH_TAC` n < x:num `;
6044 UNDISCH_TAC` local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) `;
6046 NHANH Local_lemmas.DETER_RHO_NODE;
6050 SUBGOAL_THEN` ivs_rho_node1 FF (ITER x (rho_node1 FF) v), ITER x (rho_node1 FF) v IN fw ` MP_TAC;
6051 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
6052 FIRST_X_ASSUM (MP_TAC o (SPEC` x:num`));
6053 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
6054 FIRST_X_ASSUM NHANH;
6056 FIRST_ASSUM (SUBST1_TAC o SYM);
6057 REWRITE_TAC[ITER_ADD];
6058 ASSUME_TAC2 (ARITH_RULE` n < x /\ x < CARD (V:real^3 -> bool) ==> CARD V - 1 + x = x - 1 + CARD V `);
6060 REWRITE_TAC[GSYM ITER_ADD];
6061 ASSUME_TAC2 LOFA_IMP_ITER_RHO_NODE_ID2;
6064 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
6066 EXISTS_TAC` x - ( n + 1) `;
6068 REWRITE_TAC[ITER_ADD];
6069 ASSUME_TAC2 (ARITH_RULE` n < x ==> x - (n + 1) + n = x - 1 /\ (x - (n + 1) + 1) + n = x`);
6071 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
6073 UNDISCH_TAC` n < (x:num) `;
6074 UNDISCH_TAC` x < CARD (V:real^3 -> bool) `;
6083 UNDISCH_TAC` local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) `;
6085 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
6090 UNDISCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v, w:real^3}}))`;
6091 DISCH_THEN (ASSUME_TAC o SYM);
6092 UNDISCH_TAC` {i | n < i /\ i < CARD V} = {i | n < i} INTER {i | i < CARD (V:real^3 -> bool)} `;
6093 DISCH_THEN (ASSUME_TAC o SYM);
6097 SUBGOAL_THEN` sum {i | 0 < i /\ i < n}
6098 (\i. ff i * interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)) =
6099 sum {i | 0 < i /\ i < n}
6100 (\i. ff i * interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v))` MP_TAC;
6101 MATCH_MP_TAC SUM_EQ;
6103 REWRITE_TAC[IN_ELIM_THM];
6105 REWRITE_TAC[REAL_EQ_MUL_LCANCEL];
6107 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1];
6108 MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN2;
6113 MP_TAC DETERMINE_FV2;
6117 DISCH_THEN (ASSUME_TAC o SYM);
6118 SUBGOAL_THEN` ITER x (rho_node1 FF) v, rho_node1 FF (ITER x (rho_node1 FF) v) IN fv ` MP_TAC;
6120 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
6123 REWRITE_TAC[GSYM ITER; ADD1];
6125 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) `;
6127 NHANH Local_lemmas.DETER_RHO_NODE;
6130 SUBGOAL_THEN` ivs_rho_node1 FF (ITER x (rho_node1 FF) v), ITER x (rho_node1 FF) v IN fv ` MP_TAC;
6132 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
6134 EXISTS_TAC` x - 1 `;
6135 ASSUME_TAC2 (ARITH_RULE` 0 < x ==> x - 1 + 1 = x `);
6137 REWRITE_TAC[ITER; GSYM ADD1];
6138 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
6139 FIRST_X_ASSUM (ASSUME_TAC o (SPEC ` x - 1 `));
6140 ASSUME_TAC2 (SPEC` ITER (x - 1) (rho_node1 FF) v ` (GEN`v: real^3 ` Local_lemmas.IVS_RHO_IDD));
6141 FIRST_X_ASSUM SUBST1_TAC;
6142 ASM_REWRITE_TAC[ADD1];
6143 UNDISCH_TAC` x < (n:num) `;
6144 UNDISCH_TAC` 0 < x `;
6146 UNDISCH_TAC` local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) `;
6148 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
6153 REPEAT STRIP_TAC THEN
6154 ASM_CASES_TAC` 0 = n ` THEN
6155 UNDISCH_TAC` ITER n (rho_node1 FF) v = w ` THEN
6156 FIRST_X_ASSUM (SUBST_ALL_TAC o SYM) THEN
6157 ASM_REWRITE_TAC[ITER];
6159 DOWN THEN NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] Collect_geom.SUM_DIS2) THEN
6160 STRIP_TAC THEN ASM_REWRITE_TAC[];
6163 SUBGOAL_THEN` interior_angle1 (vec 0) fv v + interior_angle1 (vec 0) fw v = interior_angle1 (vec 0) FF v /\
6164 interior_angle1 (vec 0) fv w + interior_angle1 (vec 0) fw w = interior_angle1 (vec 0) FF w ` MP_TAC;
6165 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1];
6167 MP_TAC INTERIOR_ANGLE_LEM_SLICING_FAN2;
6170 SIMP_TAC[REAL_ADD_SYM; interior_angle1; GSYM ivs_rho_node1];
6173 REWRITE_TAC[REAL_ARITH` (a + b) + c = a + b + c `];
6174 REWRITE_TAC[REAL_ARITH` a + b + c + aa + bb + cc = a + aa + (b + bb) + (c + cc)`];
6175 SIMP_TAC[GSYM REAL_ADD_LDISTRIB];
6177 SUBGOAL_THEN` ff 0 * interior_angle1 (vec 0) FF v +
6178 ff n * interior_angle1 (vec 0) FF w = sum {0, n}
6179 (\i. ff i * interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v))` MP_TAC;
6180 ASM_REWRITE_TAC[ITER];
6184 UNDISCH_TAC` DISJOINT {i | n < i /\ i < CARD (V:real^3 -> bool)} {0, n} `;
6185 UNDISCH_TAC` FINITE {0, n} `;
6186 UNDISCH_TAC` FINITE {i | n < i /\ i < CARD (V:real^3 -> bool)}`;
6188 NHANH (MESON[SUM_UNION]` FINITE s /\ FINITE t /\ DISJOINT s t
6189 ==> ! f. sum (s UNION t) f = sum s f + sum t f `);
6194 SUBGOAL_THEN` !i. n < i /\ i < CARD (V:real^3 -> bool) ==>
6195 interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v) =
6196 interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v) ` MP_TAC;
6197 MP_TAC (SPECL [` w:real^3 `;` v:real^3 `;`n':num `;` fw:real^3#real^3 -> bool`]
6198 (GENL [` v:real^3 `;` w:real^3 `;` n: num `; `fv:real^3 # real^3 -> bool`] INTERIOR_AGL_EQ));
6201 ASM_REWRITE_TAC[INSERT_COMM];
6202 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t:real^3} `;
6204 SIMP_TAC[INSERT_COMM];
6205 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
6207 ONCE_REWRITE_TAC[ARITH_RULE` n < i /\ i < m <=> 0 < i - n /\ i - n < m - n `];
6208 ASSUME_TAC2 (ARITH_RULE` n + n' = CARD (V:real^3 -> bool) ==> CARD V - n = n'`);
6209 FIRST_X_ASSUM SUBST1_TAC;
6210 FIRST_X_ASSUM NHANH;
6212 REWRITE_TAC[ITER_ADD];
6213 NHANH (ARITH_RULE` 0 < i - n ==> i - n + n = i `);
6217 SUBGOAL_THEN` sum {i | n < i /\ i < CARD (V:real^3 -> bool)}
6218 (\i. ff i * interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)) =
6219 sum {i | n < i /\ i < CARD V}
6220 (\i. ff i * interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v))` MP_TAC;
6221 MATCH_MP_TAC SUM_EQ;
6222 REWRITE_TAC[IN_ELIM_THM];
6223 FIRST_X_ASSUM NHANH;
6225 DISCH_THEN SUBST1_TAC;
6227 DISCH_THEN (ASSUME_TAC o GSYM);
6228 UNDISCH_TAC` !f. sum {0, n} f = f 0 + f n `;
6229 DISCH_THEN (ASSUME_TAC o GSYM);
6232 UNDISCH_TAC` FINITE {0, n} `;
6233 UNDISCH_TAC` FINITE {i | n < i /\ i < CARD (V:real^3 -> bool)} `;
6235 REWRITE_TAC[GSYM FINITE_UNION];
6237 SUBGOAL_THEN` DISJOINT {x | 0 < x /\ x < n} ({i | n < i /\ i < CARD (V:real^3 -> bool)} UNION {0, n}) ` MP_TAC;
6238 REWRITE_TAC[DISJOINT; EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_ELIM_THM; IN_UNION; IN_INSERT];
6242 UNDISCH_TAC` FINITE {m | 0 < m /\ m < n} `;
6244 NHANH (MESON[SUM_UNION]` FINITE s /\ FINITE t /\ DISJOINT s t
6245 ==> ! f. sum (s UNION t) f = sum s f + sum t f`);
6247 FIRST_X_ASSUM (ASSUME_TAC o GSYM);
6250 MATCH_MP_TAC (MESON[]` s = ss ==> sum s f = sum ss f `);
6251 REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_UNION; IN_INSERT; NOT_IN_EMPTY];
6253 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
6258 let THE_SLICING_INTO_2_LEMMA = prove(` convex_local_fan (V,E,FF) /\
6259 (local_fan (V,E,FF) /\
6263 (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
6264 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
6265 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
6266 fv = face HS (v,rho_node1 FF v) /\
6267 fw = face HS (w,rho_node1 FF w)
6268 ==> convex_local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) /\
6269 convex_local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) /\
6270 (!ff. sum {i | i < CARD V}
6272 interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v)) =
6274 {i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fv}
6276 interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)) +
6278 {i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fw}
6280 interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)))`,
6281 NHANH COVEX_OF_LOFA_HALF_CIRCLE2 THEN
6282 NHANH SUM_INTERIOR_AGL_LEMMA THEN SIMP_TAC[]);;
6287 let WEDGE_IN_FAN_LOFA_DETER2 = prove(`local_fan (V,E,FF) /\ v IN V
6288 ==> wedge_in_fan_gt (v,rho_node1 FF v) E =
6289 wedge (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v)`,
6290 NHANH LOCAL_FAN_IVS_IN_V THEN
6291 NHANH LOCAL_FAN_RHO_NODE_IVS THEN
6292 ABBREV_TAC` vv = ivs_rho_node1 FF v` THEN
6293 MESON_TAC[WEDGE_IN_FAN_LOFA_DETER]);;
6298 let AZIM_COND_FOR_COPLANAR = prove_by_refinement
6299 (`azim v0 v1 w1 w2 = &0 \/ azim v0 v1 w1 w2 = pi
6300 <=> coplanar {v0, v1, w1, w2} `,
6302 REWRITE_TAC[AZIM_EQ_0_PI_IMP_COPLANAR];
6303 ASM_CASES_TAC` collinear {v0, v1, w1:real^3} `;
6306 UNDISCH_TAC` collinear {v0, v1, w1:real^3}`;
6307 REWRITE_TAC[AZIM_DEGENERATE];
6309 ASM_CASES_TAC` collinear {v0, v1, w2:real^3}`;
6312 REWRITE_TAC[AZIM_DEGENERATE];
6314 MESON_TAC[AZIM_EQ_0_PI_EQ_COPLANAR]]);;
6318 let AFF_SUB_PLANE = prove(`plane P /\ S SUBSET P ==> aff S SUBSET P `,
6319 REWRITE_TAC[plane; aff] THEN
6320 MESON_TAC[AFFINE_AFFINE_HULL; HULL_MINIMAL]);;
6325 let PROVE_THE_SLICE_ASSUMPTION = prove_by_refinement
6326 (`! v w. convex_local_fan (V,E,FF) /\
6330 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)
6331 ==> (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t})`,
6332 [REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
6333 MATCH_MP_TAC (MESON[]`(!v w. P v w ==> P w v) /\
6334 (!v w. P v w ==> (!z t. z = v /\ Q z t ==> R z t))
6335 ==> (!v w. P v w ==> (!z t. (z = v \/ z = w) /\ Q z t ==> R z t))`);
6336 SIMP_TAC[INSERT_COMM; IN_DIFF; IN_SING];
6338 MP_TAC (SPEC` t:real^3 ` (GEN`w:real^3 ` CVLF_COLLINEAR_CIRCULAR_LUNAR));
6340 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; INSERT_COMM];
6341 UNDISCH_TAC` ~(t = z:real^3)`;
6345 ASSUME_TAC2 Local_lemmas.KCHMAMG;
6346 DOWN THEN STRIP_TAC;
6347 SUBGOAL_THEN` interior_angle1 (vec 0) FF v = pi` MP_TAC;
6348 FIRST_X_ASSUM MATCH_MP_TAC;
6349 FIRST_ASSUM ACCEPT_TAC;
6350 SUBGOAL_THEN` convex_local_fan (V,E,FF) ` MP_TAC;
6353 REWRITE_TAC[convex_local_fan];
6355 ASSUME_TAC2 WEDGE_IN_FAN_LOFA_DETER2;
6357 SUBGOAL_THEN` aff {vec 0, v, w:real^3} SUBSET A` MP_TAC;
6358 MATCH_MP_TAC AFF_SUB_PLANE;
6359 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
6360 UNDISCH_TAC` (V:real^3 -> bool) SUBSET A `;
6361 REWRITE_TAC[SUBSET];
6364 FIRST_X_ASSUM MATCH_MP_TAC;
6365 FIRST_ASSUM ACCEPT_TAC;
6366 FIRST_X_ASSUM MATCH_MP_TAC;
6367 FIRST_ASSUM ACCEPT_TAC;
6369 MP_TAC (ISPECL[`{vec 0: real^3}`;` {v,w:real^3}`] (GEN_ALL Local_lemmas.AFF_GT_SUB_AFF_UNION));
6370 REWRITE_TAC[SET_RULE` {a} UNION S = a INSERT S `];
6372 NHANH (SUBSET_TRANS);
6375 REWRITE_TAC[SUBSET];
6376 SUBGOAL_THEN` DISJOINT {vec 0} {v,w:real^3} ` MP_TAC;
6377 ASM_REWRITE_TAC[SET_RULE` DISJOINT {a} S <=> ~( a IN S) `; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM];
6378 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
6379 UNDISCH_TAC` v:real^3 IN V `;
6380 UNDISCH_TAC` w:real^3 IN V `;
6381 FIRST_X_ASSUM NHANH;
6383 NHANH Planarity.exists_in_aff_gt_disjoint;
6385 DISCH_THEN (ASSUME_TAC2 o (SPEC` y:real^3 `));
6387 SUBGOAL_THEN` coplanar {vec 0, v, rho_node1 FF v, y} ` MP_TAC;
6388 UNDISCH_TAC` plane (A:real^3 -> bool) `;
6389 REWRITE_TAC[coplanar; plane];
6391 EXISTS_TAC` u:real^3 `;
6392 EXISTS_TAC` v':real^3 `;
6393 EXISTS_TAC` w':real^3 `;
6394 FIRST_X_ASSUM (SUBST1_TAC o SYM);
6395 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
6396 ASSUME_TAC2 Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
6398 UNDISCH_TAC` v:real^3 IN V `;
6399 UNDISCH_TAC` (V:real^3 -> bool) SUBSET A `;
6400 REWRITE_TAC[SUBSET];
6404 REWRITE_TAC[ GSYM AZIM_COND_FOR_COPLANAR];
6405 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
6406 DOWN THEN STRIP_TAC;
6407 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
6409 UNDISCH_TAC` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E `;
6411 ASM_REWRITE_TAC[SUBSET];
6413 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`y: real^3 `));
6415 REWRITE_TAC[wedge; IN_ELIM_THM; interior_angle1; GSYM ivs_rho_node1];
6418 MP_TAC (SPEC`t:real^3 ` (GEN` w:real^3 ` Local_lemmas.HKIRPEP));
6422 ASSUME_TAC2 Local_lemmas.CVX_LO_IMP_LO;
6423 ASSUME_TAC2 WEDGE_IN_FAN_LOFA_DETER2;
6425 SUBGOAL_THEN` i + j = CARD (V:real^3 -> bool) ` MP_TAC;
6426 MATCH_MP_TAC (GEN`w:real^3 ` CARD_V_TWO_HAFL_CIRCLE);
6427 EXISTS_TAC` t: real^3 `;
6428 SWITCH_TAC` t = ITER i (rho_node1 FF) v `;
6429 SWITCH_TAC` v = ITER j (rho_node1 FF) t `;
6431 UNDISCH_TAC` ~(t = (z:real^3))`;
6432 ASM_REWRITE_TAC[EQ_SYM_EQ];
6433 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
6434 DOWN THEN STRIP_TAC;
6435 ASM_CASES_TAC` n = 0 `;
6436 FIRST_X_ASSUM SUBST_ALL_TAC;
6438 SWITCH_TAC` t = ITER i (rho_node1 FF) v `;
6439 SWITCH_TAC` v = ITER j (rho_node1 FF) t `;
6440 ASM_REWRITE_TAC[ITER];
6441 ASM_CASES_TAC` n < (i:num) `;
6442 SUBGOAL_THEN` w IN {ITER l (rho_node1 FF) v | 0 < l /\ l < i} ` MP_TAC;
6443 REWRITE_TAC[IN_ELIM_THM];
6448 SWITCH_TAC` t = ITER i (rho_node1 FF) v `;
6449 SWITCH_TAC` v = ITER j (rho_node1 FF) t `;
6450 ASM_REWRITE_TAC[IN_INTER];
6452 SUBGOAL_THEN` aff_gt {vec 0, v} {rho_node1 FF v} = aff_gt {vec 0, v} {w}` MP_TAC;
6453 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
6455 MATCH_MP_TAC Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
6457 MP_TAC (REWRITE_RULE[SING_SUBSET; IN_INSERT] (
6458 ISPECL [`{v:real^3}`;` {vec 0, v:real^3}`; `{w:real^3}`] (GEN_ALL Local_lemmas.AFF_GT_MONO_TRANS)));
6459 REWRITE_TAC[Packing3.SING_UNION_EQ_INSERT];
6460 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
6461 SUBGOAL_THEN` {vec 0, v} DIFF {v:real^3} = {vec 0}` MP_TAC;
6462 REWRITE_TAC[DIFF; EXTENSION; IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY];
6464 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3`));
6469 SUBGOAL_THEN` DISJOINT {vec 0} {w, v:real^3}` MP_TAC;
6470 REWRITE_TAC[SET_RULE` DISJOINT {a} S <=> ~( a IN S)`; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM];
6471 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
6472 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
6476 NHANH Planarity.exists_in_aff_gt_disjoint;
6479 SUBGOAL_THEN` y IN aff_gt {vec 0, v} {rho_node1 FF v}` MP_TAC;
6481 UNDISCH_TAC` aff_gt {vec 0} {w, v} SUBSET aff_gt {vec 0, v} {w:real^3} `;
6482 REWRITE_TAC[SUBSET];
6483 DISCH_THEN MATCH_MP_TAC;
6484 FIRST_X_ASSUM ACCEPT_TAC;
6485 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
6487 SUBGOAL_THEN` ~collinear {vec 0, v, y:real^3}` MP_TAC;
6488 MATCH_MP_TAC (GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO);
6489 EXISTS_TAC` rho_node1 FF v `;
6491 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF v}`;
6493 NHANH AZIM_EQ_0_ALT;
6495 FIRST_X_ASSUM (SUBST_ALL_TAC o SYM);
6496 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
6497 DOWN THEN STRIP_TAC;
6498 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
6501 UNDISCH_TAC` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E `;
6503 REWRITE_TAC[SUBSET];
6504 ONCE_REWRITE_TAC[INSERT_COMM];
6506 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`y: real^3 `));
6508 ASM_REWRITE_TAC[wedge; IN_ELIM_THM];
6512 SWITCH_TAC` v = ITER j (rho_node1 FF) t `;
6513 SWITCH_TAC` t = ITER i (rho_node1 FF) v `;
6514 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
6515 DOWN THEN STRIP_TAC;
6516 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
6518 UNDISCH_TAC` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E `;
6524 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
6525 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3} ` MP_TAC;
6526 REWRITE_TAC[DISJOINT; INTER; EXTENSION; IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY];
6528 UNDISCH_TAC` (v:real^3) IN V `;
6529 UNDISCH_TAC` (w:real^3) IN V `;
6532 NHANH Planarity.exists_in_aff_gt_disjoint;
6535 ASM_CASES_TAC` n = (i:num) `;
6536 UNDISCH_TAC` collinear {t, v:real^3, vec 0} `;
6537 FIRST_X_ASSUM SUBST_ALL_TAC;
6539 ONCE_REWRITE_TAC[GSYM COLLINEAR_AFFINE_HULL_COLLINEAR];
6540 REWRITE_TAC[GSYM aff];
6542 SUBGOAL_THEN` {vec 0, v, (y:real^3)} SUBSET aff {t,v, vec 0} ` MP_TAC;
6543 MP_TAC (ISPECL [` {t, v:real^3, vec 0} `] (ISPECL [` affine` ] HULL_SUBSET));
6544 SIMP_TAC[GSYM aff; INSERT_SUBSET; EMPTY_SUBSET];
6545 SUBGOAL_THEN` t = (w:real^3) ` SUBST_ALL_TAC;
6550 MP_TAC (ISPECL [` {vec 0:real^3} `; `{v, w:real^3 }`] (GEN_ALL Local_lemmas.AFF_GT_SUB_AFF_UNION));
6551 REWRITE_TAC[SUBSET];
6553 SIMP_TAC[SET_RULE` {a} UNION S = a INSERT S`; INSERT_COMM];
6556 SUBGOAL_THEN` collinear {vec 0, v, y:real^3} ` MP_TAC;
6557 MATCH_MP_TAC COLLINEAR_SUBSET;
6558 EXISTS_TAC` aff {t, v:real^3, vec 0} `;
6562 SUBGOAL_THEN` azim (vec 0) v (rho_node1 FF v) y = &0 ` MP_TAC;
6564 REWRITE_TAC[AZIM_DEGENERATE];
6565 UNDISCH_TAC` y IN aff_gt {vec 0} {v, w:real^3} `;
6567 UNDISCH_TAC` aff_gt {vec 0} {v, w} SUBSET
6568 wedge (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
6569 REWRITE_TAC[SUBSET];
6571 ASM_REWRITE_TAC[wedge; IN_ELIM_THM];
6574 SUBGOAL_THEN` w IN {ITER l (rho_node1 FF) t | 0 < l /\ l < j} ` MP_TAC;
6575 REWRITE_TAC[IN_ELIM_THM];
6576 EXISTS_TAC` n - (i:num) `;
6578 REWRITE_TAC[ITER_ADD];
6579 UNDISCH_TAC` ~( n < (i:num)) `;
6580 NHANH (ARITH_RULE` ~( a < (b:num)) ==> a - b + b = a `);
6584 REPLICATE_TAC 3 DOWN;
6587 ASSUME_TAC2 (ARITH_RULE`~(n < i ) ==> (n - i < (j:num) <=> n < i + j) `);
6592 ASM_REWRITE_TAC[IN_INTER];
6593 ASSUME_TAC2 Local_lemmas.LOFA_IMP_NOT_COLL_IVS;
6595 UNDISCH_TAC` ~( n = (i:num)) `;
6597 DOWN THEN DOWN THEN PHA;
6598 NHANH Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
6602 REWRITE_RULE[INSERT_SUBSET; EMPTY_SUBSET; IN_INSERT] (
6603 ISPECL [`{vec 0: real^3}`;`{v, w:real^3}`; ` {v:real^3} `] (GEN_ALL Local_lemmas.AFF_GT_MONO)));
6604 SUBGOAL_THEN` {v,w} DIFF {v:real^3} = {w} ` SUBST1_TAC;
6605 UNDISCH_TAC` ~( v = w:real^3) `;
6608 REWRITE_TAC[Packing3.SING_UNION_EQ_INSERT];
6610 SUBGOAL_THEN` y IN aff_gt {vec 0, v} {ivs_rho_node1 FF v} ` MP_TAC;
6612 ASM_REWRITE_TAC[SUBSET];
6613 DISCH_THEN MATCH_MP_TAC;
6616 SUBGOAL_THEN` ~ collinear {vec 0, v, rho_node1 FF v} /\
6617 ~ collinear {vec 0, v, y} /\
6618 ~ collinear {vec 0, v, ivs_rho_node1 FF v } ` MP_TAC;
6619 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
6621 MATCH_MP_TAC (GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO);
6622 EXISTS_TAC` ivs_rho_node1 FF v `;
6624 UNDISCH_TAC` aff_gt {vec 0} {v, w} SUBSET aff_gt {vec 0, v} {w:real^3} `;
6625 REWRITE_TAC[SUBSET];
6626 DISCH_THEN MATCH_MP_TAC;
6631 FIRST_X_ASSUM (SUBST1_TAC o SYM);
6632 UNDISCH_TAC` y IN aff_gt {vec 0} {v, w:real^3} `;
6633 UNDISCH_TAC` aff_gt {vec 0} {v, w} SUBSET
6634 wedge (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
6635 REWRITE_TAC[SUBSET];
6637 REWRITE_TAC[IN_ELIM_THM; wedge];
6645 let EJRCFJD = prove(` convex_local_fan (V,E,FF) /\
6649 (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E) /\
6650 HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
6651 fv = face HS (v,rho_node1 FF v) /\
6652 fw = face HS (w,rho_node1 FF w)
6653 ==> convex_local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) /\
6654 convex_local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) /\
6655 (!ff. sum {i | i < CARD V}
6657 interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v)) =
6659 {i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fv}
6661 interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)) +
6663 {i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fw}
6665 interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)))`,
6667 ASSUME_TAC2 PROVE_THE_SLICE_ASSUMPTION THEN
6668 MATCH_MP_TAC THE_SLICING_INTO_2_LEMMA THEN
6669 ASSUME_TAC2 Local_lemmas.CVX_LO_IMP_LO THEN
6670 ASM_REWRITE_TAC[] THEN
6671 REPEAT GEN_TAC THEN STRIP_TAC THEN
6673 FIRST_X_ASSUM MATCH_MP_TAC THEN
6674 FIRST_X_ASSUM ACCEPT_TAC);;
6679 let DIST_TRIANGLE_AS_ABS = prove(` abs ( dist (x,y) - dist (x,z:real^N)) <= dist (y,z) `,
6680 REWRITE_TAC[REAL_ABS_BOUNDS] THEN CONJ_TAC THENL [
6681 REWRITE_TAC[REAL_ARITH` -- a <= b - c <=> c <= b + a `; DIST_TRIANGLE];
6682 REWRITE_TAC[REAL_ARITH` a - b <= c <=> a <= b + c `] THEN
6683 MESON_TAC[DIST_TRIANGLE; DIST_SYM]]);;
6688 let CON_ATREAL_REAL_CON2_REDO = prove_by_refinement
6689 (` (f:real -> real^N) continuous atreal r /\ g continuous atreal r
6690 ==> (\t. dist (f t,g t)) real_continuous atreal r`,
6691 [REWRITE_TAC[real_continuous_atreal; continuous_atreal];
6693 SUBGOAL_THEN` &0 < e / &2 ` ASSUME_TAC;
6697 FIRST_X_ASSUM (MP_TAC o (SPEC` e / &2 `));
6699 FIRST_X_ASSUM ACCEPT_TAC;
6700 FIRST_X_ASSUM (MP_TAC o (SPEC` e / &2 `));
6702 FIRST_X_ASSUM ACCEPT_TAC;
6705 EXISTS_TAC` min d d'`;
6706 ASM_REWRITE_TAC[REAL_LT_MIN];
6708 FIRST_X_ASSUM NHANH;
6709 FIRST_X_ASSUM NHANH;
6711 SUBST1_TAC (REAL_ARITH` dist ((f:real -> real^N) x',g x') - dist (f r,g r) =
6712 (dist (f x',g x') - dist (f x', g r)) + ( dist (f x', g r) - dist (f r,g r))`);
6713 MP_TAC (SPECL [` dist ((f:real -> real^N) x',g x') - dist (f x',g r)`; ` dist ((f:real -> real^N) x',g r) - dist (f r,g r) `] REAL_ABS_TRIANGLE);
6715 SUBGOAL_THEN` abs (dist ((f:real -> real^N) x',g x') - dist (f x',g r)) +
6716 abs (dist (f x',g r) - dist (f r,g r)) < e ` MP_TAC;
6717 MATCH_MP_TAC REAL_LET_TRANS;
6718 EXISTS_TAC`dist (g x',(g:real -> real^N) r) + dist (f x',(f:real -> real^N) r)`;
6720 MATCH_MP_TAC (REAL_ARITH` a <= b /\ d <= c ==> a + d <= b + c `);
6721 REWRITE_TAC[DIST_TRIANGLE_AS_ABS];
6724 REWRITE_TAC[DIST_SYM];
6725 ONCE_REWRITE_TAC[DIST_SYM];
6726 REWRITE_TAC[DIST_TRIANGLE_AS_ABS];
6735 let REAL_POS_LT_MUL = prove(
6736 ` &0 <= a /\ a < b /\ &0 <= x /\ x < y ==> a * x < b * y `,
6737 NHANH REAL_LET_TRANS THEN STRIP_TAC THEN
6738 ASSUME_TAC2 (SPECL [` a:real`;` b:real`;` y:real `] REAL_LT_RMUL) THEN
6739 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC` a * (y:real) ` THEN
6740 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
6741 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN
6742 FIRST_X_ASSUM ACCEPT_TAC);;
6748 let REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN = prove_by_refinement
6749 (` f real_continuous atreal r /\ g real_continuous atreal r
6750 ==> (\t. (f t) * (g t)) real_continuous atreal r `,
6751 [REWRITE_TAC[real_continuous_atreal];
6755 SUBGOAL_THEN` &0 < e / (&2 * ( abs (f (r:real)) + &1)) ` MP_TAC;
6756 MATCH_MP_TAC REAL_LT_DIV;
6760 FIRST_X_ASSUM (MP_TAC o (SPEC` e / (&2 * (abs (f (r:real)) + &1))`));
6762 FIRST_X_ASSUM ACCEPT_TAC;
6764 ABBREV_TAC` dd = e / (&2 * (abs (f (r:real)) + &1)) `;
6765 SUBGOAL_THEN` &0 < e / (&2 * (abs (g (r:real)) + dd)) ` ASSUME_TAC;
6766 MATCH_MP_TAC REAL_LT_DIV;
6768 UNDISCH_TAC` &0 < dd `;
6770 UNDISCH_TAC` !e. &0 < e
6771 ==> (?d. &0 < d /\ (!x'. abs (x' - r) < d ==> abs (f x' - f (r:real)) < e))`;
6773 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` e / (&2 * (abs (g (r:real)) + dd))`));
6774 DOWN THEN STRIP_TAC;
6775 EXISTS_TAC` min d d' `;
6776 ASM_REWRITE_TAC[REAL_LT_MIN];
6778 FIRST_X_ASSUM NHANH;
6779 FIRST_X_ASSUM NHANH;
6781 SUBST1_TAC (REAL_ARITH` f (x':real) * g x' - f r * g r = (f x' - f r) * g x' + ( g x' - g r) * f r `);
6782 MATCH_MP_TAC REAL_LET_TRANS;
6783 EXISTS_TAC` abs ((f x' - f r) * g x') + abs ((g x' - g r) * f (r:real)) `;
6784 REWRITE_TAC[REAL_ABS_TRIANGLE; REAL_ABS_MUL];
6785 MP_TAC (SPECL[`abs (g x' - g (r:real)) `;` dd:real `; ` abs (f (r:real))`] REAL_LE_RMUL);
6787 REWRITE_TAC[ REAL_ABS_POS];
6788 MATCH_MP_TAC REAL_LT_IMP_LE;
6789 FIRST_X_ASSUM ACCEPT_TAC;
6790 MP_TAC (SPECL [`(g:real -> real) x' `; `(g:real -> real) r`] REAL_SUB_ABS);
6791 REWRITE_TAC[REAL_ARITH` a - b <= c <=> a <= b + c `];
6793 ASSUME_TAC2 (REAL_ARITH` abs (g x' - g (r:real)) < dd /\
6794 abs (g x') <= abs (g r) + abs (g x' - g r) ==> abs (g x') < abs (g r) + dd`);
6796 MP_TAC (ISPECL [`abs (f x' - f (r:real)) `;` abs ( g (x':real)) `;
6797 ` e / (&2 * (abs (g (r:real)) + dd)) `;` abs (g (r:real)) + dd`] (GEN_ALL REAL_POS_LT_MUL));
6799 ASM_REWRITE_TAC[REAL_ABS_POS];
6801 NHANH (REAL_ARITH` a <= b /\ c < d ==> c + a < b + d `);
6804 SUBGOAL_THEN` e / (&2 * (abs (g r) + dd)) * (abs (g (r:real)) + dd) = e / &2 ` SUBST1_TAC;
6805 UNDISCH_TAC` &0 < dd `;
6806 CONV_TAC REAL_FIELD;
6808 SUBST1_TAC (REAL_FIELD` e / (&2 * (abs (f (r:real)) + &1)) * abs (f r) = (e / &2) * (abs (f r) / ( abs (f r) + &1))`);
6809 SUBGOAL_THEN` abs (f r) / (abs (f (r:real)) + &1) < &1 ` MP_TAC;
6810 MATCH_MP_TAC Real_ext.REAL_PROP_LT_LCANCEL;
6811 EXISTS_TAC` abs (f (r:real)) + &1`;
6812 SUBGOAL_THEN` &0 < abs (f (r:real)) + &1 ` MP_TAC;
6814 SIMP_TAC[REAL_FIELD` &0 < a ==> a * x / a = x `; REAL_MUL_RID];
6818 MP_TAC (SPECL [` e / &2 `;` abs (f r) / (abs (f (r:real)) + &1)`; `&1 `] REAL_LT_LMUL);
6820 ASM_REWRITE_TAC[REAL_ARITH` &0 < e / &2 <=> &0 < e `];
6821 ABBREV_TAC` dx = abs (f x' - f r) * abs (g x') + abs (g x' - g r) * abs (f (r:real))`;
6828 let REAL_CONTINUOUS_ATREAL_POW_2 =
6829 REWRITE_RULE[CONJ_ACI; GSYM POW_2] (
6830 SPEC` f:real -> real ` (GEN`g:real -> real ` REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN));;
6835 let CONSTANCE_FUN_CONTINUOUS = prove(` ! c. (\t. c) real_continuous atreal r `,
6836 REWRITE_TAC[real_continuous_atreal] THEN
6837 REPEAT STRIP_TAC THEN EXISTS_TAC ` e:real ` THEN
6838 ASM_REWRITE_TAC[REAL_SUB_REFL; REAL_ABS_0]);;
6841 let REAL_CONS_IMP_SCALAR_MUL = prove(
6842 ` f real_continuous atreal r ==> ! c. (\t. c * f t) real_continuous atreal r `,
6843 STRIP_TAC THEN GEN_TAC THEN
6844 MP_TAC (SPEC_ALL CONSTANCE_FUN_CONTINUOUS) THEN
6845 DOWN THEN PHA THEN NHANH REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN THEN
6846 SIMP_TAC[BETA_THM; REAL_MUL_SYM]);;
6849 let CONS_IMP_SO_IVS = prove(` f real_continuous atreal r ==> (\t. -- f t) real_continuous atreal r `,
6850 MP_TAC (SPEC` -- &1 ` CONSTANCE_FUN_CONTINUOUS) THEN
6852 NHANH REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN THEN
6853 SIMP_TAC[BETA_THM; GSYM REAL_NEG_MINUS1]);;
6857 let REAL_CONS_IMP_SUM_CONS = prove_by_refinement(
6858 ` f real_continuous atreal r /\ g real_continuous atreal r
6859 ==> (\t. f t + g t) real_continuous atreal r `,
6860 [REWRITE_TAC[real_continuous_atreal] ;
6862 ASSUME_TAC2 (REAL_ARITH` &0 < e ==> &0 < e / &2 `) ;
6863 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` e / &2 `)) ;
6864 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` e / &2 `)) ;
6866 PHA THEN STRIP_TAC ;
6867 EXISTS_TAC` min d d' ` ;
6868 REWRITE_TAC[REAL_LT_MIN] ;
6871 FIRST_X_ASSUM NHANH ;
6872 FIRST_X_ASSUM NHANH ;
6874 MATCH_MP_TAC REAL_LET_TRANS ;
6875 EXISTS_TAC` abs (g x' - g r) + abs (f x' - f (r:real))` ;
6878 REPLICATE_TAC 3 DOWN THEN PHA ;
6884 let REAL_CONS_IMP_SCALAR_MUL_ALT =
6885 REWRITE_RULE[RIGHT_IMP_FORALL_THM] REAL_CONS_IMP_SCALAR_MUL;;
6888 let UPS_X_CONTS_FUNC = prove_by_refinement
6889 (` (f:real -> real^N) continuous atreal r /\
6890 (g: real -> real^N) continuous atreal r /\
6891 (h: real -> real^N) continuous atreal r
6892 ==> (\r. ups_x (dist (f r,g r) pow 2) (dist (h r,f r) pow 2) (dist (g r, h r) pow 2)) real_continuous atreal r `,
6893 [REWRITE_TAC[ups_x];
6895 ASSUME_TAC2 CON_ATREAL_REAL_CON2_REDO;
6896 ASSUME_TAC2 (SPECL [` g:real -> real^N `;` h:real -> real^N`;` r:real `] (GEN_ALL CON_ATREAL_REAL_CON2_REDO));
6897 ASSUME_TAC2 (SPECL [` h:real -> real^N `;` f:real -> real^N`;` r:real `] (GEN_ALL CON_ATREAL_REAL_CON2_REDO));
6898 REPLICATE_TAC 3 DOWN THEN PHA;
6899 NHANH_PAT `\x. x ==> y ` REAL_CONTINUOUS_ATREAL_POW_2;
6900 REWRITE_TAC[BETA_THM];
6901 NHANH_PAT `\x. x ==> y ` REAL_CONTINUOUS_ATREAL_POW_2;
6902 REWRITE_TAC[BETA_THM];
6904 SUBGOAL_THEN`(\r. dist ((f:real -> real^N) r,g r) pow 2 * dist (g r,h r) pow 2) real_continuous atreal r ` ASSUME_TAC;
6905 MATCH_MP_TAC REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN;
6907 SUBGOAL_THEN `(\r. dist ((f:real -> real^N) r,g r) pow 2 * dist (h r,f r) pow 2) real_continuous atreal r ` ASSUME_TAC;
6908 MATCH_MP_TAC REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN;
6910 SUBGOAL_THEN`(\r. dist ((h:real -> real^N) r,f r) pow 2 * dist (g r,h r) pow 2) real_continuous atreal r ` ASSUME_TAC;
6911 MATCH_MP_TAC REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN;
6914 REWRITE_TAC[REAL_ARITH` a - b = a + -- b `];
6915 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6917 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6919 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6921 REWRITE_TAC[REAL_ARITH` -- a * b = -- ( a * b) `];
6922 MATCH_MP_TAC CONS_IMP_SO_IVS;
6923 ASM_REWRITE_TAC[GSYM REAL_POW_2];
6924 MATCH_MP_TAC CONS_IMP_SO_IVS;
6925 ASM_REWRITE_TAC[GSYM REAL_POW_2];
6926 MATCH_MP_TAC CONS_IMP_SO_IVS;
6927 ASM_REWRITE_TAC[GSYM REAL_POW_2];
6928 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6930 MATCH_MP_TAC REAL_CONS_IMP_SCALAR_MUL_ALT;
6931 FIRST_X_ASSUM ACCEPT_TAC;
6932 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6934 MATCH_MP_TAC REAL_CONS_IMP_SCALAR_MUL_ALT;
6935 FIRST_X_ASSUM ACCEPT_TAC;
6936 MATCH_MP_TAC REAL_CONS_IMP_SCALAR_MUL_ALT;
6937 FIRST_X_ASSUM ACCEPT_TAC]);;
6942 let CONTS_FUN_CONTINUOUS_ATREAL = prove(
6943 `! v0. (\t. (v0: real^N)) continuous atreal r `,
6944 SIMP_TAC[continuous_atreal; DIST_REFL] THEN MESON_TAC[]);;
6949 let REAL_CONS_STILL_DIFF = prove(` f real_continuous atreal r /\ ~( f r = a)
6950 ==> ?d. &0 < d /\ (! rr. abs (rr - r) < d ==> ~( f rr = a)) `,
6951 ONCE_REWRITE_TAC[REAL_ARITH` a = b <=> a - b = &0 `] THEN
6952 REWRITE_TAC[real_continuous_atreal; REAL_ABS_NZ] THEN
6954 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` abs ((f:real -> real) r - a)`)) THEN
6955 DOWN THEN STRIP_TAC THEN
6956 EXISTS_TAC` d:real ` THEN
6957 ASM_REWRITE_TAC[] THEN
6958 GEN_TAC THEN FIRST_X_ASSUM NHANH THEN
6964 let CONTINUOUS_PRESERVE_COLLINEAR = prove_by_refinement
6965 (` f continuous atreal r /\
6966 g continuous atreal r /\
6967 ~ collinear {v0:real^3, f r, g r}
6969 (! r'. abs ( r - r') < e
6970 ==> ~ collinear {v0, f r', g r'} ) `,
6971 [REWRITE_TAC[Collect_geom.COL_EQ_UPS_0];
6972 MP_TAC (ISPECL [` (f:real -> real^3) r `;` v0:real^3 `;
6973 `(g:real -> real^3) r `] (GEN_ALL Collect_geom.TROI_OI_DAT_HOI));
6975 REWRITE_TAC[Collect_geom.UPS_X_SYM];
6977 MP_TAC (ISPEC` v0:real^3` CONTS_FUN_CONTINUOUS_ATREAL);
6978 UNDISCH_TAC` (g:real -> real^3) continuous atreal r `;
6979 UNDISCH_TAC` (f:real -> real^3) continuous atreal r `;
6981 NHANH UPS_X_CONTS_FUNC;
6982 REWRITE_TAC[BETA_THM];
6984 MP_TAC (ISPECL [` r:real `; `(\r. ups_x (dist ((f:real -> real^3) r,g r) pow 2) (dist (v0,f r) pow 2)
6985 (dist (v0,g r) pow 2)) `; ` &0 `]
6986 (GEN_ALL REAL_CONS_STILL_DIFF));
6990 REWRITE_TAC[DIST_SYM];
6991 SIMP_TAC[REAL_ARITH` abs ( a - b) = abs ( b - a) `]]);;
6996 let EACH_ELM_PRESERVED_IMP_ALL = prove_by_refinement
6997 (` (!x. x IN (E: A -> bool)
7004 ==> ! x. x IN E ==> P x t))`,
7005 [ABBREV_TAC` n = CARD (E: A -> bool) `;
7007 SPEC_TAC (` E: A -> bool `,` E:A -> bool `);
7008 SPEC_TAC (`n:num `,` n:num `);
7011 STRIP_TAC THEN STRIP_TAC THEN STRIP_TAC;
7012 FIRST_X_ASSUM SUBST_ALL_TAC;
7013 ASM_REWRITE_TAC[IMAGE_CLAUSES; NOT_IN_EMPTY];
7018 ASM_CASES_TAC` (E: A -> bool) = {} `;
7019 ASM_REWRITE_TAC[CARD_CLAUSES; ADD1];
7020 REWRITE_TAC[ARITH_RULE` ~( 0 = n + 1) `];
7022 REWRITE_TAC[Local_lemmas.EMPTY_NOT_EXISTS_IN];
7024 UNDISCH_TAC` (x:A) IN E `;
7027 UNDISCH_TAC` !E. CARD (E: A -> bool) = n
7028 ==> (!x. x IN E ==> (?e. &0 < e /\ (!t. abs t < e ==> P x t))) /\
7030 ==> (?e. &0 < e /\ (!t. abs t < e ==> (!x. x IN E ==> P x t))) `;
7033 FIRST_X_ASSUM (MP_TAC o (SPEC` E DELETE (x:A)`));
7036 ASSUME_TAC2 (ISPECL [` x:A `;` E: A -> bool `] CARD_DELETE);
7037 ASM_REWRITE_TAC[ARITH_RULE` SUC n - 1 = n `; IN_DELETE; FINITE_DELETE];
7039 FIRST_X_ASSUM MATCH_MP_TAC;
7040 FIRST_X_ASSUM ACCEPT_TAC;
7042 EXISTS_TAC` min e e' `;
7043 REWRITE_TAC[REAL_LT_MIN];
7045 FIRST_X_ASSUM NHANH;
7046 FIRST_X_ASSUM NHANH;
7051 let EACH_ELM_PRESERVED_IMP_ALLL =
7052 prove_by_refinement (
7053 ` (! x. (x:real^3 -> bool) IN E ==> (? e. &0 < e /\ (! t. abs t < e ==> ~collinear ({vec 0} UNION (IMAGE (\v. (phii: real ^3 -> real -> real^3) v t) x))))) /\
7057 ==> (!e. e IN IMAGE (IMAGE (\v. phii v t)) E
7058 ==> ~collinear ({vec 0} UNION e))) `,
7059 [ABBREV_TAC` n = CARD (E:(real^3 -> bool) -> bool) `;
7061 SPEC_TAC (` E:(real^3 -> bool) -> bool `,` E:(real^3 -> bool) -> bool `);
7062 SPEC_TAC (`n:num `,` n:num `);
7065 STRIP_TAC THEN STRIP_TAC THEN STRIP_TAC;
7066 FIRST_X_ASSUM SUBST_ALL_TAC;
7067 ASM_REWRITE_TAC[IMAGE_CLAUSES; NOT_IN_EMPTY];
7072 ASM_CASES_TAC` (E:(real^3 -> bool) -> bool) = {} `;
7073 ASM_REWRITE_TAC[CARD_CLAUSES; ADD1];
7074 REWRITE_TAC[ARITH_RULE` ~( 0 = n + 1) `];
7076 REWRITE_TAC[Local_lemmas.EMPTY_NOT_EXISTS_IN];
7078 UNDISCH_TAC` (x:real^3 -> bool) IN E `;
7081 UNDISCH_TAC` !E. CARD (E: (real^3 -> bool) -> bool) = n
7086 ({vec 0} UNION IMAGE (\v. (phii:real^3 -> real -> real^3) v t ) x)))) /\
7090 ==> (!e. e IN IMAGE (IMAGE (\v. phii v t)) E
7091 ==> ~collinear ({vec 0} UNION e)))) `;
7094 FIRST_X_ASSUM (MP_TAC o (SPEC` E DELETE (x:real^3 -> bool)`));
7097 ASSUME_TAC2 (ISPECL [` x:real ^3 -> bool `;` E: (real^3 -> bool) -> bool `] CARD_DELETE);
7098 ASM_REWRITE_TAC[ARITH_RULE` SUC n - 1 = n `; IN_DELETE; FINITE_DELETE];
7100 FIRST_X_ASSUM MATCH_MP_TAC;
7101 FIRST_X_ASSUM ACCEPT_TAC;
7103 EXISTS_TAC` min e e' `;
7104 REWRITE_TAC[REAL_LT_MIN];
7106 FIRST_X_ASSUM NHANH;
7107 FIRST_X_ASSUM NHANH;
7113 let ALL_TO_THE_NONPARALLEL_PART = prove_by_refinement
7114 (` deformation phii (V:real^3 -> bool) (a,b) /\ FAN (vec 0, V,E)
7116 (!t. --e < t /\ t < e
7117 ==> UNIONS (IMAGE (IMAGE (\v. phii v t)) E) SUBSET
7118 IMAGE (\v. phii v t) V /\
7119 graph (IMAGE (IMAGE (\v. phii v t)) E) /\
7122 IMAGE (\v. phii v t) V,
7123 IMAGE (IMAGE (\v. phii v t)) E) /\
7126 IMAGE (\v. phii v t) V,
7127 IMAGE (IMAGE (\v. phii v t)) E) /\
7130 IMAGE (\v. phii v t) V,
7131 IMAGE (IMAGE (\v. phii v t)) E) ))`,
7134 MATCH_MP_TAC (GEN_ALL TOW_REAL_EXISTS_COMBINED);
7138 REWRITE_TAC[REAL_ARITH` &0 < &1 `];
7141 REWRITE_TAC[GSYM IMAGE_UNIONS];
7142 MATCH_MP_TAC IMAGE_SUBSET;
7145 MATCH_MP_TAC (GEN_ALL TOW_REAL_EXISTS_COMBINED);
7148 REWRITE_TAC[deformation; graph; fan1; fan2];
7151 MP_TAC (ISPECL [` &0 `;`phii:real^3 -> real -> real^3 `;`V:real^3 -> bool`]
7152 (GEN_ALL CONTINUOUS_ATREAL_INJ_PRESERVED));
7157 ASM_SIMP_TAC[REAL_SUB_RZERO];
7159 EXISTS_TAC `d:real `;
7160 ASM_REWRITE_TAC[REAL_BOUNDS_LT; IMAGE; IN_ELIM_THM];
7161 FIRST_X_ASSUM NHANH;
7163 REWRITE_TAC[HAS_SIZE_2_EXISTS; IN];
7165 SUBGOAL_THEN` (?xx y. ~(xx = y) /\ (!z. x (z:real^3) <=> z = xx \/ z = y))`
7167 UNDISCH_TAC` (E:(real^3 -> bool) -> bool) x `;
7170 EXISTS_TAC` (phii: real^3 -> (real -> real^3)) xx t `;
7171 EXISTS_TAC` (phii: real^3 -> (real -> real^3)) y t `;
7174 FIRST_X_ASSUM MATCH_MP_TAC;
7176 ASSUME_TAC2 (SET_RULE` UNIONS E SUBSET (V:real^3 -> bool) /\
7177 E x ==> (! z. x z ==> V z) `);
7180 ASM_REWRITE_TAC[IN_ELIM_THM];
7184 MATCH_MP_TAC (GEN_ALL TOW_REAL_EXISTS_COMBINED);
7188 REWRITE_TAC[REAL_ARITH` &0 < &1 `];
7190 MATCH_MP_TAC FINITE_IMAGE;
7195 SIMP_TAC[SET_RULE` s SUBSET {} <=> s = {} `; fan1; IMAGE_EQ_EMPTY];
7199 MATCH_MP_TAC (GEN_ALL TOW_REAL_EXISTS_COMBINED);
7202 REWRITE_TAC[fan2; deformation];
7205 MP_TAC (ISPECL [`&0`;` phii:real^3 -> real -> real^ 3 `;` vec 0:real^3 `;
7206 ` V:real^3 -> bool `] (GEN_ALL CONTINUOUS_ATREAL_DISTINCT_FINITE));
7209 SIMP_TAC[fan2; fan1];
7212 SIMP_TAC[fan2; fan1];
7214 UNDISCH_TAC` ~( vec 0 IN (V:real^3 -> bool)) `;
7218 REWRITE_TAC[REAL_SUB_RZERO; REAL_BOUNDS_LT; IN_IMAGE];
7222 UNDISCH_TAC` graph (E:(real^3 -> bool) -> bool) `;
7223 REWRITE_TAC[Fan.GRAPH];
7225 REWRITE_TAC[fan1; fan2];
7228 ASSUME_TAC2 (ISPECL [` UNIONS (E:(real^3 -> bool) -> bool) `;` V:real^3 -> bool`] FINITE_SUBSET);
7230 REWRITE_TAC[FINITE_UNIONS; REAL_BOUNDS_LT];
7232 MATCH_MP_TAC EACH_ELM_PRESERVED_IMP_ALLL;
7237 SUBGOAL_THEN` (x:real^3 -> bool) HAS_SIZE 2 ` MP_TAC;
7241 REWRITE_TAC[fan6; deformation; HAS_SIZE_2_EXISTS2];
7243 SUBGOAL_THEN` ~collinear ({vec 0: real^3} UNION x)` MP_TAC;
7244 FIRST_X_ASSUM MATCH_MP_TAC;
7245 FIRST_X_ASSUM ACCEPT_TAC;
7246 ASM_REWRITE_TAC[IMAGE_CLAUSES; Local_lemmas.INSERT_UNION2; UNION_EMPTY];
7247 ONCE_REWRITE_TAC[REAL_ARITH` abs t = abs (&0 - t) `];
7249 MATCH_MP_TAC CONTINUOUS_PRESERVE_COLLINEAR;
7250 ASSUME_TAC2 (SET_RULE` UNIONS E SUBSET V /\ (x:real^3 -> bool) IN E ==> x SUBSET V `);
7252 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
7253 UNDISCH_TAC` !v. (v:real^3) IN V ==> phii v (&0) = v`;
7255 ASM_SIMP_TAC[ETA_AX]]);;
7262 (* ================================================================== *)
7263 (* ================================================================== *)