1 (* ========================================================================== *)
\r
2 (* FLYSPECK - BOOK FORMALIZATION *)
\r
4 (* Chapter: Local Fan *)
\r
5 (* Author: Nguyen Quang Truong *)
\r
6 (* Date: 2010-05-09 *)
\r
7 (* ========================================================================== *)
\r
9 (* rho_fan interior_angle *)
\r
11 flyspeck_needs "local/LDURDPN.hl";;
\r
14 module type Local_lemmas_type = sig
\r
18 (* ================================================================ *)
\r
19 (* lemma 6.13 - KOMWBWC *)
\r
21 module Local_lemmas = struct
\r
23 parse_as_infix("has_orders",(12,"right"));;
\r
24 parse_as_infix("cyclic_on",(13,"right"));;
\r
29 open Trigonometry1;;
\r
30 open Trigonometry2;;
\r
33 open Prove_by_refinement;;
\r
34 open Wrgcvdr_cizmrrh;;
\r
38 let rho_node1 = new_definition ` rho_node1 (FF:real^3 # real^3 -> bool) v = (@w. (v,w) IN FF)`;;
\r
40 let ivs_rho_node1 = new_definition ` ivs_rho_node1 (FF:real^3 # real^3 -> bool) v = (@a. a,v IN FF )`;;
\r
42 let SWITCH_TAC t = UNDISCH_TAC t THEN DISCH_THEN (ASSUME_TAC o GSYM);;
\r
50 let LOCAL_FAN_IMP_IN_V = prove_by_refinement
\r
51 (` local_fan (V,E,FF) /\ x,y IN FF ==> x IN V /\ y IN V `,
\r
52 [REWRITE_TAC[local_fan];
\r
53 NHANH lemma_face_subset;
\r
54 NHANH ELMS_OF_HYPERMAP_HYP;
\r
55 LET_TAC THEN STRIP_TAC;
\r
57 UNDISCH_TAC ` face H (x':real^3 # real^3) SUBSET dart H`;
\r
58 ASM_REWRITE_TAC[SUBSET];
\r
61 REWRITE_TAC[FAN; darts_of_hyp; IN_UNION; Wrgcvdr_cizmrrh.IN_ORD_E_EQ_IN_E];
\r
64 UNDISCH_TAC ` UNIONS E SUBSET (V:real^3 -> bool) `;
\r
65 NHANH lemma_sub_support;
\r
66 REWRITE_TAC[INSERT_SUBSET; SUBSET];
\r
69 REWRITE_TAC[self_pairs; IN_ELIM_THM; PAIR_EQ];
\r
73 let LOCAL_FAN_RHO_NODE_PROS = prove_by_refinement
\r
74 (`local_fan (V,E,FF)
\r
75 ==> (!x. x IN V ==> x, (rho_node1 FF x) IN FF) /\
\r
76 (!x. x IN FF ==> x = FST x,rho_node1 FF (FST x))`,
\r
77 [ABBREV_TAC `k = (\x. FST (x:real^3 # real^3)) `;
\r
78 SWITCH_TAC `(\x. FST (x:real^3 # real^3)) = k`;
\r
80 MP_TAC2 Wrgcvdr_cizmrrh.BIJ_BETWEEN_FF_AND_V;
\r
83 SUBGOAL_THEN ` (!x. x IN V ==> x,rho_node1 FF x IN (FF:real^3 # real^3 -> bool))` ASSUME_TAC;
\r
85 REWRITE_TAC[rho_node1];
\r
86 CONV_TAC SELECT_CONV;
\r
93 EXISTS_TAC ` SND (y:real^3 # real^3) `;
\r
94 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
96 DOWN THEN SIMP_TAC[];
\r
99 STRIP_TAC THEN STRIP_TAC;
\r
100 UNDISCH_TAC ` !x. x IN (FF:real^3 # real^3 -> bool) ==> k x IN (V:real^3 -> bool) ` ;
\r
102 FIRST_X_ASSUM NHANH;
\r
104 ASM_REWRITE_TAC[INJ];
\r
110 let ORTHONORMAL_CYCLIC = prove_by_refinement
\r
111 (`~( x:real^N = y ) /\ FINITE U /\ (! u1 u2. u1 IN U /\ u2 IN U
\r
112 ==> (u1 - u2) dot (x - y ) = &0) /\
\r
113 U INTER affine hull {x,y} = {} ==>
\r
114 cyclic_set U x y `,
\r
115 [SIMP_TAC[cyclic_set];
\r
117 REWRITE_TAC[VECTOR_ARITH` p = q + h % x <=> p - q = h % x `];
\r
119 FIRST_X_ASSUM (ASSUME_TAC o (SPECL [`p:real^N`;` q:real^N`]));
\r
120 FIRST_X_ASSUM MP_TAC2;
\r
121 ASM_REWRITE_TAC[IN];
\r
122 ASM_REWRITE_TAC[DOT_LMUL; REAL_ENTIRE; DOT_EQ_0];
\r
123 DISCH_THEN DISJ_CASES_TAC;
\r
124 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_RID];
\r
125 ASM_REWRITE_TAC[VECTOR_ADD_RID; VECTOR_MUL_RZERO]]);;
\r
130 let FAN_SINGLETON_V_DARTS = prove_by_refinement
\r
131 (` FAN (x:real^N,V,E) /\ V = {v} ==> darts_of_hyp E V = {(v,v)}`,
\r
132 [REWRITE_TAC[FAN; darts_of_hyp; EXTENSION; IN_INSERT; NOT_IN_EMPTY; SUBSET; IN_UNION; ord_pairs; self_pairs; IN_ELIM_THM];
\r
133 NHANH lemma_sub_support;
\r
134 REWRITE_TAC[INSERT_SUBSET];
\r
140 EXISTS_TAC ` v:real^N`;
\r
141 ASM_REWRITE_TAC[EE; IN_ELIM_THM];
\r
142 DOWN_TAC THEN REWRITE_TAC[graph; IN];
\r
145 REWRITE_TAC[HAS_SIZE; Geomdetail.CARD2];
\r
147 UNDISCH_TAC ` (E:(real^N -> bool) -> bool) {v,x'':real^N}`;
\r
148 PAT_ONCE_REWRITE_TAC `\x. x ==> i ` [GSYM IN ];
\r
150 NHANH lemma_sub_support;
\r
151 REWRITE_TAC[INSERT_SUBSET; IN];
\r
152 ASM_MESON_TAC[]]);;
\r
158 let FAN_IN_DARTS_FST_EQ_SND_SELF_PAIRS = prove_by_refinement
\r
159 (` FAN (x:real^N,V,E) /\ y IN darts_of_hyp E V
\r
160 ==> ( FST y = SND y <=> y IN self_pairs E V )`,
\r
161 [REWRITE_TAC[FAN; graph; darts_of_hyp; IN_UNION; ord_pairs; self_pairs; IN_ELIM_THM];
\r
163 FIRST_X_ASSUM (MP_TAC2 o (SPEC `{a,b:real^N}`));
\r
164 ONCE_REWRITE_TAC[GSYM IN];
\r
166 ASM_REWRITE_TAC[HAS_SIZE; Geomdetail.CARD2; PAIR_EQ];
\r
169 EXISTS_TAC ` v:real^N`;
\r
170 ASM_REWRITE_TAC[]]);;
\r
175 let FAN_FST_EQ_SND_SUPPER_EQ = prove_by_refinement
\r
176 (` FAN (x,V,E) /\ FST y = SND y ==>
\r
177 ee_of_hyp (x,V,E) y = y /\
\r
178 nn_of_hyp (x,V,E) y = y /\
\r
179 ff_of_hyp (x,V,E) y = y `,
\r
181 ASM_CASES_TAC ` y IN darts_of_hyp E (V:real^3 -> bool) `;
\r
182 ASM_SIMP_TAC[Lvducxu.EE_OF_HYP_IDE_FST_SND_EQ];
\r
183 UNDISCH_TAC ` FST y = SND (y:real^3 # real^3) `;
\r
185 ISPEC `x:real^3 ` (GEN `x:real^N `FAN_IN_DARTS_FST_EQ_SND_SELF_PAIRS));
\r
186 ASM_SIMP_TAC[nn_of_hyp3; ff_of_hyp3];
\r
187 ASM_REWRITE_TAC[nn_of_hyp2; ee_of_hyp2; ff_of_hyp2]]);;
\r
194 let COLLINEAR_CROSS_0 = prove(
\r
195 ` collinear {x,y,z} <=> (y - x ) cross ( z - x ) = vec 0 `,
\r
196 ONCE_REWRITE_TAC[Trigonometry2.COLLINEAR_TRANSABLE] THEN
\r
197 REWRITE_TAC[CROSS_EQ_0]);;
\r
202 let DET_CROSS = prove(` det (vector [x;y;z]) = (x cross y ) dot z `,
\r
203 REWRITE_TAC[Trigonometry2.DET_VEC3_EXPAND; Trigonometry2.DET_VEC3_AS_CROSS_DOT]);;
\r
207 let COPLANAR_IFF_CROSS_DOT = prove(
\r
208 ` coplanar {x,y,z,t} <=> (( y - x ) cross ( z - x ) ) dot ( t - x ) = &0`,
\r
209 REWRITE_TAC[COPLANAR_DET_EQ_0; DET_CROSS]);;
\r
215 let CROSS_DOT_COPLANAR = prove(
\r
216 ` (x cross y) dot z = &0 <=> coplanar {vec 0, x, y, z}`,
\r
217 REWRITE_TAC[COPLANAR_IFF_CROSS_DOT; VECTOR_SUB_RZERO]);;
\r
223 let SUBSET_NOT_COLLINEAR_AFFINE_HULL_EQ = prove_by_refinement
\r
224 (` {a:real^3,b,c} SUBSET affine hull {x,y,z} /\ ~( collinear {a,b,c})
\r
225 ==> affine hull {x,y,z} = affine hull {a,b,c} `,
\r
226 [REWRITE_TAC[COLLINEAR_CROSS_0];
\r
227 REWRITE_TAC[GSYM DOT_EQ_0];
\r
228 REWRITE_TAC[CROSS_DOT_COPLANAR];
\r
230 REWRITE_TAC[EXTENSION];
\r
233 DOWN THEN NHANH (SMOOTH_GEN_ALL Trigonometry2.NONCOPLANAR_3_BASIS);
\r
234 REWRITE_TAC[VECTOR_SUB_RZERO];
\r
236 FIRST_X_ASSUM (MP_TAC o (SPEC ` x':real^3 - a`));
\r
238 SUBGOAL_THEN ` coplanar {a,b,c,x':real^3}` MP_TAC;
\r
240 REWRITE_TAC[coplanar; INSERT_SUBSET; EMPTY_SUBSET];
\r
242 ASM_REWRITE_TAC[COPLANAR_IFF_CROSS_DOT; DOT_RADD; DOT_RMUL; DOT_CROSS_SELF;
\r
243 Collect_geom.ZERO_NEUTRAL; REAL_ENTIRE; DOT_EQ_0; GSYM COLLINEAR_CROSS_0];
\r
245 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
246 UNDISCH_TAC ` x' - (a:real^3) = t1 % (b - a) + t2 % (c - a) + &0 % ((b - a) cross (c - a)) `;
\r
247 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_RID; VECTOR_ARITH` x' - a = t1 % (b - a) + t2 % (c - a) <=> x' = (&1 - t1 - t2) % a + t1 % b + t2 % c `; AFFINE_HULL_3; IN_ELIM_THM];
\r
248 MESON_TAC[REAL_ARITH` (&1 - a - b ) + a + b = &1 `];
\r
250 NHANH NOT_COPLANAR_NOT_COLLINEAR;
\r
251 ONCE_REWRITE_TAC[Trigonometry2.COLLINEAR_TRANSABLE];
\r
252 REWRITE_TAC[VECTOR_SUB_RZERO];
\r
255 NHANH (ISPEC ` affine ` HULL_MONO);
\r
256 REWRITE_TAC[HULL_HULL; SUBSET];
\r
262 let THREE_NOT_COLL_DETER_PLANE = prove(
\r
263 `plane P /\ {a:real^3,b,c} SUBSET P /\ ~collinear {a,b,c}
\r
264 ==> affine hull {a,b,c} = P `, REWRITE_TAC[plane] THEN
\r
265 MESON_TAC [SUBSET_NOT_COLLINEAR_AFFINE_HULL_EQ ]);;
\r
270 let LOCAL_FAN_NOT_V_SING = prove_by_refinement
\r
271 (` local_fan (V,E,FF) ==> ~(?v. V = {v}) `,
\r
272 [REWRITE_TAC[local_fan; dih2k];
\r
274 NHANH ELMS_OF_HYPERMAP_HYP;
\r
276 UNDISCH_TAC ` V = {v:real^3}`;
\r
277 UNDISCH_TAC `FAN (vec 0:real^3,V,E) `;
\r
279 NHANH FAN_SINGLETON_V_DARTS;
\r
280 NHANH (MESON[CARD_SINGLETON]` S = {c} ==> CARD S = 1 `);
\r
282 UNDISCH_TAC ` CARD (dart (H:(real^3 # real^3) hypermap)) = 2 * CARD (FF:real^3 # real^3 -> bool)` ;
\r
286 MESON_TAC[FACE_NOT_EMPTY; ARITH_RULE` 1 <= a ==> ~( 1 = 2 * a ) `]]);;
\r
292 let LOCAL_FAN_NOT_SING_FF = prove_by_refinement
\r
293 (` local_fan (V,E,FF) ==> ~(? x. FF = {x})`,
\r
295 ABBREV_TAC ` k = (\x. FST (x:real^3 # real^3)) `;
\r
296 SWITCH_TAC ` (\x. FST (x:real^3 # real^3)) = k `;
\r
297 ASSUME_TAC2 Wrgcvdr_cizmrrh.BIJ_BETWEEN_FF_AND_V;
\r
300 NHANH Wrgcvdr_cizmrrh.SURJ_IMP_S2_EQ_IMAGE_S1;
\r
302 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
304 REWRITE_TAC[IMAGE; IN_INSERT; NOT_IN_EMPTY; SET_RULE` {y | ?x'. x' = x /\ y = k x'} = {k x }`];
\r
305 DOWN_TAC THEN NHANH LOCAL_FAN_NOT_V_SING;
\r
313 let LOCAL_FAN_IN_FF_DISTINCT = prove_by_refinement
\r
314 (` local_fan (V,E,FF) /\ x IN FF ==> ~( FST x = SND x ) `,
\r
315 [NHANH LOCAL_FAN_NOT_SING_FF;
\r
316 REWRITE_TAC[local_fan];
\r
321 NHANH lemma_face_identity;
\r
323 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
325 SUBGOAL_THEN ` face_map (H:(real^3 # real^3) hypermap) x = x ` ASSUME_TAC;
\r
327 NHANH ELMS_OF_HYPERMAP_HYP;
\r
328 IMP_TAC THEN SIMP_TAC[];
\r
332 UNDISCH_TAC ` FAN (vec 0:real^3,V,E) `;
\r
334 SIMP_TAC[FAN_FST_EQ_SND_SUPPER_EQ];
\r
335 DOWN THEN PHA THEN ONCE_REWRITE_TAC[orbit_one_point];
\r
336 REWRITE_TAC[GSYM face; ETA_AX];
\r
337 ASM_MESON_TAC[]]);;
\r
342 let LOCAL_FAN_IN_FF_IN_ORD_PAIRS = prove_by_refinement
\r
343 (` local_fan (V,E,FF) /\ x IN FF ==> x IN ord_pairs E `,
\r
344 [NHANH LOCAL_FAN_IN_FF_DISTINCT;
\r
345 REWRITE_TAC[local_fan];
\r
346 NHANH ELMS_OF_HYPERMAP_HYP;
\r
348 NHANH lemma_face_subset;
\r
349 ASM_REWRITE_TAC[SUBSET];
\r
351 UNDISCH_TAC ` (x:real^3 # real^3) IN FF `;
\r
353 FIRST_X_ASSUM NHANH;
\r
354 ASM_REWRITE_TAC[darts_of_hyp; IN_UNION];
\r
357 REWRITE_TAC[self_pairs; IN_ELIM_THM];
\r
359 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
360 REPLICATE_TAC 4 DOWN;
\r
368 let LOCAL_FAN_IN_FF_NOT_COLLINEAR = prove(
\r
369 ` local_fan (V,E,FF) /\ x IN FF ==> ~( collinear {vec 0, FST x, SND x }) `,
\r
370 NHANH LOCAL_FAN_IN_FF_IN_ORD_PAIRS THEN
\r
371 REWRITE_TAC[Wrgcvdr_cizmrrh.IN_ORD_E_EQ_IN_E; local_fan; FAN; fan6; IN] THEN
\r
372 LET_TAC THEN STRIP_TAC THEN DOWN THEN FIRST_X_ASSUM NHANH THEN
\r
373 SIMP_TAC[SET_RULE` {a} UNION S = a INSERT S `]);;
\r
381 let LOCAL_FAN_CHARACTER_OF_RHO_NODE = prove_by_refinement
\r
382 (` local_fan (V,E,FF) ==> (! v. v IN V ==> ~( rho_node1 FF v = v ) /\
\r
383 v, rho_node1 FF v IN ord_pairs E /\
\r
384 ~ (collinear {vec 0, v, rho_node1 FF v})) `,
\r
385 [NHANH LOCAL_FAN_RHO_NODE_PROS;
\r
387 FIRST_X_ASSUM NHANH;
\r
388 FIRST_X_ASSUM NHANH;
\r
389 GEN_TAC THEN IMP_TAC THEN REMOVE_TAC;
\r
391 NHANH LOCAL_FAN_IN_FF_DISTINCT;
\r
392 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;
\r
393 NHANH LOCAL_FAN_IN_FF_IN_ORD_PAIRS;
\r
397 let graph2 = prove(`graph E <=> (!e. e IN E ==> FINITE e /\ CARD e = 2)`,
\r
398 REWRITE_TAC[graph; IN; HAS_SIZE]);;
\r
400 let GRAPH_WITH_SET2 = prove(
\r
401 ` graph E ==> (! a b. {a,b} IN E ==> ~( a = b )) `,
\r
402 REWRITE_TAC[graph2] THEN DISCH_THEN NHANH THEN
\r
403 SIMP_TAC[Geomdetail.CARD2]);;
\r
407 let FAN_V_TWO_ELMS_IN_E_DARTS2 = prove_by_refinement
\r
408 (` FAN (x:real^N,V,E) /\ V = {v1,v2} /\ {v1,v2} IN E ==>
\r
409 darts_of_hyp E V = {(v1,v2), (v2,v1)}`,
\r
410 [REWRITE_TAC[darts_of_hyp; FAN; EXTENSION; IN_UNION; ord_pairs; self_pairs;
\r
411 IN_ELIM_THM; SUBSET; graph2; IN_INSERT; NOT_IN_EMPTY];
\r
412 STRIP_TAC THEN GEN_TAC;
\r
415 UNDISCH_TAC ` {a:real^N, b} IN E `;
\r
416 NHANH lemma_sub_support;
\r
417 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
418 FIRST_X_ASSUM NHANH;
\r
419 FIRST_X_ASSUM NHANH;
\r
420 ASM_REWRITE_TAC[Geomdetail.CARD2; PAIR_EQ];
\r
422 UNDISCH_TAC ` v:real^N IN V `;
\r
423 UNDISCH_TAC ` !x. ~(x IN EE (v:real^N) E)`;
\r
424 UNDISCH_TAC ` {v1, v2:real^N} IN E`;
\r
425 ASM_REWRITE_TAC[EE; IN_ELIM_THM];
\r
427 MESON_TAC[INSERT_COMM];
\r
433 DOWN THEN DOWN THEN PHA;
\r
434 MESON_TAC[INSERT_COMM]]);;
\r
438 let FAN_IN_E_DIFF = prove(
\r
439 ` FAN (x,V,E) ==> (! x y. {x,y} IN E ==> ~( x,y = y,x)) `,
\r
440 REWRITE_TAC[PAIR_EQ; FAN] THEN NHANH GRAPH_WITH_SET2 THEN MESON_TAC[]);;
\r
445 let LOCAL_FAN_NOT_TWO_V_IN_E = prove_by_refinement
\r
446 (` local_fan (V,E,FF) ==> ~(? v1 v2. V = {v1,v2} /\ {v1,v2} IN E )`,
\r
447 [NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
448 STRIP_TAC THEN STRIP_TAC;
\r
450 NHANH FAN_V_TWO_ELMS_IN_E_DARTS2;
\r
451 NHANH FAN_IN_E_DIFF;
\r
452 NHANH LOCAL_FAN_NOT_SING_FF;
\r
453 REWRITE_TAC[GSYM Geomdetail.CARD2; local_fan; dih2k];
\r
455 NHANH ELMS_OF_HYPERMAP_HYP;
\r
458 UNDISCH_TAC` CARD (dart (H:(real^3 # real^3) hypermap)) = 2 * CARD (FF:real^3 # real^3 -> bool) `;
\r
459 ASM_SIMP_TAC[ARITH_RULE` 2 = 2 * x <=> x = 1 `];
\r
461 SUBGOAL_THEN ` face H (x:real^3 # real^3) = {x} ` ASSUME_TAC;
\r
462 MATCH_MP_TAC set_one_point;
\r
463 ASM_REWRITE_TAC[FACE_FINITE; face_refl];
\r
464 UNDISCH_TAC ` ~(?x. FF = {x:real^3 # real^3})`;
\r
473 let LOCAL_FAN_ORBIT_MAP_V = prove(
\r
474 ` local_fan (V,E,FF) ==> (! v. v IN V ==> orbit_map (rho_node1 FF) v = V) `,
\r
475 NHANH LOCAL_FAN_RHO_NODE_PROS THEN
\r
477 ABBREV_TAC ` k = (\x. FST (x:real^3 # real^3)) ` THEN
\r
478 SWITCH_TAC `(\x. FST (x:real^3 # real^3)) = k ` THEN
\r
479 ASSUME_TAC2 (SMOOTH_GEN_ALL Wrgcvdr_cizmrrh.WRGCVDR) THEN
\r
480 FIRST_X_ASSUM (MP_TAC o (SPEC ` rho_node1 (FF:real^3 # real^3 -> bool) `)) THEN
\r
482 FIRST_X_ASSUM MP_TAC2 THEN
\r
483 DISCH_THEN MP_TAC2 THEN
\r
484 SIMP_TAC[EQ_SYM_EQ]);;
\r
490 let LOCAL_FAN_RHO_NODE_PROS2 = ONCE_REWRITE_RULE[TAUT` a /\ b <=> b /\ a `] LOCAL_FAN_RHO_NODE_PROS;;
\r
494 let FINTE_OF_N_FIRST_ELMS2 = prove(`FINITE {ITER n f x | n < i}`,
\r
495 REWRITE_TAC[SET_RULE` {ITER n f x | n < i} = {y | ?n. n < i /\ y = ITER n f x}`]
\r
496 THEN REWRITE_TAC[Wrgcvdr_cizmrrh.FINITE_OF_N_FIRST_ELMS]);;
\r
501 let PLANE_AFFINE_HUL_INTER_P = prove_by_refinement
\r
502 (` plane P /\ {x,y,z} SUBSET P
\r
503 ==> affine hull {x, x + ( y - x ) cross ( z - x )} INTER P = {x} `,
\r
504 [REWRITE_TAC[AFFINE_HULL_2; EXTENSION; IN_INSERT; NOT_IN_EMPTY; IN_INTER];
\r
507 REWRITE_TAC[IN_ELIM_THM];
\r
510 SUBGOAL_THEN ` coplanar {x,y,z,x':real^3} ` ASSUME_TAC;
\r
512 REWRITE_TAC[coplanar; plane; INSERT_SUBSET];
\r
515 ASM_REWRITE_TAC[COPLANAR_IFF_CROSS_DOT; VECTOR_ARITH` u % x + v % ( x + y ) =
\r
516 ( u + v ) % x + v % y `; VECTOR_MUL_LID; VECTOR_ARITH ` (a + b:real^N) - a =
\r
517 b `; VECTOR_ARITH` a + b = a <=> b = vec 0 `; DOT_RMUL; REAL_ENTIRE; DOT_EQ_0;
\r
520 SIMP_TAC[INSERT_SUBSET];
\r
524 REWRITE_TAC[REAL_ADD_RID; VECTOR_MUL_LZERO; VECTOR_MUL_LID; VECTOR_ADD_RID]]);;
\r
530 let FAN_IMP_V_DIFF = prove( ` FAN (x,V,E) ==> (! v. v IN V ==> ~( v = x )) `,
\r
531 REWRITE_TAC[FAN; fan2] THEN MESON_TAC[]);;
\r
538 let LOCAL_FAN_IMP_CYCLIC_SET = prove_by_refinement
\r
539 (` local_fan (V,E,FF) /\ v IN V /\
\r
540 {ITER n (rho_node1 FF) v | n <= l } = U /\
\r
541 plane P /\ vec 0 IN P /\
\r
542 U SUBSET P /\ v cross (rho_node1 FF v ) = e
\r
543 ==> cyclic_set U (vec 0 ) e `,
\r
544 [NHANH LOCAL_FAN_RHO_NODE_PROS;
\r
546 MATCH_MP_TAC ORTHONORMAL_CYCLIC;
\r
547 UNDISCH_TAC ` v:real^3 IN V `;
\r
548 UNDISCH_TAC ` !x. x IN V ==> x,rho_node1 FF x IN (FF:real^3 # real^3 -> bool) `;
\r
553 UNDISCH_TAC ` local_fan (V,E,FF) `;
\r
555 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;
\r
556 REWRITE_TAC[ GSYM CROSS_EQ_0];
\r
559 REWRITE_TAC[ARITH_RULE` a <= b <=> a < b + 1 `];
\r
560 REWRITE_TAC[FINTE_OF_N_FIRST_ELMS2];
\r
562 ASM_CASES_TAC ` l = 0 `;
\r
563 ASM_REWRITE_TAC[ARITH_RULE ` x < 0 + 1 <=> x = 0`; IN_ELIM_THM];
\r
566 ASM_REWRITE_TAC[VECTOR_SUB_REFL; DOT_LZERO];
\r
567 REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_ELIM_THM];
\r
571 ASM_REWRITE_TAC[ITER; AFFINE_HULL_2; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
573 SUBGOAL_THEN ` v dot (e:real^3) = &0` ASSUME_TAC;
\r
575 REWRITE_TAC[DOT_CROSS_SELF];
\r
577 ASM_REWRITE_TAC[DOT_LMUL; REAL_ENTIRE; DOT_EQ_0];
\r
579 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
581 REWRITE_TAC[VECTOR_MUL_LZERO];
\r
582 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
583 REWRITE_TAC[FAN; fan2];
\r
584 UNDISCH_TAC ` v:real^3 IN V `;
\r
586 SUBGOAL_THEN ` {vec 0, v, rho_node1 (FF:real^3 # real^3 -> bool) v} SUBSET P ` ASSUME_TAC;
\r
587 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
588 UNDISCH_TAC ` U SUBSET (P:real^3 -> bool) `;
\r
589 MATCH_MP_TAC (SET_RULE` a IN S /\ b IN S ==> S SUBSET A ==> a IN A /\ b IN A `);
\r
591 REWRITE_TAC[IN_ELIM_THM];
\r
599 REWRITE_TAC[ITER1];
\r
602 UNDISCH_TAC ` plane (P:real^3 -> bool) `;
\r
604 NHANH PLANE_AFFINE_HUL_INTER_P;
\r
605 ASM_REWRITE_TAC[VECTOR_SUB_RZERO; VECTOR_ADD_LID];
\r
606 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_V;
\r
607 UNDISCH_TAC ` v:real^3 IN V `;
\r
609 ASM_REWRITE_TAC[ARITH_RULE` a < b + 1 <=> a <= b `];
\r
611 SUBGOAL_THEN ` ! u. u IN U ==> (u:real^3) dot --e = &0 ` ASSUME_TAC;
\r
613 SUBGOAL_THEN ` {vec 0, v, rho_node1 FF v, u:real^3} SUBSET P` MP_TAC;
\r
615 SIMP_TAC[INSERT_SUBSET];
\r
618 UNDISCH_TAC ` U SUBSET (P:real^3 -> bool) `;
\r
620 UNDISCH_TAC `plane (P:real^3 -> bool) `;
\r
621 REWRITE_TAC[plane];
\r
625 SUBGOAL_THEN ` coplanar {vec 0, v, rho_node1 FF v, u:real^3} ` MP_TAC;
\r
626 REWRITE_TAC[coplanar];
\r
627 DOWN THEN MESON_TAC[];
\r
628 ASM_REWRITE_TAC[COPLANAR_IFF_CROSS_DOT; VECTOR_SUB_RZERO; DOT_RNEG];
\r
631 ASM_SIMP_TAC[DOT_LSUB; VECTOR_SUB_LZERO];
\r
633 REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER];
\r
635 SUBGOAL_THEN ` x IN affine hull {vec 0, e:real^3} INTER P` MP_TAC;
\r
636 ASM_REWRITE_TAC[IN_INTER];
\r
637 UNDISCH_TAC ` x IN U:real ^3 -> bool `;
\r
638 UNDISCH_TAC ` U SUBSET P:real^3 -> bool `;
\r
640 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
\r
641 SUBGOAL_THEN ` U SUBSET (V:real^3 -> bool) ` MP_TAC;
\r
644 REWRITE_TAC[GSYM POWER_TO_ITER; lemma_subset_orbit];
\r
645 REWRITE_TAC[SUBSET];
\r
647 UNDISCH_TAC ` x:real^3 IN U `;
\r
648 FIRST_X_ASSUM NHANH;
\r
649 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
650 REWRITE_TAC[FAN; fan2];
\r
656 let LOCAL_FAN_ITER_RHO_NODE_IN_V = prove(
\r
657 ` local_fan (V,E,FF) /\ v IN V ==>
\r
658 (! i. ITER i (rho_node1 FF ) v IN V )`,
\r
659 NHANH LOCAL_FAN_ORBIT_MAP_V THEN STRIP_TAC THEN
\r
660 DOWN THEN FIRST_X_ASSUM (NHANH_PAT `\x. x ==> y `) THEN
\r
661 STRIP_TAC THEN EXPAND_TAC "V" THEN
\r
662 REWRITE_TAC[orbit_map; POWER_TO_ITER; IN_ELIM_THM; ARITH_RULE` a >= 0 `] THEN
\r
667 let ORD2_ORBIT_MAP = prove(` f ( f x ) = (x:A) ==> orbit_map f x = {x, f x} `,
\r
668 STRIP_TAC THEN SUBGOAL_THEN ` 0 < 2 /\ ITER 2 f (x:A) = x ` MP_TAC THENL
\r
669 [ASM_REWRITE_TAC[ARITH_RULE ` 0 < 2 `; ITER12];
\r
670 NHANH Lvducxu.ITER_CYCLIC_ORBIT] THEN SIMP_TAC[] THEN STRIP_TAC THEN
\r
671 REWRITE_TAC[EXTENSION; IN_INSERT; NOT_IN_EMPTY; IN_ELIM_THM; ARITH_RULE `
\r
672 x < 2 <=> x = 0 \/ x = 1 `] THEN MESON_TAC[ITER; ITER1]);;
\r
675 let LOCAL_FAN_IMP_NOT_SEMI_IDE = prove(
\r
676 ` local_fan (V,E,FF) ==> (!v. v IN V ==> ~( rho_node1 FF ( rho_node1 FF v ) = v ))`,
\r
677 NHANH LOCAL_FAN_CHARACTER_OF_RHO_NODE THEN
\r
678 NHANH LOCAL_FAN_ORBIT_MAP_V THEN
\r
679 NHANH LOCAL_FAN_NOT_TWO_V_IN_E THEN
\r
680 REWRITE_TAC[Wrgcvdr_cizmrrh.IN_ORD_E_EQ_IN_E] THEN
\r
681 MESON_TAC[ORD2_ORBIT_MAP]);;
\r
693 let RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT = prove_by_refinement
\r
694 (`local_fan (V,E,FF) /\
\r
696 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
700 v cross rho_node1 FF v = e
\r
703 (ITER i (rho_node1 FF) v cross ITER (i + 1) (rho_node1 FF) v) dot
\r
707 REWRITE_TAC[ITER; ITER1; ARITH_RULE` 0 + 1 = 1 `];
\r
708 MP_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
709 DISCH_THEN (MP_TAC2 o (SPEC `v:real^3`));
\r
710 REWRITE_TAC[COLLINEAR_CROSS_0];
\r
711 REWRITE_TAC[VECTOR_SUB_RZERO];
\r
712 ASM_SIMP_TAC[DOT_POS_LT];
\r
713 NHANH (ARITH_RULE` SUC a < b ==> a < b `);
\r
714 FIRST_X_ASSUM NHANH;
\r
716 MP_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
722 DISCH_THEN (MP_TAC2 o (SPEC ` ITER i (rho_node1 (FF:real^3 # real^3 -> bool)) v:real^3`));
\r
723 MP_TAC2 LOCAL_FAN_ITER_RHO_NODE_IN_V;
\r
725 ABBREV_TAC` px = ITER i (rho_node1 FF) v:real^3 `;
\r
726 ABBREV_TAC` py = ITER (i + 1) (rho_node1 FF) v:real^3 `;
\r
727 ABBREV_TAC` pz = ITER (SUC i + 1) (rho_node1 FF) v:real^3 `;
\r
728 ASM_REWRITE_TAC[ADD1];
\r
729 SUBGOAL_THEN ` {px,py,pz} SUBSET (U:real^3 -> bool) ` MP_TAC;
\r
730 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
732 REWRITE_TAC[IN_ELIM_THM];
\r
737 MP_TAC2 (ARITH_RULE` SUC i < l ==> SUC i + 1 <= l /\ i <= l /\ i + 1 <= l`);
\r
741 SUBGOAL_THEN ` {px, py, pz} SUBSET (P:real^3 -> bool) ` ASSUME_TAC;
\r
742 UNDISCH_TAC ` U SUBSET (P:real^3 -> bool) `;
\r
745 REWRITE_TAC[SUBSET_TRANS];
\r
746 SUBGOAL_THEN ` rho_node1 (FF:real^3 # real^3 -> bool) px = py /\
\r
747 rho_node1 (FF:real^3 # real^3 -> bool) py = pz` MP_TAC;
\r
751 REWRITE_TAC[GSYM ITER; ADD1];
\r
753 SUBGOAL_THEN ` {vec 0, px, rho_node1 FF px} SUBSET (P:real^3 -> bool) ` MP_TAC;
\r
754 UNDISCH_TAC ` {px,py,pz:real^3} SUBSET P `;
\r
756 ASM_SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
758 SUBGOAL_THEN ` affine hull {vec 0, px, py:real^3} = P ` MP_TAC;
\r
759 MATCH_MP_TAC THREE_NOT_COLL_DETER_PLANE;
\r
761 UNDISCH_TAC ` ~collinear {vec 0, px, rho_node1 FF (px:real^3)}`;
\r
762 UNDISCH_TAC ` {vec 0, px, rho_node1 FF px} SUBSET (P:real^3 -> bool) `;
\r
766 REWRITE_TAC[AFFINE_HULL_3];
\r
768 UNDISCH_TAC ` {px, py, pz} SUBSET (P:real^3 -> bool) `;
\r
769 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
773 REWRITE_TAC[IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
775 ASM_CASES_TAC` v' < &0 `;
\r
776 ASM_REWRITE_TAC[CROSS_RADD; CROSS_RMUL; CROSS_REFL; VECTOR_MUL_RZERO; VECTOR_ADD_RID];
\r
777 ONCE_REWRITE_TAC[CROSS_SKEW];
\r
778 REWRITE_TAC[ DOT_LMUL; DOT_LNEG; REAL_ARITH` a * -- b = (-- a ) * b `];
\r
779 MATCH_MP_TAC REAL_LT_MUL;
\r
780 ASM_SIMP_TAC[REAL_ARITH` &0 < -- a <=> a < &0 `];
\r
782 REWRITE_TAC[REAL_ARITH` ~( a < &0 ) <=> &0 <= a `];
\r
784 ASM_CASES_TAC ` &0 <= w `;
\r
785 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_V;
\r
786 UNDISCH_TAC `v:real^3 IN V `;
\r
789 SUBGOAL_THEN ` px:real^3 IN V ` MP_TAC;
\r
792 REWRITE_TAC[lemma_in_orbit; GSYM POWER_TO_ITER];
\r
793 MP_TAC2 LOCAL_FAN_IMP_NOT_SEMI_IDE;
\r
795 SWITCH_TAC ` pz = v' % px + w % (py:real^3) `;
\r
798 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
799 REWRITE_TAC[FAN; fan7];
\r
801 FIRST_X_ASSUM (MP_TAC2 o (SPECL [` {px, py:real^3}`;` {pz:real^3 }`]));
\r
802 UNDISCH_TAC ` (px:real^3),rho_node1 FF px IN ord_pairs E`;
\r
803 ASM_SIMP_TAC[Wrgcvdr_cizmrrh.IN_ORD_E_EQ_IN_E; IN_UNION];
\r
806 REWRITE_TAC[IN_ELIM_THM; EXTENSION; IN_INSERT; NOT_IN_EMPTY];
\r
808 EXISTS_TAC ` pz:real^3 `;
\r
810 UNDISCH_TAC ` ITER (SUC i + 1) (rho_node1 FF) v:real^3 = pz:real^3`;
\r
814 REWRITE_TAC[GSYM POWER_TO_ITER; lemma_in_orbit];
\r
815 SUBGOAL_THEN ` {px,py} INTER {pz:real^3} = {} ` SUBST1_TAC;
\r
816 ASM_REWRITE_TAC[SET_RULE ` {a,b} INTER {x} = {} <=> ~( x = a ) /\ ~( x = b )`];
\r
817 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
818 SUBGOAL_THEN ` py:real^3 IN V ` MP_TAC;
\r
822 REWRITE_TAC[GSYM ITER];
\r
823 REWRITE_TAC[GSYM POWER_TO_ITER; lemma_in_orbit];
\r
824 FIRST_X_ASSUM NHANH;
\r
825 ASM_SIMP_TAC[AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
\r
826 SUBGOAL_THEN ` pz:real^3 IN V /\ py IN V` MP_TAC;
\r
827 SWITCH_TAC ` ITER (SUC i + 1) (rho_node1 FF) v = pz:real^3 `;
\r
828 ASM_REWRITE_TAC[GSYM ITER];
\r
832 REWRITE_TAC[GSYM ITER];
\r
833 REWRITE_TAC[GSYM POWER_TO_ITER; lemma_in_orbit];
\r
835 SUBGOAL_THEN ` DISJOINT {vec 0} {px, py:real^3} /\ ~( vec 0 = pz:real^3)` MP_TAC;
\r
836 UNDISCH_TAC ` fan2 (vec 0:real^3, V:real^3 -> bool, E: (real^3 -> bool) -> bool) `;
\r
837 REWRITE_TAC[fan2; SET_RULE `DISJOINT {x} {a,b} <=> ~( x = a ) /\ ~( x = b ) `];
\r
842 REWRITE_TAC[AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
\r
844 SUBGOAL_THEN ` pz:real^3 IN aff_ge {vec 0} {px, py} INTER aff_ge {vec 0} {pz} ` ASSUME_TAC;
\r
845 ASM_SIMP_TAC[IN_INTER; Fan.AFF_GE_1_2; Fan.AFF_GE_1_1];
\r
847 REWRITE_TAC[IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
849 UNDISCH_TAC ` &0 <= v' `;
\r
850 UNDISCH_TAC ` &0 <= w `;
\r
851 MESON_TAC[REAL_ARITH` (&1 - a - b ) + a + b = &1 `];
\r
852 REWRITE_TAC[IN_ELIM_THM];
\r
853 REWRITE_TAC[ENDS_IN_HALFLINE];
\r
854 DISCH_THEN SUBST_ALL_TAC;
\r
856 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
\r
859 ASM_CASES_TAC ` v' = &0 `;
\r
860 UNDISCH_TAC` pz = v' % px + w % (py:real^3) `;
\r
861 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
\r
862 NHANH (MESON[COLLINEAR_LEMMA]` x = a % y ==> collinear {vec 0,y,x}`);
\r
863 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
864 ASSUME_TAC2 LOCAL_FAN_ITER_RHO_NODE_IN_V;
\r
865 FIRST_ASSUM (MP_TAC o (SPEC ` i + 1 `));
\r
870 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
871 ASSUME_TAC2 LOCAL_FAN_IMP_NOT_SEMI_IDE;
\r
872 ASSUME_TAC2 LOCAL_FAN_ITER_RHO_NODE_IN_V;
\r
873 FIRST_ASSUM (MP_TAC o (SPEC ` i: num`));
\r
874 FIRST_X_ASSUM NHANH;
\r
875 FIRST_ASSUM (MP_TAC o (SPEC ` i + 1`));
\r
878 SWITCH_TAC ` pz = v' % px + w % (py:real^3) `;
\r
879 ASM_REWRITE_TAC[Wrgcvdr_cizmrrh.IN_ORD_E_EQ_IN_E];
\r
880 STRIP_TAC THEN STRIP_TAC;
\r
882 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
883 REWRITE_TAC[FAN; fan7];
\r
885 FIRST_X_ASSUM (MP_TAC2 o (SPECL [` {py, pz:real^3}`;` {px:real^3}`]));
\r
886 ASM_REWRITE_TAC[IN_UNION; IN_ELIM_THM; EXTENSION; IN_INSERT; NOT_IN_EMPTY];
\r
888 EXISTS_TAC ` px:real^3`;
\r
889 UNDISCH_TAC ` ITER (i) (rho_node1 FF) v = (px:real^3)`;
\r
890 DISCH_THEN (SUBST1_TAC o SYM);
\r
892 SUBGOAL_THEN ` {py, pz} INTER {px:real^3} = {} ` SUBST1_TAC;
\r
893 ASM_REWRITE_TAC[SET_RULE` {a,b} INTER {x} = {} <=> ~( a = x ) /\ ~( b = x )`; AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
\r
894 SUBGOAL_THEN ` DISJOINT {vec 0} {py, pz:real^3} /\ ~( vec 0 = px:real^3)` MP_TAC;
\r
895 REWRITE_TAC[SET_RULE` DISJOINT {x} {a,b} <=> ~( x = a ) /\ ~( x = b )`];
\r
897 NHANH Collect_geom.NOT_COL3_IMP_DIFF;
\r
898 SIMP_TAC[DE_MORGAN_THM];
\r
901 SUBGOAL_THEN ` v' % (px:real^3) IN aff_ge {vec 0} {py, pz} INTER aff_ge {vec 0} {px} ` MP_TAC;
\r
902 ASM_SIMP_TAC[Fan.AFF_GE_1_2; Fan.AFF_GE_1_1; IN_INTER; IN_ELIM_THM];
\r
904 UNDISCH_TAC ` v' % px + w % py = (pz:real^3 )`;
\r
905 UNDISCH_TAC` ~( &0 <= w ) `;
\r
906 NHANH (REAL_ARITH` ~( &0 <= x ) ==> &0 <= -- x `);
\r
908 SIMP_TAC[VECTOR_ARITH` a + b % y = z <=> a = ( -- b ) % y + z `; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
909 MESON_TAC[REAL_ARITH` &0 <= &1 /\ a + -- a + &1 = &1 `; VECTOR_MUL_LID];
\r
910 REWRITE_TAC[HALFLINE; IN_ELIM_THM];
\r
911 EXISTS_TAC ` v':real` ;
\r
912 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
914 DISCH_THEN SUBST_ALL_TAC;
\r
916 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; VECTOR_MUL_EQ_0;
\r
917 AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING]]);;
\r
922 let AZIM_RANGE = prove(`! v w w1 w2. &0 <= azim v w w1 w2 /\
\r
923 azim v w w1 w2 < &2 * pi `,
\r
924 REWRITE_TAC[azim]);;
\r
928 let PI_TO_TWO_PI_NEG_SIN = prove_by_refinement
\r
929 (`! x. pi < x /\ x < &2 * pi ==> sin x < &0 `, [GEN_TAC;
\r
930 ONCE_REWRITE_TAC[MESON[REAL_ARITH` x = x - pi + pi `]` sin x = sin ( x - pi + pi )`];
\r
931 ONCE_REWRITE_TAC[REAL_ARITH` x = x - pi + pi `];
\r
932 REWRITE_TAC[SIN_PERIODIC_PI];
\r
933 ABBREV_TAC ` xx = x - pi `;
\r
934 REWRITE_TAC[REAL_ARITH` a + b < c + b <=> a < c `;
\r
935 REAL_ARITH` a - b < c - b <=> a < c `; REAL_SUB_REFL;
\r
936 REAL_ARITH` &2 * x - x = x `; REAL_ARITH` -- x < &0 <=> &0 < x `];
\r
937 REWRITE_TAC[SIN_POS_PI]]);;
\r
941 let MIXED_PROD_POS_IMP_RANGE_AZIM = prove_by_refinement
\r
942 (`~collinear {vec 0, u, v} /\ ~collinear {vec 0, u, w} /\
\r
943 &0 < (u cross v) dot w ==> &0 < azim (vec 0) u v w /\
\r
944 azim (vec 0) u v w < pi `,
\r
946 MP_TAC2 (SPEC_ALL Planarity.JBDNJJB);
\r
948 SUBGOAL_THEN` &0 < sin (azim (vec 0) u v w) ` ASSUME_TAC;
\r
950 MATCH_MP_TAC REAL_LT_MUL;
\r
952 MP_TAC (SPECL [`vec 0:real^3 `;` u:real^3`;` v:real^3 `;` w:real^3 `]
\r
954 ASM_CASES_TAC ` azim (vec 0) u v w <= pi `;
\r
956 REWRITE_TAC[REAL_ARITH` &0 < x <=> -- x < &0 `];
\r
959 NHANH (REAL_ARITH` a < b /\ b <= c ==> a < c `);
\r
961 MP_TAC2 (SPEC ` azim (vec 0) u v w ` Trigonometry1.SIN_NEGPOS_PI);
\r
963 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
964 ASM_REWRITE_TAC[REAL_ARITH` -- x < &0 <=> &0 < x `];
\r
966 UNDISCH_TAC` &0 < sin (azim (vec 0) u v w) `;
\r
967 MP_TAC2 (SPEC ` azim (vec 0) u v w ` PI_TO_TWO_PI_NEG_SIN);
\r
968 ASM_REWRITE_TAC[REAL_ARITH` a < b <=> ~( b <= a ) `];
\r
970 REWRITE_TAC[REAL_ARITH` ~( a < b /\ b < a ) `]]);;
\r
977 let COLLINEAR_ONCE_VEC_0 = prove(
\r
978 ` ~ ( x = vec 0 ) ==> (! y. collinear {vec 0, x, y} <=> ? t. y = t % x )`,
\r
979 SIMP_TAC[COLLINEAR_LEMMA] THEN MESON_TAC[VECTOR_MUL_LZERO]);;
\r
987 let AFF_SGN_TRULE tm = prove (tm, AFF_SGN_TAC);;
\r
988 let AFF_GE11 = AFF_SGN_TRULE`!x v:real^N.
\r
990 ==> aff_ge {x} {v} =
\r
991 {y | ?t1 t2. &0 <= t2 /\ t1 + t2 = &1 /\ y = t1 % x + t2 % v} `;;
\r
994 let X_IN_AFF_GE11 = prove(`! x:real^N. ~( c = x ) ==> x IN aff_ge {c} {x}`,
\r
995 SIMP_TAC[AFF_GE11; IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN
\r
996 EXISTS_TAC `&0 ` THEN EXISTS_TAC ` &1 ` THEN
\r
997 REWRITE_TAC[REAL_ARITH` &0 <= &1 /\ &0 + &1 = &1 `] THEN VECTOR_ARITH_TAC);;
\r
1000 let FAN_IN_AFF_GE_IMP_EQ = prove_by_refinement
\r
1001 (` FAN (x:real^N,V,E) /\ v IN V /\ {a,b} IN E /\ v IN aff_ge {x} {a,b} ==> v = a \/ v = b `,
\r
1002 [REWRITE_TAC[fan7;FAN; fan2];
\r
1004 ASM_CASES_TAC ` v = a \/ v = (b:real^N) `;
\r
1005 FIRST_ASSUM ACCEPT_TAC;
\r
1007 REWRITE_TAC[SET_RULE` ~( x = a \/ x = b ) <=> {a,b} INTER {x} = {}`];
\r
1008 FIRST_X_ASSUM (MP_TAC2 o (SPECL [`{a,b:real^N} `;` {v:real^N}`]));
\r
1009 ASM_REWRITE_TAC[IN_UNION; IN_ELIM_THM];
\r
1011 EXISTS_TAC `v:real^N`;
\r
1012 ASM_REWRITE_TAC[];
\r
1014 DISCH_THEN SUBST_ALL_TAC;
\r
1015 ASM_CASES_TAC ` v = x:real^N `;
\r
1016 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
1019 ONCE_REWRITE_TAC[EQ_SYM_EQ];
\r
1020 NHANH X_IN_AFF_GE11;
\r
1022 UNDISCH_TAC ` aff_ge {x} {a, b} INTER aff_ge {x} {v} = aff_ge {x:real^N} {}`;
\r
1023 REWRITE_TAC[AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING; EXTENSION; IN_INTER; IN_INSERT; NOT_IN_EMPTY];
\r
1024 ASM_MESON_TAC[]]);;
\r
1034 AFF_SGN_TRULE`! a b x (y:real^N). DISJOINT {a,b} {x,y} ==> aff_ge {a,b} {x,y} =
\r
1035 {z | ? aa bb xx yy. &0 <= xx /\ &0 <= yy
\r
1036 /\ aa + bb + xx + yy = &1 /\ z = aa % a + bb % b + xx % x + yy % y }`;;
\r
1038 let RHO_NODE_IS_SUCCESEOR_AZIM = prove_by_refinement
\r
1039 (`local_fan (V,E,FF) /\
\r
1041 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
1045 v cross rho_node1 FF v = e
\r
1046 ==> (!x n. x = ITER n ( rho_node1 FF) v /\ n < l
\r
1047 ==> (!y. y IN U /\ ~(y = x) /\ ~(y = rho_node1 FF x)
\r
1048 ==> azim (vec 0) e x (rho_node1 FF x) < azim (vec 0) e x y))`,
\r
1049 [NHANH RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT;
\r
1051 UNDISCH_TAC` n < l:num `;
\r
1052 FIRST_ASSUM NHANH;
\r
1053 SWITCH_TAC ` x = ITER n (rho_node1 FF) (v:real^3)`;
\r
1054 ASSUME_TAC2 LOCAL_FAN_ITER_RHO_NODE_IN_V;
\r
1055 NHANH_PAT `\x. x ==> y ` REAL_LT_IMP_NE;
\r
1056 SIMP_TAC[EQ_SYM_EQ; CROSS_DOT_COPLANAR];
\r
1057 ONCE_REWRITE_TAC[Collect_geom.PER_SET2];
\r
1058 NHANH NOT_COPLANAR_NOT_COLLINEAR;
\r
1059 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {c,b,a}`];
\r
1060 NHANH NOT_COPLANAR_NOT_COLLINEAR;
\r
1061 SIMP_TAC[INSERT_COMM];
\r
1062 ONCE_REWRITE_TAC[GSYM CROSS_TRIPLE];
\r
1064 UNDISCH_TAC ` &0 < (e cross ITER n (rho_node1 FF) v) dot ITER (n + 1) (rho_node1 FF) (v:real^3) `;
\r
1065 UNDISCH_TAC ` ~collinear {e, ITER (n + 1) (rho_node1 FF) (v:real^3), vec 0} `;
\r
1066 UNDISCH_TAC` ~collinear {e, ITER n (rho_node1 FF) v:real^3, vec 0}`;
\r
1068 NHANH (SIMP_RULE[INSERT_COMM] MIXED_PROD_POS_IMP_RANGE_AZIM);
\r
1069 ASM_REWRITE_TAC[];
\r
1071 ABBREV_TAC ` sx = ITER (n + 1 ) (rho_node1 FF) v:real^3 `;
\r
1073 REWRITE_TAC[GSYM ITER; ADD1];
\r
1074 ASM_REWRITE_TAC[];
\r
1075 ASM_CASES_TAC ` y IN aff_ge {vec 0} {x , sx:real^3}`;
\r
1076 SUBGOAL_THEN ` {x,sx:real^3} IN E ` ASSUME_TAC;
\r
1077 REWRITE_TAC[Wrgcvdr_cizmrrh.IN_E_IFF_IN_ORD_E];
\r
1078 MATCH_MP_TAC LOCAL_FAN_IN_FF_IN_ORD_PAIRS;
\r
1079 ASM_REWRITE_TAC[];
\r
1080 SUBGOAL_THEN ` x IN (V:real^3 -> bool) ` MP_TAC;
\r
1082 ASM_REWRITE_TAC[];
\r
1084 MP_TAC2 LOCAL_FAN_RHO_NODE_PROS2;
\r
1086 FIRST_ASSUM NHANH;
\r
1088 REWRITE_TAC[GSYM ITER; ADD1];
\r
1091 SUBGOAL_THEN ` y:real^3 IN V ` ASSUME_TAC;
\r
1092 UNDISCH_TAC ` y IN U:real^3 -> bool ` ;
\r
1094 REWRITE_TAC[IN_ELIM_THM];
\r
1096 ASM_REWRITE_TAC[];
\r
1097 MP_TAC2 (ISPECL [`V:real^3 -> bool`;` E: (real^3 -> bool) -> bool`;
\r
1098 ` vec 0:real^3 `;` x:real^3 `;` y:real^3 `;` sx: real^3 `] (GEN_ALL
\r
1099 FAN_IN_AFF_GE_IMP_EQ));
\r
1100 ASSUME_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
1101 FIRST_X_ASSUM ACCEPT_TAC;
\r
1103 ASM_REWRITE_TAC[];
\r
1104 UNDISCH_TAC ` ~(y:real^3 = rho_node1 FF (x:real^3)) `;
\r
1106 REWRITE_TAC[ADD1; GSYM ITER];
\r
1108 SUBGOAL_THEN ` rho_node1 (FF:real^3 # real^3 -> bool) x = sx ` ASSUME_TAC;
\r
1110 REWRITE_TAC[ADD1; GSYM ITER];
\r
1111 FIRST_ASSUM ACCEPT_TAC;
\r
1113 SUBGOAL_THEN ` wedge (vec 0) e x sx = aff_gt {vec 0, e} {x,sx} ` ASSUME_TAC;
\r
1114 MATCH_MP_TAC WEDGE_LUNE;
\r
1115 ASM_REWRITE_TAC[GSYM CROSS_DOT_COPLANAR];
\r
1116 ASM_SIMP_TAC[REAL_ARITH` &0 < x ==> ~( x = &0) `];
\r
1118 UNDISCH_TAC` &0 < (e cross x) dot sx `;
\r
1119 NHANH_PAT `\x. x ==> y ` REAL_LT_IMP_NE;
\r
1120 SIMP_TAC[EQ_SYM_EQ; CROSS_DOT_COPLANAR];
\r
1121 NHANH (SMOOTH_GEN_ALL Trigonometry2.NONCOPLANAR_3_BASIS);
\r
1123 FIRST_ASSUM (MP_TAC o (SPEC ` y: real^3 `));
\r
1124 REWRITE_TAC[VECTOR_SUB_RZERO];
\r
1126 UNDISCH_TAC ` ~(y IN aff_ge {vec 0} {x, sx:real^3}) `;
\r
1127 UNDISCH_TAC ` ~coplanar {vec 0, e, x, sx:real^3} `;
\r
1128 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {b,c,a}`];
\r
1129 NHANH NOT_COPLANAR_NOT_COLLINEAR;
\r
1131 SIMP_TAC[Fan.AFF_GE_1_2];
\r
1133 REWRITE_TAC[IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
1134 REWRITE_TAC[MESON[REAL_ARITH` (&1 - a - b) + a + b = &1`]` (?t1 t2 t3.
\r
1135 &0 <= t2 /\ &0 <= t3 /\ t1 + t2 + t3 = &1 /\ y = t2 % x + t3 % sx)
\r
1136 <=> (? t2 t3. &0 <= t2 /\ &0 <= t3 /\ y = t2 % x + t3 % sx) `];
\r
1138 SUBGOAL_THEN ` ~( y:real^3 IN aff_ge {vec 0, e} {x, sx} )` ASSUME_TAC;
\r
1139 SUBGOAL_THEN ` DISJOINT {vec 0, e} {x, sx:real^3} ` MP_TAC;
\r
1140 REWRITE_TAC[DISJOINT; SET_RULE` (a INSERT A ) INTER ( b INSERT B) = {} <=>
\r
1141 ~( a = b ) /\ ~ ( a IN B ) /\ ~( b IN A ) /\ A INTER B = {} `; NOT_IN_EMPTY;
\r
1142 IN_INSERT; INTER_EMPTY];
\r
1143 ASM_REWRITE_TAC[];
\r
1144 UNDISCH_TAC ` ~coplanar {vec 0, x, sx, e:real^3}`;
\r
1145 SIMP_TAC[INSERT_COMM];
\r
1146 NHANH NOT_COPLANAR_NOT_COLLINEAR;
\r
1148 SIMP_TAC[EQ_SYM_EQ];
\r
1151 SIMP_TAC[AFF_GE22; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
1153 UNDISCH_TAC ` ~(?t2 t3. &0 <= t2 /\ &0 <= t3 /\ y = t2 % x + t3 % sx:real^3)`;
\r
1154 UNDISCH_TAC` !ta tb tc.
\r
1155 (y:real^3) = ta % e + tb % x + tc % sx ==> ta = t1 /\ tb = t2 /\ tc = t3 `;
\r
1156 REWRITE_TAC[TAUT` ~ a ==> ~ b <=> b ==> a `];
\r
1158 SUBGOAL_THEN ` {vec 0,x,sx:real^3} SUBSET P ` ASSUME_TAC;
\r
1159 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
1160 UNDISCH_TAC ` U SUBSET (P:real^3 -> bool) `;
\r
1161 MATCH_MP_TAC (SET_RULE` x IN U /\ y IN U ==> U SUBSET P ==> x IN P /\ y IN P `);
\r
1165 REWRITE_TAC[IN_ELIM_THM; GSYM ITER; ADD1];
\r
1166 UNDISCH_TAC ` n < l:num `;
\r
1167 MESON_TAC[ARITH_RULE ` a < b:num ==> a <= b /\ a + 1 <= b `];
\r
1168 SUBGOAL_THEN ` affine hull {vec 0,x, sx:real^3} = P ` ASSUME_TAC;
\r
1169 MATCH_MP_TAC THREE_NOT_COLL_DETER_PLANE;
\r
1170 ASM_REWRITE_TAC[];
\r
1171 ASSUME_TAC2 (SET_RULE` y:real^3 IN U /\ U SUBSET P ==> y IN P `);
\r
1174 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
1177 EXISTS_TAC ` xx:real ` ;
\r
1178 EXISTS_TAC `yy:real `;
\r
1179 ASM_REWRITE_TAC[];
\r
1180 FIRST_ASSUM (MP_TAC o (SPECL [`&0 `;` v': real`;` w:real `]));
\r
1182 DOWN THEN REMOVE_TAC;
\r
1183 UNDISCH_TAC ` y = t1 % e + t2 % x + t3 % (sx:real^3) `;
\r
1185 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
\r
1187 FIRST_ASSUM NHANH;
\r
1191 UNDISCH_TAC ` &0 = t1 `;
\r
1192 DISCH_THEN (SUBST1_TAC o SYM);
\r
1194 ASSUME_TAC2 (SIMP_RULE[INSERT_COMM] (SPECL [`vec 0:real^3 `;` e:real^3 `;
\r
1195 ` x:real^3 `;` sx: real^3 `] WEDGE_LUNE_GE));
\r
1196 UNDISCH_TAC ` ~(y IN aff_ge {vec 0, e} {x, sx:real^3})`;
\r
1197 SIMP_TAC[INSERT_COMM];
\r
1198 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
1199 REWRITE_TAC[IN_ELIM_THM];
\r
1200 MP_TAC (SPECL [`vec 0:real^3 `;` e:real^3 `;` x:real^3 `;` y:real^3 `]
\r
1202 REAL_ARITH_TAC]);;
\r
1208 let FIRST_AZIM_CYCLE_EQ_RHO_NODE = prove_by_refinement
\r
1209 (`local_fan (V,E,FF) /\
\r
1211 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
1215 v cross rho_node1 FF v = e
\r
1217 x = ITER n (rho_node1 FF) v /\ n < l
\r
1218 ==> azim_cycle U (vec 0) e x = rho_node1 FF x ) `,
\r
1219 [NHANH RHO_NODE_IS_SUCCESEOR_AZIM;
\r
1220 NHANH LOCAL_FAN_IMP_CYCLIC_SET;
\r
1222 MATCH_MP_TAC Wrgcvdr_cizmrrh.IDENTIFY_AZIM_CYCLE;
\r
1223 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
1224 ASSUME_TAC2 LOCAL_FAN_ITER_RHO_NODE_IN_V;
\r
1225 SUBGOAL_THEN ` x IN (V:real^3 -> bool) ` MP_TAC;
\r
1226 ASM_REWRITE_TAC[];
\r
1227 FIRST_ASSUM NHANH;
\r
1230 SUBGOAL_THEN ` rho_node1 (FF:real^3 # real^3 -> bool) x IN U ` MP_TAC;
\r
1231 ASM_REWRITE_TAC[GSYM ITER; ADD1];
\r
1233 REWRITE_TAC[IN_ELIM_THM];
\r
1234 UNDISCH_TAC ` n < l:num `;
\r
1235 MESON_TAC[ARITH_RULE` a < l:num ==> a + 1 <= l `];
\r
1236 UNDISCH_TAC ` cyclic_set U (vec 0) (e:real^3) `;
\r
1241 UNDISCH_TAC ` ~(rho_node1 FF x = (x:real^3)) `;
\r
1244 ASSUME_TAC2 RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT;
\r
1245 UNDISCH_TAC ` n < l:num `;
\r
1247 FIRST_X_ASSUM NHANH;
\r
1248 NHANH REAL_LT_IMP_NE;
\r
1250 ASM_SIMP_TAC[CROSS_DOT_COPLANAR; EQ_SYM_EQ; INSERT_COMM];
\r
1251 ONCE_REWRITE_TAC[Collect_geom.PER_SET2];
\r
1252 NHANH NOT_COPLANAR_NOT_COLLINEAR;
\r
1253 SIMP_TAC[INSERT_COMM];
\r
1255 UNDISCH_TAC ` !(x:real^3) n.
\r
1256 x = ITER n (rho_node1 FF) v /\ n < l
\r
1257 ==> (!y. y IN U /\ ~(y = x) /\ ~(y = rho_node1 FF x)
\r
1258 ==> azim (vec 0) e x (rho_node1 FF x) < azim (vec 0) e x y)`;
\r
1259 DISCH_THEN ASSUME_TAC2;
\r
1260 ASM_CASES_TAC ` q:real^3 = rho_node1 FF (x:real^3) `;
\r
1262 FIRST_X_ASSUM SUBST1_TAC;
\r
1263 REWRITE_TAC[REAL_LE_REFL];
\r
1265 REPLICATE_TAC 4 DOWN THEN PHA;
\r
1274 let SEQUENCE_OF_RHO_NODE_IS_SUC = prove_by_refinement
\r
1275 (`local_fan (V,E,FF) /\
\r
1277 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
1281 v cross rho_node1 FF v = e
\r
1283 x = ITER n (rho_node1 FF) v /\ n < l
\r
1284 ==> (!y. y IN U /\ ~(y = x) /\ ~(y = rho_node1 FF x)
\r
1285 ==> azim (vec 0) e y x <
\r
1286 azim (vec 0) e y ( rho_node1 FF x)))`,
\r
1287 [NHANH RHO_NODE_IS_SUCCESEOR_AZIM;
\r
1288 NHANH LOCAL_FAN_IMP_CYCLIC_SET;
\r
1290 FIRST_X_ASSUM NHANH;
\r
1291 REPEAT GEN_TAC THEN STRIP_TAC;
\r
1292 FIRST_X_ASSUM NHANH;
\r
1293 GEN_TAC THEN STRIP_TAC;
\r
1295 SUBGOAL_THEN` cyclic_set {x, rho_node1 FF (x:real^3), y} (vec 0) e` MP_TAC;
\r
1296 MATCH_MP_TAC (SPEC ` U:real^3 -> bool` (GEN `W: real^3 -> bool`
\r
1297 (SPEC_ALL Fan.subset_cyclic_set_fan)));
\r
1298 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; GSYM ITER; ADD1];
\r
1300 REWRITE_TAC[IN_ELIM_THM];
\r
1301 UNDISCH_TAC ` n < l:num `;
\r
1302 MESON_TAC[ARITH_RULE` n < l:num ==> n <= l /\ n + 1 <= l `];
\r
1304 NHANH_PAT `\x. x ==> y ` REAL_LT_IMP_LE;
\r
1305 ONCE_REWRITE_TAC[TAUT` a /\ b /\ c <=> (a /\c) /\ b`];
\r
1306 NHANH Fan.sum2_azim_fan;
\r
1308 ASM_CASES_TAC ` azim (vec 0) e x (rho_node1 FF x) = &0 `;
\r
1310 NHANH (MESON[AZIM_EQ_0_PI_IMP_COPLANAR]` azim v0 v1 w1 w2 = &0
\r
1311 ==> coplanar {v0, v1, w1, w2} `);
\r
1312 REWRITE_TAC[GSYM CROSS_DOT_COPLANAR];
\r
1314 ASSUME_TAC2 RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT;
\r
1315 UNDISCH_TAC ` n < l:num `;
\r
1316 FIRST_X_ASSUM NHANH;
\r
1318 ASM_REWRITE_TAC[GSYM ITER; ADD1];
\r
1319 PAT_ONCE_REWRITE_TAC `\x. x ==> ll ` [CROSS_TRIPLE];
\r
1320 SIMP_TAC[REAL_ARITH` a = &0 ==> ~( &0 < a ) `];
\r
1321 SUBGOAL_THEN ` azim (vec 0) e (rho_node1 FF x) y < azim (vec 0) e x y ` MP_TAC;
\r
1323 ASM_REWRITE_TAC[REAL_ARITH ` a < b + a <=> &0 < b `];
\r
1324 MESON_TAC[REWRITE_RULE[REAL_ARITH` a <= b <=> b = a \/ a < b `] AZIM_RANGE];
\r
1325 UNDISCH_TAC ` cyclic_set U (vec 0) (e:real^3) `;
\r
1326 NHANH Wrgcvdr_cizmrrh.CYCLIC_SET_IMP_NOT_COLLINEAR;
\r
1328 SUBGOAL_THEN` x IN (U:real^3 -> bool) /\ rho_node1 FF x IN U /\ y IN U ` MP_TAC;
\r
1329 ASM_REWRITE_TAC[GSYM ITER; ADD1];
\r
1331 REWRITE_TAC[IN_ELIM_THM];
\r
1332 UNDISCH_TAC ` n < l:num `;
\r
1333 MESON_TAC[ARITH_RULE` a < n:num ==> a <= n /\ a + 1 <= n `];
\r
1334 FIRST_ASSUM NHANH;
\r
1336 ASM_CASES_TAC` azim (vec 0) e (rho_node1 (FF:real^3 # real^3 -> bool) x:real^3) y = &0 `;
\r
1337 REPLICATE_TAC 3 DOWN;
\r
1338 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {b,c,a}`];
\r
1339 ONCE_REWRITE_TAC[TAUT` a ==> b ==> c <=> a /\ b ==> c `];
\r
1340 NHANH AZIM_EQ_0_ALT;
\r
1343 UNDISCH_TAC ` ~collinear {vec 0, (e:real^3), rho_node1 (FF:real^3 # real^3 -> bool) x}`;
\r
1345 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
1347 SUBGOAL_THEN ` {vec 0, x, rho_node1 FF (x:real^3)} SUBSET P ` ASSUME_TAC;
\r
1348 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
1349 UNDISCH_TAC ` U SUBSET (P:real^3 -> bool) `;
\r
1350 MATCH_MP_TAC (SET_RULE` a IN U /\ b IN U ==> U SUBSET P ==> a IN P /\ b IN P `);
\r
1351 UNDISCH_TAC ` x:real^3 IN U `;
\r
1352 UNDISCH_TAC ` rho_node1 (FF: real^3 # real^3 -> bool) x IN U `;
\r
1353 ASM_REWRITE_TAC[];
\r
1355 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
1356 SUBGOAL_THEN ` x IN (V:real^3 -> bool) ` ASSUME_TAC;
\r
1358 MP_TAC2 LOCAL_FAN_ITER_RHO_NODE_IN_V;
\r
1360 FIRST_X_ASSUM NHANH;
\r
1362 SUBGOAL_THEN ` affine hull {vec 0, x, rho_node1 (FF:real^3 # real^3 -> bool) x} = P` MP_TAC;
\r
1363 MATCH_MP_TAC THREE_NOT_COLL_DETER_PLANE;
\r
1364 ASM_REWRITE_TAC[];
\r
1366 MP_TAC2 (SET_RULE` y IN U /\ U SUBSET (P:real^3 -> bool) ==> y IN P`);
\r
1368 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
1370 ASSUME_TAC2 RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT;
\r
1371 UNDISCH_TAC ` n < l:num`;
\r
1372 FIRST_X_ASSUM NHANH;
\r
1373 SWITCH_TAC ` x = ITER n (rho_node1 FF) (v:real^3) `;
\r
1374 ASM_REWRITE_TAC[GSYM ADD1; ITER];
\r
1375 NHANH_PAT `\x. x ==> y ` REAL_LT_IMP_NE;
\r
1376 SIMP_TAC[EQ_SYM_EQ; CROSS_DOT_COPLANAR];
\r
1377 NHANH (SMOOTH_GEN_ALL Trigonometry2.NONCOPLANAR_3_BASIS);
\r
1378 REWRITE_TAC[VECTOR_SUB_RZERO];
\r
1380 FIRST_X_ASSUM (MP_TAC o (SPEC ` y:real^3 `));
\r
1382 UNDISCH_TAC ` y = v' % x + w % rho_node1 (FF:real^3 # real^3 -> bool) x`;
\r
1383 PAT_ONCE_REWRITE_TAC`\x. x ==> y ` [VECTOR_ARITH` a + b % x = a + b % x + &0 % e `];
\r
1384 FIRST_ASSUM NHANH;
\r
1386 UNDISCH_TAC ` y = t2 % e + t3 % rho_node1 (FF:real^3 # real^3 -> bool) x`;
\r
1387 PAT_ONCE_REWRITE_TAC`\x. x ==> y ` [VECTOR_ARITH` a + b % xx = &0 % x + b % xx + a `];
\r
1388 FIRST_ASSUM NHANH;
\r
1389 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
1391 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
1392 UNDISCH_TAC ` y = &0 % x + t3 % rho_node1 FF x + &0 % (e:real^3)`;
\r
1393 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID; VECTOR_ADD_RID];
\r
1394 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
1395 REWRITE_TAC[FAN; fan7];
\r
1397 FIRST_X_ASSUM (MP_TAC o (SPECL [`{y:real^3}`;` {rho_node1 (FF:real^3 # real^3 -> bool) x }`]));
\r
1399 ASSUME_TAC2 LOCAL_FAN_ITER_RHO_NODE_IN_V;
\r
1400 REWRITE_TAC[IN_UNION; IN_ELIM_THM];
\r
1403 EXISTS_TAC `y:real^3 `;
\r
1404 UNDISCH_TAC ` y IN U:real^3 -> bool`;
\r
1406 REWRITE_TAC[IN_ELIM_THM];
\r
1408 REPLICATE_TAC 3 DOWN THEN PHA;
\r
1411 EXISTS_TAC ` rho_node1 (FF:real^3 # real^3 -> bool) x `;
\r
1413 REWRITE_TAC[GSYM ITER];
\r
1414 DOWN THEN SIMP_TAC[];
\r
1415 UNDISCH_TAC ` ~( y:real^3 = rho_node1 FF (x:real^3) ) `;
\r
1416 SIMP_TAC[SET_RULE` ~( a = b ) ==> {a} INTER {b} = {} `; AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
\r
1417 SUBGOAL_THEN `! y. y:real^3 IN U ==> ~( vec 0 = y:real^3) ` MP_TAC;
\r
1418 UNDISCH_TAC ` !v. v IN U ==> ~collinear {v, vec 0, e:real^3} `;
\r
1421 SIMP_TAC[EQ_SYM_EQ];
\r
1423 UNDISCH_TAC `y:real^3 IN U `;
\r
1424 UNDISCH_TAC ` rho_node1 FF (x:real^3) IN (U:real^3 -> bool) `;
\r
1425 FIRST_X_ASSUM NHANH;
\r
1426 STRIP_TAC THEN STRIP_TAC;
\r
1427 SUBGOAL_THEN ` y:real^3 IN aff_ge {vec 0} {y} INTER aff_ge {vec 0} {rho_node1 FF (x:real^3)} ` ASSUME_TAC;
\r
1428 DOWN THEN DOWN THEN DOWN;
\r
1430 SIMP_TAC[IN_INTER; X_IN_AFF_GE11];
\r
1431 SIMP_TAC[AFF_GE11; IN_ELIM_THM; VECTOR_ARITH` t % vec 0 + x = x `];
\r
1433 EXISTS_TAC ` &1 - t3 `;
\r
1434 EXISTS_TAC ` t3:real `;
\r
1435 UNDISCH_TAC ` y = t3 % rho_node1 (FF:real^3 # real^3 -> bool) x`;
\r
1438 UNDISCH_TAC` &0 < t3`;
\r
1441 DISCH_THEN SUBST_ALL_TAC;
\r
1443 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
\r
1445 MP_TAC (MESON[AZIM_RANGE]` &0 <= azim (vec 0) e (rho_node1 FF (x:real^3)) y`);
\r
1447 NHANH (REAL_ARITH` &0 <= a /\ a < b ==> ~( b = &0 ) `);
\r
1449 SWITCH_TAC ` x = ITER n (rho_node1 FF) (v:real^3) `;
\r
1450 ASM_REWRITE_TAC[];
\r
1452 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {b,c,a}`];
\r
1454 UNDISCH_TAC ` ~collinear {vec 0, e, (y:real^3) }`;
\r
1455 UNDISCH_TAC ` ~collinear {vec 0, e, x:real^3}`;
\r
1458 ASM_REWRITE_TAC[];
\r
1460 UNDISCH_TAC ` ~collinear {vec 0, e, y:real^3}`;
\r
1461 UNDISCH_TAC ` ~collinear {vec 0, e, rho_node1 (FF:real^3 # real^3 -> bool) x}`;
\r
1464 SWITCH_TAC ` azim (vec 0) e x y =
\r
1465 azim (vec 0) e x (rho_node1 (FF:real^3 # real^3 -> bool) x) + azim (vec 0) e (rho_node1 FF x) y `;
\r
1466 ASM_SIMP_TAC[REAL_ARITH` a - b < a - c <=> c < b `]]);;
\r
1473 let V_AZIM_SMALLEST_ELMS = prove_by_refinement
\r
1474 (`local_fan (V,E,FF) /\
\r
1476 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
1480 v cross rho_node1 FF v = e
\r
1481 ==> ITER l (rho_node1 FF) v = ls /\
\r
1482 (!i. i < l ==> ~(ls = ITER i (rho_node1 FF) v))
\r
1483 ==> (!y. y IN U /\ ~(y = v) /\ ~(y = ls)
\r
1484 ==> azim (vec 0) e ls v < azim (vec 0) e ls y)`,
\r
1485 [NHANH SEQUENCE_OF_RHO_NODE_IS_SUC;
\r
1486 STRIP_TAC THEN STRIP_TAC;
\r
1489 REWRITE_TAC[IN_ELIM_THM];
\r
1491 UNDISCH_TAC ` n <= l:num `;
\r
1492 SWITCH_TAC ` y = ITER n (rho_node1 FF) v:real^3 `;
\r
1493 ASM_REWRITE_TAC[];
\r
1495 ASM_CASES_TAC ` n = 0 `;
\r
1496 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
1498 ASM_REWRITE_TAC[ITER];
\r
1499 ASM_CASES_TAC` n = l:num `;
\r
1500 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
1501 UNDISCH_TAC ` ITER l (rho_node1 FF) v = ls:real^3 `;
\r
1502 ASM_REWRITE_TAC[];
\r
1504 SPEC_TAC (`n:num`,` n:num`);
\r
1508 ASM_CASES_TAC ` n' = 0 `;
\r
1509 ASM_REWRITE_TAC[ADD; ITER1];
\r
1510 UNDISCH_TAC ` !x n.
\r
1511 x = ITER n (rho_node1 FF) (v:real^3) /\ n < l
\r
1512 ==> (!y. y IN U /\ ~(y = x) /\ ~(y = rho_node1 FF x)
\r
1513 ==> azim (vec 0) e y x < azim (vec 0) e y (rho_node1 FF x))`;
\r
1514 DISCH_THEN (MP_TAC o (SPECL [`v:real^3 `;`0`]));
\r
1517 DOWN THEN DOWN THEN ARITH_TAC;
\r
1518 DISCH_THEN MATCH_MP_TAC;
\r
1519 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
1520 SUBST_ALL_TAC (SYM ONE);
\r
1523 REWRITE_TAC[ARITH_RULE` ~( 1 = z ) /\ 1 <= z <=> 0 < z /\ 1 < z `];
\r
1524 UNDISCH_TAC ` !i. i < l ==> ~(ls = ITER i (rho_node1 FF) (v:real^3)) `;
\r
1526 SIMP_TAC[ITER1; ITER];
\r
1530 REWRITE_TAC[IN_ELIM_THM];
\r
1531 MESON_TAC[LE_REFL];
\r
1532 UNDISCH_TAC ` ~(n' = 0)
\r
1535 ==> azim (vec 0) e ls v < azim (vec 0) e ls (ITER n' (rho_node1 FF) v)`;
\r
1538 REPLICATE_TAC 3 DOWN THEN PHA;
\r
1541 UNDISCH_TAC ` !x n.
\r
1542 x = ITER n (rho_node1 FF) v /\ n < l
\r
1543 ==> (!y. y IN U /\ ~(y = x) /\ ~(y = rho_node1 FF x)
\r
1544 ==> azim (vec 0) e y x < azim (vec 0) e y (rho_node1 FF x))`;
\r
1545 DISCH_THEN (MP_TAC o (SPECL [`ITER n' (rho_node1 FF) v:real^3 `;` n':num`]));
\r
1547 UNDISCH_TAC` SUC n' <= l `;
\r
1548 REWRITE_TAC[ARITH_RULE` SUC n <= m <=> n < m `];
\r
1549 DISCH_THEN (MP_TAC o (SPEC ` ls:real^3 `));
\r
1551 UNDISCH_TAC ` SUC n' <= l `;
\r
1552 UNDISCH_TAC ` ~( SUC n' = l ) `;
\r
1554 REWRITE_TAC[ARITH_RULE` ~(SUC n' = l) /\ SUC n' <= l <=> n' < l /\ SUC n' < l`];
\r
1555 FIRST_ASSUM NHANH;
\r
1560 REWRITE_TAC[IN_ELIM_THM];
\r
1561 MESON_TAC[LE_REFL];
\r
1563 REWRITE_TAC[ITER];
\r
1564 REAL_ARITH_TAC]);;
\r
1570 let AZIM_LAST_POINT_IN_RHO_SET = prove_by_refinement
\r
1571 (`local_fan (V,E,FF) /\
\r
1573 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
1577 v cross rho_node1 FF v = e
\r
1578 ==> ITER l (rho_node1 FF) v = ls /\
\r
1579 (!i. i < l ==> ~(ls = ITER i (rho_node1 FF) v))
\r
1580 ==> azim_cycle U (vec 0) e ls = v`,
\r
1581 [NHANH V_AZIM_SMALLEST_ELMS;
\r
1583 FIRST_X_ASSUM NHANH;
\r
1585 ASM_CASES_TAC ` l = 0 `;
\r
1586 UNDISCH_TAC ` {ITER n (rho_node1 FF) (v:real^3) | n <= l} = U`;
\r
1587 MP_TAC2 (ARITH_RULE` l = 0 ==> (!n. n <=l <=> n = 0 ) `);
\r
1589 REWRITE_TAC[SET_RULE` {p n | n = 0 } = {p (0) }`; ITER];
\r
1590 DISCH_THEN (SUBST1_TAC o SYM);
\r
1592 FIRST_X_ASSUM SUBST1_TAC;
\r
1593 REWRITE_TAC[ITER];
\r
1594 MESON_TAC[Lvducxu.W_SUBSET_SINGLETON_IMP_IDE; SUBSET_REFL];
\r
1597 MATCH_MP_TAC Wrgcvdr_cizmrrh.IDENTIFY_AZIM_CYCLE;
\r
1598 ASSUME_TAC2 LOCAL_FAN_IMP_CYCLIC_SET;
\r
1599 UNDISCH_TAC ` ~( l = 0 ) `;
\r
1600 REWRITE_TAC[ARITH_RULE` ~( l = 0) <=> 0 < l `];
\r
1601 USE_FIRST ` !i. i < l ==> ~(ls = ITER i (rho_node1 FF) v:real^3) ` NHANH;
\r
1602 SUBGOAL_THEN ` ls:real^3 IN U /\ v IN U` ASSUME_TAC;
\r
1605 REWRITE_TAC[IN_ELIM_THM];
\r
1606 MESON_TAC[LE_REFL; LE_0; ITER];
\r
1608 ASM_SIMP_TAC[ITER; LE_0];
\r
1611 DOWN THEN DOWN THEN DOWN THEN PHA;
\r
1614 UNDISCH_TAC ` cyclic_set U (vec 0) (e:real^3) `;
\r
1615 NHANH Wrgcvdr_cizmrrh.CYCLIC_SET_IMP_NOT_COLLINEAR;
\r
1618 ONCE_REWRITE_TAC[GSYM IN];
\r
1619 ASM_REWRITE_TAC[];
\r
1621 ASM_CASES_TAC ` q = v:real^3 `;
\r
1622 ASM_SIMP_TAC[REAL_LE_REFL];
\r
1624 ASM_MESON_TAC[IN]]);;
\r
1629 let LOOP_MAP_IMP_DIFF_FIRST_ELMS = prove_by_refinement
\r
1630 (` (! v:A. v IN V ==> orbit_map f v = V) /\ v IN V /\ k < CARD V /\
\r
1631 l < k ==> ~( ITER k f v = ITER l f v ) `,
\r
1632 [REPEAT STRIP_TAC;
\r
1633 UNDISCH_TAC ` v:A IN V `;
\r
1635 FIRST_ASSUM NHANH;
\r
1637 SUBGOAL_THEN ` ITER l f (v:A) IN V ` ASSUME_TAC;
\r
1639 REWRITE_TAC[orbit_map; IN_ELIM_THM; POWER_TO_ITER];
\r
1640 EXISTS_TAC `l:num`;
\r
1641 REWRITE_TAC[ARITH_RULE` x >= 0 `];
\r
1644 FIRST_ASSUM NHANH;
\r
1645 SUBGOAL_THEN ` ITER ( k - l ) f ( ITER l f v ) = ITER l f (v:A) ` ASSUME_TAC;
\r
1646 ASM_SIMP_TAC[ITER_ADD; ARITH_RULE`l < k ==> ( k - l ) + l:num = k `];
\r
1648 UNDISCH_TAC ` l < k:num`;
\r
1650 ONCE_REWRITE_TAC[ARITH_RULE` a < b <=> 0 < b - a `];
\r
1651 NHANH Lvducxu.ITER_CYCLIC_ORBIT;
\r
1654 ARITH_RULE` a < b:num /\ aa <= a - i ==> ~( aa = b ) `;
\r
1655 ISPECL [`f:A -> A `;` ITER l f (v:A) `; ` k - l:num` ] (GEN_ALL Wrgcvdr_cizmrrh.CARD_LE_K_OF_SET_K_FIRST_ELMS)]]);;
\r
1660 let CARD_IMAGE_INJ2 = prove(
\r
1661 ` INJ f A B /\ FINITE A ==> CARD (IMAGE f A ) = CARD A `,
\r
1662 REWRITE_TAC[INJ] THEN STRIP_TAC THEN
\r
1663 MATCH_MP_TAC CARD_IMAGE_INJ THEN ASM_REWRITE_TAC[]);;
\r
1667 let BIJ_IMP_CARD_EQ = prove(` BIJ f A B /\ FINITE A ==> CARD A = CARD B `,
\r
1668 REWRITE_TAC[BIJ] THEN
\r
1669 NHANH Wrgcvdr_cizmrrh.SURJ_IMP_S2_EQ_IMAGE_S1 THEN MESON_TAC[CARD_IMAGE_INJ2]);;
\r
1673 let LOFA_IMP_DIS_ELMS = prove(
\r
1674 ` local_fan (V,E,FF) /\ v IN V /\ l < CARD FF
\r
1675 ==> (!i. i < l ==> ~(ITER l (rho_node1 FF) v = ITER i (rho_node1 FF) v))`,
\r
1676 STRIP_TAC THEN GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC LOOP_MAP_IMP_DIFF_FIRST_ELMS THEN
\r
1677 MP_TAC2 LOCAL_FAN_ORBIT_MAP_V THEN ASM_REWRITE_TAC[] THEN
\r
1678 ABBREV_TAC ` k = (\x. FST (x:real^3 # real^3 )) ` THEN STRIP_TAC THEN
\r
1679 MP_TAC2 Wrgcvdr_cizmrrh.BIJ_BETWEEN_FF_AND_V THEN
\r
1680 ASSUME_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_FINITE_FF THEN
\r
1681 DOWN THEN REWRITE_TAC[TAUT` a ==> b ==> c <=> b /\ a ==> c `] THEN
\r
1682 NHANH BIJ_IMP_CARD_EQ THEN PURE_ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
\r
1688 let AZIM_LAST_POINT_IN_RHO_SET2 = prove(
\r
1689 ` local_fan (V,E,FF) /\
\r
1691 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
1695 v cross rho_node1 FF v = e
\r
1696 ==> ITER l (rho_node1 FF) v = ls /\
\r
1698 ==> azim_cycle U (vec 0) e ls = v `,
\r
1699 NHANH AZIM_LAST_POINT_IN_RHO_SET THEN STRIP_TAC THEN STRIP_TAC THEN
\r
1700 FIRST_X_ASSUM MATCH_MP_TAC THEN EXPAND_TAC "ls" THEN
\r
1701 REWRITE_TAC[] THEN MATCH_MP_TAC LOFA_IMP_DIS_ELMS THEN
\r
1702 ASM_REWRITE_TAC[]);;
\r
1707 let KOMWBWC = prove_by_refinement(`!E V P l FF U e ls v.
\r
1708 local_fan (V,E,FF) /\
\r
1710 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
1714 v cross rho_node1 FF v = e
\r
1715 ==> cyclic_set U (vec 0) e /\
\r
1718 (ITER i (rho_node1 FF) v cross ITER (i + 1) (rho_node1 FF) v) dot
\r
1721 x = ITER n (rho_node1 FF) v /\ n < l
\r
1722 ==> azim_cycle U (vec 0) e x = rho_node1 FF x) /\
\r
1723 (ITER l (rho_node1 FF) v = ls /\
\r
1725 ==> azim_cycle U (vec 0) e ls = v)`,
\r
1726 [REPEAT GEN_TAC THEN STRIP_TAC; MP_TAC2 LOCAL_FAN_IMP_CYCLIC_SET;
\r
1727 STRIP_TAC; MP_TAC2 RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT;
\r
1728 REMOVE_TAC; MP_TAC2 AZIM_LAST_POINT_IN_RHO_SET2;
\r
1729 REMOVE_TAC; MP_TAC2 FIRST_AZIM_CYCLE_EQ_RHO_NODE]);;
\r
1734 (* -------------------------------- *)
\r
1735 (* ================================ *)
\r
1736 (* -------------------------------- *)
\r
1737 (* lemma OZQVSFF *)
\r
1738 (* ================================ *)
\r
1740 let interior_angle1 = new_definition
\r
1741 ` interior_angle1 x FF v = azim x v (rho_node1 FF v) (@a. a,v IN FF)`;;
\r
1745 let WEDGE_GE_AZIM_LE = prove(
\r
1746 `! x v0 v1 w1 w2. x IN wedge_ge v0 v1 w1 w2 <=> azim v0 v1 w1 x <= azim v0 v1 w1 w2 `,
\r
1747 REWRITE_TAC[wedge_ge; IN_ELIM_THM; AZIM_RANGE]);;
\r
1751 let IN_WEDGE_IMP_AZIM_LE = prove(`! x y. y IN wedge_ge v0 v1 w1 w2 /\
\r
1752 azim v0 v1 w1 x <= azim v0 v1 w1 y /\
\r
1753 ~collinear {v0, v1, x} /\
\r
1754 ~collinear {v0, v1, y} /\
\r
1755 ~collinear {v0, v1, w1}
\r
1756 ==> azim v0 v1 x y <= azim v0 v1 w1 w2`,
\r
1757 NHANH Fan.sum4_azim_fan THEN
\r
1758 REWRITE_TAC[WEDGE_GE_AZIM_LE] THEN
\r
1759 REPEAT GEN_TAC THEN
\r
1760 MP_TAC (SPECL [`v0:real^3`;` v1:real^3`;`w1:real^3`;` x:real^3`] AZIM_RANGE) THEN
\r
1766 let LOFA_IMAGE_RHO_NODE_IDE = prove(
\r
1767 `local_fan (V,E,FF) ==> IMAGE (rho_node1 FF) V = V`,
\r
1768 STRIP_TAC THEN ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_V THEN
\r
1769 ASM_SIMP_TAC[EQ_SYM_EQ; Lvducxu.W_EQ_ITS_ORBIT_IMP_EQ_ITS_IMAGE]);;
\r
1773 let EXISTS_INVERSE_OF_V = prove(
\r
1774 ` local_fan (V,E,FF) /\ v IN V ==> ? vv. vv IN V /\ rho_node1 FF vv = v `,
\r
1775 NHANH LOFA_IMAGE_RHO_NODE_IDE THEN
\r
1776 REWRITE_TAC[IMAGE] THEN SET_TAC[]);;
\r
1780 let LOFA_IN_V_SO_DO_RHO_NODE_V = prove(
\r
1781 ` local_fan (V,E,FF) /\ v IN V ==> rho_node1 FF v IN V `,
\r
1782 NHANH LOCAL_FAN_ORBIT_MAP_V THEN STRIP_TAC THEN
\r
1783 DOWN THEN FIRST_X_ASSUM (NHANH_PAT `\x. x ==> y `) THEN
\r
1784 STRIP_TAC THEN EXPAND_TAC "V" THEN
\r
1785 REWRITE_TAC[in_orbit_map1]);;
\r
1788 let HYP_MAPS_INVERSABLE =
\r
1789 MESON[hypermap_lemma; PERMUTES_INVERSES_o]`! H:(A) hypermap.
\r
1790 inverse (face_map H) o (face_map H ) = I /\
\r
1791 inverse (node_map H) o (node_map H ) = I /\
\r
1792 inverse (edge_map H) o (edge_map H ) = I /\
\r
1793 (face_map H ) o inverse (face_map H) = I /\
\r
1794 (node_map H ) o inverse (node_map H) = I/\
\r
1795 (edge_map H ) o inverse (edge_map H) = I`;;
\r
1799 let LOFA_DARTS_FF_UNION_SWITCH_FF = prove_by_refinement
\r
1800 (` local_fan (V,E,FF) ==> darts_of_hyp E V = FF UNION {v,w | w,v IN FF }`,
\r
1801 [REWRITE_TAC[local_fan];
\r
1803 REWRITE_TAC[dih2k; Lvducxu.HAS_ORD2_INTERPRET; Lvducxu.EDGE_MAP_RESO_INVERSE];
\r
1806 UNDISCH_TAC ` x':real^3 # real^3 IN dart H `;
\r
1807 FIRST_X_ASSUM NHANH;
\r
1808 ONCE_REWRITE_TAC[inverse2_hypermap_maps];
\r
1809 REWRITE_TAC[IMAGE_o];
\r
1810 ONCE_REWRITE_TAC[Lvducxu.ENF_IMAGE_ITSELF];
\r
1811 ASM_REWRITE_TAC[GSYM IMAGE_o; GSYM o_ASSOC; HYP_MAPS_INVERSABLE; I_O_ID;
\r
1812 GSYM Lvducxu.ENF_IMAGE_ITSELF];
\r
1813 UNDISCH_TAC ` FAN (vec 0:real^3, V, E) `;
\r
1814 NHANH ELMS_OF_HYPERMAP_HYP;
\r
1815 ASM_REWRITE_TAC[];
\r
1817 ASM_REWRITE_TAC[];
\r
1819 ASM_REWRITE_TAC[];
\r
1820 MATCH_MP_TAC (MESON[]` x = y ==> f x = f y`);
\r
1821 REWRITE_TAC[IMAGE; EXTENSION; IN_ELIM_THM; ee_of_hyp2];
\r
1822 SUBGOAL_THEN ` x' IN dart (H:(real^3 # real^3) hypermap) ` MP_TAC;
\r
1823 FIRST_X_ASSUM MP_TAC;
\r
1824 ASM_REWRITE_TAC[];
\r
1825 NHANH lemma_face_subset;
\r
1826 REWRITE_TAC[SUBSET];
\r
1828 GEN_TAC THEN EQ_TAC;
\r
1831 FIRST_X_ASSUM NHANH;
\r
1834 EXISTS_TAC ` SND (x''':real^3 #real^3 ) `;
\r
1835 EXISTS_TAC ` FST (x''':real^3 #real^3 ) `;
\r
1836 ASM_REWRITE_TAC[];
\r
1838 EXISTS_TAC `w:real^3, v:real^3 `;
\r
1839 DOWN THEN DOWN THEN PHA;
\r
1840 FIRST_X_ASSUM NHANH;
\r
1841 ASM_SIMP_TAC[]]);;
\r
1847 let SELF_CYCLIC_IMP_FINITE = prove_by_refinement
\r
1848 (`(! x:A. x IN V ==> V = orbit_map f x ) ==> FINITE V `,
\r
1849 [ASM_CASES_TAC `V:A -> bool = {} `;
\r
1850 ASM_REWRITE_TAC[FINITE_EMPTY];
\r
1852 REWRITE_TAC[SET_RULE` ~( x = {}) <=> ? a. a IN x `];
\r
1854 UNDISCH_TAC` a:A IN V `;
\r
1855 FIRST_ASSUM NHANH;
\r
1857 MP_TAC (ISPECL [`f:A -> A `;` a:A `] in_orbit_map1);
\r
1858 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
1859 FIRST_ASSUM NHANH;
\r
1861 SUBGOAL_THEN ` a:A IN V ` MP_TAC;
\r
1862 FIRST_X_ASSUM ACCEPT_TAC;
\r
1863 FIRST_ASSUM SUBST1_TAC;
\r
1864 REWRITE_TAC[orbit_map; IN_ELIM_THM; POWER_TO_ITER; GSYM ITER_ALT];
\r
1866 FIRST_X_ASSUM (MP_TAC o SYM);
\r
1867 MP_TAC (ARITH_RULE` 0 < SUC n `);
\r
1869 NHANH Lvducxu.ITER_CYCLIC_ORBIT;
\r
1870 UNDISCH_TAC ` a:A IN V `;
\r
1871 FIRST_X_ASSUM NHANH;
\r
1872 ASM_SIMP_TAC[orbit_map; POWER_TO_ITER; GSYM ITER_ALT];
\r
1875 SET_RULE` {ITER n' f a | n' < n} = {y | ? n' . n' < n /\ y = ITER n' f a }`;
\r
1876 Wrgcvdr_cizmrrh.FINITE_OF_N_FIRST_ELMS]]);;
\r
1883 let SELF_CYCLIC_IMP_BIJ = prove(
\r
1884 ` (!x. x IN S ==> S = orbit_map f x) ==> BIJ f S S `,
\r
1885 NHANH SELF_CYCLIC_IMP_FINITE THEN
\r
1886 MESON_TAC[Lvducxu.FIN_LOOP_IMP_BIJ_ITSELF]);;
\r
1891 let LOFA_IN_E_IMP_IN_FF = prove(
\r
1892 ` local_fan (V,E,FF) /\ {a,b} IN E ==> a,b IN FF \/ b,a IN FF `,
\r
1893 REWRITE_TAC[Wrgcvdr_cizmrrh.IN_E_IFF_IN_ORD_E] THEN
\r
1894 NHANH LOFA_DARTS_FF_UNION_SWITCH_FF THEN
\r
1895 REWRITE_TAC[darts_of_hyp] THEN PHA THEN
\r
1896 NHANH (SET_RULE` a UNION b = x /\ xx IN a ==> xx IN x `) THEN
\r
1897 REWRITE_TAC[IN_UNION; IN_ELIM_THM; PAIR_EQ] THEN
\r
1898 STRIP_TAC THENL [ASM_REWRITE_TAC[];ASM_REWRITE_TAC[]]);;
\r
1903 let LOFA_IMP_EE_TWO_ELMS = prove_by_refinement
\r
1904 (` local_fan (V,E,FF) /\ vv IN V /\ rho_node1 FF vv = v
\r
1905 ==> EE v E = {rho_node1 FF v, vv }`,
\r
1906 [NHANH LOCAL_FAN_RHO_NODE_PROS2;
\r
1907 IMP_TAC THEN STRIP_TAC;
\r
1909 SUBGOAL_THEN ` v:real^3 IN V ` ASSUME_TAC;
\r
1910 ASM_MESON_TAC[LOFA_IN_V_SO_DO_RHO_NODE_V];
\r
1912 UNDISCH_TAC ` vv:real^3 IN V `;
\r
1913 FIRST_ASSUM NHANH;
\r
1915 REWRITE_RULE[TAUT` a /\ b ==> c <=> a ==> b ==> c `;
\r
1916 RIGHT_FORALL_IMP_THM] (GEN `x:real^3 # real^3 ` LOCAL_FAN_IN_FF_IN_ORD_PAIRS));
\r
1917 FIRST_ASSUM NHANH;
\r
1919 REWRITE_TAC[EXTENSION; EE; IN_ELIM_THM];
\r
1920 GEN_TAC THEN EQ_TAC;
\r
1921 UNDISCH_TAC ` local_fan (V,E,FF) `;
\r
1923 NHANH LOFA_IN_E_IMP_IN_FF;
\r
1924 UNDISCH_TAC ` !x. x IN FF ==> x = FST x,rho_node1 FF (FST (x:real^3 # real^3))`;
\r
1928 SIMP_TAC[PAIR_EQ; IN_INSERT];
\r
1930 SIMP_TAC[PAIR_EQ];
\r
1931 ASSUME_TAC2 (SPEC `v:real^3 ` (GEN `y:real^3 ` LOCAL_FAN_IMP_IN_V));
\r
1932 MP_TAC2 LOCAL_FAN_ORBIT_MAP_V;
\r
1933 SIMP_TAC[EQ_SYM_EQ];
\r
1934 NHANH SELF_CYCLIC_IMP_BIJ;
\r
1935 REWRITE_TAC[BIJ; INJ];
\r
1937 UNDISCH_TAC ` x IN V /\ v:real^3 IN V`;
\r
1942 UNDISCH_TAC ` x:real^3 IN V `;
\r
1943 UNDISCH_TAC ` vv:real^3 IN V `;
\r
1945 FIRST_X_ASSUM NHANH;
\r
1946 SIMP_TAC[IN_INSERT];
\r
1947 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
\r
1949 UNDISCH_TAC `v, rho_node1 FF v IN FF `;
\r
1950 UNDISCH_TAC ` local_fan (V,E,FF) `;
\r
1952 NHANH LOCAL_FAN_IN_FF_IN_ORD_PAIRS;
\r
1953 ASM_SIMP_TAC[Wrgcvdr_cizmrrh.IN_E_IFF_IN_ORD_E];
\r
1954 UNDISCH_TAC ` vv,rho_node1 FF vv IN FF `;
\r
1955 FIRST_X_ASSUM NHANH;
\r
1956 ASM_REWRITE_TAC[];
\r
1957 UNDISCH_TAC `local_fan (V,E,FF) `;
\r
1959 NHANH LOCAL_FAN_IN_FF_IN_ORD_PAIRS;
\r
1960 SIMP_TAC[Wrgcvdr_cizmrrh.IN_ORD_E_EQ_IN_E; INSERT_COMM]]);;
\r
1963 let LOFA_CARD_EE_V_2 = prove(
\r
1964 `local_fan (V,E,FF) /\ vv IN V /\ rho_node1 FF vv = v
\r
1965 ==> CARD (EE v E ) = 2 `, NHANH LOFA_IMP_EE_TWO_ELMS THEN
\r
1966 SIMP_TAC[Geomdetail.CARD_SET2] THEN NHANH LOCAL_FAN_IMP_NOT_SEMI_IDE THEN
\r
1971 let LOFA_CARD_EE_V_1 = prove(
\r
1972 `local_fan (V,E,FF) /\ v IN V ==> CARD (EE v E) = 2 `,
\r
1973 NHANH EXISTS_INVERSE_OF_V THEN
\r
1974 MESON_TAC[ LOFA_CARD_EE_V_2]);;
\r
1980 let RHO_NODE_INVERSE_POINT = MESON[]`
\r
1981 w,v IN FF /\ (! ww. ww,v IN FF ==> ww = w )
\r
1982 ==> (@a. a,v IN FF ) = w `;;
\r
1986 let AZIM_CYCLE_TWO_POINT_SET = prove_by_refinement
\r
1987 (`azim_cycle {a,b} v w a = b `,
\r
1988 [ASM_CASES_TAC ` a = b:real^3`;
\r
1989 ASM_REWRITE_TAC[INSERT_INSERT];
\r
1990 REWRITE_TAC[ MATCH_MP Lvducxu.W_SUBSET_SINGLETON_IMP_IDE (SET_RULE` {p:real^3} SUBSET {p}`)];
\r
1991 ABBREV_TAC ` W = {a,b:real^3} `;
\r
1992 ABBREV_TAC ` u = azim_cycle W v w a `;
\r
1993 ABBREV_TAC ` p = a:real^3`;
\r
1994 SUBGOAL_THEN ` ~(u = p) /\
\r
1996 (!q. ~(q = p) /\ W q
\r
1997 ==> azim v w p u < azim v w p q \/
\r
1998 azim v w p u = azim v w p q /\
\r
1999 norm (projection (w - v) (u - v)) <=
\r
2000 norm (projection (w - v) (q - v))) ` ASSUME_TAC;
\r
2002 SUBGOAL_THEN ` ~(W SUBSET {p:real^3}) ` MP_TAC;
\r
2004 REWRITE_TAC[azim_cycle];
\r
2007 CONV_TAC SELECT_CONV;
\r
2008 EXISTS_TAC `b:real^3 `;
\r
2009 ASM_REWRITE_TAC[];
\r
2013 REWRITE_TAC[SET_RULE` ~(q = p) /\ {p, b} q <=> q = b /\ ~( q = p)`];
\r
2014 SIMP_TAC[REAL_LE_REFL];
\r
2020 let LOFA_IMP_BIJ_VV = prove(
\r
2021 ` local_fan (V,E,FF) ==> BIJ (rho_node1 FF ) V V `,
\r
2022 NHANH LOCAL_FAN_ORBIT_MAP_V THEN STRIP_TAC THEN
\r
2023 MATCH_MP_TAC SELF_CYCLIC_IMP_BIJ THEN DOWN THEN
\r
2024 SIMP_TAC[EQ_SYM_EQ]);;
\r
2031 let MOST_EXPAND_IN_WEDGE_GE = prove_by_refinement
\r
2032 (` ~collinear {v0,v1, w1} /\
\r
2033 ~collinear {v0,v1, w2} /\
\r
2034 ~collinear {v0,v1, x} /\ ~ collinear {v0, v1, y} /\
\r
2035 y IN wedge_ge v0 v1 w1 w2 /\
\r
2036 azim v0 v1 w1 x <= azim v0 v1 w1 y /\
\r
2037 azim v0 v1 x y = azim v0 v1 w1 w2 ==>
\r
2038 azim v0 v1 w1 x = &0 /\
\r
2039 azim v0 v1 y w2 = &0 `,
\r
2040 [REWRITE_TAC[wedge_ge; IN_ELIM_THM];
\r
2042 SUBGOAL_THEN ` azim v0 v1 w1 w2 = azim v0 v1 w1 y + azim v0 v1 y w2` ASSUME_TAC;
\r
2043 MATCH_MP_TAC Fan.sum4_azim_fan;
\r
2044 ASM_REWRITE_TAC[];
\r
2045 SUBGOAL_THEN ` azim v0 v1 w1 y = azim v0 v1 w1 x + azim v0 v1 x y` ASSUME_TAC;
\r
2046 MATCH_MP_TAC Fan.sum4_azim_fan;
\r
2047 ASM_REWRITE_TAC[];
\r
2048 UNDISCH_TAC` azim v0 v1 w1 w2 = azim v0 v1 w1 y + azim v0 v1 y w2 `;
\r
2049 ASM_REWRITE_TAC[];
\r
2051 SPECL [`v0:real^3`; ` v1:real^3 `;`w1:real^3 `;` x:real^3 `] AZIM_RANGE);
\r
2053 SPECL [`v0:real^3`; ` v1:real^3 `;`y:real^3 `;` w2:real^3 `] AZIM_RANGE);
\r
2054 REAL_ARITH_TAC]);;
\r
2060 let OZQVSFF = prove_by_refinement
\r
2061 (`! u w. convex_local_fan (V,E,FF) /\
\r
2062 {u,v,w} SUBSET V /\
\r
2064 {vec 0, u, v, w} SUBSET P /\
\r
2065 {u,w} INTER aff {vec 0, v} = {} /\
\r
2066 ~( aff {v, vec 0} INTER conv0 {w,u} = {} ) ==>
\r
2067 interior_angle1 (vec 0) FF v = pi /\
\r
2068 rho_node1 FF v IN P /\ ivs_rho_node1 FF v IN P`,
\r
2069 [MATCH_MP_TAC (MESON[REAL_ARITH` a <= b \/ b <= a `]`
\r
2070 (! x y. P x y ==> P y x ) /\ (! x y. azim (vec 0) v (rho_node1 FF v) y <=
\r
2071 azim (vec 0) v (rho_node1 FF v) x ==> P x y ) ==>
\r
2072 (! x y. P x y ) `);
\r
2074 SIMP_TAC[INSERT_COMM];
\r
2075 REWRITE_TAC[convex_local_fan; INSERT_SUBSET; EMPTY_SUBSET; Trigonometry2.INSERT_INTER_EMPTY];
\r
2076 NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
2077 NHANH FAN_IMP_V_DIFF;
\r
2078 REPLICATE_TAC 4 STRIP_TAC;
\r
2079 UNDISCH_TAC ` !v:real^3. v IN V ==> ~(v = vec 0)`;
\r
2081 UNDISCH_TAC` v:real^3 IN V `;
\r
2082 FIRST_ASSUM NHANH;
\r
2084 UNDISCH_TAC ` ~( u IN aff {vec 0, v:real^3})`;
\r
2085 UNDISCH_TAC ` ~( w:real^3 IN aff {vec 0, v})`;
\r
2086 ASM_SIMP_TAC[INSERT_COMM; Trigonometry2.NOT_EQ_IMP_AFF_AND_COLL3];
\r
2088 SUBGOAL_THEN ` azim (vec 0) v w u = pi ` ASSUME_TAC;
\r
2089 DOWN THEN DOWN THEN PHA;
\r
2090 PAT_ONCE_REWRITE_TAC `\x. y /\ x ==> k ` [INSERT_COMM];
\r
2091 NHANH (SIMP_RULE[INSERT_COMM] Ldurdpn.LDURDPN);
\r
2093 FIRST_X_ASSUM SUBST1_TAC;
\r
2095 EXISTS_TAC `P:real^3 -> bool`;
\r
2096 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
2097 FIRST_ASSUM ACCEPT_TAC;
\r
2098 UNDISCH_TAC ` v:real^3 IN V `;
\r
2099 ASSUME_TAC2 LOCAL_FAN_RHO_NODE_PROS2;
\r
2100 DOWN THEN IMP_TAC;
\r
2103 UNDISCH_TAC ` !x:real^3 #real^3. x IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E`;
\r
2105 FIRST_ASSUM NHANH;
\r
2106 REWRITE_TAC[SUBSET];
\r
2108 UNDISCH_TAC` w:real^3 IN V `;
\r
2109 UNDISCH_TAC ` u:real^3 IN V `;
\r
2110 FIRST_ASSUM NHANH;
\r
2111 REWRITE_TAC[wedge_in_fan_ge];
\r
2112 SUBGOAL_THEN ` CARD (EE (v:real^3) E ) = 2 ` MP_TAC;
\r
2113 MATCH_MP_TAC LOFA_CARD_EE_V_1;
\r
2114 ASM_REWRITE_TAC[];
\r
2115 NHANH (ARITH_RULE ` a = 2 ==> a > 1 `);
\r
2117 REPLICATE_TAC 3 STRIP_TAC;
\r
2118 UNDISCH_TAC ` v:real^3 IN V `;
\r
2119 UNDISCH_TAC ` local_fan (V,E,FF) `;
\r
2121 NHANH EXISTS_INVERSE_OF_V;
\r
2123 ASSUME_TAC2 LOFA_IMP_EE_TWO_ELMS;
\r
2124 UNDISCH_TAC ` azim_in_fan (v,rho_node1 FF v) E <= pi `;
\r
2125 REWRITE_TAC[azim_in_fan];
\r
2127 ASM_REWRITE_TAC[];
\r
2128 SUBGOAL_THEN` azim (vec 0) v w u <= azim (vec 0) v (rho_node1 FF v) d ` ASSUME_TAC;
\r
2129 MATCH_MP_TAC IN_WEDGE_IMP_AZIM_LE;
\r
2130 ASM_SIMP_TAC[INSERT_COMM];
\r
2131 UNDISCH_TAC ` v,rho_node1 FF v IN FF `;
\r
2132 UNDISCH_TAC ` local_fan (V,E,FF) `;
\r
2134 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;
\r
2135 SIMP_TAC[INSERT_COMM];
\r
2137 UNDISCH_TAC ` azim (vec 0) v w u = pi `;
\r
2140 REWRITE_TAC[interior_angle1];
\r
2141 SUBGOAL_THEN `(@a. a,v IN (FF:real^3 # real^3 -> bool)) = vv ` ASSUME_TAC;
\r
2142 MATCH_MP_TAC RHO_NODE_INVERSE_POINT;
\r
2143 MP_TAC2 LOCAL_FAN_RHO_NODE_PROS2;
\r
2145 UNDISCH_TAC ` vv:real^3 IN V `;
\r
2146 FIRST_X_ASSUM NHANH;
\r
2150 FIRST_ASSUM NHANH;
\r
2151 REWRITE_TAC[PAIR_EQ];
\r
2152 UNDISCH_TAC `local_fan (V,E,FF) `;
\r
2155 NHANH LOCAL_FAN_IMP_IN_V;
\r
2156 UNDISCH_TAC ` vv:real^3 IN V `;
\r
2157 NHANH LOFA_IMP_BIJ_VV;
\r
2158 REWRITE_TAC[BIJ; INJ];
\r
2161 SUBGOAL_THEN ` azim_cycle (EE v E) (vec 0) v (rho_node1 FF v) = vv ` ASSUME_TAC;
\r
2162 UNDISCH_TAC ` EE v E = {rho_node1 FF v, vv} `;
\r
2164 SIMP_TAC[AZIM_CYCLE_TWO_POINT_SET];
\r
2165 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
2166 ONCE_REWRITE_TAC[TAUT` a/\ b <=> a /\ (a ==> b ) `];
\r
2168 FIRST_X_ASSUM SUBST1_TAC;
\r
2170 ASM_REWRITE_TAC[];
\r
2172 FIRST_ASSUM SUBST1_TAC;
\r
2175 SUBGOAL_THEN ` ~collinear {v, rho_node1 FF v, vec 0} /\ ~collinear {d, v, vec 0} ` ASSUME_TAC;
\r
2178 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
2179 UNDISCH_TAC ` v:real^3 IN V `;
\r
2180 UNDISCH_TAC ` vv:real^3 IN V `;
\r
2182 FIRST_X_ASSUM NHANH;
\r
2183 ASM_SIMP_TAC[INSERT_COMM];
\r
2187 SUBGOAL_THEN ` azim (vec 0) v (rho_node1 FF v) w = &0 /\
\r
2188 azim (vec 0) v u vv = &0 ` MP_TAC;
\r
2189 MATCH_MP_TAC MOST_EXPAND_IN_WEDGE_GE;
\r
2190 ASM_SIMP_TAC[INSERT_COMM];
\r
2194 DOWN THEN STRIP_TAC;
\r
2195 UNDISCH_TAC `~ collinear {v, w, vec 0:real^3 }`;
\r
2196 UNDISCH_TAC `~ collinear {v, rho_node1 FF v, vec 0:real^3 }`;
\r
2197 ONCE_REWRITE_TAC[TAUT` a ==> b ==> c <=> b /\a ==> c `];
\r
2198 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {c,a,b} `];
\r
2199 NHANH AZIM_EQ_0_ALT;
\r
2200 NHANH AZIM_EQ_0_SYM;
\r
2202 ASSUME_TAC2 (SIMP_RULE[INSERT_COMM] (SPECL [` vec 0:real^3`;` v:real^3 `;`u:real^3 `;` d:real^3 `] AZIM_EQ_0_ALT));
\r
2206 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
2207 ASM_SIMP_TAC[ivs_rho_node1];
\r
2208 REMOVE_TAC THEN REMOVE_TAC;
\r
2210 SET_RULE` A SUBSET S /\ B SUBSET S ==> a IN A /\ b IN B ==> a IN S /\ b IN S `);
\r
2212 SUBGOAL_THEN ` affine hull {vec 0,v,w:real^3} = P ` MP_TAC;
\r
2213 MATCH_MP_TAC THREE_NOT_COLL_DETER_PLANE;
\r
2214 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
2215 DISCH_THEN (SUBST1_TAC o SYM);
\r
2216 REWRITE_TAC[SET_RULE` {a,b,c} = {a,b} UNION {c}`];
\r
2217 REWRITE_TAC[INSERT_UNION;AFF_GT_SUBSET_AFFINE_HULL; UNION_EMPTY];
\r
2218 SUBGOAL_THEN ` affine hull {u,v,vec 0:real^3} = P ` MP_TAC;
\r
2219 MATCH_MP_TAC THREE_NOT_COLL_DETER_PLANE;
\r
2220 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
2221 DISCH_THEN (SUBST1_TAC o SYM);
\r
2222 REWRITE_TAC[SET_RULE` {c,a,b} = {a,b} UNION {c}`];
\r
2223 REWRITE_TAC[INSERT_UNION;AFF_GT_SUBSET_AFFINE_HULL; UNION_EMPTY]]);;
\r
2227 (* ============================================= *)
\r
2228 (* ============================================= *)
\r
2229 (* ============================================= *)
\r
2230 (* ============================================= *)
\r
2231 (* lemma KCHMAMG *)
\r
2234 let REAL_LT_DIV_NEG = prove(` a < &0 /\ b < &0 ==> &0 < a /b `,
\r
2235 SIMP_TAC [REAL_FIELD` b < &0 ==> a / b = ( -- a) / ( -- b ) `; REAL_ARITH `
\r
2236 b < &0 <=> &0 < -- b `; REAL_LT_DIV]);;
\r
2239 let IN_CONV0 = prove_by_refinement
\r
2240 (` &0 < a /\ &0 < b ==> &1 / ( a + b ) % ( a % x + b % (y:real^N)) IN conv0 {x,y}`,
\r
2241 [REWRITE_TAC[Geomdetail.CONV0_SET2; IN_ELIM_THM];
\r
2243 EXISTS_TAC ` a / ( a + b ) `;
\r
2244 EXISTS_TAC ` b / ( a + b ) `;
\r
2246 MATCH_MP_TAC REAL_LT_DIV;
\r
2250 MATCH_MP_TAC REAL_LT_DIV;
\r
2255 CONV_TAC REAL_FIELD;
\r
2256 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC;
\r
2257 REAL_ARITH` &1 / x * y = y / x `]]);;
\r
2260 (* lemma about intersection between conv0 {x,y} and
\r
2261 aff {w,v} in affine hull {a,b,c} *)
\r
2265 let INTERSECTION_LEMMA = prove_by_refinement
\r
2266 (` ~ ( z = x ) /\ DISJOINT {x:real^N} {v,w} /\ ~( x = u ) /\
\r
2267 ~(aff_gt {x} {v, w} INTER aff_lt {x} {u} = {}) /\
\r
2268 z IN affine hull {x,v,w} ==>
\r
2269 (? a b t. {a,b} SUBSET {u,v,w} /\ t IN aff {x,z} INTER conv0 {a,b})`,
\r
2270 [REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM; REAL_ARITH` a + b = &1 <=> &1 - b = a `];
\r
2273 ASM_CASES_TAC ` &0 < v' /\ &0 < w' `;
\r
2274 ASM_REWRITE_TAC[VECTOR_ARITH` a = x % b + c + d <=> a - x % b = c + d`];
\r
2276 EXISTS_TAC ` v:real^N `;
\r
2277 EXISTS_TAC `w:real^N `;
\r
2278 EXISTS_TAC ` (&1 / (v' + w') ) % ( z - u' % x:real^N ) `;
\r
2279 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_INSERT; AFF2;
\r
2280 Geomdetail.CONV0_SET2; IN_INTER; IN_ELIM_THM];
\r
2282 EXISTS_TAC ` ( -- u') / (v' + w' ) `;
\r
2283 REWRITE_TAC[VECTOR_SUB_LDISTRIB; VECTOR_MUL_ASSOC; REAL_ARITH` (&1 / a ) * b = b / a `];
\r
2284 ASM_SIMP_TAC [REAL_FIELD` &0 < v' /\ &0 < w' ==> &1 - --u' / (v' + w') = (u' + v' + w' ) / (v' + w') `];
\r
2286 REWRITE_TAC[REAL_ARITH` &1 - ( a + b) + a + b = &1 `];
\r
2288 EXISTS_TAC ` v' / ( v' + w') `;
\r
2289 EXISTS_TAC ` w' / ( v' + w') `;
\r
2291 MATCH_MP_TAC REAL_LT_DIV;
\r
2292 ASM_REWRITE_TAC[];
\r
2293 MATCH_MP_TAC REAL_LT_ADD;
\r
2294 FIRST_X_ASSUM ACCEPT_TAC;
\r
2296 MATCH_MP_TAC REAL_LT_DIV;
\r
2297 ASM_REWRITE_TAC[];
\r
2298 MATCH_MP_TAC REAL_LT_ADD;
\r
2299 FIRST_X_ASSUM ACCEPT_TAC;
\r
2300 ASM_SIMP_TAC[REAL_FIELD` &0 < v' /\ &0 < w' ==> v' / (v' + w') + w' / (v' + w') = &1`];
\r
2301 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC];
\r
2302 ASM_SIMP_TAC[REAL_FIELD` &0 < v' /\ &0 < w' ==> &1 / (v' + w') * v' = v' / ( v' + w') /\ (&1 / (v' + w') * w') = w' / ( v' + w') `];
\r
2304 (* CASES v' < &0 and w' < &0 *)
\r
2305 ASM_CASES_TAC ` v' < &0 /\ w' < &0 `;
\r
2306 ASM_REWRITE_TAC[VECTOR_ARITH` a = x % b + c + d <=> a - x % b = c + d`];
\r
2308 EXISTS_TAC ` v:real^N `;
\r
2309 EXISTS_TAC `w:real^N `;
\r
2310 EXISTS_TAC ` (&1 / (v' + w') ) % ( z - u' % x:real^N ) `;
\r
2311 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_INSERT; AFF2;
\r
2312 Geomdetail.CONV0_SET2; IN_INTER; IN_ELIM_THM];
\r
2314 EXISTS_TAC ` ( -- u') / (v' + w' ) `;
\r
2315 REWRITE_TAC[VECTOR_SUB_LDISTRIB; VECTOR_MUL_ASSOC; REAL_ARITH` (&1 / a ) * b = b / a `];
\r
2316 ASM_SIMP_TAC [REAL_FIELD` v' < &0 /\ w' < &0 ==> &1 - --u' / (v' + w') = (u' + v' + w' ) / (v' + w') `];
\r
2318 REWRITE_TAC[REAL_ARITH` &1 - ( a + b) + a + b = &1 `];
\r
2320 EXISTS_TAC ` v' / ( v' + w') `;
\r
2321 EXISTS_TAC ` w' / ( v' + w') `;
\r
2323 MATCH_MP_TAC REAL_LT_DIV_NEG;
\r
2324 ASM_SIMP_TAC[REAL_ARITH` a < &0 /\ b < &0 ==> a + b < &0`];
\r
2328 MATCH_MP_TAC REAL_LT_DIV_NEG;
\r
2329 ASM_SIMP_TAC[REAL_ARITH` a < &0 /\ b < &0 ==> a + b < &0`];
\r
2331 ASM_SIMP_TAC[REAL_FIELD` v' < &0 /\ w' < &0 ==> v' / (v' + w') + w' / (v' + w') = &1`];
\r
2332 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC];
\r
2333 ASM_SIMP_TAC[REAL_FIELD` v' < &0 /\ w' < &0 ==> &1 / (v' + w') * v' = v' / ( v' + w') /\ (&1 / (v' + w') * w') = w' / ( v' + w') `];
\r
2336 UNDISCH_TAC ` ~(aff_gt {x} {v, w} INTER aff_lt {x} {u:real^N} = {})`;
\r
2337 UNDISCH_TAC ` ~ ( x = u:real^N) `;
\r
2339 ASM_SIMP_TAC[Planarity.AFF_GT_1_2; AFF_LT_1_1; SET_RULE` ~( a INTER b = {} ) <=> ? x. x IN a /\ x IN b `; IN_ELIM_THM; SET_RULE` ~( a = b ) <=> DISJOINT {a} {b} `];
\r
2341 FIRST_ASSUM (SUBST1_TAC o SYM);
\r
2344 ASM_CASES_TAC ` v' = &0 \/ w' = &0`;
\r
2346 SPEC_TAC (`v:real^N`,`v:real^N `);
\r
2347 SPEC_TAC (`w:real^N`,`w:real^N `);
\r
2349 SPEC_TAC (`v':real`,`v':real `);
\r
2350 SPEC_TAC (`w':real`,`w':real `);
\r
2351 SPEC_TAC (`t2:real`,`t2:real `);
\r
2352 SPEC_TAC (`t3:real`,`t3:real `);
\r
2353 MATCH_MP_TAC (MESON[]` (! t3 t2 x y a b. P x y a b t3 t2 ==> P y x b a t2 t3 ) /\ (! x y a b t3 t2 . y = &0 ==> P x y a b t3 t2)
\r
2354 ==> (! t3 t2 x y a b. (y = &0 \/ x = &0 ) ==> P x y a b t3 t2) `);
\r
2357 ONCE_REWRITE_TAC[TAUT` a ==> b ==> c <=> b ==> a ==> c `];
\r
2362 SIMP_TAC[INSERT_COMM; REAL_ADD_SYM; CONJ_SYM; VECTOR_ADD_SYM];
\r
2363 ONCE_REWRITE_TAC[EQ_SYM_EQ];
\r
2365 SIMP_TAC[INSERT_COMM];
\r
2370 DISCH_THEN SUBST_ALL_TAC;
\r
2374 REWRITE_TAC[VECTOR_ARITH` z = (&1 - (&0 + w')) % x + &0 % v + w' % w <=>
\r
2375 z - x = w' % ( w - x ) `];
\r
2377 ASM_REWRITE_TAC[];
\r
2378 ONCE_REWRITE_TAC[VECTOR_ARITH ` t1 % x + t2 % v + t3 % w = t1' % x + t2' % u
\r
2379 <=> (t1 + t2 + t3 ) % x + t2 % ( v - x ) + t3 % ( w - x ) = ( t1' + t2' ) % x + t2' % (u - x ) `];
\r
2380 ASM_REWRITE_TAC[VECTOR_ARITH` x + a = x + b <=> a = b:real^N `; VECTOR_ARITH `
\r
2381 a % z + b % x = y <=> b % x = y + -- a % z `];
\r
2385 ASM_CASES_TAC ` w' = &0 `;
\r
2386 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ];
\r
2387 MP_TAC2 (REAL_ARITH ` &0 < t3 ==> ~( t3 = &0 ) `);
\r
2388 SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE];
\r
2389 REWRITE_TAC[VECTOR_MUL_ASSOC; VECTOR_ADD_LDISTRIB;
\r
2390 VECTOR_SUB_LDISTRIB; VECTOR_ARITH` a = x - y + b % d - t <=> a + y + t = x + b % d `];
\r
2392 EXISTS_TAC `u:real^N`;
\r
2393 EXISTS_TAC `v:real^N `;
\r
2395 EXISTS_TAC ` (t3 / (w' * (t2' - t2 ))) % ( z - x + ((w' * &1 / t3) * t2') % x + ((w' * &1 / t3) * --t2) % (x:real^N) ) `;
\r
2396 REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET; IN_INTER;AFF2; IN_ELIM_THM];
\r
2399 EXISTS_TAC ` &1 - t3 / (w' * (t2' - t2)) `;
\r
2401 REWRITE_TAC[REAL_ARITH` (w' * &1 / t3) * t2' = t2' * w' / t3 `; GSYM VECTOR_ADD_RDISTRIB; VECTOR_ADD_LDISTRIB; VECTOR_SUB_LDISTRIB];
\r
2402 REWRITE_TAC[REAL_ARITH` a - ( a - b ) = b `];
\r
2404 REWRITE_TAC[VECTOR_SUB_RDISTRIB;
\r
2405 VECTOR_ARITH` x - t + z = zz - t + x:real^N <=> z = zz `];
\r
2406 STRIP_TAC THEN STRIP_TAC;
\r
2407 REWRITE_TAC[VECTOR_MUL_ASSOC; GSYM VECTOR_ADD_RDISTRIB];
\r
2408 MATCH_MP_TAC (MESON[]` a = b ==> a % x = b % x `);
\r
2409 UNDISCH_TAC ` &0 < t3 `;
\r
2410 UNDISCH_TAC ` ~ ( w' = &0) `;
\r
2411 UNDISCH_TAC ` t2' < &0 `;
\r
2412 UNDISCH_TAC ` &0 < t2 `;
\r
2413 CONV_TAC REAL_FIELD;
\r
2415 ASM_REWRITE_TAC[];
\r
2416 REWRITE_TAC[Geomdetail.CONV0_SET2; IN_ELIM_THM; VECTOR_ADD_LDISTRIB;
\r
2417 VECTOR_MUL_ASSOC];
\r
2418 EXISTS_TAC ` t3 / (w' * (t2' - t2)) * (w' * &1 / t3) * t2' `;
\r
2419 EXISTS_TAC` t3 / (w' * (t2' - t2)) * (w' * &1 / t3) * --t2 `;
\r
2422 ASM_SIMP_TAC[REAL_FIELD` ~(t3 = &0) ==> ~( w' = &0 )
\r
2423 ==> t3 / (w' * (t2' - t2)) * (w' * &1 / t3) * t2' = t2' / ( t2' - t2) `];
\r
2424 MATCH_MP_TAC REAL_LT_DIV_NEG;
\r
2425 ASM_REAL_ARITH_TAC;
\r
2427 REAL_FIELD` ~(t3 = &0) /\ ~( w' = &0 ) /\ t2' < &0 /\ &0 < t2
\r
2428 ==> t3 / (w' * (t2' - t2)) * (w' * &1 / t3) * --t2 = ( -- t2 ) / ( t2' - t2 ) /\
\r
2429 t3 / (w' * (t2' - t2)) * (w' * &1 / t3) * t2' +
\r
2430 t3 / (w' * (t2' - t2)) * (w' * &1 / t3) * --t2 =
\r
2432 ASM_REWRITE_TAC[];
\r
2434 MATCH_MP_TAC REAL_LT_DIV_NEG;
\r
2435 UNDISCH_TAC ` &0 < t2 `;
\r
2436 UNDISCH_TAC ` t2' < &0 `;
\r
2439 SIMP_TAC[DE_MORGAN_THM; REAL_ARITH` ~( a < b ) <=> a = b \/ b < a `];
\r
2440 REWRITE_TAC[TAUT` (a \/ b) /\ c /\ d <=> ((a \/ b) /\ c ) /\ d`; REAL_ARITH` (v' < &0 \/ w' < &0) /\
\r
2441 (&0 < v' \/ &0 < w') <=> v' < &0 /\ &0 < w' \/ w' < &0 /\ &0 < v' `];
\r
2444 REWRITE_TAC[TAUT` a /\ ( b \/ c ) /\ d <=> ( b \/ c) /\ a /\ d `];
\r
2445 SPEC_TAC (`v':real`,`v':real`);
\r
2446 SPEC_TAC (`t2:real`,`t2:real`);
\r
2447 SPEC_TAC (`v:real^N`,`v:real^N`);
\r
2448 SPEC_TAC (`w':real`,`w':real`);
\r
2449 SPEC_TAC (`t3:real`,`t3:real`);
\r
2450 SPEC_TAC (`w:real^N`,`w:real^N`);
\r
2452 MATCH_MP_TAC (MESON[]`(! a b c x y z. P a b c x y z ==> P x y z a b c ) /\
\r
2453 (! a b c x y z. R c z ==> P a b c x y z ) ==> (! a b c x y z. R c z \/ R z c
\r
2454 ==> P a b c x y z ) `);
\r
2456 ONCE_REWRITE_TAC[TAUT` a ==> b ==> c <=> b ==> a ==> c `];
\r
2457 REPEAT GEN_TAC THEN STRIP_TAC;
\r
2460 SIMP_TAC[INSERT_COMM; REAL_ADD_SYM; VECTOR_ADD_SYM];
\r
2461 ONCE_REWRITE_TAC[EQ_SYM_EQ];
\r
2463 SIMP_TAC[VECTOR_ADD_SYM; INSERT_COMM];
\r
2465 SWITCH_TAC ` x' = t1 % x + t2 % v + t3 % w:real^N`;
\r
2466 SWITCH_TAC `z = u' % x + v'' % v + w'' % w:real^N `;
\r
2467 ASM_REWRITE_TAC[];
\r
2468 UNDISCH_TAC ` x' = t1' % x + t2' % u:real^N `;
\r
2472 REWRITE_TAC[VECTOR_ARITH` a + b % x + c = d <=> b % x = d - a - c `];
\r
2473 MP_TAC2 (REAL_ARITH` &0 < t2 ==> ~( t2 = &0 ) `);
\r
2474 ABBREV_TAC ` set = {v,w:real^N} `;
\r
2476 SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE];
\r
2478 UNDISCH_TAC ` u' % x + v'' % v + w'' % w = z:real^N `;
\r
2479 ASM_REWRITE_TAC[VECTOR_MUL_ASSOC; VECTOR_SUB_LDISTRIB; VECTOR_ADD_LDISTRIB];
\r
2480 REWRITE_TAC[REAL_ARITH` a * &1 / b * c = ( a * c ) / b `;
\r
2481 VECTOR_ARITH ` u' % x +
\r
2482 (tt % x + vv % u) -
\r
2486 z <=> z + ( t22 - u' - tt ) % x = vv % u + (w'' - ww) % w `];
\r
2488 SUBGOAL_THEN ` &1 + ((v'' * t1) / t2 - u' - (v'' * t1') / t2) =
\r
2489 (v'' * t2') / t2 + (w'' - (v'' * t3) / t2) ` ASSUME_TAC;
\r
2491 REAL_FIELD` ~ ( m = &0 ) ==> a / m - b - c / m = ( a - m * b - c ) / m /\
\r
2492 &1 + a / m = ( m + a ) / m /\ a / m + b - c / m = (a + m * b - c ) / m`];
\r
2493 MATCH_MP_TAC (MESON[]` a = b ==> a / x = b / x`);
\r
2494 UNDISCH_TAC ` t1' + t2' = &1 `;
\r
2495 UNDISCH_TAC ` t1 + t2 + t3 = &1 `;
\r
2497 SIMP_TAC[REAL_ARITH` a + b = c <=> a = c - b `];
\r
2499 ABBREV_TAC ` tu = (v'' * t2') / t2 `;
\r
2500 ABBREV_TAC ` tw = (w'' - (v'' * t3) / t2) `;
\r
2502 EXISTS_TAC `u:real^N `;
\r
2503 EXISTS_TAC ` w:real^N `;
\r
2504 EXISTS_TAC ` ( &1 / (tu + tw) ) % ( tu % u + tw % w:real^N ) `;
\r
2506 REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET; IN_INTER];
\r
2507 SUBGOAL_THEN ` &0 < tu /\ &0 < tw ` ASSUME_TAC;
\r
2510 MATCH_MP_TAC REAL_LT_DIV;
\r
2511 ASM_REWRITE_TAC[REAL_MUL_POS_LT];
\r
2513 MATCH_MP_TAC (REAL_ARITH` &0 < a /\ b < &0 ==> &0 < a - b `);
\r
2514 ASM_REWRITE_TAC[ REAL_ARITH` a / b < &0 <=> &0 < ( -- a ) / b `];
\r
2515 MATCH_MP_TAC REAL_LT_DIV;
\r
2516 ASM_REWRITE_TAC[REAL_ARITH` -- ( a * b ) = ( -- a ) * b `; REAL_MUL_POS_LT];
\r
2517 ASM_REWRITE_TAC[REAL_ARITH ` &0 < -- a <=> a < &0 `];
\r
2519 REWRITE_TAC[AFF2; IN_ELIM_THM];
\r
2520 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
2521 EXISTS_TAC ` (&1 / (tu + tw)) * (((v'' * t1) / t2 - u' - (v'' * t1') / t2) ) `;
\r
2522 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC;
\r
2523 VECTOR_ARITH` a + z % x = z % x + b <=> a = b `];
\r
2524 MATCH_MP_TAC (MESON[]` a = b ==> a % x = b % x `);
\r
2525 UNDISCH_TAC` &1 + (v'' * t1) / t2 - u' - (v'' * t1') / t2 = tu + tw `;
\r
2527 NHANH (REAL_ARITH` &0 < a /\ &0 < b ==> ~( a + b = &0) `);
\r
2528 CONV_TAC REAL_FIELD;
\r
2530 REWRITE_TAC[IN_CONV0]]);;
\r
2535 let CVX_LO_IMP_LO = prove(` convex_local_fan (V,E,FF) ==> local_fan (V,E,FF)`,
\r
2536 SIMP_TAC[convex_local_fan]);;
\r
2540 let S_SUBSET_IMP_AFF_S_TOO = prove(
\r
2541 ` S SUBSET aff SS ==> aff S SUBSET aff SS `,
\r
2542 NHANH_PAT `\x. x ==> y ` (ISPEC ` affine ` HULL_MONO)
\r
2543 THEN SIMP_TAC[aff; HULL_HULL]);;
\r
2546 let AFF2_DET_BY_TWO_POINTS = prove_by_refinement
\r
2547 (` {x:real^N,y} SUBSET aff {a,b} /\ ~( x = y ) ==>
\r
2548 aff {a,b} = aff {x,y} `,
\r
2550 MATCH_MP_TAC Collect_geom.RCEABUJ;
\r
2551 ASM_REWRITE_TAC[line];
\r
2552 EXISTS_TAC ` a:real^N`;
\r
2553 EXISTS_TAC `b:real^N`;
\r
2556 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
2560 REWRITE_TAC[INSERT_INSERT; AFFINE_HULL_SING; aff; INSERT_SUBSET; IN_INSERT;
\r
2564 let IN_CONV0_EQ_EQ = prove(
\r
2565 `! x:real^N. x IN conv0 {a,b} ==> ( x = a <=> a = b ) `,
\r
2566 REWRITE_TAC[Geomdetail.CONV0_SET2; IN_ELIM_THM] THEN
\r
2567 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
\r
2568 UNDISCH_TAC` a' + b' = &1 ` THEN
\r
2569 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `] THEN
\r
2571 REWRITE_TAC[VECTOR_ARITH` (&1 - b') % a + b' % b = a + b' % (b - a ) `;
\r
2572 VECTOR_ARITH` a + x = a <=> x = vec 0`; VECTOR_MUL_EQ_0] THEN
\r
2573 ASM_SIMP_TAC[REAL_ARITH` &0 < a ==> ~( a = &0 ) `; VECTOR_SUB_EQ; EQ_SYM_EQ]);;
\r
2578 let CONV02_SUBSET_AFF2 = prove(` conv0 {a,b} SUBSET aff {a,b} `,
\r
2579 REWRITE_TAC[Geomdetail.CONV0_SET2; AFF2; SUBSET; IN_ELIM_THM] THEN
\r
2580 MESON_TAC[REAL_ARITH` a + b = &1 ==> b = &1 - a `]);;
\r
2584 let IN_CONV0_IMP_AFF_EQ = prove_by_refinement
\r
2585 (` a:real^N IN conv0 {x,y} ==> aff {x,y} = aff {x,a} `,
\r
2586 [NHANH IN_CONV0_EQ_EQ;
\r
2588 ASM_CASES_TAC` a = x :real^N `;
\r
2589 ASM_REWRITE_TAC[];
\r
2591 ASM_REWRITE_TAC[];
\r
2592 DISCH_THEN (SUBST1_TAC o SYM);
\r
2594 MATCH_MP_TAC AFF2_DET_BY_TWO_POINTS;
\r
2596 SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET; EQ_SYM_EQ; aff; Ldurdpn.IN_HULL_INSERT];
\r
2597 ASM_SIMP_TAC[REWRITE_RULE[SUBSET; aff] CONV02_SUBSET_AFF2]]);;
\r
2604 let IN_CONV0_AFF_SUBSET = prove(`! t:real^N. t IN aff {a,b} INTER conv0 {x,y} /\
\r
2605 x IN aff {a,b} ==> aff {x,y} SUBSET aff {a,b} `,
\r
2606 REWRITE_TAC[IN_INTER] THEN NHANH IN_CONV0_EQ_EQ THEN
\r
2607 NHANH IN_CONV0_IMP_AFF_EQ THEN GEN_TAC THEN STRIP_TAC THEN
\r
2608 ASM_REWRITE_TAC[] THEN
\r
2609 MATCH_MP_TAC Collect_geom.AFFINE_CONTAIN_LINE THEN
\r
2610 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; aff; AFFINE_AFFINE_HULL]);;
\r
2615 let CONDS_FOR_INTER_AFF_CONV0 = prove_by_refinement
\r
2618 t1 + t2 + t3 = ss /\
\r
2619 t = t1 % x + t2 % v + t3 % (w:real^N) /\
\r
2621 t = t1' % x + t2' % u
\r
2622 ==> (?tt. tt IN aff {x, u} /\ tt IN conv0 {v, w})`,
\r
2625 ASM_REWRITE_TAC[VECTOR_ARITH` a % x + y = z <=> z - a % x = y `];
\r
2626 REWRITE_TAC[ VECTOR_ARITH ` (t1' % x + u) - t1 % x = (t1' - t1 ) % x + u `];
\r
2628 EXISTS_TAC` &1 / (t2 + t3 ) % ( (t1' - t1) % x + t2' % (u:real^N) )`;
\r
2630 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; REAL_ARITH` &1 / a * b = b / a `;
\r
2631 AFF2; IN_ELIM_THM];
\r
2632 EXISTS_TAC ` (t1' - t1) / (t2 + t3) `;
\r
2633 MATCH_MP_TAC (MESON[]` a = b ==> f a = f b `);
\r
2634 MATCH_MP_TAC (MESON[]` a = b ==> a % u = b % u `);
\r
2638 DOWN THEN REMOVE_TAC;
\r
2640 CONV_TAC REAL_FIELD;
\r
2641 ASM_REWRITE_TAC[];
\r
2642 MATCH_MP_TAC IN_CONV0;
\r
2643 ASM_REWRITE_TAC[]]);;
\r
2648 let INTER_AFF_GT_LT_IMP_INTER_AFF_CONV0 = prove_by_refinement
\r
2649 (`DISJOINT {x} {v,w} /\ ~(u = x ) ==>
\r
2650 t IN aff_gt {x} {v,w} INTER aff_lt {x} {u} ==>
\r
2651 (? tt. tt IN aff {x,u} INTER conv0 {v,w}) `,
\r
2652 [SIMP_TAC[Planarity.AFF_GT_1_2; AFF_LT_1_1; SET_RULE` ~(x = y) <=> DISJOINT {y} {x}`];
\r
2653 REWRITE_TAC[IN_INTER; IN_ELIM_THM];
\r
2655 ABBREV_TAC ` ss = &1 `;
\r
2656 MATCH_MP_TAC CONDS_FOR_INTER_AFF_CONV0;
\r
2658 ASM_SIMP_TAC[]]);;
\r
2661 let SUBSET_AFF2_IMP_COLL = prove_by_refinement
\r
2662 (` S SUBSET aff {a:real^N, b} ==> collinear S `,
\r
2663 [REWRITE_TAC[collinear; SUBSET; AFF2; IN_ELIM_THM];
\r
2665 EXISTS_TAC ` a - b:real^N `;
\r
2666 FIRST_X_ASSUM NHANH;
\r
2668 EXISTS_TAC ` t - t':real `;
\r
2669 ASM_REWRITE_TAC[];
\r
2670 CONV_TAC VECTOR_ARITH]);;
\r
2674 let COLLINEAR_SUBSET_AFF2 = prove_by_refinement
\r
2675 (` a:real^N IN S /\ b IN S /\ ~( a = b ) /\ collinear S
\r
2676 ==> S SUBSET aff {a,b} `,
\r
2677 [REWRITE_TAC[collinear];
\r
2679 SUBGOAL_THEN ` ? c. a - b:real^N = c % u ` ASSUME_TAC;
\r
2682 REWRITE_TAC[SUBSET];
\r
2684 UNDISCH_TAC ` b:real^N IN S `;
\r
2686 ONCE_REWRITE_TAC[CONJ_SYM];
\r
2687 FIRST_X_ASSUM NHANH;
\r
2688 FIRST_X_ASSUM CHOOSE_TAC;
\r
2689 ASM_CASES_TAC ` c = &0 `;
\r
2690 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
2692 SIMP_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_EQ];
\r
2693 UNDISCH_TAC ` a - b = c % u:real^N `;
\r
2694 ONCE_REWRITE_TAC[EQ_SYM_EQ];
\r
2695 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE];
\r
2696 REWRITE_TAC[VECTOR_ARITH` a = x - b:real^N <=> x = a + b `];
\r
2697 STRIP_TAC THEN STRIP_TAC;
\r
2698 ASM_REWRITE_TAC[AFF2; IN_ELIM_THM; VECTOR_MUL_ASSOC; VECTOR_ARITH` a % ( x - y ) + y = a % x + ( &1 - a ) % y `];
\r
2704 let AFF_CONV0_COLL4 = prove_by_refinement
\r
2705 (` t:real^N IN aff {a, b} INTER conv0 {x, y} /\ x IN aff {a, b}
\r
2706 ==> collinear {a,b,x,y} `,
\r
2707 [NHANH IN_CONV0_AFF_SUBSET;
\r
2709 MATCH_MP_TAC (GEN_ALL SUBSET_AFF2_IMP_COLL);
\r
2710 EXISTS_TAC ` a:real^N `;
\r
2711 EXISTS_TAC `b:real^N `;
\r
2712 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; Planarity.POINT_IN_LINE];
\r
2714 ONCE_REWRITE_TAC[INSERT_COMM];
\r
2715 REWRITE_TAC[SUBSET; Planarity.POINT_IN_LINE];
\r
2718 FIRST_ASSUM MATCH_MP_TAC;
\r
2719 PURE_ONCE_REWRITE_TAC[INSERT_COMM];
\r
2720 PURE_REWRITE_TAC[Planarity.POINT_IN_LINE];
\r
2721 FIRST_ASSUM MATCH_MP_TAC;
\r
2722 PURE_REWRITE_TAC[Planarity.POINT_IN_LINE]]);;
\r
2727 let CONDS_IN_HAFL_LINE = prove(
\r
2728 `&0 <= t /\ a - x = t % (b - x) ==> a IN aff_ge {x} {b} `,
\r
2729 REWRITE_TAC[HALFLINE; IN_ELIM_THM] THEN STRIP_TAC THEN
\r
2730 EXISTS_TAC ` t:real ` THEN ASM_REWRITE_TAC[] THEN DOWN
\r
2731 THEN CONV_TAC VECTOR_ARITH);;
\r
2733 let PRESERABLE_AFF_GE_SUBSET = prove(
\r
2734 ` a IN aff_ge {x} {b} ==> aff_ge {x} {a} SUBSET aff_ge {x} {b} `,
\r
2735 REWRITE_TAC[HALFLINE; SUBSET; IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN
\r
2736 EXISTS_TAC ` t * t':real ` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [
\r
2737 MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[]; VECTOR_ARITH_TAC]);;
\r
2743 let AFF_GE_EQ = prove_by_refinement
\r
2744 (`&0 < t /\ a - x:real^N = t % (b - x) ==>
\r
2745 aff_ge {x} {a} = aff_ge {x} {b} `,
\r
2747 SUBGOAL_THEN ` a:real^N IN aff_ge {x} {b} ` ASSUME_TAC;
\r
2748 MATCH_MP_TAC CONDS_IN_HAFL_LINE;
\r
2749 ASM_REWRITE_TAC[];
\r
2750 ASM_REAL_ARITH_TAC;
\r
2751 SUBGOAL_THEN ` b:real^N IN aff_ge {x} {a} ` ASSUME_TAC;
\r
2752 MATCH_MP_TAC (GEN_ALL CONDS_IN_HAFL_LINE);
\r
2753 EXISTS_TAC ` &1 / t `;
\r
2754 ASSUME_TAC2 (REAL_ARITH` &0 < t ==> ~( t = &0 ) `);
\r
2755 SWITCH_TAC `a - x = t % (b - x:real^N)`;
\r
2757 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE];
\r
2759 MATCH_MP_TAC REAL_LE_DIV;
\r
2760 UNDISCH_TAC ` &0 < t `;
\r
2763 NHANH PRESERABLE_AFF_GE_SUBSET;
\r
2769 let FAN_INTERSECTION_PRO_EXPRESS = prove_by_refinement
\r
2770 (` FAN (x:real^N,V,E) /\ a IN V /\ b IN V /\ ~( a = b )
\r
2771 ==> ~( ? t. &0 < t /\
\r
2772 a - x = t % ( b - x ) )`,
\r
2773 [NHANH FAN_IMP_V_DIFF;
\r
2774 REWRITE_TAC[FAN; fan7];
\r
2776 SUBGOAL_THEN ` aff_ge {x} {a:real^N} INTER aff_ge {x} {b} = aff_ge {x} ({a} INTER {b})` ASSUME_TAC;
\r
2777 FIRST_X_ASSUM MATCH_MP_TAC;
\r
2778 REWRITE_TAC[IN_UNION; IN_ELIM_THM; SET_RULE` {a} = {b} <=> a = b `];
\r
2781 SIMP_TAC[SET_RULE` ~(a = b) <=> {a} INTER {b} = {} `; AFF_GE_EQ_AFFINE_HULL];
\r
2782 REWRITE_TAC[AFFINE_HULL_SING];
\r
2785 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
2786 SUBGOAL_THEN ` b IN aff_ge {x} {b} INTER aff_ge {x} {b:real^N} ` ASSUME_TAC;
\r
2787 REWRITE_TAC[ENDS_IN_HALFLINE; IN_INTER];
\r
2789 ASM_SIMP_TAC[IN_INSERT; NOT_IN_EMPTY]]);;
\r
2795 let FAN_INTERSECTION_PRO_EXPRESS2 =
\r
2796 MESON[FAN_INTERSECTION_PRO_EXPRESS]`FAN (x:real^N,V,E) /\ a IN V /\ b IN V
\r
2797 /\ ~(a = b) /\ &0 < t ==> ~( a - x = t % (b - x))`;;
\r
2803 let FAN_AFF2_INTER_CONV0_IMP_NO_IN_AF = prove_by_refinement
\r
2804 (` FAN (x:real^N,V,E) /\ {u,v,w} SUBSET V /\ t IN aff {x,v} INTER conv0 {u,w}
\r
2805 /\ CARD {u,v,w} = 3 ==> ~( u IN aff {x,v} )`,
\r
2806 [NHANH FAN_IMP_V_DIFF;
\r
2810 ISPECL [` t:real^N `;` x:real^N`;` v:real^N `;`u:real^N `;` w:real^N `] (GEN_ALL AFF_CONV0_COLL4));
\r
2811 SUBGOAL_THEN ` {x, v, u, w} SUBSET aff { x,v:real^N } ` ASSUME_TAC;
\r
2812 MATCH_MP_TAC COLLINEAR_SUBSET_AFF2;
\r
2813 ASM_REWRITE_TAC[IN_INSERT];
\r
2815 SIMP_TAC[EQ_SYM_EQ; INSERT_SUBSET];
\r
2817 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; Planarity.POINT_IN_LINE];
\r
2818 ONCE_REWRITE_TAC[INSERT_COMM];
\r
2819 REWRITE_TAC[Planarity.POINT_IN_LINE];
\r
2820 REWRITE_TAC[AFF2; IN_ELIM_THM];
\r
2822 ASM_CASES_TAC ` &0 < t' \/ &0 < t'' `;
\r
2824 (* very smart way *)
\r
2826 REPLICATE_TAC 5 DOWN;
\r
2830 SPEC_TAC (`t':real`,`t':real`);
\r
2831 SPEC_TAC (`u:real^N `,`u:real^N `);
\r
2832 SPEC_TAC (`t'':real`,`t'':real`);
\r
2833 SPEC_TAC (`w:real^N `,`w:real^N`);
\r
2835 MESON[]` (! x a y b. P x a y b ==> P y b x a ) /\ (! x a y b. ~( Q b /\ P x a y b )) ==> (! x a y b. ~(( Q b \/ Q a ) /\ P x a y b )) `);
\r
2837 ONCE_REWRITE_TAC[EQ_SYM_EQ];
\r
2838 SIMP_TAC[INSERT_COMM];
\r
2840 REWRITE_TAC[Geomdetail.CARD3];
\r
2842 UNDISCH_TAC` u = t' % v + (&1 - t') % x:real^N `;
\r
2843 REWRITE_TAC[VECTOR_ARITH` u = t' % v + (&1 - t') % x <=> u - x = t' % (v - x )`];
\r
2846 MESON[FAN_INTERSECTION_PRO_EXPRESS]`FAN (x,V,E) /\ a IN V /\ b IN V /\ ~(a = b)
\r
2847 /\ &0 < t ==> ~( a - x = t % (b - x))`);
\r
2849 SIMP_TAC[INSERT_SUBSET; DE_MORGAN_THM];
\r
2851 ASM_CASES_TAC` t' = &0 `;
\r
2852 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
2853 UNDISCH_TAC ` u = &0 % v + (&1 - &0) % x:real^N `;
\r
2854 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_RDISTRIB; VECTOR_ADD_LID; VECTOR_SUB_RZERO; VECTOR_MUL_LID];
\r
2855 UNDISCH_TAC ` {u, v, w} SUBSET V:real^N -> bool `;
\r
2856 ASM_SIMP_TAC[INSERT_SUBSET];
\r
2858 ASM_CASES_TAC ` t'' = &0 `;
\r
2859 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
2860 UNDISCH_TAC ` w = &0 % v + (&1 - &0) % x:real^N `;
\r
2861 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_RDISTRIB; VECTOR_ADD_LID; VECTOR_SUB_RZERO; VECTOR_MUL_LID];
\r
2862 UNDISCH_TAC ` {u, v, w} SUBSET V:real^N -> bool `;
\r
2863 ASM_SIMP_TAC[INSERT_SUBSET];
\r
2864 DOWN THEN DOWN THEN DOWN THEN PHA;
\r
2865 REWRITE_TAC[REAL_ARITH` ~(&0 < t' \/ &0 < t'') /\ ~(t' = &0) /\ ~(t'' = &0)
\r
2866 <=> t' < &0 /\ t'' < &0 `];
\r
2868 REWRITE_TAC[VECTOR_ARITH` u = t' % v + (&1 - t') % x <=>
\r
2869 u - x = t'% ( v - x ) `];
\r
2871 ASSUME_TAC2 (REAL_ARITH` t' < &0 ==> ~( t' = &0) `);
\r
2872 SWITCH_TAC ` u - x = t' % (v - x:real^N)`;
\r
2874 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE];
\r
2876 UNDISCH_TAC ` w - x = t'' % (v - x:real^N)`;
\r
2877 ASM_REWRITE_TAC[VECTOR_MUL_ASSOC];
\r
2878 MATCH_MP_TAC FAN_INTERSECTION_PRO_EXPRESS2;
\r
2880 SIMP_TAC[INSERT_SUBSET; Geomdetail.CARD3; DE_MORGAN_THM; REAL_ARITH ` a * &1 / b = a / b `];
\r
2882 MATCH_MP_TAC REAL_LT_DIV_NEG;
\r
2883 ASM_REWRITE_TAC[]]);;
\r
2888 let AFF2_ITR_CONV0_IMP_SAME_ENDS = prove(
\r
2889 `! a b. t IN aff {x,y} INTER conv0 {a,b} ==>
\r
2890 (a IN aff {x,y} <=> b IN aff {x,y} ) `,
\r
2892 MESON[]` (! a b. P a b ==> P b a ) /\ (! a b. P a b /\ Q a ==> Q b )
\r
2893 ==> (! a b. P a b ==> (Q a <=> Q b )) `) THEN
\r
2894 SIMP_TAC[INSERT_COMM; INTER_COMM] THEN
\r
2895 NHANH IN_CONV0_AFF_SUBSET THEN REWRITE_TAC[SUBSET] THEN
\r
2896 REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
\r
2897 REWRITE_TAC[Planarity.POINT_IN_LINE1]);;
\r
2904 let AFF_XX_CASES = prove_by_refinement
\r
2905 (`!x: real^N. aff_lt {x} {x} = {} /\ aff_le {x} {x} = {} /\
\r
2906 aff_gt {x} {x} = {x}`,
\r
2907 [REWRITE_TAC[aff_le_def; sgn_le; aff_lt_def; aff_gt_def; affsign; FUN_EQ_THM; UNION_IDEMPOT; SET_RULE`~( {} x)`; sgn_gt; lin_combo; VSUM_SING; SUM_SING; sgn_lt] THEN
\r
2908 REWRITE_TAC[SET_RULE` {x} a <=> x = a `];
\r
2911 MESON_TAC[REAL_ARITH` ~( &1 < &0 ) `];
\r
2913 MESON_TAC[REAL_ARITH` ~( &1 <= &0 ) `];
\r
2917 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
2919 SIMP_TAC[VECTOR_MUL_LID];
\r
2921 EXISTS_TAC `(\x:real^N. &1 ) `;
\r
2922 ASM_REWRITE_TAC[VECTOR_MUL_LID];
\r
2923 GEN_TAC THEN DISCH_TAC;
\r
2924 REAL_ARITH_TAC]);;
\r
2929 let NOT_X_IN_AFF_X_A = prove_by_refinement
\r
2930 (` ~ ( x:real^N IN aff_lt {x} {a} )`,
\r
2931 [ASM_CASES_TAC ` x = a:real^N `;
\r
2932 ASM_REWRITE_TAC[AFF_XX_CASES; NOT_IN_EMPTY];
\r
2934 SIMP_TAC[SET_RULE` ~( a = x ) <=> DISJOINT {a} {x} `; AFF_LT_1_1];
\r
2935 REWRITE_TAC[GSYM (SET_RULE` ~( a = x ) <=> DISJOINT {a} {x} `); IN_ELIM_THM;
\r
2936 VECTOR_ARITH` x = t1 % x + t2 % a <=> t2 % ( a - x ) = x - (t1 + t2 ) % x `];
\r
2939 ASM_REWRITE_TAC[VECTOR_ARITH` x - &1 % x = vec 0 `; VECTOR_MUL_EQ_0; VECTOR_SUB_EQ];
\r
2940 ASM_REAL_ARITH_TAC]);;
\r
2945 let INTER_EQ_EM_EXPAND = SET_RULE` A INTER B = {} <=> ~( ?x. x IN A /\ x IN B )`;;
\r
2951 let NOT_INTER_EQ_EM_IMP_AFF_SUBSET = prove_by_refinement
\r
2952 (` x' IN aff_gt {x:real^N} {v, w} INTER aff_lt {x} {u}
\r
2953 ==> aff {x,u} SUBSET affine hull {x,v,w} `, [REWRITE_TAC[IN_INTER];
\r
2954 STRIP_TAC; SUBGOAL_THEN ` ~ (x' = x:real^N) ` ASSUME_TAC;
\r
2955 ASM_MESON_TAC[NOT_X_IN_AFF_X_A];
\r
2956 SUBGOAL_THEN ` {x,x':real^N} SUBSET aff {x,u} ` ASSUME_TAC;
\r
2957 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; Planarity.POINT_IN_LINE];
\r
2958 MP_TAC (ISPECL [`{x:real^N }`;` {u:real^N }`] AFF_LT_SUBSET_AFFINE_HULL);
\r
2959 REWRITE_TAC[GSYM aff; SET_RULE` {x} UNION S = x INSERT S `; SUBSET];
\r
2961 SUBGOAL_THEN ` aff {x,u:real^N} = aff {x,x'} ` ASSUME_TAC;
\r
2962 MATCH_MP_TAC AFF2_DET_BY_TWO_POINTS;
\r
2964 ASM_REWRITE_TAC[];
\r
2965 MATCH_MP_TAC Collect_geom.AFFINE_CONTAIN_LINE;
\r
2966 REWRITE_TAC[AFFINE_AFFINE_HULL];
\r
2967 MP_TAC (ISPECL [`{x:real^N }`;` {v,w:real^N }`] AFF_GT_SUBSET_AFFINE_HULL);
\r
2968 REWRITE_TAC[aff; SET_RULE` {x} UNION S = x INSERT S `; INSERT_SUBSET;
\r
2969 EMPTY_SUBSET; Ldurdpn.IN_HULL_INSERT];
\r
2970 REWRITE_TAC[SUBSET];
\r
2971 DISCH_THEN MATCH_MP_TAC;
\r
2972 FIRST_ASSUM ACCEPT_TAC]);;
\r
2975 let IN_AFF_HULL_3 = prove(` x' IN aff_gt {x} {v, w} INTER aff_lt {x} {u}
\r
2976 ==> u IN affine hull {x, v, w} `,
\r
2977 NHANH NOT_INTER_EQ_EM_IMP_AFF_SUBSET THEN
\r
2978 REWRITE_TAC[AFF2; SUBSET; IN_ELIM_THM] THEN
\r
2979 STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN
\r
2980 EXISTS_TAC ` &0 ` THEN VECTOR_ARITH_TAC);;
\r
2985 let LOCAL_FAN_ORBIT_MAP_VITER = prove(
\r
2986 ` local_fan (V,E,FF) ==> (! v n. v IN V ==> ITER n (rho_node1 FF) v IN V ) `,
\r
2987 NHANH LOCAL_FAN_ORBIT_MAP_V THEN STRIP_TAC THEN REPEAT GEN_TAC THEN
\r
2988 FIRST_X_ASSUM (NHANH_PAT `\x. x ==> y `) THEN STRIP_TAC THEN EXPAND_TAC "V"
\r
2989 THEN REWRITE_TAC[REWRITE_RULE[POWER_TO_ITER] Hypermap.lemma_in_orbit]);;
\r
2995 let INTER_AFF_GT_LT_IMP_INTER_AFF_CONV0 = REWRITE_RULE[TAUT` a ==> b ==> c
\r
2996 <=> a /\ b ==> c `] (ISPEC ` t:real^N ` (GEN_ALL
\r
2997 INTER_AFF_GT_LT_IMP_INTER_AFF_CONV0));;
\r
3000 let AFF_GT_AFF_LT_INTERPRET = prove_by_refinement
\r
3001 ( `! x:real^N. DISJOINT {x} {v, w} /\ DISJOINT {x} {u}
\r
3006 a % (u - x) = b % (v - x) + c % (w - x)) <=>
\r
3007 (?tt. tt IN aff_gt {x} {v, w} INTER aff_lt {x} {u})) `,
\r
3008 [GEN_TAC THEN STRIP_TAC;
\r
3010 ASM_SIMP_TAC[Planarity.AFF_GT_1_2; AFF_LT_1_1; IN_INTER; IN_ELIM_THM];
\r
3012 EXISTS_TAC ` (x:real^N) + a % (u - x) `;
\r
3014 ASM_REWRITE_TAC[];
\r
3015 EXISTS_TAC ` &1 - b - c `;
\r
3016 EXISTS_TAC `b:real `;
\r
3017 EXISTS_TAC `c:real `;
\r
3018 ASM_REWRITE_TAC[];
\r
3022 EXISTS_TAC ` &1 - a `;
\r
3023 EXISTS_TAC `a:real `;
\r
3024 ASM_REWRITE_TAC[];
\r
3027 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
3029 ASM_SIMP_TAC[Planarity.AFF_GT_1_2; AFF_LT_1_1; IN_INTER; IN_ELIM_THM];
\r
3031 EXISTS_TAC ` t2':real `;
\r
3032 EXISTS_TAC ` t2:real ` ;
\r
3033 EXISTS_TAC ` t3:real `;
\r
3034 ASM_REWRITE_TAC[];
\r
3037 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `];
\r
3043 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `];
\r
3046 VECTOR_ARITH_TAC]);;
\r
3051 let AFF_GT_AFF_LT_INTERPRET2 = REWRITE_RULE[SET_RULE`DISJOINT {x} {v, w} /\
\r
3052 DISJOINT {x} {u} <=> DISJOINT {x} {u,v,w} `] AFF_GT_AFF_LT_INTERPRET;;
\r
3053 let EXISTS_IN = SET_RULE` ~( a = {} ) <=> ? x. x IN a `;;
\r
3056 let AFF_GT_LT_INTER_SYM = prove_by_refinement
\r
3057 (`! x:real^N. DISJOINT {x} {u, v, w} ==>
\r
3058 ~( aff_gt {x} {v,w} INTER aff_lt {x} {u} = {} ) ==>
\r
3059 ~( aff_gt {x} {u,v} INTER aff_lt {x} {w} = {} )`,
\r
3060 [REWRITE_TAC[EXISTS_IN];
\r
3061 SIMP_TAC[GSYM AFF_GT_AFF_LT_INTERPRET2];
\r
3062 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {c,a,b} `];
\r
3063 SIMP_TAC[GSYM AFF_GT_AFF_LT_INTERPRET2];
\r
3065 EXISTS_TAC ` -- c:real `;
\r
3066 EXISTS_TAC ` -- a :real `;
\r
3067 EXISTS_TAC ` b:real `;
\r
3068 ASM_SIMP_TAC[VECTOR_ARITH` a % (u - x) = b % (v - x) + c % (w - x)
\r
3069 ==> --c % (w - x) = --a % (u - x) + b % (v - x) `];
\r
3070 ASM_REAL_ARITH_TAC]);;
\r
3076 let EXISTS_INTERSECTION_PROPERPLY = prove_by_refinement
\r
3077 (` (~(z:real^N = x) /\
\r
3078 DISJOINT {x} {v, w} /\
\r
3080 ~(aff_gt {x} {v, w} INTER aff_lt {x} {u} = {}) /\
\r
3081 z IN affine hull {x, v, w}) /\
\r
3082 ~ collinear {x,v,w}
\r
3084 {a, b} SUBSET {u, v, w} /\
\r
3085 t IN aff {x, z} INTER conv0 {a, b} /\
\r
3086 ~(a IN aff {x,z}))`,
\r
3087 [NHANH INTERSECTION_LEMMA;
\r
3089 ASM_CASES_TAC` ~( a:real^N IN aff {x,z}) `;
\r
3090 EXISTS_TAC ` a:real^N `;
\r
3091 EXISTS_TAC ` b:real^N `;
\r
3092 EXISTS_TAC ` t:real^N `;
\r
3093 ASM_REWRITE_TAC[];
\r
3094 UNDISCH_TAC` {a, b} SUBSET {u, v, w:real^N } `;
\r
3095 ONCE_REWRITE_TAC[INSERT_SUBSET];
\r
3096 ONCE_REWRITE_TAC[IN_INSERT];
\r
3098 EXISTS_TAC` v:real^N `;
\r
3099 EXISTS_TAC `w:real^N `;
\r
3100 REWRITE_TAC[IN_INSERT; INSERT_SUBSET; EMPTY_SUBSET];
\r
3101 SUBGOAL_THEN` (?tt. tt IN aff {x, u} INTER conv0 {v, w:real^N})` MP_TAC;
\r
3102 MATCH_MP_TAC (GEN_ALL INTER_AFF_GT_LT_IMP_INTER_AFF_CONV0);
\r
3104 UNDISCH_TAC ` ~(aff_gt {x} {v, w} INTER aff_lt {x} {u:real^N} = {}) `;
\r
3107 EXISTS_TAC `tt:real^N `;
\r
3108 SUBGOAL_THEN` aff {x,z} = aff {x,u:real^N} ` SUBST_ALL_TAC;
\r
3109 MATCH_MP_TAC Planarity.sym_line_fan1;
\r
3110 UNDISCH_TAC ` ~ ~(a IN aff {x, z:real^N}) `;
\r
3111 ASM_SIMP_TAC[SET_RULE` DISJOINT {x} {u,z} <=> ~( z = x ) /\ ~ (x = u )`];
\r
3112 ASM_REWRITE_TAC[];
\r
3114 SUBGOAL_THEN ` w IN aff {x, u:real^N} ` MP_TAC;
\r
3116 NHANH AFF2_ITR_CONV0_IMP_SAME_ENDS;
\r
3119 SUBGOAL_THEN ` {x,v,w:real^N} SUBSET aff {x,u} ` MP_TAC;
\r
3120 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; Planarity.POINT_IN_LINE];
\r
3122 NHANH SUBSET_AFF2_IMP_COLL;
\r
3123 ASM_REWRITE_TAC[];
\r
3124 UNDISCH_TAC` a IN {v,w:real^N} ` ;
\r
3125 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
\r
3128 SPEC_TAC (`v:real^N`,`v:real^N`);
\r
3129 SPEC_TAC (`w:real^N`,`w:real^N`);
\r
3130 MATCH_MP_TAC (MESON[]` (! x y. (P x y ==> P y x) /\ ( L x y ==> L y x )) /\
\r
3131 (! x y. a = x /\ P x y ==> L x y ) ==>
\r
3132 (! y x. (a = x \/ a = y) /\ P x y ==> L x y ) `);
\r
3134 SIMP_TAC[INSERT_COMM; DISJ_SYM];
\r
3136 EXISTS_TAC ` w:real^N`;
\r
3137 EXISTS_TAC `u:real^N`;
\r
3138 REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET; RIGHT_EXISTS_AND_THM];
\r
3141 SUBGOAL_THEN ` {x:real^N,v,w} SUBSET aff {x,z} ` MP_TAC;
\r
3142 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
3143 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; Planarity.POINT_IN_LINE];
\r
3144 UNDISCH_TAC` ~collinear {x, v, w:real^N}`;
\r
3145 MESON_TAC[SUBSET_AFF2_IMP_COLL];
\r
3146 SUBGOAL_THEN ` aff {x, z} = aff {x,v:real^N}` SUBST1_TAC;
\r
3147 MATCH_MP_TAC AFF2_DET_BY_TWO_POINTS;
\r
3148 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; Planarity.POINT_IN_LINE];
\r
3149 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
3150 ASM_SIMP_TAC[EQ_SYM_EQ];
\r
3151 UNDISCH_TAC` DISJOINT {x} {v, w:real^N}` ;
\r
3153 MATCH_MP_TAC (GEN_ALL INTER_AFF_GT_LT_IMP_INTER_AFF_CONV0);
\r
3154 ASM_SIMP_TAC[INSERT_COMM; RIGHT_EXISTS_AND_THM];
\r
3156 DOWN THEN DOWN THEN DOWN;
\r
3158 REWRITE_TAC[GSYM EXISTS_IN];
\r
3160 REWRITE_RULE[TAUT` a ==> b ==> c <=> a /\ b ==> c `] AFF_GT_LT_INTER_SYM);
\r
3161 ASM_SIMP_TAC[INSERT_COMM];
\r
3162 DOWN THEN DOWN THEN SET_TAC[]]);;
\r
3169 let LOFA_V_SUBSET_AFF_HULL = prove_by_refinement
\r
3172 convex_local_fan (V,E,FF) /\
\r
3174 ~(aff_gt {vec 0} {v, w} INTER aff_lt {vec 0} {u} = {})
\r
3175 ==> V SUBSET affine hull {v,w,vec 0} /\
\r
3176 ~ collinear {vec 0,v,w} `,
\r
3177 [NHANH CVX_LO_IMP_LO;
\r
3178 PURE_ONCE_REWRITE_TAC[TAUT` a /\ (b /\c)/\d <=>(c/\a)/\b/\d `];
\r
3179 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;
\r
3181 NHANH LOCAL_FAN_ORBIT_MAP_V;
\r
3183 ONCE_REWRITE_TAC[TAUT` a /\b/\c/\d <=> (a/\c)/\b/\d`];
\r
3184 NHANH LOCAL_FAN_IMP_IN_V;
\r
3186 UNDISCH_TAC ` v:real^3 IN V`;
\r
3187 FIRST_ASSUM NHANH;
\r
3189 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
3190 REWRITE_TAC[orbit_map; SUBSET; IN_ELIM_THM; ARITH_RULE` a >= 0`];
\r
3192 ASM_REWRITE_TAC[];
\r
3193 SPEC_TAC (`n:num`,`n:num`);
\r
3195 REWRITE_TAC[POWER_0; I_THM; Trigonometry2.IN_P_HULL_INSERT];
\r
3196 MP_TAC (ISPECL [`u:real^3 `;`v:real^3`;`w:real^3 `;` vec 0: real^3 `;
\r
3197 ` (rho_node1 FF POWER n') v `] (GEN_ALL EXISTS_INTERSECTION_PROPERPLY));
\r
3199 ASM_SIMP_TAC[INSERT_COMM; DISJOINT_INSERT; DISJOINT_EMPTY; IN_INSERT; DE_MORGAN_THM; NOT_IN_EMPTY];
\r
3200 SUBGOAL_THEN ` (rho_node1 FF POWER n') v IN V ` ASSUME_TAC;
\r
3201 ABBREV_TAC `conjl <=> (rho_node1 FF POWER n') v IN V `;
\r
3202 UNDISCH_TAC ` v:real^3 IN V `;
\r
3203 FIRST_X_ASSUM NHANH;
\r
3204 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
3207 REWRITE_TAC[orbit_map; IN_ELIM_THM; ARITH_RULE` a >= 0`];
\r
3209 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
3210 NHANH FAN_IMP_V_DIFF;
\r
3211 ASM_SIMP_TAC[EQ_SYM_EQ];
\r
3213 SUBGOAL_THEN ` ~(b IN aff {vec 0, (rho_node1 FF POWER n') v})` MP_TAC;
\r
3216 NHANH AFF2_ITR_CONV0_IMP_SAME_ENDS;
\r
3219 REWRITE_TAC[SET_RULE` ~( x IN S ) /\ ~(y IN S ) <=> {x,y} INTER S = {} `];
\r
3221 SUBGOAL_THEN ` interior_angle1 (vec 0) FF ((rho_node1 FF POWER n') v) = pi /\
\r
3222 rho_node1 FF ((rho_node1 FF POWER n') v) IN (affine hull {v, w, vec 0}) /\
\r
3223 ivs_rho_node1 FF ((rho_node1 FF POWER n') v) IN ( affine hull {v, w, vec 0})` ASSUME_TAC;
\r
3224 MATCH_MP_TAC (GEN_ALL OZQVSFF);
\r
3225 EXISTS_TAC `E:(real^3 -> bool) -> bool `;
\r
3226 EXISTS_TAC `V:real^3 -> bool `;
\r
3227 EXISTS_TAC ` a:real^3 `;
\r
3228 EXISTS_TAC ` b:real^3 `;
\r
3229 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
3230 SUBGOAL_THEN ` {a,b:real^3} SUBSET V` MP_TAC;
\r
3231 UNDISCH_TAC `{a, b} SUBSET {u, v, w:real^3}`;
\r
3232 MATCH_MP_TAC (SET_RULE` A SUBSET B ==> c SUBSET A ==> c SUBSET B `);
\r
3233 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
3234 SIMP_TAC[INSERT_SUBSET];
\r
3235 SUBGOAL_THEN ` {u, v, w} SUBSET affine hull {v,w,vec 0:real^3}` ASSUME_TAC;
\r
3236 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; Ldurdpn.IN_HULL_INSERT];
\r
3237 ONCE_REWRITE_TAC[INSERT_COMM];
\r
3238 REWRITE_TAC[Ldurdpn.IN_HULL_INSERT];
\r
3239 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {c,b,a} `];
\r
3240 MATCH_MP_TAC (GEN_ALL IN_AFF_HULL_3);
\r
3241 UNDISCH_TAC` ~(aff_gt {vec 0} {v:real^3, w} INTER aff_lt {vec 0} {u} = {}) `;
\r
3243 ASSUME_TAC2 (ISPECL [`{a,b:real^3}`;` {u,v,w:real^3}`;
\r
3244 `affine hull {v,w, vec 0:real^3 }` ] SUBSET_TRANS);
\r
3246 SIMP_TAC[INSERT_SUBSET];
\r
3247 STRIP_TAC THEN STRIP_TAC;
\r
3248 ONCE_REWRITE_TAC[SET_RULE`{a,b,c} = {c,a,b} `];
\r
3249 REWRITE_TAC[Ldurdpn.IN_HULL_INSERT; POWER_TO_ITER];
\r
3250 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
3251 UNDISCH_TAC `v:real^3 IN V `;
\r
3252 FIRST_X_ASSUM (MP_TAC o (SPECL [`v:real^3`;` n': num `]));
\r
3257 REWRITE_TAC[plane];
\r
3258 EXISTS_TAC ` vec 0:real^3 `;
\r
3259 EXISTS_TAC `v:real^3 `;
\r
3260 EXISTS_TAC `w:real^3 `;
\r
3261 ASM_REWRITE_TAC[];
\r
3262 UNDISCH_TAC ` t IN aff {vec 0, (rho_node1 FF POWER n') v} INTER conv0 {a, b:real^3}`;
\r
3263 SIMP_TAC[INSERT_COMM; POWER_TO_ITER];
\r
3266 SIMP_TAC[COM_POWER; o_THM]]);;
\r
3272 let DETER_RHO_NODE = prove(` local_fan (V,E,FF) /\ v,w IN FF
\r
3273 ==> rho_node1 FF v = w `, NHANH LOCAL_FAN_RHO_NODE_PROS THEN
\r
3274 STRIP_TAC THEN DOWN THEN FIRST_X_ASSUM NHANH THEN
\r
3275 SIMP_TAC[PAIR_EQ]);;
\r
3280 let CARD_RECUSIVE_EQ = prove_by_refinement
\r
3281 (` !k f. 0 < k ==>
\r
3282 (CARD {ITER n f x:A | n < k} = k
\r
3283 <=> CARD {ITER n f x | n < k - 1} = k - 1 /\
\r
3284 (!i. i < k - 1 ==> ~(ITER i f x = ITER (k - 1) f x))) `,
\r
3288 REWRITE_TAC[Wrgcvdr_cizmrrh.CARD_K_FIRST_ELMS_EQ_K];
\r
3289 SUBGOAL_THEN ` {ITER n f x:A | n < k} = ITER (k - 1) f x INSERT {ITER n f x | n < k - 1} ` SUBST1_TAC;
\r
3290 REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_INSERT];
\r
3291 ASM_SIMP_TAC[ARITH_RULE`0 < b ==> ( a < b <=> a = b - 1 \/ a < b - 1 )`];
\r
3294 SUBGOAL_THEN ` FINITE {ITER n f x:A | n < k - 1} /\
\r
3295 ~( ITER (k - 1) f x IN {ITER n f x | n < k - 1}) ` ASSUME_TAC;
\r
3296 REWRITE_TAC[IN_ELIM_THM; SET_RULE` {ITER n f x | n < k } = {y | ?n. n < k /\
\r
3297 y = ITER n f x}`; Wrgcvdr_cizmrrh.FINITE_OF_N_FIRST_ELMS];
\r
3298 DOWN THEN MESON_TAC[];
\r
3299 DOWN THEN STRIP_TAC;
\r
3300 ASM_SIMP_TAC[Geomdetail.CARD_CLAUSES_IMP];
\r
3301 UNDISCH_TAC ` 0 < k `;
\r
3308 let LE_CARDV_IMP_CARD_DETERED = prove_by_refinement
\r
3309 (`(! v. v:A IN V ==> orbit_map f v = V ) /\ v IN V ==>
\r
3310 (! l. l <= CARD V ==> CARD {ITER n f v | n < l} = l)`,
\r
3313 REWRITE_TAC[LT; SET_RULE` {ITER n f v | n | F} = {} `; CARD_CLAUSES];
\r
3314 NHANH (ARITH_RULE` SUC n <= c ==> n <= c `);
\r
3315 FIRST_X_ASSUM NHANH;
\r
3317 MP_TAC (ARITH_RULE` 0 < SUC l `);
\r
3318 ASM_SIMP_TAC[ CARD_RECUSIVE_EQ; ARITH_RULE` SUC l - 1 = l `];
\r
3321 ONCE_REWRITE_TAC[EQ_SYM_EQ];
\r
3322 MATCH_MP_TAC LOOP_MAP_IMP_DIFF_FIRST_ELMS;
\r
3323 ASM_REWRITE_TAC[];
\r
3324 UNDISCH_TAC ` SUC l <= CARD (V:A -> bool) `;
\r
3328 let LEMMA_SUBSET_ORBIT_MAP = REWRITE_RULE[POWER_TO_ITER] Hypermap.lemma_subset_orbit;;
\r
3332 let LEMMA_SUBSET_ORBIT_MAP_LT = prove(
\r
3333 ` {ITER i p x | i < n} SUBSET orbit_map p x`,
\r
3334 ASM_CASES_TAC ` n = 0 ` THENL [ASM_REWRITE_TAC[LT] THEN SET_TAC[];
\r
3335 ASM_SIMP_TAC[ARITH_RULE`~( b = 0 ) ==> ( a < b <=> a <= b - 1) `;
\r
3336 LEMMA_SUBSET_ORBIT_MAP]]);;
\r
3340 let LOOP_SET_DETER_FIRTS_ELMS = prove_by_refinement
\r
3341 (` (!v. v:A IN V ==> orbit_map f v = V) ==>
\r
3342 (! v. v IN V ==> {ITER n f v | n < CARD V } = V ) `,
\r
3343 [REPEAT STRIP_TAC;
\r
3344 SUBGOAL_THEN ` CARD {ITER n f v:A | n < CARD V} = CARD (V:A -> bool) ` MP_TAC;
\r
3345 ASSUME_TAC2 LE_CARDV_IMP_CARD_DETERED;
\r
3346 FIRST_X_ASSUM MATCH_MP_TAC;
\r
3348 SUBGOAL_THEN ` {ITER n f v:A | n < CARD V} SUBSET V ` ASSUME_TAC;
\r
3350 FIRST_X_ASSUM NHANH;
\r
3352 ABBREV_TAC ` nn = CARD (V:A -> bool) `;
\r
3354 REWRITE_TAC[ARITH_RULE ` a < b ==> a <= b - 1 `; LEMMA_SUBSET_ORBIT_MAP_LT];
\r
3356 SIMP_TAC[EQ_SYM_EQ];
\r
3357 NHANH SELF_CYCLIC_IMP_FINITE;
\r
3358 ONCE_REWRITE_TAC[EQ_SYM_EQ];
\r
3360 ASM_SIMP_TAC[GSYM SUBSET_CARD_EQ]]);;
\r
3365 let lemma_in_orbit_iter = REWRITE_RULE[POWER_TO_ITER] Hypermap.lemma_in_orbit;;
\r
3370 let SIN_SUB_PERIODIC = prove(` sin x = -- ( sin ( x - pi )) `,
\r
3371 REWRITE_TAC[GSYM SIN_PERIODIC_PI; REAL_ARITH` a - b + b = a `]);;
\r
3374 (* ==================================== *)
\r
3376 let KCHMAMG = prove_by_refinement
\r
3377 (`convex_local_fan (V,E,FF) /\ circular V E
\r
3378 ==> (!v. v IN V ==> interior_angle1 (vec 0) FF v = pi) /\
\r
3382 (?e. (!x. x IN A ==> e dot x = &0) /\
\r
3383 cyclic_set V (vec 0) e /\
\r
3385 ==> azim_cycle V (vec 0) e v = rho_node1 FF v /\
\r
3386 azim (vec 0) e v (rho_node1 FF v) =
\r
3387 dihV (vec 0) e v (rho_node1 FF v) /\
\r
3388 azim (vec 0) e v (rho_node1 FF v) =
\r
3389 arcV (vec 0) v (rho_node1 FF v) /\
\r
3390 azim (vec 0) e v (rho_node1 FF v) < pi)))`,
\r
3391 [REWRITE_TAC[circular];
\r
3395 NHANH CVX_LO_IMP_LO;
\r
3396 ONCE_REWRITE_TAC[TAUT` ((a/\b)/\c)/\ x IN S <=>a /\(b/\c)/\x IN S`];
\r
3397 NHANH LOFA_IN_E_IMP_IN_FF;
\r
3399 SPEC_TAC (`v:real^3`,`v:real^3`);
\r
3400 SPEC_TAC (`w:real^3`,`w:real^3 `);
\r
3401 ONCE_REWRITE_TAC[TAUT` a /\a1 /\a2 /\a3/\a4 <=> a3 /\ a/\a1/\a2/\a4`];
\r
3403 MESON[]`(! x y. P x y ==> P y x) /\ (! x y. Q x y /\ P x y ==> L)
\r
3404 ==> (! x y. (Q x y \/ Q y x) /\ P x y ==> L)`);
\r
3406 SIMP_TAC[INSERT_COMM];
\r
3407 REPEAT GEN_TAC THEN STRIP_TAC;
\r
3408 ONCE_REWRITE_TAC[TAUT` a /\ b <=> b /\ ( b ==> a ) `];
\r
3410 EXISTS_TAC ` affine hull {vec 0, v, w:real^3}`;
\r
3411 REWRITE_TAC[plane];
\r
3412 UNDISCH_TAC ` v,w IN FF:real^3 # real^3 -> bool `;
\r
3413 UNDISCH_TAC ` local_fan (V,E,FF) `;
\r
3415 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;
\r
3418 EXISTS_TAC ` vec 0:real^3 `;
\r
3419 EXISTS_TAC ` v:real^3 `;
\r
3420 EXISTS_TAC ` w:real^3 `;
\r
3424 REWRITE_TAC[Ldurdpn.IN_HULL_INSERT];
\r
3425 ASSUME_TAC2 LOFA_V_SUBSET_AFF_HULL;
\r
3426 ASM_SIMP_TAC[INSERT_COMM];
\r
3427 ABBREV_TAC ` e = v cross (rho_node1 FF v ) `;
\r
3428 EXISTS_TAC ` e:real^3 `;
\r
3429 SUBGOAL_THEN ` v:real^3 IN V /\ w IN V ` MP_TAC;
\r
3430 MATCH_MP_TAC LOCAL_FAN_IMP_IN_V;
\r
3431 ASM_REWRITE_TAC[];
\r
3433 ASSUME_TAC2 LOFA_IN_V_SO_DO_RHO_NODE_V;
\r
3435 UNDISCH_TAC ` V SUBSET affine hull {v, w, vec 0} /\ ~collinear {vec 0, v, w:real^3}`;
\r
3436 REWRITE_TAC[SUBSET];
\r
3439 FIRST_ASSUM (NHANH_PAT`\x. x ==> y ` );
\r
3441 ASSUME_TAC2 DETER_RHO_NODE;
\r
3443 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM];
\r
3445 ASM_REWRITE_TAC[];
\r
3447 UNDISCH_TAC ` rho_node1 FF v = w `;
\r
3448 SIMP_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_RID; DOT_RADD; DOT_RMUL; DOT_CROSS_SELF;
\r
3449 Collect_geom.ZERO_NEUTRAL];
\r
3450 REWRITE_TAC[DOT_RZERO; Collect_geom.ZERO_NEUTRAL];
\r
3452 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_V;
\r
3453 DOWN THEN NHANH LOOP_SET_DETER_FIRTS_ELMS;
\r
3455 UNDISCH_TAC` v:real^3 IN V `;
\r
3456 FIRST_X_ASSUM (NHANH_PAT`\x. x ==> y`);
\r
3458 FIRST_ASSUM (NHANH_PAT`\x. x ==> y`);
\r
3460 SUBGOAL_THEN` ITER (CARD (V:real^3 -> bool)) (rho_node1 FF) v IN V ` ASSUME_TAC;
\r
3463 REWRITE_TAC[lemma_in_orbit_iter];
\r
3464 SUBGOAL_THEN`ITER (CARD (V:real^3 -> bool)) (rho_node1 FF) v INSERT {ITER n (rho_node1 FF) v | n < CARD V} = {ITER n (rho_node1 FF) v | n <= CARD V} ` ASSUME_TAC;
\r
3465 REWRITE_TAC[EXTENSION; IN_INSERT; IN_ELIM_THM];
\r
3466 MESON_TAC[ARITH_RULE` a <= b <=> a = b \/ a < b:num `];
\r
3467 REPLICATE_TAC 3 DOWN THEN PHA;
\r
3468 NHANH (SET_RULE` a = b /\ x IN b /\ x INSERT a = h ==> h = b `);
\r
3472 SPECL [`V:real^3 -> bool`;`affine hull {v, w, vec 0:real^3} `;` CARD (V:real^3
\r
3473 -> bool)`] (GENL [`U:real^3 -> bool`;` P:real^3 -> bool `;`l:num`]
\r
3474 (SPEC_ALL KOMWBWC)));
\r
3475 ASSUME_TAC2 LOFA_V_SUBSET_AFF_HULL;
\r
3476 ASM_REWRITE_TAC[plane];
\r
3478 EXISTS_TAC` vec 0:real^3 `;
\r
3479 EXISTS_TAC `v:real^3 `;
\r
3480 EXISTS_TAC ` w:real^3 `;
\r
3481 ASM_REWRITE_TAC[];
\r
3482 SIMP_TAC[INSERT_COMM];
\r
3483 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {c,a,b}`];
\r
3484 REWRITE_TAC[Ldurdpn.IN_HULL_INSERT];
\r
3490 GEN_TAC THEN STRIP_TAC;
\r
3493 UNDISCH_TAC` {ITER n (rho_node1 FF) v | n < CARD V} = V`;
\r
3496 REWRITE_TAC[IN_ELIM_THM];
\r
3497 ONCE_REWRITE_TAC[CONJ_SYM];
\r
3499 DOWN THEN DOWN THEN PHA;
\r
3501 UNDISCH_TAC `!x n.
\r
3502 x = ITER n (rho_node1 FF) v /\ n < CARD V
\r
3503 ==> azim_cycle V (vec 0) e (ITER n (rho_node1 FF) v) =
\r
3504 rho_node1 FF (ITER n (rho_node1 FF) v) `;
\r
3506 SUBGOAL_THEN` &0 < sin (azim (vec 0) e v' (rho_node1 FF v')) ` ASSUME_TAC;
\r
3507 MP_TAC (SPECL [`e:real^3 `;` v':real^3 `;` rho_node1 FF v' `]
\r
3508 Trigonometry2.JBDNJJB);
\r
3509 REWRITE_TAC[re_eqvl];
\r
3511 FIRST_X_ASSUM SUBST1_TAC;
\r
3512 MATCH_MP_TAC REAL_LT_MUL;
\r
3513 UNDISCH_TAC ` v':real^3 IN V `;
\r
3514 UNDISCH_TAC `{ITER n (rho_node1 FF) v | n < CARD V} = V `;
\r
3515 DISCH_THEN (SUBST1_TAC o SYM);
\r
3516 REWRITE_TAC[IN_ELIM_THM];
\r
3517 UNDISCH_TAC ` !i. i < CARD (V:real^3 -> bool)
\r
3519 (ITER i (rho_node1 FF) v cross ITER (i + 1) (rho_node1 FF) v) dot
\r
3524 ASM_SIMP_TAC[GSYM ITER; ADD1];
\r
3525 ONCE_REWRITE_TAC[CROSS_TRIPLE];
\r
3526 ASM_REWRITE_TAC[];
\r
3527 MP_TAC (SPECL [`vec 0:real^3 `;` e:real^3 `;` v':real^3 `;
\r
3528 `rho_node1 FF v' `] AZIM_RANGE);
\r
3530 ASM_CASES_TAC ` pi <= azim (vec 0) e v' (rho_node1 FF v') `;
\r
3532 ABBREV_TAC ` a = azim (vec 0) e v' (rho_node1 FF v') `;
\r
3533 SUBGOAL_THEN ` sin a <= &0 ` MP_TAC;
\r
3534 ONCE_REWRITE_TAC[SIN_SUB_PERIODIC];
\r
3535 REWRITE_TAC[REAL_ARITH` -- a <= &0 <=> &0 <= a `];
\r
3536 MATCH_MP_TAC SIN_POS_PI_LE;
\r
3537 UNDISCH_TAC ` pi <= a `;
\r
3538 UNDISCH_TAC ` a < &2 * pi `;
\r
3540 UNDISCH_TAC ` &0 < sin a `;
\r
3541 MESON_TAC[REAL_ARITH` &0 < a ==> ~(a <= &0 ) `];
\r
3543 REWRITE_TAC[REAL_ARITH` ~( a <= b ) <=> b < a `];
\r
3544 SUBGOAL_THEN `~ collinear {vec 0, e, v'} /\ ~ collinear {vec 0, e, rho_node1 FF v'}` ASSUME_TAC;
\r
3545 SUBGOAL_THEN ` rho_node1 FF v' IN V ` ASSUME_TAC;
\r
3546 MATCH_MP_TAC LOFA_IN_V_SO_DO_RHO_NODE_V;
\r
3547 ASM_REWRITE_TAC[];
\r
3549 ONCE_REWRITE_TAC[SET_RULE`{a,b,c} = {c,a,b}`];
\r
3550 UNDISCH_TAC` cyclic_set V (vec 0) (e:real^3) `;
\r
3551 NHANH Wrgcvdr_cizmrrh.CYCLIC_SET_IMP_NOT_COLLINEAR;
\r
3555 SIMP_TAC[AZIM_DIHV_SAME];
\r
3558 REWRITE_TAC[Trigonometry2.DIHV_FORMULAR; VECTOR_SUB_RZERO];
\r
3560 SUBGOAL_THEN` v' dot e = &0 /\ rho_node1 FF v' dot (e:real^3) = &0 ` MP_TAC;
\r
3562 SUBGOAL_THEN ` rho_node1 FF v' IN V ` ASSUME_TAC;
\r
3563 MATCH_MP_TAC LOFA_IN_V_SO_DO_RHO_NODE_V;
\r
3564 ASM_REWRITE_TAC[];
\r
3566 UNDISCH_TAC ` v':real^3 IN V `;
\r
3567 UNDISCH_TAC` !x. x IN V ==> x IN affine hull {v, w, vec 0:real^3}`;
\r
3569 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM];
\r
3570 STRIP_TAC THEN STRIP_TAC;
\r
3571 ASM_REWRITE_TAC[];
\r
3573 USE_FIRST ` rho_node1 FF v = w ` SUBST1_TAC;
\r
3574 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_RID];
\r
3575 REWRITE_TAC[DOT_LADD; DOT_LMUL; DOT_CROSS_SELF];
\r
3577 SIMP_TAC[VECTOR_MUL_LZERO; VECTOR_SUB_RZERO];
\r
3578 SUBGOAL_THEN` &0 < e dot (e:real^3)` ASSUME_TAC;
\r
3579 UNDISCH_TAC `cyclic_set V (vec 0) (e:real^3) `;
\r
3580 SIMP_TAC[DOT_POS_LT; cyclic_set; EQ_SYM_EQ];
\r
3583 MESON_TAC[Trigonometry2.WHEN_A_B_POS_ARCV_STABLE];
\r
3587 ASSUME_TAC2 (SPEC `v:real^3,w:real^3 ` (GEN `x:real^3# real^3 `
\r
3588 LOCAL_FAN_IN_FF_NOT_COLLINEAR));
\r
3589 SUBGOAL_THEN` affine hull {vec 0, v, w:real^3} = A ` ASSUME_TAC;
\r
3590 MATCH_MP_TAC THREE_NOT_COLL_DETER_PLANE;
\r
3591 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
3592 UNDISCH_TAC` V:real^3 -> bool SUBSET A `;
\r
3593 MATCH_MP_TAC (SET_RULE` x IN A /\ y IN A ==> A SUBSET B ==> x IN B /\ y IN B`);
\r
3594 MATCH_MP_TAC LOCAL_FAN_IMP_IN_V;
\r
3595 ASM_REWRITE_TAC[];
\r
3596 MP_TAC (ISPECL [` vec 0:real^3 `;` v':real^3 ` ] (GENL [` x:real^N `;
\r
3597 ` z:real^N `] EXISTS_INTERSECTION_PROPERPLY));
\r
3599 ASM_REWRITE_TAC[];
\r
3600 MP_TAC2 (SET_RULE` v' :real^3 IN V /\ V SUBSET A ==> v' IN A`);
\r
3603 SUBGOAL_THEN ` v IN V /\ w:real^3 IN V ` MP_TAC;
\r
3604 MATCH_MP_TAC LOCAL_FAN_IMP_IN_V;
\r
3605 ASM_REWRITE_TAC[];
\r
3606 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
3607 NHANH FAN_IMP_V_DIFF;
\r
3609 UNDISCH_TAC ` v':real^3 IN V `;
\r
3610 UNDISCH_TAC ` u:real^3 IN V `;
\r
3611 FIRST_X_ASSUM NHANH;
\r
3617 SUBGOAL_THEN ` ~(b IN aff {vec 0, v':real^3}) ` MP_TAC;
\r
3619 NHANH AFF2_ITR_CONV0_IMP_SAME_ENDS;
\r
3625 REWRITE_TAC[SET_RULE` ~( a IN X) /\ ~( b IN X ) <=> {a,b} INTER X = {}`];
\r
3627 MP_TAC (SPECL [`E:(real^3 -> bool) -> bool `;` V:real^3 -> bool`;
\r
3628 ` FF: real^3 #real^3 -> bool `;` v':real^3 ` ;`A:real^3 -> bool`;` a:real^3 `;
\r
3629 ` b:real^3 `] (GEN_ALL OZQVSFF));
\r
3631 SUBGOAL_THEN` {a,b} SUBSET (V:real^3 -> bool) ` MP_TAC;
\r
3635 UNDISCH_TAC` {a, b} SUBSET {u, v, w:real^3}`;
\r
3636 MATCH_MP_TAC (SET_RULE` B SUBSET C ==> A SUBSET B ==> A SUBSET C `);
\r
3637 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
3638 MATCH_MP_TAC LOCAL_FAN_IMP_IN_V;
\r
3639 ASM_REWRITE_TAC[];
\r
3640 UNDISCH_TAC` v':real^3 IN V `;
\r
3641 UNDISCH_TAC ` (V:real^3 -> bool) SUBSET A `;
\r
3642 SIMP_TAC[INSERT_SUBSET];
\r
3643 REWRITE_TAC[SUBSET];
\r
3646 DOWN THEN PHA THEN REMOVE_TAC;
\r
3647 DOWN THEN SIMP_TAC[INSERT_COMM];
\r
3652 (* ========================================================= *)
\r
3655 let CONVEX_SOME_WEDGE = prove(`~collinear {v0, v1, w1} /\
\r
3656 ~collinear {v0, v1, w2} /\
\r
3657 &0 < azim v0 v1 w1 w2 /\
\r
3658 azim v0 v1 w1 w2 < pi
\r
3659 ==> convex ( wedge v0 v1 w1 w2 ) `,
\r
3660 SIMP_TAC[WEDGE_LUNE_GT; CONVEX_AFF_GT]);;
\r
3665 let AZIM_EQ_0_GE_ALT2 = prove_by_refinement
\r
3667 ~collinear {v0, v1, w}
\r
3668 ==> (azim v0 v1 w x = &0 <=> x IN aff_ge {v0, v1} {w}) `,
\r
3669 [REPEAT STRIP_TAC;
\r
3670 ASM_CASES_TAC` ~ collinear {v0,v1,x:real^3} `;
\r
3672 REWRITE_TAC[AZIM_EQ_0_GE_ALT];
\r
3674 SIMP_TAC[AZIM_DEGENERATE];
\r
3677 NHANH Topology.aff_subset_aff_ge;
\r
3679 SIMP_TAC[GSYM Trigonometry2.NOT_EQ_IMP_AFF_AND_COLL3];
\r
3686 let WEDGE_GE_EQ_AFF_GE = prove_by_refinement
\r
3687 (` azim v0 v1 w1 w2 < pi /\ ~ collinear {v0,v1,w1} /\ ~ collinear {v0,v1,w2}
\r
3688 ==> wedge_ge v0 v1 w1 w2 = aff_ge {v0, v1} {w1,w2} `,
\r
3689 [ASM_SIMP_TAC[wedge_ge];
\r
3691 ONCE_REWRITE_TAC[INSERT_COMM];
\r
3694 SUBGOAL_THEN` DISJOINT {v1,v0} {w2,w1:real^3}` ASSUME_TAC;
\r
3696 SUBGOAL_THEN ` aff_ge {v0,v1} {w1} SUBSET aff_ge {v0,v1} {w1,w2:real^3}` ASSUME_TAC;
\r
3697 MATCH_MP_TAC AFF_GE_MONO_RIGHT;
\r
3698 DOWN THEN SET_TAC[];
\r
3702 ASM_CASES_TAC` azim v0 v1 w1 w2 = &0 `;
\r
3704 ASM_SIMP_TAC[IN_ELIM_THM; REAL_LE_ANTISYM; REAL_ARITH` &0 = a <=> a = &0`];
\r
3706 UNDISCH_TAC` ~ collinear {v1,v0,w1:real^3 }`;
\r
3707 ONCE_REWRITE_TAC[INSERT_COMM];
\r
3708 ASM_SIMP_TAC[AZIM_EQ_0_GE_ALT2; GSYM SUBSET_ANTISYM_EQ; SET_RULE` {x| x IN S } = S `];
\r
3712 SUBGOAL_THEN` DISJOINT {v0,v1} {w1: real^3}` MP_TAC;
\r
3713 DOWN THEN SET_TAC[];
\r
3715 SIMP_TAC[Collect_geom.simp_def2; AFF_GE22; INSERT_COMM];
\r
3716 REWRITE_TAC[IN_ELIM_THM; SUBSET];
\r
3719 ASM_REWRITE_TAC[];
\r
3722 EXISTS_TAC ` aa + yy * ta `;
\r
3723 EXISTS_TAC ` bb + yy * tb `;
\r
3724 EXISTS_TAC ` xx + yy * t `;
\r
3725 ASM_REWRITE_TAC[REAL_ARITH` (aa + yy * ta) + (bb + yy * tb) + xx + yy * t =
\r
3726 aa + bb + xx + yy * ( ta + tb + t ) `; REAL_MUL_RID];
\r
3730 MATCH_MP_TAC REAL_LE_ADD;
\r
3731 ASM_REWRITE_TAC[];
\r
3732 MATCH_MP_TAC REAL_LE_MUL;
\r
3733 ASM_REWRITE_TAC[];
\r
3734 CONV_TAC VECTOR_ARITH;
\r
3735 MP_TAC (SPECL [`v0:real^3 `;` v1:real^3 `;`w1:real^3 `;` w2:real^3 `] AZIM_RANGE);
\r
3736 ASM_REWRITE_TAC[REAL_ARITH` &0 <= a <=> a = &0 \/ &0 < a `];
\r
3738 DOWN_TAC THEN SIMP_TAC[INSERT_COMM];
\r
3740 ASSUME_TAC2 WEDGE_LUNE_GT;
\r
3744 REWRITE_TAC[EXTENSION; IN_ELIM_THM];
\r
3747 ASM_SIMP_TAC[AZIM_EQ_0_GE_ALT2];
\r
3749 UNDISCH_TAC ` x IN aff_ge {v0, v1} {w1:real^3}`;
\r
3750 UNDISCH_TAC ` aff_ge {v0, v1} {w1} SUBSET aff_ge {v0, v1} {w1, w2:real^3}`;
\r
3751 REWRITE_TAC[SUBSET];
\r
3756 REWRITE_TAC[REAL_ARITH` a <= b <=> a = b \/ a < b `];
\r
3757 SUBGOAL_THEN` ~ collinear {v0,v1,x:real^3} ` ASSUME_TAC;
\r
3759 UNDISCH_TAC ` &0 < azim v0 v1 w1 x `;
\r
3761 SIMP_TAC[AZIM_DEGENERATE];
\r
3769 ASM_SIMP_TAC[AZIM_EQ_ALT];
\r
3772 SUBGOAL_THEN ` aff_ge {v0,v1} {w2} SUBSET aff_ge {v0,v1} {w1,w2:real^3} ` ASSUME_TAC;
\r
3773 MATCH_MP_TAC AFF_GE_MONO_RIGHT;
\r
3774 ASM_REWRITE_TAC[];
\r
3777 REWRITE_TAC[SUBSET];
\r
3778 DISCH_THEN MATCH_MP_TAC;
\r
3779 MP_TAC (ISPECL [`{v0,v1:real^3} `;` {w2:real^3} `] AFF_GT_SUBSET_AFF_GE);
\r
3780 REWRITE_TAC[SUBSET];
\r
3781 DISCH_THEN MATCH_MP_TAC;
\r
3782 DOWN THEN SIMP_TAC[];
\r
3784 SUBGOAL_THEN` x IN wedge v0 v1 w1 w2 ` ASSUME_TAC;
\r
3785 REWRITE_TAC[wedge; IN_ELIM_THM];
\r
3786 DOWN THEN DOWN THEN DOWN THEN PHA;
\r
3789 MATCH_MP_TAC (SET_RULE` a SUBSET b ==> x IN a ==> x IN b `);
\r
3790 ASM_REWRITE_TAC[AFF_GT_SUBSET_AFF_GE];
\r
3792 ASM_SIMP_TAC[AFF_GE22; IN_ELIM_THM];
\r
3794 ASM_CASES_TAC ` yy = &0 `;
\r
3795 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
3797 UNDISCH_TAC` ~collinear {v0, v1, w1:real^3}`;
\r
3798 NHANH AZIM_EQ_0_GE_ALT2;
\r
3800 SUBGOAL_THEN ` azim v0 v1 w1 x = &0 ` ASSUME_TAC;
\r
3801 FIRST_X_ASSUM SUBST1_TAC;
\r
3802 ASSUME_TAC2 (SET_RULE` DISJOINT {v0, v1} {w1, w2} ==> DISJOINT {v0,v1} {w1:real^3} `);
\r
3804 SIMP_TAC[Collect_geom.simp_def2];
\r
3805 ASM_REWRITE_TAC[IN_ELIM_THM];
\r
3807 EXISTS_TAC` aa:real `;
\r
3808 EXISTS_TAC ` bb:real `;
\r
3809 EXISTS_TAC ` xx:real `;
\r
3810 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_RID];
\r
3811 UNDISCH_TAC ` aa + bb + xx + &0 = &1 `;
\r
3813 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
3814 REWRITE_TAC[AZIM_RANGE];
\r
3818 ASM_CASES_TAC` collinear {v0,v1,x:real^3} `;
\r
3820 SIMP_TAC[AZIM_DEGENERATE; AZIM_RANGE];
\r
3823 ASM_CASES_TAC ` xx = &0 `;
\r
3824 SUBGOAL_THEN ` azim v0 v1 w1 x = azim v0 v1 w1 w2 ` ASSUME_TAC;
\r
3825 SUBGOAL_THEN ` azim v0 v1 w1 x = azim v0 v1 w1 w2 <=> x IN aff_gt {v0,v1} {w2}` SUBST1_TAC;
\r
3826 MATCH_MP_TAC AZIM_EQ_ALT;
\r
3827 ASM_REWRITE_TAC[];
\r
3828 MP_TAC2 (SET_RULE` DISJOINT {v0,v1} {w1,w2} ==> DISJOINT {v0,v1} {w2:real^3}`);
\r
3829 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM];
\r
3831 EXISTS_TAC ` aa: real`;
\r
3832 EXISTS_TAC` bb:real `;
\r
3833 EXISTS_TAC ` yy:real `;
\r
3834 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
\r
3835 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
3836 UNDISCH_TAC ` &0 <= yy `;
\r
3837 UNDISCH_TAC ` ~( yy = &0 ) `;
\r
3838 UNDISCH_TAC ` aa + bb + &0 + yy = &1 `;
\r
3840 ASM_REWRITE_TAC[REAL_LE_REFL];
\r
3841 SUBGOAL_THEN` x IN wedge v0 v1 w1 w2 ` ASSUME_TAC;
\r
3842 ASM_SIMP_TAC[Planarity.AFF_GT_2_2; IN_ELIM_THM];
\r
3843 EXISTS_TAC ` aa:real ` ;
\r
3844 EXISTS_TAC ` bb:real`;
\r
3845 EXISTS_TAC ` xx:real ` ;
\r
3846 EXISTS_TAC` yy:real`;
\r
3847 ASM_REWRITE_TAC[REAL_ARITH` a < b <=> ~( b = a ) /\ a <= b `];
\r
3849 REWRITE_TAC[wedge; IN_ELIM_THM];
\r
3852 REAL_ARITH_TAC]);;
\r
3860 let AZIM_PI_WEDGE_GE_SIN = prove_by_refinement(` azim u v w ww = pi ==>
\r
3861 wedge_ge u v w ww = {x| &0 <= sin (azim u v w x ) } `,
\r
3862 [REWRITE_TAC[wedge_ge; EXTENSION; IN_ELIM_THM];
\r
3864 ONCE_REWRITE_TAC[GSYM (SPEC ` -- (u:real^3) ` AZIM_TRANSLATION)];
\r
3866 REWRITE_TAC[VECTOR_ARITH` -- a + (a:real^N) = vec 0`;VECTOR_ARITH` -- a + b = b - a:real^N `; re_eqvl];
\r
3868 ASM_REWRITE_TAC[];
\r
3870 REWRITE_TAC[SIN_POS_PI_LE];
\r
3871 MP_TAC (SPECL [`u - u:real^3 `;` v - u:real^3 `;` w - u:real^3 `;
\r
3872 ` x - u:real^3 `] AZIM_RANGE);
\r
3874 ASM_CASES_TAC ` azim (u - u) (v - u) (w - u) (x - u) <= pi `;
\r
3875 ASM_REWRITE_TAC[];
\r
3876 ABBREV_TAC ` goc = azim (u - u) (v - u) (w - u) (x - u) `;
\r
3878 SUBGOAL_THEN` sin goc < &0 ` MP_TAC;
\r
3879 ONCE_REWRITE_TAC[SIN_SUB_PERIODIC];
\r
3880 REWRITE_TAC[REAL_ARITH` -- a < &0 <=> &0 < a `];
\r
3881 MATCH_MP_TAC SIN_POS_PI;
\r
3882 ASM_REWRITE_TAC[REAL_ARITH` a - b < b <=> a < &2 * b `;REAL_ARITH` &0 < a - pi <=> ~( a <= pi ) `];
\r
3884 REAL_ARITH_TAC]);;
\r
3890 let AZIM_PI_WEDGE_GE_CROSS_DOT = prove_by_refinement(` azim u v w ww = pi ==>
\r
3891 wedge_ge u v w ww = {x | &0 <= ((v - u) cross ( w - u )) dot ( x - u )}`,
\r
3892 [SIMP_TAC[AZIM_PI_WEDGE_GE_SIN; EXTENSION; IN_ELIM_THM];
\r
3894 ONCE_REWRITE_TAC[GSYM (SPEC ` -- (u:real^3) ` AZIM_TRANSLATION)];
\r
3895 REWRITE_TAC[VECTOR_ARITH` -- a + a:real^N = vec 0 `; VECTOR_ARITH` -- a + x = x - a:real^N `];
\r
3896 MP_TAC (SPECL [` v - u:real^3 `;` w - u:real^3 `;` x - u:real^3 `] Trigonometry2.JBDNJJB);
\r
3897 REWRITE_TAC[re_eqvl];
\r
3899 ASM_REWRITE_TAC[VECTOR_SUB_REFL];
\r
3900 ASM_SIMP_TAC[REAL_LE_MUL_EQ]]);;
\r
3905 let AZIM_PI_CONVEX_WEDGE = prove_by_refinement(` azim u v w ww = pi
\r
3906 ==> convex (wedge_ge u v w ww) `,
\r
3907 [SIMP_TAC[AZIM_PI_WEDGE_GE_CROSS_DOT; convex; IN_ELIM_THM];
\r
3909 ONCE_REWRITE_TAC[VECTOR_ARITH` (u' % x + v' % y) = u' % ( x - u ) +
\r
3910 v' % (y - u ) + (u' + v') % u `];
\r
3911 ASM_REWRITE_TAC[VECTOR_MUL_LID; VECTOR_ARITH ` ( a + c + b ) - b = (a:real^N) + c `; DOT_RADD; DOT_RMUL];
\r
3912 MATCH_MP_TAC REAL_LE_ADD;
\r
3914 MATCH_MP_TAC REAL_LE_MUL;
\r
3915 ASM_REWRITE_TAC[];
\r
3916 MATCH_MP_TAC REAL_LE_MUL;
\r
3917 ASM_REWRITE_TAC[]]);;
\r
3923 let CONVEX_WEDGE_LE_PI = prove(` azim v0 v1 w1 w2 <= pi /\
\r
3924 ~collinear {v0, v1, w1} /\
\r
3925 ~collinear {v0, v1, w2}
\r
3926 ==> convex ( wedge_ge v0 v1 w1 w2 )`,
\r
3927 ASM_CASES_TAC ` azim v0 v1 w1 w2 = pi ` THENL [
\r
3928 ASM_SIMP_TAC[AZIM_PI_CONVEX_WEDGE];
\r
3929 ASM_SIMP_TAC[REAL_ARITH` ~( a = b ) ==> ( a <= b <=> a < b )`]] THEN
\r
3930 NHANH WEDGE_GE_EQ_AFF_GE THEN SIMP_TAC[CONVEX_AFF_GE]);;
\r
3937 let wedge_in_fan_ge2 = prove(` wedge_in_fan_ge x E =
\r
3938 (if CARD (EE (FST x) E) > 1
\r
3939 then wedge_ge (vec 0) (FST x ) (SND x ) (azim_cycle (EE (FST x) E) (vec 0) (FST x ) (SND x ) )
\r
3941 PAT_ONCE_REWRITE_TAC `\x. x = y ` [GSYM PAIR]
\r
3942 THEN REWRITE_TAC[wedge_in_fan_ge]);;
\r
3948 let azim_in_fan2 = prove(` azim_in_fan x E =
\r
3949 (let d = azim_cycle (EE ( FST x ) E) (vec 0) (FST x ) (SND x ) in
\r
3950 if CARD (EE (FST x ) E) > 1 then azim (vec 0) (FST x ) (SND x) d else &2 * pi) `,
\r
3951 PAT_ONCE_REWRITE_TAC `\x. x = y ` [GSYM PAIR]
\r
3952 THEN REWRITE_TAC[azim_in_fan]);;
\r
3957 let LOFA_IMP_NOT_INCLUDE_VEC0 = prove(
\r
3958 ` local_fan (V,E,FF) ==> ~( vec 0 IN V ) `,
\r
3959 NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN THEN NHANH FAN_IMP_V_DIFF
\r
3960 THEN STRIP_TAC THEN DOWN THEN SET_TAC[]);;
\r
3966 let AZIM_SPEC_DEGENERATE = prove(
\r
3967 ` azim v0 v1 w1 v0 = &0 /\ azim v0 v1 w1 v1 = &0 `,
\r
3968 SUBGOAL_THEN ` collinear {v0, v1, v0} /\ collinear {v0,v1,v1:real^3} ` MP_TAC
\r
3969 THENL [SIMP_TAC[INSERT_INSERT; INSERT_COMM; COLLINEAR_2];
\r
3970 SIMP_TAC[AZIM_DEGENERATE]]);;
\r
3977 let CONDS_IN_CONV2 = prove_by_refinement
\r
3978 (` &0 <= t2 /\ &0 <= t3 /\ ~( t2 = &0 /\ t3 = &0)
\r
3979 ==> t2 / (t2 + t3) % v + t3 / (t2 + t3) % w IN conv {v, w} `,
\r
3981 SUBGOAL_THEN ` ~( t2 + t3 = &0 ) ` ASSUME_TAC;
\r
3984 REWRITE_TAC[Collect_geom.CONV_SET2; IN_ELIM_THM];
\r
3985 EXISTS_TAC ` t2 / (t2 + t3 ) `;
\r
3986 EXISTS_TAC ` t3 / (t2 + t3 ) `;
\r
3988 MATCH_MP_TAC REAL_LE_DIV;
\r
3989 DOWN_TAC THEN REAL_ARITH_TAC;
\r
3991 MATCH_MP_TAC REAL_LE_DIV;
\r
3992 DOWN_TAC THEN REAL_ARITH_TAC;
\r
3993 ASM_SIMP_TAC[GSYM Geomdetail.SUM_TWO_RATIO]]);;
\r
4003 let PGSQVBL = prove_by_refinement
\r
4004 (` convex_local_fan (V,E,FF) /\ {v,w} SUBSET V /\ x IN FF ==>
\r
4005 aff_ge {vec 0} {v,w} SUBSET wedge_in_fan_ge x E `,
\r
4006 [REWRITE_TAC[convex_local_fan];
\r
4009 FIRST_X_ASSUM NHANH;
\r
4010 REWRITE_TAC[azim_in_fan2; wedge_in_fan_ge2];
\r
4013 SUBGOAL_THEN ` FST (x:real^3 # real^3) IN V /\ SND x IN V ` MP_TAC;
\r
4014 MATCH_MP_TAC LOCAL_FAN_IMP_IN_V;
\r
4015 ASM_REWRITE_TAC[];
\r
4017 ASSUME_TAC2 (SPEC `FST (x:real^3 # real^3 ) ` (GEN `v:real^3 ` LOFA_CARD_EE_V_1));
\r
4018 UNDISCH_TAC` (if CARD (EE (FST x) E) > 1
\r
4019 then azim (vec 0) (FST x) (SND x) d
\r
4022 UNDISCH_TAC` V SUBSET
\r
4023 (if CARD (EE (FST x) E) > 1
\r
4024 then wedge_ge (vec 0) (FST x) (SND x) d
\r
4027 ASM_SIMP_TAC[ARITH_RULE` a = 2 ==> a > 1 `];
\r
4028 ASSUME_TAC2 (SPEC ` FST (x:real^3 #real^3 ) ` (GEN `v:real^3 ` EXISTS_INVERSE_OF_V));
\r
4029 DOWN THEN STRIP_TAC;
\r
4030 MP_TAC2 (SPEC ` FST (x:real^3 # real^3) ` (GEN `v:real^3 ` LOFA_IMP_EE_TWO_ELMS));
\r
4031 DISCH_THEN SUBST_ALL_TAC;
\r
4032 SUBGOAL_THEN ` rho_node1 FF (FST x) = SND (x:real^3 # real^3) ` ASSUME_TAC;
\r
4033 MATCH_MP_TAC DETER_RHO_NODE;
\r
4034 ASM_REWRITE_TAC[];
\r
4035 UNDISCH_TAC ` azim_cycle {rho_node1 FF (FST x), vv} (vec 0) (FST x) (SND x) = d `;
\r
4036 ASM_REWRITE_TAC[AZIM_CYCLE_TWO_POINT_SET];
\r
4037 MP_TAC2 LOCAL_FAN_RHO_NODE_PROS2;
\r
4039 UNDISCH_TAC` vv:real^3 IN V `;
\r
4040 FIRST_X_ASSUM NHANH;
\r
4043 UNDISCH_TAC ` local_fan (V,E,FF) `;
\r
4045 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;
\r
4046 ASM_REWRITE_TAC[];
\r
4048 ASSUME_TAC2 LOCAL_FAN_IN_FF_NOT_COLLINEAR;
\r
4049 SUBGOAL_THEN ` conv {v,w:real^3} SUBSET wedge_ge (vec 0) (FST x) (SND x) d ` ASSUME_TAC;
\r
4050 SUBGOAL_THEN ` convex (wedge_ge (vec 0) (FST x ) (SND x ) d) ` ASSUME_TAC;
\r
4051 MATCH_MP_TAC CONVEX_WEDGE_LE_PI;
\r
4053 UNDISCH_TAC` ~ collinear {vec 0, d, FST (x:real^3 # real^3)}`;
\r
4054 SIMP_TAC[INSERT_COMM];
\r
4055 MATCH_MP_TAC Geomdetail.CONVEX_IM_CONV2_SU;
\r
4056 ASM_REWRITE_TAC[SET_RULE` a IN S /\ b IN S <=> {a,b} SUBSET S `];
\r
4057 MATCH_MP_TAC SUBSET_TRANS;
\r
4058 EXISTS_TAC` V:real^3 -> bool `;
\r
4059 ASM_REWRITE_TAC[];
\r
4060 SUBGOAL_THEN ` DISJOINT {vec 0} {v,w:real^3} ` MP_TAC;
\r
4061 MP_TAC2 LOFA_IMP_NOT_INCLUDE_VEC0;
\r
4062 UNDISCH_TAC` {v,w:real^3} SUBSET V `;
\r
4065 SIMP_TAC[Fan.AFF_GE_1_2; SUBSET; IN_ELIM_THM];
\r
4067 ASM_CASES_TAC ` t2 = &0 /\ t3 = &0 `;
\r
4068 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_MUL_RZERO; VECTOR_ADD_LID; wedge_ge; IN_ELIM_THM];
\r
4069 REWRITE_TAC[AZIM_SPEC_DEGENERATE; AZIM_RANGE; REAL_LE_REFL];
\r
4070 SUBGOAL_THEN ` (t2 / ( t2 + t3)) % v + ( t3 / ( t2 + t3 )) % w IN conv {v,w:real^3}` ASSUME_TAC;
\r
4071 MATCH_MP_TAC CONDS_IN_CONV2;
\r
4072 ASM_REWRITE_TAC[];
\r
4074 UNDISCH_TAC ` conv {v, w} SUBSET wedge_ge (vec 0) (FST x) (SND x) d `;
\r
4075 REWRITE_TAC[SUBSET];
\r
4077 ABBREV_TAC `p = t2 / (t2 + t3) % v + t3 / (t2 + t3) % (w:real^3) `;
\r
4078 SUBGOAL_THEN ` x' = t1 % (vec 0) + (&0) % (FST (x:real^3 # real^3)) + (t2 + t3 ) % (p:real^3) ` ASSUME_TAC;
\r
4079 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
4081 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC];
\r
4082 MP_TAC2 (REAL_ARITH` &0 <= t2 /\ &0 <= t3 /\ ~( t2 = &0 /\ t3 = &0)
\r
4083 ==> ~( t2 + t3 = &0) `);
\r
4084 SIMP_TAC[REAL_FIELD` ~( t = &0 ) ==> t * a / t = a `];
\r
4085 ASM_CASES_TAC ` collinear {vec 0, FST (x:real^3 # real^3), p}`;
\r
4087 ASSUME_TAC2 LOFA_IMP_NOT_INCLUDE_VEC0;
\r
4088 SUBGOAL_THEN` ~( FST (x:real^3 # real^3 ) = vec 0 ) ` ASSUME_TAC;
\r
4089 UNDISCH_TAC ` FST (x:real^3 # real^3 ) IN V `;
\r
4092 ASM_SIMP_TAC[COLLINEAR_LEMMA_ALT];
\r
4094 SUBGOAL_THEN ` collinear {vec 0, FST (x:real^3 # real^3), x'}` MP_TAC;
\r
4095 SIMP_TAC[COLLINEAR_LEMMA_ALT];
\r
4097 EXISTS_TAC ` (t2 + t3) * c `;
\r
4098 UNDISCH_TAC` x' = t1 % vec 0 + &0 % FST (x:real^3 # real^3) + (t2 + t3) % (p:real^3)`;
\r
4100 ASM_REWRITE_TAC[];
\r
4104 UNDISCH_TAC` x' = t1 % vec 0 + t2 % v + t3 % (w:real^3) `;
\r
4105 DISCH_THEN (SUBST1_TAC o SYM);
\r
4106 SIMP_TAC[AZIM_DEGENERATE; wedge_ge; IN_ELIM_THM; AZIM_RANGE; REAL_LE_REFL];
\r
4108 REWRITE_TAC[wedge_ge; IN_ELIM_THM];
\r
4109 SUBGOAL_THEN` azim (vec 0) (FST x) (SND x) p = azim (vec 0) (FST x) (SND x) x'` SUBST1_TAC;
\r
4110 UNDISCH_TAC` x' = t1 % vec 0 + &0 % FST (x:real^3 # real^3) + (t2 + t3) % p`;
\r
4113 MATCH_MP_TAC Topology.th1;
\r
4114 ASSUME_TAC2 (REAL_ARITH` &0 <= t2 /\ &0 <= t3 /\ ~( t2 = &0 /\ t3 = &0 ) ==> t2 + t3 > &0 `);
\r
4116 ASM_REWRITE_TAC[REAL_ADD_LID];
\r
4117 ASM_SIMP_TAC[Fan.th3a];
\r
4120 (* begin new lemma *)
\r
4121 (* =============== *)
\r
4122 (* =============== *)
\r
4127 let FST_EQ_IF_SAME_SND = prove_by_refinement
\r
4128 (` local_fan (V,E,FF) /\ (w1,v) IN FF /\ (w2,v) IN FF
\r
4130 [NHANH LOFA_IMP_BIJ_VV;
\r
4132 SUBGOAL_THEN` {w1,w2,v} SUBSET (V:real^3 -> bool) ` ASSUME_TAC;
\r
4133 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
4134 ASM_MESON_TAC[LOCAL_FAN_IMP_IN_V];
\r
4136 SUBGOAL_THEN` rho_node1 FF w1 = v /\ rho_node1 FF w2 = v ` ASSUME_TAC;
\r
4137 ASM_MESON_TAC[DETER_RHO_NODE];
\r
4139 REWRITE_TAC[BIJ; INJ; INSERT_SUBSET];
\r
4146 let PRE_IVS_RHO_NODE1_DETE = prove_by_refinement
\r
4147 (` local_fan (V,E,FF) /\ (vv,v) IN FF
\r
4148 ==> (@a. a,v IN FF) = vv `,
\r
4149 [STRIP_TAC; MATCH_MP_TAC RHO_NODE_INVERSE_POINT;
\r
4150 ASM_REWRITE_TAC[]; REPEAT STRIP_TAC;
\r
4151 MATCH_MP_TAC FST_EQ_IF_SAME_SND; ASM_REWRITE_TAC[]]);;
\r
4154 let IVS_RHO_NODE1_DETE = prove(` local_fan (V,E,FF) /\ (vv,v) IN FF
\r
4155 ==> ivs_rho_node1 FF v = vv`,
\r
4156 REWRITE_TAC[PRE_IVS_RHO_NODE1_DETE; ivs_rho_node1]);;
\r
4161 let AZIM_EQ_0_SYM2 = prove(`! w1 w2. azim v0 v1 w1 w2 = &0 <=> azim v0 v1 w2 w1 = &0 `,
\r
4162 REWRITE_TAC[MESON[]` (! x y. P x y <=> P y x ) <=> (! x y. P x y ==> P y x )`] THEN
\r
4163 MESON_TAC[AZIM_EQ_0_SYM; AZIM_DEGENERATE]);;
\r
4167 let LOCAL_FAN_IN_FF_IN_ORD_PAIRS2 =
\r
4168 prove(`local_fan (V,E,FF) /\ x,y IN FF ==> {x,y} IN E `,
\r
4169 NHANH LOCAL_FAN_IN_FF_IN_ORD_PAIRS THEN
\r
4170 SIMP_TAC[Wrgcvdr_cizmrrh.IN_E_IFF_IN_ORD_E]);;
\r
4177 let INTERIOR_ANGLE1_POS = prove_by_refinement
\r
4178 (` local_fan (V,E,FF) /\ v IN V ==> &0 < interior_angle1 (vec 0) FF v `,
\r
4179 [ASM_CASES_TAC` interior_angle1 (vec 0) FF v = &0 `;
\r
4181 REWRITE_TAC[interior_angle1];
\r
4182 NHANH EXISTS_INVERSE_OF_V;
\r
4184 MP_TAC2 LOCAL_FAN_RHO_NODE_PROS2;
\r
4186 UNDISCH_TAC` vv:real^3 IN V `;
\r
4187 UNDISCH_TAC ` v:real^3 IN V `;
\r
4188 FIRST_X_ASSUM NHANH;
\r
4189 STRIP_TAC THEN STRIP_TAC;
\r
4190 SUBGOAL_THEN` (@a. a,v IN (FF:real^3 # real^3 -> bool)) = vv ` ASSUME_TAC;
\r
4191 MATCH_MP_TAC PRE_IVS_RHO_NODE1_DETE;
\r
4193 ASM_REWRITE_TAC[];
\r
4194 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
4195 ABBREV_TAC ` vc = rho_node1 FF v `;
\r
4196 SUBGOAL_THEN ` vv = vc:real^3 ` ASSUME_TAC;
\r
4197 MATCH_MP_TAC Fan.UNIQUE_AZIM_POINT_FAN;
\r
4198 EXISTS_TAC ` vec 0:real^3 `;
\r
4199 EXISTS_TAC `V:real^3 -> bool` ;
\r
4200 EXISTS_TAC ` E: (real^3 -> bool) -> bool `;
\r
4201 EXISTS_TAC ` v:real^3 `;
\r
4202 EXISTS_TAC `vv:real^3 `;
\r
4203 UNDISCH_TAC` azim (vec 0) v vc vv = &0 `;
\r
4204 ONCE_REWRITE_TAC[AZIM_EQ_0_SYM2];
\r
4205 SIMP_TAC[AZIM_REFL];
\r
4207 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
4208 STRIP_TAC THEN STRIP_TAC;
\r
4210 ASM_MESON_TAC[LOCAL_FAN_IN_FF_IN_ORD_PAIRS2; INSERT_COMM];
\r
4211 ASM_MESON_TAC[LOCAL_FAN_IMP_NOT_SEMI_IDE];
\r
4214 REWRITE_TAC[interior_angle1];
\r
4215 MP_TAC (SPECL [`vec 0:real^3 `;` v:real^3 `;` rho_node1 FF v `;
\r
4216 ` (@a. a,v IN (FF:real^3 # real^3 -> bool))`] AZIM_RANGE);
\r
4217 REAL_ARITH_TAC]);;
\r
4219 (* ======================================================================== *)
\r
4222 let FAN_IMP_NOT_IN_AFF_GE = prove_by_refinement
\r
4223 (` FAN (x:real^N,V,E) /\ {v, w} SUBSET V /\ ~( v = w)
\r
4224 ==> ~ ( v IN aff_ge {x} {w} ) `,
\r
4225 [NHANH FAN_IMP_V_DIFF;
\r
4226 REWRITE_TAC[FAN; fan7];
\r
4228 FIRST_X_ASSUM (MP_TAC o (SPECL [`{v:real^N}`;`{w:real^N}`]));
\r
4230 REWRITE_TAC[IN_UNION; IN_ELIM_THM];
\r
4231 UNDISCH_TAC` {v, w:real^N} SUBSET V`;
\r
4233 ASM_SIMP_TAC[SET_RULE` ~( a = b ) ==> {a} INTER {b} = {} `;
\r
4234 AFFINE_HULL_SING; AFF_GE_EQ_AFFINE_HULL];
\r
4236 MP_TAC (ISPECL [`x:real^N`;` v:real^N`] (CONJUNCT2 ENDS_IN_HALFLINE));
\r
4240 REWRITE_TAC[INSERT_SUBSET];
\r
4241 FIRST_ASSUM NHANH;
\r
4249 let IN_AFF_LT_IMP_IN_CONV = prove_by_refinement
\r
4250 (`DISJOINT {x:real^N} {b} /\ a IN aff_lt {x} {b} ==> x IN conv0 {a,b} `,
\r
4252 SIMP_TAC[AFF_LT_1_1; IN_ELIM_THM];
\r
4255 ONCE_REWRITE_TAC[VECTOR_ARITH` a = x % b + y % c <=> x % b = a + (-- y) % c`];
\r
4256 ASSUME_TAC2 (REAL_ARITH` t2 < &0 /\ t1 + t2 = &1 ==> ~(t1 = &0 )`);
\r
4257 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE];
\r
4258 ASSUME_TAC2 (REAL_ARITH` t2 < &0 /\ t1 + t2 = &1 ==> &0 < t1`);
\r
4259 REWRITE_TAC[VECTOR_ADD_LDISTRIB;REAL_ARITH` &1 / a * b = b / a `;
\r
4260 VECTOR_MUL_ASSOC; Collect_geom.CONV0_SET2; IN_ELIM_THM];
\r
4262 EXISTS_TAC` &1 / t1 `;
\r
4263 EXISTS_TAC ` ( -- t2 ) / t1 `;
\r
4265 MATCH_MP_TAC REAL_LT_DIV;
\r
4266 ASM_REWRITE_TAC[];
\r
4269 MATCH_MP_TAC REAL_LT_DIV;
\r
4270 ASM_REWRITE_TAC[REAL_ARITH` &0 < -- a <=> a < &0 `];
\r
4272 UNDISCH_TAC` t1 + t2 = &1 `;
\r
4273 UNDISCH_TAC ` ~( t1 = &0 ) `;
\r
4274 CONV_TAC REAL_FIELD]);;
\r
4278 let FAN_SUB_NOT_EQ_COLL_IN_CONV0 = prove_by_refinement
\r
4279 (` FAN (x,V,E) /\ {v:real^N, w} SUBSET V /\ ~(v = w) /\
\r
4280 collinear {x, v, w} ==> x IN (conv0 {v,w}) `,
\r
4281 [REWRITE_TAC[COLLINEAR_3_EXPAND];
\r
4282 NHANH FAN_IMP_V_DIFF;
\r
4284 UNDISCH_TAC ` {v, w:real^N} SUBSET V`;
\r
4285 REWRITE_TAC[INSERT_SUBSET];
\r
4287 ASM_CASES_TAC ` &0 <= &1 - u `;
\r
4288 SUBGOAL_THEN` v IN aff_ge {x} {w:real^N}` ASSUME_TAC;
\r
4289 REWRITE_TAC[HALFLINE; IN_ELIM_THM];
\r
4290 EXISTS_TAC ` &1 - u `;
\r
4291 ASM_REWRITE_TAC[REAL_ARITH` a - ( a - b ) = b `];
\r
4292 MP_TAC2 FAN_IMP_NOT_IN_AFF_GE;
\r
4293 ASM_REWRITE_TAC[];
\r
4294 MATCH_MP_TAC IN_AFF_LT_IMP_IN_CONV;
\r
4295 SUBGOAL_THEN` DISJOINT {x} {w:real^N}` ASSUME_TAC;
\r
4298 ASM_SIMP_TAC[AFF_LT_1_1; IN_ELIM_THM];
\r
4299 EXISTS_TAC` u:real`;
\r
4300 EXISTS_TAC` &1 - u `;
\r
4301 ASM_REWRITE_TAC[REAL_ARITH` a + b - a = b `;REAL_ARITH`b < a <=> ~( a <= b ) `]]);;
\r
4307 let IN_CONV_LINE_SEPERATABLE = prove_by_refinement
\r
4308 (` x IN conv0 {a,b:real^N} ==> aff {a,b} = aff_ge {x} {a} UNION aff_ge {x} {b} `,
\r
4309 [REWRITE_TAC[Collect_geom.CONV0_SET2; IN_ELIM_THM; EXTENSION];
\r
4310 STRIP_TAC THEN GEN_TAC;
\r
4312 REWRITE_TAC[Collect_geom.AFF_2POINTS_INTERPRET; IN_ELIM_THM];
\r
4314 ASSUME_TAC2 (REAL_ARITH` ta + tb = &1 /\ a' + b' = &1 ==> ta <= a' \/ tb <= b' `);
\r
4317 SPEC_TAC (`ta:real`,`ta:real`);
\r
4318 SPEC_TAC (`tb:real`,`tb:real`);
\r
4319 SPEC_TAC (`a':real`,`a':real`);
\r
4320 SPEC_TAC (`b':real`,`b':real`);
\r
4321 SPEC_TAC (`a:real^N`,`a:real^N`);
\r
4322 SPEC_TAC (`b:real^N`,`b:real^N`);
\r
4323 MATCH_MP_TAC (MESON[]`(! x y a b aa bb. P x y a b aa bb ==> P y x b a bb aa) /\
\r
4324 (! x y. L x y ==> L y x ) /\ (! x y a b aa bb. bb <= b /\ P x y a b aa bb ==> L x y ) ==> (! x y a b aa bb. (bb <= b \/ aa <= a ) /\ P x y a b aa bb ==> L x y ) `);
\r
4326 SIMP_TAC[UNION_COMM; VECTOR_ADD_SYM; REAL_ADD_SYM];
\r
4327 ONCE_REWRITE_TAC[EQ_SYM_EQ];
\r
4332 REWRITE_TAC[IN_UNION; IN_ELIM_THM; HALFLINE];
\r
4334 EXISTS_TAC` tb - ( ta / a' ) * b' `;
\r
4336 SUBGOAL_THEN` ta / a' <= &1 ` ASSUME_TAC;
\r
4337 MATCH_MP_TAC Trigonometry2.REAL_LE_LDIV;
\r
4338 ASM_REWRITE_TAC[];
\r
4339 SUBGOAL_THEN` ta / a' * b' <= b' ` ASSUME_TAC;
\r
4340 REWRITE_TAC[REAL_ARITH` a * b <= b <=> &0 <= ( &1 - a ) * b `];
\r
4341 MATCH_MP_TAC REAL_LE_MUL;
\r
4342 DOWN THEN DOWN THEN REAL_ARITH_TAC;
\r
4343 ASM_REAL_ARITH_TAC;
\r
4346 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; VECTOR_ARITH` ( a + b % x ) + c % x = a + ( b + c ) % x `];
\r
4347 MATCH_MP_TAC (MESON[]` a = aa /\ b = bb ==> a % x + b % y = aa % x + bb % y `);
\r
4349 REPLICATE_TAC 4 DOWN;
\r
4355 CONV_TAC REAL_FIELD;
\r
4358 REPLICATE_TAC 4 DOWN;
\r
4364 CONV_TAC REAL_FIELD;
\r
4366 SPEC_TAC (`x':real^N`,`x':real^N`);
\r
4367 REWRITE_TAC[GSYM SUBSET; UNION_SUBSET];
\r
4368 SUBGOAL_THEN ` x:real^N IN aff {a,b}` ASSUME_TAC;
\r
4369 REWRITE_TAC[Collect_geom.AFF_2POINTS_INTERPRET; IN_ELIM_THM];
\r
4370 EXISTS_TAC` a':real`;
\r
4371 EXISTS_TAC `b':real`;
\r
4372 ASM_REWRITE_TAC[];
\r
4373 ASSUME_TAC (ISPECL [` a:real^N`;`b:real^N`] Planarity.POINT_IN_LINE);
\r
4374 ASSUME_TAC (ISPECL [` b:real^N`;`a:real^N`] Planarity.POINT_IN_LINE);
\r
4375 MP_TAC (ISPECL [`x:real^N`;` a:real^N`] HALFLINE_SUBSET_AFFINE_HULL);
\r
4376 MP_TAC (ISPECL [`x:real^N`;` b:real^N`] HALFLINE_SUBSET_AFFINE_HULL);
\r
4377 SUBGOAL_THEN ` aff {x,a:real^N} SUBSET aff {a,b} ` MP_TAC;
\r
4378 MATCH_MP_TAC S_SUBSET_IMP_AFF_S_TOO;
\r
4379 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
4380 SUBGOAL_THEN ` aff {x,b:real^N} SUBSET aff {a,b} ` MP_TAC;
\r
4381 MATCH_MP_TAC S_SUBSET_IMP_AFF_S_TOO;
\r
4383 ASM_SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
4384 ONCE_REWRITE_TAC[INSERT_COMM];
\r
4385 ASM_REWRITE_TAC[];
\r
4387 REWRITE_TAC[GSYM aff];
\r
4398 let CVLF_LF_F = prove(
\r
4399 ` convex_local_fan (V,E,FF) ==> local_fan (V,E,FF) /\ FAN (vec 0,V,E)`,
\r
4400 SIMP_TAC[convex_local_fan] THEN NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN THEN
\r
4405 let EMPTY_NOT_EXISTS_IN = SET_RULE` a = {} <=> ~(? x. x IN a ) `;;
\r
4410 let LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI = prove_by_refinement
\r
4411 (`convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
4412 ==> vec 0 IN conv0 {v,w} /\
\r
4413 (!u. u IN V DIFF {v, w} ==> interior_angle1 (vec 0) FF u = pi /\
\r
4414 rho_node1 FF u IN aff {u,v,w} /\
\r
4415 ivs_rho_node1 FF u IN aff {u,v,w})`,
\r
4416 [REWRITE_TAC[lunar];
\r
4418 SUBGOAL_THEN` vec 0 IN conv0 {v,w:real^3} ` ASSUME_TAC;
\r
4419 MATCH_MP_TAC FAN_SUB_NOT_EQ_COLL_IN_CONV0;
\r
4420 ASSUME_TAC2 CVLF_LF_F;
\r
4421 ASM_REWRITE_TAC[];
\r
4422 ASM_REWRITE_TAC[];
\r
4423 GEN_TAC THEN DISCH_TAC;
\r
4424 ABBREV_TAC` conclusion <=> interior_angle1 (vec 0) FF u = pi /\
\r
4425 rho_node1 FF u IN aff {u, v, w} /\
\r
4426 ivs_rho_node1 FF u IN aff {u, v, w} `;
\r
4427 SUBGOAL_THEN` vec 0 IN aff {u:real^3, vec 0} ` ASSUME_TAC;
\r
4428 ONCE_REWRITE_TAC[INSERT_COMM];
\r
4429 ASM_REWRITE_TAC[Planarity.POINT_IN_LINE];
\r
4430 SUBGOAL_THEN` ~(aff {u, vec 0} INTER conv0 {v,w:real^3} = {})` ASSUME_TAC;
\r
4431 REWRITE_TAC[INTER_EQ_EM_EXPAND];
\r
4432 EXISTS_TAC` vec 0:real^3 `;
\r
4433 ASM_REWRITE_TAC[];
\r
4434 ASM_CASES_TAC ` v IN aff {u, vec 0:real^3} `;
\r
4435 SUBGOAL_THEN`aff {u, vec 0} = aff {v,w:real^3} ` ASSUME_TAC;
\r
4436 MATCH_MP_TAC AFF2_DET_BY_TWO_POINTS;
\r
4437 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
4439 SIMP_TAC[INTER_EQ_EM_EXPAND; GSYM IN_INTER];
\r
4440 MESON_TAC[AFF2_ITR_CONV0_IMP_SAME_ENDS];
\r
4441 SUBGOAL_THEN` u IN aff {u:real^3, vec 0} ` MP_TAC;
\r
4442 REWRITE_TAC[Planarity.POINT_IN_LINE];
\r
4443 ASM_REWRITE_TAC[];
\r
4444 UNDISCH_TAC` vec 0 IN conv0 {v, w:real^3}`;
\r
4445 NHANH IN_CONV_LINE_SEPERATABLE;
\r
4446 SIMP_TAC[IN_UNION];
\r
4448 SUBGOAL_THEN` ~( u:real^3 IN aff_ge {vec 0} {v} )` MP_TAC;
\r
4449 MATCH_MP_TAC FAN_IMP_NOT_IN_AFF_GE;
\r
4450 ASSUME_TAC2 CVLF_LF_F;
\r
4451 ASM_REWRITE_TAC[];
\r
4452 UNDISCH_TAC` {v,w:real^3} SUBSET V `;
\r
4453 UNDISCH_TAC `u:real^3 IN V DIFF {v,w} `;
\r
4455 ASM_REWRITE_TAC[];
\r
4456 SUBGOAL_THEN` ~( u IN aff_ge {vec 0} {w:real^3}) ` MP_TAC;
\r
4457 MATCH_MP_TAC FAN_IMP_NOT_IN_AFF_GE;
\r
4458 ASSUME_TAC2 CVLF_LF_F;
\r
4459 ASM_REWRITE_TAC[];
\r
4460 UNDISCH_TAC` {v,w:real^3} SUBSET V `;
\r
4461 UNDISCH_TAC `u:real^3 IN V DIFF {v,w} `;
\r
4463 ASM_REWRITE_TAC[];
\r
4464 SUBGOAL_THEN` {v,w:real^3} INTER aff {u, vec 0} = {} ` ASSUME_TAC;
\r
4465 ASM_REWRITE_TAC[Trigonometry2.INSERT_INTER_EMPTY];
\r
4467 REWRITE_TAC[EMPTY_NOT_EXISTS_IN];
\r
4468 MESON_TAC[AFF2_ITR_CONV0_IMP_SAME_ENDS];
\r
4469 EXPAND_TAC "conclusion";
\r
4470 MATCH_MP_TAC OZQVSFF;
\r
4471 EXISTS_TAC ` v:real^3 `;
\r
4472 EXISTS_TAC ` w:real^3 `;
\r
4473 UNDISCH_TAC` {v,w:real^3} SUBSET V `;
\r
4474 UNDISCH_TAC` u IN V DIFF {v,w:real^3}`;
\r
4475 ASM_REWRITE_TAC[INSERT_SUBSET; IN_DIFF];
\r
4477 STRIP_TAC THEN STRIP_TAC;
\r
4479 REWRITE_TAC[plane];
\r
4480 SUBGOAL_THEN` ~ collinear {u,v,w:real^3} ` ASSUME_TAC;
\r
4481 ASM_SIMP_TAC[Collect_geom.NOT_TWO_EQ_IMP_COL_EQUAVALENT];
\r
4482 UNDISCH_TAC` vec 0 IN conv0 {v, w:real^3}`;
\r
4483 NHANH IN_CONV_LINE_SEPERATABLE;
\r
4486 REWRITE_TAC[IN_UNION; DE_MORGAN_THM];
\r
4488 MATCH_MP_TAC FAN_IMP_NOT_IN_AFF_GE;
\r
4489 ASSUME_TAC2 CVLF_LF_F;
\r
4490 ASM_REWRITE_TAC[];
\r
4491 UNDISCH_TAC` ~( u:real^3 IN {v,w})`;
\r
4492 ASM_REWRITE_TAC[INSERT_SUBSET; IN_INSERT];
\r
4494 MATCH_MP_TAC FAN_IMP_NOT_IN_AFF_GE;
\r
4495 ASSUME_TAC2 CVLF_LF_F;
\r
4496 ASM_REWRITE_TAC[];
\r
4497 UNDISCH_TAC` ~( u:real^3 IN {v,w})`;
\r
4498 ASM_REWRITE_TAC[INSERT_SUBSET; IN_INSERT];
\r
4504 MP_TAC (ISPECL [` v:real^3`;` w:real^3`] (GEN_ALL CONV02_SUBSET_AFF2));
\r
4505 SUBGOAL_THEN` aff {v,w} SUBSET aff {u,v,w:real^3}` ASSUME_TAC;
\r
4507 MATCH_MP_TAC HULL_MONO;
\r
4508 REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET];
\r
4509 REWRITE_TAC[EMPTY_SUBSET];
\r
4512 UNDISCH_TAC` aff {v, w} SUBSET aff {u, v, w:real^3}`;
\r
4513 REWRITE_TAC[SUBSET];
\r
4514 DISCH_THEN MATCH_MP_TAC;
\r
4516 REWRITE_TAC[SUBSET];
\r
4517 DISCH_THEN MATCH_MP_TAC;
\r
4518 FIRST_ASSUM ACCEPT_TAC;
\r
4520 MESON_TAC[INSERT_COMM; Trigonometry2.IN_P_HULL_INSERT];
\r
4521 ASM_SIMP_TAC[INSERT_COMM]]);;
\r
4524 let AFF_GE_MONO_TRANS = prove(
\r
4525 ` S SUBSET X ==> aff_ge (X DIFF S ) ( Y UNION S) SUBSET aff_ge X Y `,
\r
4526 STRIP_TAC THEN REWRITE_TAC[aff_ge_def; SUBSET; IN; affsign] THEN
\r
4527 ASM_SIMP_TAC[SET_RULE` S SUBSET X ==> (X DIFF S UNION Y UNION S) = X UNION Y `]
\r
4531 let AFF_GT_MONO_TRANS = prove(
\r
4532 ` S SUBSET X ==> aff_gt (X DIFF S ) ( Y UNION S) SUBSET aff_gt X Y `,
\r
4533 STRIP_TAC THEN REWRITE_TAC[aff_gt_def; SUBSET; IN; affsign] THEN
\r
4534 ASM_SIMP_TAC[SET_RULE` S SUBSET X ==> (X DIFF S UNION Y UNION S) = X UNION Y `]
\r
4537 let CONV_UNION_SUB_AFF_GE = prove(
\r
4538 ` conv (X:(real^N -> bool) UNION Y) SUBSET aff_ge X Y `,
\r
4539 REWRITE_TAC[Collect_geom.conv; GSYM aff_ge_def] THEN
\r
4540 MP_TAC (ISPECL [`X:real^N -> bool`;`X:real^N -> bool`] (GEN_ALL AFF_GE_MONO_TRANS))
\r
4541 THEN SIMP_TAC[SUBSET_REFL; DIFF_EQ_EMPTY; UNION_COMM]);;
\r
4545 let CONV_MONO = prove(` S SUBSET SS ==> conv S SUBSET conv SS `,
\r
4546 REWRITE_TAC[Geomdetail.conv; GSYM aff_ge_def] THEN
\r
4547 STRIP_TAC THEN MATCH_MP_TAC AFF_GE_MONO_RIGHT THEN
\r
4548 ASM_REWRITE_TAC[DISJOINT_EMPTY]);;
\r
4553 let CONV3_SUBSET_AFF_GE_3S = prove(` conv {a,b,c:real^N} SUBSET aff_ge {a,b,c} S `,
\r
4554 MP_TAC (ISPECL [` {a,b,c:real^N}`;` S:real^N -> bool`] (GEN_ALL CONV_UNION_SUB_AFF_GE)) THEN
\r
4555 MATCH_MP_TAC (SET_RULE` a SUBSET b ==> b SUBSET c ==> a SUBSET c `) THEN
\r
4556 MATCH_MP_TAC CONV_MONO THEN SET_TAC[]);;
\r
4559 let P_SET3_IMP_SET2 =
\r
4560 MESON[INSERT_INSERT]` (! (a:A) b c. P ({a,b,c}) ) ==> (! (a:A) b. (P {a,b})) `;;
\r
4563 let CONV2_SUBSET_AFF_GE_2S =
\r
4564 MATCH_MP P_SET3_IMP_SET2 (GEN_ALL CONV3_SUBSET_AFF_GE_3S);;
\r
4573 (* ------------------------------------------------------------------------- *)
\r
4574 (* Search (automatically updates) *)
\r
4575 (* ------------------------------------------------------------------------- *)
\r
4577 let full t = mk_comb(mk_var("<full term>",W mk_fun_ty (type_of t)),t);;
\r
4579 (* very rough measure of the size of a printed term *)
\r
4580 let rec term_length tm = match tm with
\r
4581 | Abs(s,x) -> 1 + term_length x
\r
4582 | Comb(s,x) -> if ((s = `NUMERAL`) or (s = `DECIMAL`)) then 2
\r
4583 else ( (term_length s) + term_length x)
\r
4586 let sortlength_thml thml =
\r
4588 (function (s,t) as r -> (term_length (concl t),r)) thml in
\r
4589 let stml = sort (fun (a,_) (b,_) -> (a < b)) ltml in
\r
4593 let rec immediatesublist l1 l2 =
\r
4594 match (l1,l2) with
\r
4597 | (h1::t1,h2::t2) -> h1 = h2 & immediatesublist t1 t2 in
\r
4598 let rec sublist l1 l2 =
\r
4599 match (l1,l2) with
\r
4602 | (h1::t1,h2::t2) -> immediatesublist l1 l2 or sublist l1 t2 in
\r
4603 let exists_subterm_satisfying p (n,th) = can (find_term p) (concl th) in
\r
4604 let exists_fullterm_satisfying p (n,th) = p (concl th) in
\r
4605 let name_contains s (n,th) = sublist (explode s) (explode n) in
\r
4606 let rec filterpred tm =
\r
4608 Comb(Var("<omit this pattern>",_),t) -> not o filterpred t
\r
4609 | Comb(Var("<match theorem name>",_),Var(pat,_)) -> name_contains pat
\r
4610 | Comb(Var("<match aconv>",_),pat) -> exists_subterm_satisfying (aconv pat)
\r
4611 | Comb(Var("<full term>",_),pat) -> exists_fullterm_satisfying (can (term_match [] pat))
\r
4612 | pat -> exists_subterm_satisfying (can (term_match [] pat)) in
\r
4613 fun pats thml -> update_database ();
\r
4614 if (pats = []) then failwith "keywords: omit, name, exactly, full" else
\r
4615 (itlist (filter o filterpred) pats thml);;
\r
4619 let (PAT_TAC:term list -> (string * thm) -> tactic) =
\r
4620 fun pat sth -> if (search_thml pat [sth] = []) then NO_TAC else ALL_TAC;;
\r
4622 let (FIRST_PAT_ASSUM: term list -> thm_tactic -> tactic) =
\r
4623 fun pat ttac gl -> tryfind (fun sth -> (PAT_TAC pat sth THEN ttac (snd sth)) gl) (goal_asms gl);;
\r
4625 let (FIRST_PAT_X_ASSUM:term list -> thm_tactic -> tactic) =
\r
4627 FIRST_PAT_ASSUM pat (fun th -> UNDISCH_THEN (concl th) ttac);;
\r
4628 (* ================================================================== *)
\r
4635 let X_IN_AFF_GE = prove_by_refinement
\r
4636 (` x IN aff_ge S {x:real^N} `,
\r
4637 [REWRITE_TAC[aff_ge_def; IN; affsign; sgn_ge; lin_combo];
\r
4638 EXISTS_TAC` (\a. if a = (x:real^N) then &1 else &0 ) `;
\r
4641 SUBGOAL_THEN` vsum (S UNION {x:real^N}) (\v. (if v = x then &1 else &0) % v)
\r
4642 = vsum ({x}) (\v. (if v = x then &1 else &0) % v) ` ASSUME_TAC;
\r
4643 MATCH_MP_TAC VSUM_UNION_LZERO;
\r
4644 REWRITE_TAC[FINITE_SINGLETON; IN_INSERT; NOT_IN_EMPTY];
\r
4645 SIMP_TAC[VECTOR_MUL_LZERO];
\r
4646 ASM_REWRITE_TAC[VSUM_SING; VECTOR_MUL_LID];
\r
4648 SIMP_TAC[SET_RULE` {a} x <=> x = a `; REAL_ARITH` &0 <= &1 `];
\r
4649 SUBGOAL_THEN` sum (S UNION {x:real^N}) (\a. if a = x then &1 else &0)
\r
4650 = sum ({x}) (\a. if a = x then &1 else &0) ` ASSUME_TAC;
\r
4651 MATCH_MP_TAC SUM_UNION_LZERO;
\r
4652 SIMP_TAC[FINITE_SING; IN_INSERT; DE_MORGAN_THM];
\r
4653 ASM_REWRITE_TAC[SUM_SING]]);;
\r
4661 let LOFA_IMP_BIJ_FF_V = MESON[Wrgcvdr_cizmrrh.BIJ_BETWEEN_FF_AND_V]
\r
4662 ` local_fan (V,E,FF) ==> BIJ (\x. FST x) FF V `;;
\r
4664 let LOFA_IMP_CARD_FF_V_EQ = prove(
\r
4665 ` local_fan (V,E,FF) ==> CARD FF = CARD V `,
\r
4666 NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_FINITE_FF THEN
\r
4667 NHANH LOFA_IMP_BIJ_FF_V THEN PHA THEN
\r
4668 NHANH BIJ_IMP_CARD_EQ THEN SIMP_TAC[]);;
\r
4672 let FIRST_IN_AFF = prove(` a IN aff ( a INSERT S ) `,
\r
4673 REWRITE_TAC[aff; Trigonometry2.IN_P_HULL_INSERT]);;
\r
4680 let HALF_CIRCULAR_IN_PLANE = prove_by_refinement
\r
4681 (` (convex_local_fan (V,E,FF) /\ lunar (v,w) V E ) /\
\r
4682 n < CARD V /\ w = ITER n (rho_node1 FF) v
\r
4683 ==> { ITER l (rho_node1 FF) v | l <= n } SUBSET aff {vec 0, v, rho_node1 FF v}`,
\r
4684 [NHANH LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
\r
4685 REWRITE_TAC[SUBSET; IN_ELIM_THM; lunar];
\r
4687 ASM_REWRITE_TAC[];
\r
4688 UNDISCH_TAC ` l <= n:num`;
\r
4689 SPEC_TAC (`l:num`,`l:num`);
\r
4691 REWRITE_TAC[ITER];
\r
4693 MP_TAC (ISPECL [`affine: (real^3 -> bool) -> bool `;
\r
4694 ` {vec 0, v, rho_node1 FF v } `] HULL_SUBSET);
\r
4695 REWRITE_TAC[aff; SUBSET];
\r
4696 DISCH_THEN MATCH_MP_TAC;
\r
4697 REWRITE_TAC[IN_INSERT];
\r
4698 NHANH (ARITH_RULE` SUC a <= b ==> a <= b `);
\r
4699 FIRST_X_ASSUM NHANH;
\r
4701 FIRST_X_ASSUM (MP_TAC o (SPEC` ITER l' (rho_node1 FF) v `));
\r
4702 ASM_CASES_TAC` l' = 0 `;
\r
4703 ASM_REWRITE_TAC[ITER];
\r
4705 MP_TAC (ISPECL [`affine: (real^3 -> bool) -> bool `;
\r
4706 ` {vec 0, v, rho_node1 FF v } `] HULL_SUBSET);
\r
4707 REWRITE_TAC[aff; SUBSET];
\r
4708 DISCH_THEN MATCH_MP_TAC;
\r
4709 REWRITE_TAC[IN_INSERT];
\r
4711 ASSUME_TAC2 CVX_LO_IMP_LO;
\r
4712 ASSUME_TAC2 LOFA_IMP_CARD_FF_V_EQ;
\r
4713 MP_TAC2 (SPEC `n:num` (GEN `l:num` LOFA_IMP_DIS_ELMS));
\r
4714 UNDISCH_TAC` !x. x IN {v, w} ==> x IN (V:real^3 -> bool) `;
\r
4715 SIMP_TAC[IN_INSERT];
\r
4716 DISCH_THEN (MP_TAC o (SPEC`l': num`));
\r
4718 UNDISCH_TAC` SUC l' <= n `;
\r
4722 MP_TAC2 (SPEC `l':num` (GEN `l:num` LOFA_IMP_DIS_ELMS));
\r
4724 UNDISCH_TAC` !x. x IN {v, w} ==> x IN (V:real^3 -> bool) `;
\r
4725 SIMP_TAC[IN_INSERT];
\r
4726 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
\r
4727 UNDISCH_TAC` l' <= n:num `;
\r
4729 DISCH_THEN (MP_TAC o (SPEC`0`));
\r
4731 UNDISCH_TAC` ~( l' = 0)`;
\r
4733 ASM_SIMP_TAC[IN_DIFF; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM; ITER];
\r
4736 MP_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
4737 DISCH_THEN MATCH_MP_TAC;
\r
4738 UNDISCH_TAC ` !x. x IN {v:real^3, w} ==> x IN V`;
\r
4739 SIMP_TAC[IN_INSERT];
\r
4741 SUBGOAL_THEN` aff {ITER l' (rho_node1 FF) v, v, w} SUBSET aff {vec 0, v, rho_node1 FF v}` MP_TAC;
\r
4742 MATCH_MP_TAC S_SUBSET_IMP_AFF_S_TOO;
\r
4743 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
4745 MESON_TAC[FIRST_IN_AFF; INSERT_COMM];
\r
4747 SUBGOAL_THEN` aff {vec 0, v:real^3} SUBSET aff {vec 0, v, rho_node1 FF v }` MP_TAC;
\r
4749 MATCH_MP_TAC HULL_MONO;
\r
4751 REWRITE_TAC[SUBSET];
\r
4752 DISCH_THEN MATCH_MP_TAC;
\r
4753 UNDISCH_TAC ` vec 0 IN conv0 {v,w:real^3}`;
\r
4754 NHANH IN_CONV0_IMP_AFF_EQ;
\r
4755 SIMP_TAC[INSERT_COMM];
\r
4757 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
4758 ASM_REWRITE_TAC[Planarity.POINT_IN_LINE1];
\r
4759 SIMP_TAC[SUBSET; ITER]]);;
\r
4766 let LOFA_IMP_AZIM_RHO_NODE_ST = prove_by_refinement
\r
4767 (` local_fan (V,E,FF) /\ v IN V /\ v cross rho_node1 FF v = e ==>
\r
4768 ~(azim ( vec 0 ) e v (rho_node1 FF v ) = &0 \/ azim (vec 0) e v (rho_node1 FF v ) = pi ) `,
\r
4769 [NHANH (MESON[Trigonometry.YIXJNJQ1; SIN_PI]` a = &0 \/ a = pi ==> sin a = &0 `);
\r
4770 MP_TAC (SPECL [`e:real^3`;` v:real^3`;` rho_node1 FF v `] Trigonometry2.JBDNJJB);
\r
4771 REWRITE_TAC[re_eqvl];
\r
4774 ASM_SIMP_TAC[REAL_ENTIRE; DE_MORGAN_THM];
\r
4777 UNDISCH_TAC` &0 < t `;
\r
4779 ONCE_REWRITE_TAC[CROSS_TRIPLE];
\r
4780 ASM_REWRITE_TAC[DOT_EQ_0];
\r
4781 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
4782 REWRITE_TAC[CROSS_EQ_0];
\r
4783 UNDISCH_TAC `v:real^3 IN V `;
\r
4784 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
4785 FIRST_X_ASSUM NHANH;
\r
4795 let LOFA_IMP_DIS_ELMS2 =
\r
4796 MESON[LOFA_IMP_DIS_ELMS]` local_fan (V,E,FF) /\ v IN V
\r
4797 ==> (!i l. i < l /\ l < CARD FF
\r
4798 ==> ~(ITER l (rho_node1 FF) v = ITER i (rho_node1 FF) v))`;;
\r
4806 let RHO_NODE1_MONO_WITH_AZIM = prove_by_refinement
\r
4807 (` local_fan (V,E,FF) /\
\r
4809 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
4813 v cross rho_node1 FF v = e
\r
4814 ==> (! n m. n < m /\ m < CARD V /\ m <= l
\r
4815 ==> azim (vec 0) e v ( ITER n (rho_node1 FF) v) <
\r
4816 azim (vec 0) e v ( ITER m (rho_node1 FF) v) )`,
\r
4821 ASM_CASES_TAC ` m = n:num`;
\r
4822 FIRST_X_ASSUM (SUBST_ALL_TAC);
\r
4823 ASSUME_TAC2 SEQUENCE_OF_RHO_NODE_IS_SUC;
\r
4824 FIRST_X_ASSUM (MP_TAC o (SPECL [` ITER n (rho_node1 FF) v`;`n:num`]));
\r
4826 NHANH (ARITH_RULE` SUC a <= b ==> a < b `);
\r
4830 FIRST_X_ASSUM (MP_TAC o (SPEC`v:real^3 `));
\r
4831 REWRITE_TAC[ITER];
\r
4832 ASM_CASES_TAC` n = 0 `;
\r
4833 ASM_REWRITE_TAC[ITER; AZIM_REFL];
\r
4834 ASSUME_TAC2 LOFA_IMP_AZIM_RHO_NODE_ST;
\r
4835 MP_TAC (SPECL [`vec 0:real^3 `;` e:real^3 `;` v:real^3 `;` rho_node1 FF v `] AZIM_RANGE);
\r
4844 DISCH_THEN MATCH_MP_TAC;
\r
4845 ASSUME_TAC2 LOFA_IMP_DIS_ELMS2;
\r
4847 REWRITE_TAC[IN_ELIM_THM];
\r
4850 REWRITE_TAC[ITER; LE_0];
\r
4852 FIRST_ASSUM (MP_TAC o (SPECL [`0`;` n:num`]));
\r
4853 FIRST_ASSUM (MP_TAC o (SPECL [`0`;` n + 1`]));
\r
4855 ASM_REWRITE_TAC[GSYM ADD1];
\r
4859 REWRITE_TAC[LT_0];
\r
4860 ASSUME_TAC2 LOFA_IMP_CARD_FF_V_EQ;
\r
4861 ASM_REWRITE_TAC[];
\r
4864 ASSUME_TAC2 LOFA_IMP_CARD_FF_V_EQ;
\r
4867 UNDISCH_TAC` ~( n = 0 ) `;
\r
4868 UNDISCH_TAC` SUC n < CARD (V:real^3 -> bool) `;
\r
4869 ASM_REWRITE_TAC[];
\r
4874 UNDISCH_TAC` n < m /\ m < CARD (V:real^3 -> bool) /\ m <= l
\r
4875 ==> azim (vec 0) e v (ITER n (rho_node1 FF) v) <
\r
4876 azim (vec 0) e v (ITER m (rho_node1 FF) v) ` ;
\r
4878 REPLICATE_TAC 4 DOWN THEN PHA;
\r
4880 ASSUME_TAC2 SEQUENCE_OF_RHO_NODE_IS_SUC;
\r
4882 FIRST_X_ASSUM (MP_TAC o (SPECL [` ITER m (rho_node1 FF) v`;` m:num`]));
\r
4888 DISCH_THEN (MP_TAC o (SPEC ` v:real^3 `));
\r
4891 REWRITE_TAC[IN_ELIM_THM];
\r
4893 REWRITE_TAC[ITER; LE_0];
\r
4894 ASM_CASES_TAC ` m = 0 `;
\r
4895 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
4896 REWRITE_TAC[ITER; AZIM_REFL];
\r
4897 MP_TAC (SPECL [` vec 0:real^3`;` e:real^3 `;` v:real^3 `;` rho_node1 FF v `] AZIM_RANGE);
\r
4900 ASSUME_TAC2 LOFA_IMP_DIS_ELMS2;
\r
4902 FIRST_X_ASSUM (MP_TAC o (SPECL [`0` ;` m:num `]));
\r
4905 REPLICATE_TAC 3 DOWN THEN PHA;
\r
4906 ASSUME_TAC2 LOFA_IMP_CARD_FF_V_EQ;
\r
4907 ASM_REWRITE_TAC[];
\r
4912 FIRST_X_ASSUM (MP_TAC o (SPECL [`0` ;`SUC m`]));
\r
4916 ASSUME_TAC2 LOFA_IMP_CARD_FF_V_EQ;
\r
4917 ASM_REWRITE_TAC[];
\r
4921 REWRITE_TAC[ITER];
\r
4922 REAL_ARITH_TAC]);;
\r
4931 let DISJOINT_IMP_Z_IN_AFF_GT =
\r
4932 prove(` DISJOINT {x,y} {z} ==> z IN aff_gt {x,y} {z} `,
\r
4933 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM] THEN DISCH_TAC THEN EXISTS_TAC` &0` THEN
\r
4934 EXISTS_TAC ` &0 ` THEN EXISTS_TAC ` &1 ` THEN
\r
4935 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID; VECTOR_MUL_LID] THEN
\r
4940 let LOFA_IMP_DIS_ELMS23 = MESON[LOFA_IMP_CARD_FF_V_EQ; LOFA_IMP_DIS_ELMS2]
\r
4941 ` local_fan (V,E,FF) /\ v IN V
\r
4943 i < l /\ l < CARD V
\r
4944 ==> ~(ITER l (rho_node1 FF) v = ITER i (rho_node1 FF) v))`;;
\r
4950 let NOT_COLL_IMP_COPL = prove(
\r
4951 ` ~ collinear {vec 0,v,w} ==> ~ coplanar {vec 0, v,w, v cross w } `,
\r
4952 REWRITE_TAC[GSYM CROSS_DOT_COPLANAR; GSYM CROSS_EQ_0; DOT_EQ_0]);;
\r
4956 let COLL_IFF_COLL_CROSS = prove_by_refinement
\r
4957 (` collinear {vec 0, v, w} <=> collinear {vec 0, v, v cross w} `,
\r
4958 [EQ_TAC; SIMP_TAC[GSYM CROSS_EQ_0; CROSS_0];
\r
4959 ASM_CASES_TAC` collinear {vec 0,v,w:real^3}`;
\r
4960 ASM_REWRITE_TAC[]; MP_TAC2 NOT_COLL_IMP_COPL;
\r
4961 MESON_TAC[NOT_COPLANAR_NOT_COLLINEAR; INSERT_COMM]]);;
\r
4968 let LOCAL_FAN_CHARACTER_OF_RHO_NODE2 =
\r
4969 prove(` local_fan (V,E,FF) /\ v IN V ==> ~collinear {vec 0, v, rho_node1 FF v} `,
\r
4970 NHANH LOCAL_FAN_CHARACTER_OF_RHO_NODE THEN SIMP_TAC[]);;
\r
4975 let LUNAR_IMP_HALF_CIRCLE_SUBSET_AFF_GT = prove_by_refinement
\r
4976 (`convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
4977 ==> (?i. i < CARD V /\
\r
4978 w = ITER i (rho_node1 FF) v /\
\r
4979 {ITER l (rho_node1 FF) v | 0 < l /\ l < i} SUBSET
\r
4980 aff_gt {vec 0, v} {rho_node1 FF v})`,
\r
4981 [NHANH LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
\r
4983 REWRITE_TAC[convex_local_fan; lunar; INSERT_SUBSET];
\r
4984 NHANH LOCAL_FAN_ORBIT_MAP_V;
\r
4985 NHANH LOOP_SET_DETER_FIRTS_ELMS;
\r
4987 SUBGOAL_THEN` orbit_map (rho_node1 FF) v = (V:real^3 -> bool) `ASSUME_TAC;
\r
4989 SUBGOAL_THEN` {ITER n (rho_node1 FF) v | n < CARD V} = V `ASSUME_TAC;
\r
4991 UNDISCH_TAC` w:real^3 IN V `;
\r
4993 REWRITE_TAC[IN_ELIM_THM];
\r
4995 EXISTS_TAC` n:num`;
\r
4996 ASM_REWRITE_TAC[SUBSET; IN_ELIM_THM];
\r
4999 ASM_REWRITE_TAC[];
\r
5000 MP_TAC2 HALF_CIRCULAR_IN_PLANE;
\r
5001 SWITCH_TAC ` w = ITER n (rho_node1 FF) v `;
\r
5002 ASM_SIMP_TAC[convex_local_fan; lunar];
\r
5003 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
5006 REWRITE_TAC[IN_ELIM_THM];
\r
5007 EXISTS_TAC` n:num`;
\r
5008 ASM_REWRITE_TAC[];
\r
5009 ABBREV_TAC` U = {ITER l (rho_node1 FF) v | l <= n} `;
\r
5010 ABBREV_TAC` P = aff {vec 0, v, rho_node1 FF v} `;
\r
5011 ABBREV_TAC` e = v cross rho_node1 FF v `;
\r
5013 MP_TAC2 (SPEC `n:num` (GEN `l:num` FIRST_AZIM_CYCLE_EQ_RHO_NODE));
\r
5015 REWRITE_TAC[plane; FIRST_IN_AFF; aff];
\r
5016 EXISTS_TAC` vec 0:real^3 `;
\r
5017 EXISTS_TAC` v:real^3`;
\r
5018 EXISTS_TAC` rho_node1 FF v `;
\r
5019 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
5020 UNDISCH_TAC` v:real^3 IN V`;
\r
5021 FIRST_X_ASSUM NHANH;
\r
5023 MP_TAC2 (SPEC `n:num ` (GEN ` l:num` RHO_NODE1_MONO_WITH_AZIM));
\r
5025 REWRITE_TAC[plane; FIRST_IN_AFF];
\r
5026 EXISTS_TAC` vec 0:real^3 `;
\r
5027 EXISTS_TAC` v:real^3 `;
\r
5028 EXISTS_TAC ` rho_node1 FF v `;
\r
5030 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
5033 FIRST_ASSUM (ASSUME_TAC o (SPECL [`0`;` l:num`]));
\r
5036 ASM_REWRITE_TAC[];
\r
5037 UNDISCH_TAC` l < n:num`;
\r
5038 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
\r
5042 FIRST_ASSUM (ASSUME_TAC o (SPECL [` l:num`;`n:num`]));
\r
5045 ASM_REWRITE_TAC[LE_REFL];
\r
5048 REWRITE_TAC[ITER; AZIM_REFL];
\r
5049 SUBGOAL_THEN` azim (vec 0) e v (ITER n (rho_node1 FF) v) = pi <=>
\r
5050 v IN aff_lt {vec 0, e:real^3} {ITER n (rho_node1 FF) v}` ASSUME_TAC;
\r
5051 MATCH_MP_TAC AZIM_EQ_PI;
\r
5053 UNDISCH_TAC` vec 0 IN conv0 {v,w:real^3}`;
\r
5054 REWRITE_TAC[Geomdetail.CONV0_SET2; IN_ELIM_THM];
\r
5055 NHANH (REAL_ARITH` &0 < a ==> ~( a = &0 ) `);
\r
5056 REWRITE_TAC[VECTOR_ARITH` vec 0 = a + b <=> b = -- a `];
\r
5058 SWITCH_TAC` w = ITER n (rho_node1 FF) v`;
\r
5059 ASM_REWRITE_TAC[];
\r
5060 SUBGOAL_THEN` collinear {vec 0, &1 % e, b % w} <=> collinear {vec 0, e, w:real^3}` ASSUME_TAC;
\r
5061 MATCH_MP_TAC COLLINEAR_SCALE_ALL;
\r
5062 ASM_REWRITE_TAC[];
\r
5064 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
5065 ASM_REWRITE_TAC[GSYM VECTOR_MUL_LNEG];
\r
5067 SUBGOAL_THEN` collinear {vec 0, &1 % e, ( -- a ) % v} <=> collinear {vec 0, e, v:real^3}` SUBST1_TAC;
\r
5068 MATCH_MP_TAC COLLINEAR_SCALE_ALL;
\r
5069 UNDISCH_TAC` ~( a = &0 )`;
\r
5073 ONCE_REWRITE_TAC[SET_RULE` {a,b} = {b,a} `];
\r
5074 ONCE_REWRITE_TAC[GSYM COLL_IFF_COLL_CROSS];
\r
5075 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
5076 UNDISCH_TAC` v:real^3 IN V`;
\r
5077 FIRST_X_ASSUM NHANH;
\r
5081 SUBGOAL_THEN ` azim (vec 0) e v (ITER n (rho_node1 FF) v) = pi ` ASSUME_TAC;
\r
5082 FIRST_X_ASSUM SUBST1_TAC;
\r
5083 SUBGOAL_THEN` ~( aff {vec 0, e:real^3} INTER conv0 {w,v} = {} ) ` MP_TAC;
\r
5084 REWRITE_TAC[EMPTY_NOT_EXISTS_IN];
\r
5085 EXISTS_TAC` vec 0:real^3 `;
\r
5086 SWITCH_TAC` w = ITER n (rho_node1 FF) v `;
\r
5087 ASM_SIMP_TAC[IN_INTER; Planarity.POINT_IN_LINE; INSERT_COMM];
\r
5089 ASM_REWRITE_TAC[];
\r
5090 MATCH_MP_TAC Ldurdpn.AFF_CONV0_IN_AFF_LT;
\r
5091 SWITCH_TAC` w = ITER n (rho_node1 FF ) v `;
\r
5097 UNDISCH_TAC` vec 0 IN conv0 {v,w:real^3}`;
\r
5098 REWRITE_TAC[Geomdetail.CONV0_SET2; IN_ELIM_THM];
\r
5099 NHANH (REAL_ARITH` &0 < a ==> ~( a = &0 ) `);
\r
5100 REWRITE_TAC[VECTOR_ARITH` vec 0 = a + b <=> b = -- a `];
\r
5102 ASM_REWRITE_TAC[];
\r
5103 SUBGOAL_THEN` collinear {vec 0, &1 % e, b % w} <=> collinear {vec 0, e, w:real^3}` ASSUME_TAC;
\r
5104 MATCH_MP_TAC COLLINEAR_SCALE_ALL;
\r
5105 ASM_REWRITE_TAC[];
\r
5107 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
5108 ASM_REWRITE_TAC[GSYM VECTOR_MUL_LNEG];
\r
5110 SUBGOAL_THEN` collinear {vec 0, &1 % e, ( -- a ) % v} <=> collinear {vec 0, e, v:real^3}` SUBST1_TAC;
\r
5111 MATCH_MP_TAC COLLINEAR_SCALE_ALL;
\r
5112 UNDISCH_TAC` ~( a = &0 )`;
\r
5116 ONCE_REWRITE_TAC[SET_RULE` {a,b} = {b,a} `];
\r
5117 ONCE_REWRITE_TAC[GSYM COLL_IFF_COLL_CROSS];
\r
5118 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
5119 UNDISCH_TAC` v:real^3 IN V`;
\r
5120 FIRST_X_ASSUM NHANH;
\r
5123 ASM_REWRITE_TAC[];
\r
5124 SWITCH_TAC` w = ITER n (rho_node1 FF) v `;
\r
5125 ASM_REWRITE_TAC[];
\r
5127 MP_TAC2 (SPEC ` azim (vec 0) e v (ITER l (rho_node1 FF) v) ` SIN_POS_PI);
\r
5128 MP_TAC (SPECL [`e:real^3`;`v:real^3`;` ITER l (rho_node1 FF) v `] Trigonometry2.JBDNJJB);
\r
5129 REWRITE_TAC[re_eqvl];
\r
5133 SUBGOAL_THEN` ITER l (rho_node1 FF) v IN aff {vec 0, v, rho_node1 FF v}` MP_TAC;
\r
5134 ASM_REWRITE_TAC[];
\r
5135 UNDISCH_TAC` U SUBSET (P:real^3 -> bool) `;
\r
5136 REWRITE_TAC[SUBSET];
\r
5137 DISCH_THEN MATCH_MP_TAC;
\r
5139 REWRITE_TAC[IN_ELIM_THM];
\r
5140 EXISTS_TAC `l:num`;
\r
5141 ASM_REWRITE_TAC[];
\r
5142 UNDISCH_TAC` l < n:num`;
\r
5146 REWRITE_TAC[aff; AFFINE_HULL_3; IN_ELIM_THM];
\r
5148 ASM_REWRITE_TAC[];
\r
5150 ONCE_REWRITE_TAC[CROSS_TRIPLE];
\r
5151 REWRITE_TAC[CROSS_RADD; CROSS_RMUL; CROSS_0; CROSS_REFL; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
5152 ASM_REWRITE_TAC[DOT_LMUL];
\r
5155 SUBGOAL_THEN` &0 < e dot (e:real^3)` ASSUME_TAC;
\r
5156 REWRITE_TAC[DOT_POS_LT];
\r
5158 REWRITE_TAC[CROSS_EQ_0];
\r
5159 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5160 ASM_REWRITE_TAC[];
\r
5162 ASM_SIMP_TAC[REAL_LT_MUL_EQ];
\r
5163 MP_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5165 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM];
\r
5167 EXISTS_TAC` u:real `;
\r
5168 EXISTS_TAC` v':real `;
\r
5169 EXISTS_TAC` w':real`;
\r
5170 ASM_REWRITE_TAC[];
\r
5171 VECTOR_ARITH_TAC]);;
\r
5179 let LOOP_SET_ITER_CARD_ID = prove_by_refinement
\r
5180 (` (!v:A. v IN V ==> orbit_map f v = V) ==>
\r
5181 (! v. v IN V ==> ITER (CARD V) f v = v )`,
\r
5182 [NHANH LOOP_SET_DETER_FIRTS_ELMS;
\r
5183 NHANH (ONCE_REWRITE_RULE[EQ_SYM_EQ] SELF_CYCLIC_IMP_BIJ);
\r
5186 FIRST_ASSUM NHANH;
\r
5187 GEN_TAC THEN STRIP_TAC;
\r
5188 SUBGOAL_THEN` ITER (CARD (V:A -> bool)) (f:A -> A) (v:A) IN V` MP_TAC;
\r
5194 FIRST_X_ASSUM (NHANH_PAT`\x. x ==> y`);
\r
5197 REWRITE_TAC[lemma_in_orbit_iter];
\r
5199 REWRITE_TAC[IN_ELIM_THM];
\r
5202 ASM_CASES_TAC` n = 0 `;
\r
5203 ASM_REWRITE_TAC[ITER];
\r
5205 ASM_REWRITE_TAC[];
\r
5206 ABBREV_TAC` cc = CARD (V:A -> bool) `;
\r
5207 ASSUME_TAC2 (ARITH_RULE` n < cc ==> cc = (cc - n ) + (n:num) `);
\r
5208 ABBREV_TAC ` m = cc - (n:num)`;
\r
5209 ASM_REWRITE_TAC[GSYM ITER_ADD];
\r
5211 SUBGOAL_THEN` 0 < m ` MP_TAC;
\r
5212 UNDISCH_TAC` n < cc:num`;
\r
5217 NHANH Lvducxu.ITER_CYCLIC_ORBIT;
\r
5219 SUBGOAL_THEN` ITER n f (v:A) IN V ` MP_TAC;
\r
5221 REWRITE_TAC[IN_ELIM_THM];
\r
5222 EXISTS_TAC `n:num`;
\r
5223 ASM_REWRITE_TAC[];
\r
5228 SUBGOAL_THEN` CARD (V:A -> bool) <= m ` MP_TAC;
\r
5229 FIRST_X_ASSUM SUBST1_TAC;
\r
5230 REWRITE_TAC[Wrgcvdr_cizmrrh.CARD_LE_K_OF_SET_K_FIRST_ELMS];
\r
5231 ASM_REWRITE_TAC[];
\r
5233 UNDISCH_TAC` ~ ( n = 0 ) `;
\r
5240 let LOFA_IMP_ITER_RHO_NODE_ID = prove(
\r
5241 `local_fan (V,E,FF) ==> (! v. v IN V ==> ITER (CARD V) (rho_node1 FF) v = v )`,
\r
5242 NHANH LOCAL_FAN_ORBIT_MAP_V THEN
\r
5243 SIMP_TAC[LOOP_SET_ITER_CARD_ID]);;
\r
5248 let CONV_SUBSET_AFF_GE = prove(` conv SS SUBSET aff_ge S SS`,
\r
5249 REWRITE_TAC[Collect_geom.conv; GSYM aff_ge_def] THEN
\r
5250 MATCH_MP_TAC AFF_GE_MONO_LEFT THEN SET_TAC[]);;
\r
5252 let CONV0_SUBSET_AFF_GT = prove(` conv0 SS SUBSET aff_gt S SS`,
\r
5253 REWRITE_TAC[conv0; GSYM aff_gt_def] THEN
\r
5254 MATCH_MP_TAC AFF_GT_MONO_LEFT THEN SET_TAC[]);;
\r
5260 let collinear_fan22 =
\r
5261 MESON[Fan.collinear_fan]`collinear {x, v,u} <=> u IN aff {x, v} \/ (x = v)`;;
\r
5263 let IN_CONV0_IMP_COLL_IFF = prove(
\r
5264 ` x IN conv0 {a,b} ==> (collinear {a,x,v} <=> collinear {a,b,v} )`,
\r
5265 NHANH IN_CONV0_IMP_AFF_EQ THEN NHANH IN_CONV0_EQ_EQ THEN
\r
5266 SIMP_TAC[collinear_fan22; EQ_SYM_EQ]);;
\r
5268 let IN_CONV0_IMP_COLL_ENDS_AFF = prove(
\r
5269 ` x IN conv0 {a:real^N,b} ==> (collinear {a,x,v} <=> collinear {b,x,v})`,
\r
5270 NHANH IN_CONV0_IMP_COLL_IFF THEN ONCE_REWRITE_TAC[INSERT_COMM] THEN
\r
5271 NHANH IN_CONV0_IMP_COLL_IFF THEN SIMP_TAC[INSERT_COMM]);;
\r
5280 let IN_CONV0_IMP_AZIM_PI = prove_by_refinement
\r
5281 (` ~ collinear {x,a,e} /\ x IN conv0 {a,b}
\r
5282 ==> azim x e a b = pi `,
\r
5284 SUBGOAL_THEN` azim x e a b = pi <=> b IN aff_lt {x,e} {a}` MP_TAC;
\r
5285 MATCH_MP_TAC AZIM_EQ_PI_ALT;
\r
5287 NHANH (SPEC `e:real^N` (GEN `v:real^N` IN_CONV0_IMP_COLL_ENDS_AFF));
\r
5289 ASM_SIMP_TAC[INSERT_COMM];
\r
5293 SPEC_TAC (`x:real^3`,`x:real^3`);
\r
5294 GEOM_ORIGIN_TAC `x:real^3`;
\r
5296 SUBGOAL_THEN` ~(aff {vec 0, e} INTER conv0 {a,b:real^3} = {})` MP_TAC;
\r
5297 REWRITE_TAC[INTER_EQ_EM_EXPAND];
\r
5298 EXISTS_TAC` vec 0:real^3 `;
\r
5299 ASM_REWRITE_TAC[Planarity.POINT_IN_LINE];
\r
5301 MATCH_MP_TAC Ldurdpn.AFF_CONV0_IN_AFF_LT;
\r
5303 SIMP_TAC[INSERT_COMM]]);;
\r
5313 let AFF_GT_MONO = prove(`!S. (S:real^N -> bool) SUBSET Y ==> aff_gt X Y SUBSET aff_gt (X UNION S) ( Y DIFF S)`, GEN_TAC THEN
\r
5314 DISCH_TAC THEN REWRITE_TAC[SUBSET; IN; aff_gt_def; affsign] THEN
\r
5315 ASM_SIMP_TAC[SET_RULE`S SUBSET Y ==> (X UNION S) UNION Y DIFF S = X UNION Y`] THEN
\r
5323 (* aff_gt X Y SUBSET aff (X UNION Y) *)
\r
5324 (* ================================= *)
\r
5325 let AFF_GT_SUB_AFF_UNION =
\r
5326 REWRITE_RULE[SUBSET_REFL; DIFF_EQ_EMPTY; AFF_GT_EQ_AFFINE_HULL; GSYM aff]
\r
5327 (SPEC `Y:real^N -> bool` AFF_GT_MONO);;
\r
5334 let SIN_AZIM_NEG_PI_LT = prove_by_refinement
\r
5335 (` sin ( azim x y u v ) < &0 <=> pi < azim x y u v `,
\r
5336 [MP_TAC (SPECL [`x:real^3`;`y:real^3`;`u:real^3`;` v:real^3 `] AZIM_RANGE);
\r
5339 ASM_CASES_TAC` azim x y u v <= pi `;
\r
5340 SUBGOAL_THEN` &0 <= sin ( azim x y u v )` MP_TAC;
\r
5341 ASM_SIMP_TAC[Trigonometry.WIBGJRR];
\r
5345 ASM_SIMP_TAC [ PI_TO_TWO_PI_NEG_SIN]]);;
\r
5354 let NEXT_OPOSITE_POINT_IS_NOT_IN_AFF_GT = prove_by_refinement
\r
5355 (`( convex_local_fan (V,E,FF) /\ lunar (v,w) V E)
\r
5356 ==> ? i. w = ITER i (rho_node1 FF) v /\
\r
5358 ~(ITER ( i + 1 ) (rho_node1 FF) v IN aff_gt {vec 0, v} {rho_node1 FF v})`,
\r
5359 [NHANH LUNAR_IMP_HALF_CIRCLE_SUBSET_AFF_GT;
\r
5361 SUBGOAL_THEN` ~ collinear {vec 0, v, rho_node1 FF v}` ASSUME_TAC;
\r
5362 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5363 UNDISCH_TAC `lunar (v:real^3,w) V E `;
\r
5364 ASM_SIMP_TAC[lunar; INSERT_SUBSET; CVX_LO_IMP_LO];
\r
5366 EXISTS_TAC `i:num`;
\r
5367 ASSUME_TAC2 (SPEC `i:num` (GEN `n:num` HALF_CIRCULAR_IN_PLANE));
\r
5368 ASM_REWRITE_TAC[];
\r
5369 ASM_CASES_TAC` i + 1 = CARD (V:real^3 -> bool) `;
\r
5370 SUBGOAL_THEN` rho_node1 FF w = v ` ASSUME_TAC;
\r
5371 ASM_REWRITE_TAC[GSYM ITER; ADD1];
\r
5372 ASSUME_TAC2 CVX_LO_IMP_LO;
\r
5373 MP_TAC2 LOFA_IMP_ITER_RHO_NODE_ID;
\r
5374 UNDISCH_TAC` lunar (v:real^3 ,w) V E `;
\r
5375 REWRITE_TAC[lunar; INSERT_SUBSET];
\r
5378 UNDISCH_TAC` lunar (v:real^3,w) V E `;
\r
5379 REWRITE_TAC[lunar; INSERT_SUBSET];
\r
5381 ASSUME_TAC2 CVX_LO_IMP_LO;
\r
5382 SUBGOAL_THEN` ~collinear {vec 0, w, rho_node1 FF w}` MP_TAC;
\r
5383 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5384 ASM_REWRITE_TAC[];
\r
5388 ASM_SIMP_TAC[INSERT_COMM];
\r
5389 ASM_REWRITE_TAC[ARITH_RULE` a + 1 < b <=> a < b /\ ~(a + 1 = b )`];
\r
5391 SUBGOAL_THEN` {ITER l (rho_node1 FF) v | l <= i + 1} SUBSET
\r
5392 aff {vec 0, v, rho_node1 FF v}` ASSUME_TAC;
\r
5393 REWRITE_TAC[ARITH_RULE` a <= b + 1 <=> a = b + 1 \/ a <= b `;
\r
5394 SET_RULE` { f x | x = a \/ Q x } = f a INSERT { f x | Q x }`; INSERT_SUBSET];
\r
5395 ASM_REWRITE_TAC[];
\r
5396 MP_TAC (ISPECL [`{vec 0,v:real^3}`;`{rho_node1 FF v}`]
\r
5397 (GEN_ALL AFF_GT_SUB_AFF_UNION));
\r
5398 REWRITE_TAC[SET_RULE` {a,b} UNION {c} = {a,b,c}`; SUBSET];
\r
5399 DISCH_THEN MATCH_MP_TAC;
\r
5400 FIRST_X_ASSUM ACCEPT_TAC;
\r
5401 ABBREV_TAC` P = aff {vec 0, v, rho_node1 FF v} `;
\r
5402 ABBREV_TAC` U = {ITER l (rho_node1 FF) v | l <= i + 1} `;
\r
5403 ABBREV_TAC` l = i + 1 `;
\r
5404 ABBREV_TAC ` e = v cross rho_node1 FF v `;
\r
5405 MP_TAC2 RHO_NODE1_MONO_WITH_AZIM;
\r
5406 UNDISCH_TAC` lunar (v:real^3,w) V E `;
\r
5407 REWRITE_TAC[lunar; INSERT_SUBSET];
\r
5409 ASSUME_TAC2 CVX_LO_IMP_LO;
\r
5410 ASM_REWRITE_TAC[plane];
\r
5412 REWRITE_TAC[FIRST_IN_AFF];
\r
5413 EXISTS_TAC `vec 0:real^3 `;
\r
5414 EXISTS_TAC` v:real^3 `;
\r
5415 EXISTS_TAC ` rho_node1 FF v `;
\r
5417 MP_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5422 FIRST_X_ASSUM (ASSUME_TAC o (SPECL [`i:num`;` i + 1`]));
\r
5426 REWRITE_TAC[ARITH_RULE` a < a + 1`; LE_REFL; ARITH_RULE` a + 1 < b <=> a < b /\ ~( a + 1 = b )`];
\r
5427 ASM_REWRITE_TAC[];
\r
5429 SUBGOAL_THEN` azim (vec 0) e v (ITER i (rho_node1 FF) v) = pi` SUBST1_TAC;
\r
5430 MATCH_MP_TAC IN_CONV0_IMP_AZIM_PI;
\r
5431 MP_TAC2 LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
\r
5436 REWRITE_TAC[GSYM COLL_IFF_COLL_CROSS];
\r
5437 MP_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5438 UNDISCH_TAC `lunar (v:real^3,w) V E `;
\r
5439 ASM_SIMP_TAC[lunar; INSERT_SUBSET; CVX_LO_IMP_LO];
\r
5441 REWRITE_TAC[GSYM SIN_AZIM_NEG_PI_LT];
\r
5442 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF v} `;
\r
5446 UNDISCH_TAC` ITER l (rho_node1 FF) v IN aff_gt {vec 0, v} {rho_node1 FF v} `;
\r
5447 ASM_REWRITE_TAC[IN_ELIM_THM];
\r
5450 SPECL [`e:real^3`;` v:real^3`;` ITER l (rho_node1 FF) v`] Trigonometry2.JBDNJJB);
\r
5451 REWRITE_TAC[re_eqvl];
\r
5453 ASM_REWRITE_TAC[];
\r
5454 ONCE_REWRITE_TAC[CROSS_TRIPLE];
\r
5455 ASM_REWRITE_TAC[CROSS_RADD; CROSS_RMUL; CROSS_REFL; CROSS_0; VECTOR_MUL_RZERO; VECTOR_ADD_LID; DOT_LMUL];
\r
5456 SUBGOAL_THEN ` &0 < e dot (e:real^3) ` ASSUME_TAC;
\r
5457 REWRITE_TAC[DOT_POS_LT];
\r
5458 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF v} `;
\r
5460 ASM_SIMP_TAC[GSYM CROSS_EQ_0];
\r
5462 ASM_SIMP_TAC[REAL_ARITH` a * b * c < &0 <=> &0 < a * ( --b ) * c `; REAL_LT_MUL_EQ];
\r
5463 UNDISCH_TAC` &0 < t3 `;
\r
5464 REAL_ARITH_TAC]);;
\r
5475 let FOR_AFF_GT_NOT_INTERSECTION = prove_by_refinement
\r
5476 (`a1 % (x:real^N) + b1 % y + t % u = a2 % x + b2 % y + tt % v /\
\r
5479 a1 + b1 + t = &1 /\
\r
5481 ==> u = (a2 - a1) / t % x + (b2 - b1) / t % y + tt / t % v /\
\r
5482 (a2 - a1) / t + (b2 - b1) / t + tt / t = &1 /\
\r
5484 [REWRITE_TAC[VECTOR_ARITH`a + (b:real^N) = c <=> b = c - a `;
\r
5485 REAL_ARITH` a / t + b / t = ( a + b ) / t`];
\r
5486 NHANH_PAT`\x. x ==> y` REAL_POS_NZ;
\r
5488 UNDISCH_TAC` t % u = (a2 % x + b2 % y + tt % v) - a1 % x - b1 % (y:real^N)`;
\r
5489 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE; REAL_ARITH` ( a - b ) / c = a / c - b / c`;
\r
5490 VECTOR_SUB_LDISTRIB; VECTOR_ADD_LDISTRIB; VECTOR_SUB_RDISTRIB];
\r
5495 UNDISCH_TAC` a1 + b1 + t = &1 `;
\r
5496 UNDISCH_TAC` a2 + b2 + tt = &1 `;
\r
5497 SIMP_TAC[ARITH_RULE` a + b = c <=> a = c - b `];
\r
5498 REWRITE_TAC[REAL_POLY_CONV`&1 - (b2 + tt) - (&1 - (b1 + t)) + b2 - b1 + tt`];
\r
5500 UNDISCH_TAC` &0 < t `;
\r
5501 CONV_TAC REAL_FIELD;
\r
5502 MATCH_MP_TAC REAL_LT_DIV;
\r
5503 ASM_REWRITE_TAC[]]);;
\r
5514 let NOT_COLL_RHONODE_SND_POINT = prove_by_refinement
\r
5515 (` convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
5516 ==> ~ collinear {vec 0, v, rho_node1 FF w }`,
\r
5517 [NHANH LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
\r
5518 REWRITE_TAC[collinear_fan22; DE_MORGAN_THM];
\r
5520 UNDISCH_TAC` vec 0 IN conv0 {v,w:real^3}`;
\r
5522 NHANH IN_CONV0_IMP_AFF_EQ;
\r
5523 NHANH IN_CONV0_EQ_EQ;
\r
5524 ONCE_REWRITE_TAC[INSERT_COMM];
\r
5525 NHANH IN_CONV0_IMP_AFF_EQ;
\r
5527 NHANH IN_CONV0_EQ_EQ;
\r
5528 SIMP_TAC[INSERT_COMM];
\r
5530 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
5531 ASM_REWRITE_TAC[];
\r
5532 UNDISCH_TAC` vec 0 = w <=> w = (v:real^3)`;
\r
5533 SIMP_TAC[EQ_SYM_EQ; GSYM collinear_fan22; GSYM DE_MORGAN_THM];
\r
5535 ONCE_REWRITE_TAC[INSERT_COMM];
\r
5537 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5539 SIMP_TAC[convex_local_fan; lunar; INSERT_SUBSET]]);;
\r
5544 let NOT_INTERSECTION_BWT_AFF_GTS = prove_by_refinement
\r
5545 (` convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
5546 ==> aff_gt {vec 0, v} {rho_node1 FF w} INTER aff_gt {vec 0, v} {rho_node1 FF v} = {}`,
\r
5547 [NHANH NOT_COLL_RHONODE_SND_POINT;
\r
5548 NHANH NEXT_OPOSITE_POINT_IS_NOT_IN_AFF_GT;
\r
5550 REWRITE_TAC[convex_local_fan; lunar; INSERT_SUBSET];
\r
5552 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5553 DOWN THEN DOWN THEN PHA;
\r
5555 SIMP_TAC[AFF_GT_2_1; INTER_EQ_EM_EXPAND; IN_ELIM_THM];
\r
5557 DOWN THEN ASM_REWRITE_TAC[GSYM ITER; ADD1];
\r
5559 ASSUME_TAC2 (ISPECL [` ITER (i + 1) (rho_node1 FF) v `;` vec 0:real^3`;` v:real^3`;`rho_node1 FF v`;` t1':real` ;` t1:real`;` t2':real`;` t2:real`;`t3':real`;` t3:real`] (GEN_ALL FOR_AFF_GT_NOT_INTERSECTION));
\r
5560 DOWN THEN STRIP_TAC;
\r
5563 UNDISCH_TAC` ~(ITER (i + 1) (rho_node1 FF) v IN aff_gt {vec 0, v} {rho_node1 FF v}) `;
\r
5564 ASM_SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM];
\r
5565 EXISTS_TAC` (t1' - t1) / t3 `;
\r
5566 EXISTS_TAC` (t2' - t2) / t3 `;
\r
5567 EXISTS_TAC` t3' / t3 `;
\r
5568 ASM_REWRITE_TAC[]]);;
\r
5571 let LUNAR_COMM = prove(` lunar (v,w) V E <=> lunar (w,v) V E `,
\r
5572 SIMP_TAC[EQ_SYM_EQ; lunar; INSERT_COMM]);;
\r
5577 let CONV0_AFF_GT_EQ = prove_by_refinement
\r
5578 (` x:real^N IN conv0 {a,b} /\ ~( collinear {a,x,v})
\r
5579 ==> aff_gt {x,a} {v} = aff_gt {x,a,b} {v}`,
\r
5580 [NHANH IN_CONV0_IMP_COLL_ENDS_AFF;
\r
5581 NHANH IN_CONV0_IMP_AFF_EQ;
\r
5582 REWRITE_TAC[IN_ELIM_THM];
\r
5585 REWRITE_TAC[GSYM SUBSET_ANTISYM_EQ];
\r
5587 MATCH_MP_TAC AFF_GT_MONO_LEFT;
\r
5589 SUBGOAL_THEN` b IN aff {a,b:real^N}` MP_TAC;
\r
5590 REWRITE_TAC[Planarity.POINT_IN_LINE1];
\r
5591 SUBGOAL_THEN` ~ collinear {b,x,v:real^N}` MP_TAC;
\r
5592 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
5593 ASM_REWRITE_TAC[];
\r
5596 ASSUME_TAC2 (SET_RULE` DISJOINT {a, x} {v} /\ DISJOINT {b,x} {v:real^N}
\r
5597 ==> DISJOINT {x,a,b} {v}`);
\r
5599 UNDISCH_TAC` DISJOINT {a, x} {v:real^N}`;
\r
5600 SIMP_TAC[AFF_GT_2_1; INSERT_COMM; AFF_GT_3_1; SUBSET; IN_ELIM_THM];
\r
5602 ASM_REWRITE_TAC[];
\r
5603 UNDISCH_TAC` b IN aff {a,b:real^N}`;
\r
5604 ASM_REWRITE_TAC[];
\r
5605 REWRITE_TAC[AFF2; IN_ELIM_THM];
\r
5607 ASM_REWRITE_TAC[];
\r
5608 EXISTS_TAC` t1 + t3 * ( &1 - t ) `;
\r
5609 EXISTS_TAC` t2 + t3 * t `;
\r
5610 EXISTS_TAC` t4:real`;
\r
5611 ASM_REWRITE_TAC[];
\r
5613 UNDISCH_TAC` t1 + t2 + t3 + t4 = &1 `;
\r
5615 VECTOR_ARITH_TAC]);;
\r
5624 let AFF_GT_SAME_WITH_ENDS = prove_by_refinement
\r
5625 (` convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
5626 ==> aff_gt {vec 0, v} {rho_node1 FF w} = aff_gt {vec 0, w} {rho_node1 FF w }`,
\r
5627 [NHANH LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
\r
5628 NHANH NOT_COLL_RHONODE_SND_POINT;
\r
5629 REWRITE_TAC[lunar; INSERT_SUBSET; convex_local_fan];
\r
5631 SUBGOAL_THEN` ~ collinear {vec 0, w, rho_node1 FF w }` ASSUME_TAC;
\r
5632 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5633 ASM_REWRITE_TAC[];
\r
5634 SUBGOAL_THEN` aff_gt {vec 0, v} {rho_node1 FF w} = aff_gt {vec 0, v, w} {rho_node1 FF w}` SUBST1_TAC;
\r
5635 MATCH_MP_TAC CONV0_AFF_GT_EQ;
\r
5636 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF w} `;
\r
5637 ASM_SIMP_TAC[INSERT_COMM];
\r
5638 SUBGOAL_THEN` aff_gt {vec 0, w} {rho_node1 FF w} = aff_gt {vec 0, w, v} {rho_node1 FF w}` SUBST1_TAC;
\r
5639 MATCH_MP_TAC CONV0_AFF_GT_EQ;
\r
5640 UNDISCH_TAC` ~collinear {vec 0, w, rho_node1 FF w} `;
\r
5641 ASM_SIMP_TAC[INSERT_COMM];
\r
5642 SIMP_TAC[INSERT_COMM]]);;
\r
5647 let CRAZY_THMMM = prove_by_refinement
\r
5648 (` w:real^N IN aff {b,c} /\ z IN aff_gt {b,c} {w}
\r
5649 ==> z IN aff {b,c} `,
\r
5650 [ASM_CASES_TAC` DISJOINT {b,c} {w:real^N}`;
\r
5651 ASM_SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM; AFF2];
\r
5653 ASM_REWRITE_TAC[];
\r
5654 EXISTS_TAC` t1 + t3 * t `;
\r
5655 UNDISCH_TAC` t1 + t2 + t3 = &1 `;
\r
5656 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `];
\r
5660 REWRITE_TAC[SET_RULE`~DISJOINT {b, c} {w} <=> w = b \/ w = c`];
\r
5662 ASM_REWRITE_TAC[];
\r
5663 MP_TAC (SPECL [`{b,c:real^N}`;` {b:real^N}`] (GEN_ALL (REWRITE_RULE[SUBSET_REFL;
\r
5664 DIFF_EQ_EMPTY; AFF_GT_EQ_AFFINE_HULL] (SPEC `Y:real^N -> bool` AFF_GT_MONO))));
\r
5665 REWRITE_TAC[aff; SET_RULE` {a,b} UNION {a} = {a,b}`];
\r
5667 ASM_REWRITE_TAC[];
\r
5668 MP_TAC (SPECL [`{b,c:real^N}`;` {c:real^N}`] (GEN_ALL (REWRITE_RULE[SUBSET_REFL;
\r
5669 DIFF_EQ_EMPTY; AFF_GT_EQ_AFFINE_HULL] (SPEC `Y:real^N -> bool` AFF_GT_MONO))));
\r
5670 REWRITE_TAC[aff; SET_RULE` {a,b} UNION {b} = {a,b}`];
\r
5676 let USEFULL_THHM = prove_by_refinement
\r
5677 (`(z:real^N) IN aff {b, c} /\ z IN aff_gt {b, c} {w} ==> w IN aff {b, c}`,
\r
5678 [ASM_CASES_TAC` DISJOINT {b,c} {w:real^N}`;
\r
5679 ASM_SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM; AFF2];
\r
5681 ASM_REWRITE_TAC[];
\r
5683 ASM_REWRITE_TAC[VECTOR_ARITH` a = x + y + c % z <=> c % z = a - x - y`];
\r
5684 ASSUME_TAC2 (REAL_ARITH` &0 < t3 ==> ~(t3 = &0) `);
\r
5685 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE; VECTOR_ADD_LDISTRIB; VECTOR_SUB_LDISTRIB; VECTOR_MUL_ASSOC; REAL_ARITH` &1 / a * b = b / a `];
\r
5687 EXISTS_TAC` t / t3 - t1 / t3 `;
\r
5688 UNDISCH_TAC` t1 + t2 + t3 = &1 `;
\r
5689 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `; REAL_ARITH` (a - ( b + c )) / t = a / t - b / t - c / t `];
\r
5690 ASM_SIMP_TAC[REAL_FIELD` ~( a = &0 ) ==> a / a = &1 `];
\r
5694 REWRITE_TAC[SET_RULE` ~ DISJOINT {a,b} {x} <=> x = a \/ x = b `];
\r
5695 MESON_TAC[Planarity.POINT_IN_LINE; Planarity.POINT_IN_LINE1]]);;
\r
5701 let COLL_IN_AFF_GT_TOO = prove(` ~ collinear {x,y,z} /\ a IN aff_gt {x,y} {z}
\r
5702 ==> ~ collinear {x,y,a}`,
\r
5703 REWRITE_TAC[collinear_fan22; DE_MORGAN_THM] THEN
\r
5704 SIMP_TAC[] THEN MESON_TAC[USEFULL_THHM]);;
\r
5709 let AFF_GT_IN_IMP_SUBSET = prove_by_refinement
\r
5710 (`~collinear {x, y, z:real^N} /\ a IN aff_gt {x, y} {z}
\r
5711 ==> aff_gt {x,y} {a} SUBSET aff_gt {x,y} {z}`,
\r
5712 [NHANH COLL_IN_AFF_GT_TOO;
\r
5715 UNDISCH_TAC` a IN aff_gt {x,y} {z:real^N} `;
\r
5716 ASM_SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM; SUBSET];
\r
5718 ASM_REWRITE_TAC[];
\r
5719 EXISTS_TAC`t1' + t3' * t1 `;
\r
5720 EXISTS_TAC` t2' + t3' * t2 `;
\r
5721 EXISTS_TAC` t3' * t3 `;
\r
5723 MATCH_MP_TAC REAL_LT_MUL;
\r
5724 ASM_REWRITE_TAC[];
\r
5726 ASM_REWRITE_TAC[REAL_ARITH` (t1' + t3' * t1) + (t2' + t3' * t2) + t3' * t3
\r
5727 = t1' + t2' + t3' * ( t1 + t2 + t3 ) `; REAL_MUL_RID];
\r
5728 VECTOR_ARITH_TAC]);;
\r
5733 let FOR_AFF_GT_NOT_INTERSECTION2 =
\r
5734 let t = SPECL [` &0:real`;` &0`;`&1 `] (GENL [`a2:real`;` b2:real`;`tt:real`]
\r
5735 FOR_AFF_GT_NOT_INTERSECTION) in REWRITE_RULE[VECTOR_MUL_LZERO; VECTOR_ADD_LID;
\r
5736 VECTOR_MUL_LID; REAL_ADD_LID; REAL_ARITH` &0 < &1 /\ a - &0 = a`] t;;
\r
5741 let INVS_IN_AFF_GT = prove_by_refinement
\r
5742 (` ~collinear {x:real^N, y, z} /\ a IN aff_gt {x, y} {z}
\r
5743 ==> z IN aff_gt {x,y} {a} `,
\r
5744 [NHANH COLL_IN_AFF_GT_TOO;
\r
5747 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM];
\r
5749 UNDISCH_TAC` t1 + t2 + t3 = &1 `;
\r
5750 UNDISCH_TAC` &0 < t3 `;
\r
5751 SWITCH_TAC` a = t1 % x + t2 % y + t3 % (z:real^N)`;
\r
5754 NHANH FOR_AFF_GT_NOT_INTERSECTION2;
\r
5762 let COLL_IN_AFF_GT_AFF_GT_EQ = prove(
\r
5763 ` ~collinear {x:real^N, y, z} /\ a IN aff_gt {x, y} {z}
\r
5764 ==> aff_gt {x,y} {z} = aff_gt {x,y} {a} `,
\r
5765 NHANH INVS_IN_AFF_GT THEN NHANH COLL_IN_AFF_GT_TOO THEN
\r
5766 NHANH AFF_GT_IN_IMP_SUBSET THEN PHA THEN
\r
5767 NHANH AFF_GT_IN_IMP_SUBSET THEN SIMP_TAC[GSYM SUBSET_ANTISYM_EQ]);;
\r
5776 let NEXT_OPOSITE_POINT_IS_NOT_IN_AFF_GT2 = prove_by_refinement
\r
5777 (`convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
5778 ==> (?i. w = ITER i (rho_node1 FF) v /\
\r
5780 ~( i = 0 ) /\ ~( i = 1 ) /\
\r
5781 ~(ITER (i + 1) (rho_node1 FF) v IN
\r
5782 aff_gt {vec 0, v} {rho_node1 FF v}))`,
\r
5783 [NHANH NEXT_OPOSITE_POINT_IS_NOT_IN_AFF_GT;
\r
5785 EXISTS_TAC` i:num`;
\r
5786 ASM_REWRITE_TAC[];
\r
5789 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
5791 REWRITE_TAC[lunar; ITER];
\r
5793 UNDISCH_TAC` ~( v = w:real^3)`;
\r
5794 ASM_REWRITE_TAC[];
\r
5796 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
5798 REWRITE_TAC[lunar; ITER12; INSERT_SUBSET; convex_local_fan];
\r
5800 UNDISCH_TAC` collinear {vec 0, v, w:real^3}`;
\r
5801 ASM_REWRITE_TAC[];
\r
5802 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5803 ASM_REWRITE_TAC[]]);;
\r
5808 let LUNAR_IMP_HALF_CIRCLE_SUBSET_AFF_GT100 = prove_by_refinement
\r
5809 (`convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
5810 ==> (?i. i < CARD V /\ ~( i = 0 ) /\ ~ ( i = 1 ) /\
\r
5811 w = ITER i (rho_node1 FF) v /\
\r
5812 {ITER l (rho_node1 FF) v | 0 < l /\ l < i} SUBSET
\r
5813 aff_gt {vec 0, v} {rho_node1 FF v})`,
\r
5814 [NHANH LUNAR_IMP_HALF_CIRCLE_SUBSET_AFF_GT;
\r
5816 EXISTS_TAC` i:num`;
\r
5817 ASM_REWRITE_TAC[];
\r
5820 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
5822 REWRITE_TAC[lunar; ITER];
\r
5824 UNDISCH_TAC` ~( v = w:real^3)`;
\r
5825 ASM_REWRITE_TAC[];
\r
5827 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
5829 REWRITE_TAC[lunar; ITER12; INSERT_SUBSET; convex_local_fan];
\r
5831 UNDISCH_TAC` collinear {vec 0, v, w:real^3}`;
\r
5832 ASM_REWRITE_TAC[];
\r
5833 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5834 ASM_REWRITE_TAC[]]);;
\r
5842 let IVS_RHO_IDD = prove(` local_fan (V,E,FF) /\ v IN V
\r
5843 ==> ivs_rho_node1 FF ( rho_node1 FF v ) = v `,
\r
5844 NHANH LOCAL_FAN_RHO_NODE_PROS2 THEN STRIP_TAC THEN
\r
5845 DOWN THEN FIRST_X_ASSUM NHANH THEN REWRITE_TAC[ivs_rho_node1] THEN
\r
5846 ASM_MESON_TAC[PRE_IVS_RHO_NODE1_DETE]);;
\r
5852 let AFF_IVS_RHO_NODE_EQQ = prove_by_refinement
\r
5853 (`convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
5854 ==> aff_gt {vec 0, w} {rho_node1 FF w} = aff_gt {vec 0, v} {ivs_rho_node1 FF v}`,
\r
5855 [NHANH AFF_GT_SAME_WITH_ENDS;
\r
5856 ONCE_REWRITE_TAC[LUNAR_COMM];
\r
5857 NHANH LUNAR_IMP_HALF_CIRCLE_SUBSET_AFF_GT100;
\r
5859 FIRST_ASSUM (SUBST1_TAC o SYM);
\r
5860 MATCH_MP_TAC COLL_IN_AFF_GT_AFF_GT_EQ;
\r
5862 ASSUME_TAC2 (ONCE_REWRITE_RULE[LUNAR_COMM] NOT_COLL_RHONODE_SND_POINT);
\r
5866 UNDISCH_TAC` {ITER l (rho_node1 FF) w | 0 < l /\ l < i} SUBSET
\r
5867 aff_gt {vec 0, w} {rho_node1 FF w}`;
\r
5868 ASM_REWRITE_TAC[SUBSET];
\r
5869 DISCH_THEN MATCH_MP_TAC;
\r
5870 REWRITE_TAC[IN_ELIM_THM];
\r
5871 EXISTS_TAC` i - 1 `;
\r
5872 MP_TAC2 (ARITH_RULE` ~( i = 0 ) /\ ~( i = 1 ) ==> 0 < i - 1 /\ i - 1 < i /\
\r
5873 i = SUC ( i - 1 ) `);
\r
5876 FIRST_ASSUM SUBST1_TAC;
\r
5877 REWRITE_TAC[ITER; ARITH_RULE` SUC a - 1 = a `];
\r
5878 MATCH_MP_TAC IVS_RHO_IDD;
\r
5879 UNDISCH_TAC` convex_local_fan (V,E,FF) `;
\r
5880 SIMP_TAC[convex_local_fan];
\r
5881 NHANH LOCAL_FAN_ORBIT_MAP_V;
\r
5883 UNDISCH_TAC` lunar (w,v:real^3) V E `;
\r
5884 REWRITE_TAC[lunar; INSERT_SUBSET];
\r
5886 UNDISCH_TAC` w:real^3 IN V `;
\r
5887 FIRST_X_ASSUM NHANH;
\r
5888 FIRST_X_ASSUM (NHANH_PAT`\x. x ==> y `);
\r
5891 REWRITE_TAC[lemma_in_orbit_iter]]);;
\r
5901 let LOFA_IMP_LT_CARD_SET_V = prove(
\r
5902 `! v. local_fan (V,E,FF) /\ v IN V ==> {ITER n (rho_node1 FF) v | n < CARD V} = V`,
\r
5903 NHANH LOCAL_FAN_ORBIT_MAP_V THEN NHANH LOOP_SET_DETER_FIRTS_ELMS THEN
\r
5914 let NOT_COLL_IMP_NOT_AFF_SUB = prove(
\r
5915 `!v:real^N. ~ collinear {x,y,z} /\ v IN aff {x,y} ==> ~( v IN aff_gt {x,y} {z})`,
\r
5916 REPEAT STRIP_TAC THEN
\r
5917 ASSUME_TAC2 (ISPECL [`z:real^N`;`x:real^N`;`y:real^N`;` v:real^N`] (GEN_ALL
\r
5918 COLL_IN_AFF_GT_TOO)) THEN DOWN THEN
\r
5919 ASM_REWRITE_TAC[collinear_fan22]);;
\r
5927 let HALP_CIRCLE_IS_INTERSECTION = prove_by_refinement
\r
5928 (` convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
5929 ==> (?i. i < CARD V /\
\r
5932 w = ITER i (rho_node1 FF) v /\
\r
5933 {ITER l (rho_node1 FF) v | 0 < l /\ l < i} =
\r
5934 aff_gt {vec 0, v} {rho_node1 FF v} INTER V)`,
\r
5935 [NHANH LUNAR_IMP_HALF_CIRCLE_SUBSET_AFF_GT100;
\r
5936 ONCE_REWRITE_TAC[LUNAR_COMM];
\r
5937 NHANH LUNAR_IMP_HALF_CIRCLE_SUBSET_AFF_GT100;
\r
5938 NHANH AFF_GT_SAME_WITH_ENDS;
\r
5939 REWRITE_TAC[convex_local_fan];
\r
5940 NHANH LOFA_IMP_ITER_RHO_NODE_ID;
\r
5942 EXISTS_TAC` i':num`;
\r
5944 ASM_REWRITE_TAC[];
\r
5946 ASM_REWRITE_TAC[];
\r
5948 ASM_REWRITE_TAC[];
\r
5950 FIRST_ASSUM ACCEPT_TAC;
\r
5951 REWRITE_TAC[GSYM SUBSET_ANTISYM_EQ; SUBSET_INTER];
\r
5953 DOWN THEN SIMP_TAC[];
\r
5954 SIMP_TAC[SUBSET; IN_ELIM_THM];
\r
5956 DOWN THEN SIMP_TAC[];
\r
5957 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_V;
\r
5958 UNDISCH_TAC` lunar (w,v:real^3) V E `;
\r
5959 REWRITE_TAC[lunar; IN_ELIM_THM; INSERT_SUBSET];
\r
5960 FIRST_X_ASSUM (NHANH_PAT`\x. x ==> y`);
\r
5961 STRIP_TAC THEN DISCH_TAC;
\r
5963 REWRITE_TAC[lemma_in_orbit_iter];
\r
5964 MP_TAC NOT_INTERSECTION_BWT_AFF_GTS;
\r
5966 REWRITE_TAC[convex_local_fan];
\r
5969 FIRST_ASSUM ACCEPT_TAC;
\r
5970 FIRST_ASSUM ACCEPT_TAC;
\r
5971 ONCE_REWRITE_TAC[LUNAR_COMM];
\r
5972 FIRST_ASSUM ACCEPT_TAC;
\r
5975 SUBGOAL_THEN` v IN V /\ w:real^3 IN V ` MP_TAC;
\r
5976 UNDISCH_TAC` lunar (w,v:real^3) V E `;
\r
5977 SIMP_TAC[lunar; INSERT_SUBSET];
\r
5980 ASSUME_TAC2 LOFA_IMP_LT_CARD_SET_V;
\r
5981 REWRITE_TAC[SUBSET; IN_INTER];
\r
5982 GEN_TAC THEN STRIP_TAC;
\r
5985 SIMP_TAC[IN_ELIM_THM];
\r
5986 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
5988 SUBGOAL_THEN` ~( v IN aff_gt {vec 0, v} {rho_node1 FF v})` ASSUME_TAC;
\r
5989 MATCH_MP_TAC NOT_COLL_IMP_NOT_AFF_SUB;
\r
5992 SIMP_TAC[Planarity.POINT_IN_LINE1];
\r
5994 SUBGOAL_THEN ` convex_local_fan (V,E,FF) ` ASSUME_TAC;
\r
5995 REWRITE_TAC[convex_local_fan];
\r
5997 FIRST_ASSUM ACCEPT_TAC;
\r
5998 FIRST_ASSUM ACCEPT_TAC;
\r
6001 SUBGOAL_THEN` ~collinear {vec 0, w, rho_node1 FF v}` ASSUME_TAC;
\r
6002 MATCH_MP_TAC NOT_COLL_RHONODE_SND_POINT;
\r
6003 ASM_REWRITE_TAC[];
\r
6006 SUBGOAL_THEN` ~( w IN aff_gt {vec 0, w:real^3} {rho_node1 FF v})` ASSUME_TAC;
\r
6007 MATCH_MP_TAC NOT_COLL_IMP_NOT_AFF_SUB;
\r
6008 DOWN THEN SIMP_TAC[Planarity.POINT_IN_LINE1];
\r
6011 ASM_CASES_TAC` n = 0 `;
\r
6012 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
6014 REWRITE_TAC[ITER];
\r
6015 DISCH_THEN SUBST_ALL_TAC;
\r
6017 UNDISCH_TAC` ~(v IN aff_gt {vec 0, v} {rho_node1 FF v})`;
\r
6018 UNDISCH_TAC` (v IN aff_gt {vec 0, v} {rho_node1 FF v})`;
\r
6022 ASM_CASES_TAC` n = i':num`;
\r
6023 FIRST_X_ASSUM SUBST_ALL_TAC;
\r
6024 SWITCH_TAC` x = ITER i' (rho_node1 FF) v `;
\r
6025 SWITCH_TAC` w = ITER i' (rho_node1 FF) v `;
\r
6026 SWITCH_TAC` v = ITER i (rho_node1 FF) w `;
\r
6027 UNDISCH_TAC` ~(w IN aff_gt {vec 0, w} {rho_node1 FF v}) `;
\r
6029 ASM_REWRITE_TAC[];
\r
6031 ASM_REWRITE_TAC[];
\r
6035 SWITCH_TAC` w = ITER i' (rho_node1 FF) v `;
\r
6036 SWITCH_TAC` v = ITER i (rho_node1 FF) w `;
\r
6037 UNDISCH_TAC` ~( n = i':num)`;
\r
6038 REWRITE_TAC[ARITH_RULE` ~( a = n:num) <=> a < n \/ n < a `];
\r
6040 EXISTS_TAC` n:num`;
\r
6041 ASM_REWRITE_TAC[ARITH_RULE` 0 < n <=> ~( n = 0 ) `];
\r
6042 SUBGOAL_THEN` x IN aff_gt {vec 0, v} {rho_node1 FF w}` ASSUME_TAC;
\r
6043 UNDISCH_TAC` {ITER l (rho_node1 FF) w | 0 < l /\ l < i} SUBSET
\r
6044 aff_gt {vec 0, w} {rho_node1 FF w} `;
\r
6045 ASM_REWRITE_TAC[];
\r
6046 ASSUME_TAC2 (ONCE_REWRITE_RULE[LUNAR_COMM] AFF_GT_SAME_WITH_ENDS);
\r
6047 ASM_REWRITE_TAC[SUBSET];
\r
6048 DISCH_THEN MATCH_MP_TAC;
\r
6049 REWRITE_TAC[IN_ELIM_THM];
\r
6050 EXISTS_TAC` n:num - i'`;
\r
6053 UNDISCH_TAC` i' < n:num`;
\r
6055 ASM_CASES_TAC` n - i' < i:num`;
\r
6056 DOWN THEN REWRITE_TAC[];
\r
6058 ASM_SIMP_TAC[ARITH_RULE` c < a ==> ( ~( a - c < b:num ) <=> b + c <= a )`];
\r
6059 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
\r
6061 NHANH (ARITH_RULE` a < b /\ c <= a:num ==> c < b `);
\r
6064 MP_TAC2 LOFA_IMP_DIS_ELMS23;
\r
6065 DISCH_THEN (MP_TAC o (SPECL [`0`;` (i:num) + i' `]));
\r
6067 ASM_SIMP_TAC[ARITH_RULE` ~ (a = 0 ) ==> 0 < a + b `];
\r
6069 ASM_REWRITE_TAC[ITER; GSYM ITER_ADD];
\r
6070 ASSUME_TAC2 (ARITH_RULE` i' < n:num ==> n = n - i' + i'`);
\r
6071 ABBREV_TAC` ll = n - i':num`;
\r
6072 ASM_REWRITE_TAC[GSYM ITER_ADD];
\r
6074 UNDISCH_TAC` aff_gt {vec 0, v} {rho_node1 FF w} INTER
\r
6075 aff_gt {vec 0, v} {rho_node1 FF v} =
\r
6077 REWRITE_TAC[INTER_EQ_EM_EXPAND; NOT_EXISTS_THM];
\r
6078 DISCH_THEN (MP_TAC o (SPEC `x:real^3`));
\r
6079 ASM_REWRITE_TAC[]]);;
\r
6092 let CONVEX_LOFA_IMP_INANGLE_LE_PI = prove_by_refinement
\r
6093 (`convex_local_fan (V,E,FF) /\ v IN V ==> interior_angle1 (vec 0) FF v <= pi `,
\r
6094 [REWRITE_TAC[convex_local_fan; azim_in_fan2];
\r
6096 ASSUME_TAC2 EXISTS_INVERSE_OF_V;
\r
6097 DOWN THEN STRIP_TAC;
\r
6098 ASSUME_TAC2 LOFA_IMP_EE_TWO_ELMS;
\r
6099 ASSUME_TAC2 LOFA_CARD_EE_V_1;
\r
6100 ASSUME_TAC2 LOCAL_FAN_RHO_NODE_PROS2;
\r
6101 DOWN THEN STRIP_TAC;
\r
6102 UNDISCH_TAC` v:real^3 IN V `;
\r
6103 FIRST_ASSUM NHANH;
\r
6104 UNDISCH_TAC` !x. x IN FF
\r
6105 ==> (let d = azim_cycle (EE (FST x) E) (vec 0) (FST x) (SND x) in
\r
6106 if CARD (EE (FST x) E) > 1
\r
6107 then azim (vec 0) (FST x) (SND x) d
\r
6110 V SUBSET wedge_in_fan_ge x E`;
\r
6113 SWITCH_TAC` EE v E = {rho_node1 FF v, vv} `;
\r
6114 ASM_SIMP_TAC[ARITH_RULE` a = 2 ==> a > 1 `];
\r
6116 DOWN THEN DOWN THEN PHA;
\r
6118 ASSUME_TAC2 (SPEC `vv:real^3 ` (GEN` v:real^3 ` IVS_RHO_IDD));
\r
6121 UNDISCH_TAC` {rho_node1 FF v, vv} = EE v E `;
\r
6122 DISCH_THEN (SUBST1_TAC o SYM);
\r
6125 SIMP_TAC[interior_angle1; GSYM ivs_rho_node1; AZIM_CYCLE_TWO_POINT_SET]]);;
\r
6133 (* x IN aff_gt S {x} *)
\r
6134 let X_IN_AFF_GT_X =
\r
6135 let t = ISPECL [`S:real^N -> bool`;` {x:real^N}`] (GEN_ALL CONV0_SUBSET_AFF_GT)
\r
6136 in REWRITE_RULE[Geomdetail.CONV0_SING; INSERT_SUBSET; EMPTY_SUBSET] t;;
\r
6142 let IVS_RNODE_IN_AFF_V = prove(`convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
6143 ==> ivs_rho_node1 FF w IN aff_gt {vec 0, v} {rho_node1 FF v}`,
\r
6144 ONCE_REWRITE_TAC[LUNAR_COMM] THEN NHANH AFF_IVS_RHO_NODE_EQQ THEN
\r
6145 MESON_TAC[X_IN_AFF_GT_X]);;
\r
6154 let AZIM_LE_PI_EQ_DIHV = prove(`~( collinear {a,b,x}) /\ ~ (collinear {a,b,y})
\r
6155 ==> azim a b x y <= pi ==> azim a b x y = dihV a b x y `,
\r
6156 DISCH_TAC THEN REWRITE_TAC[REAL_ARITH` a <= b <=> a = b \/ a < b `] THEN
\r
6157 STRIP_TAC THENL [DOWN THEN ASM_SIMP_TAC[AZIM_DIHV_EQ_PI];
\r
6158 ASM_SIMP_TAC[AZIM_DIHV_SAME]]);;
\r
6164 let LOFA_IMP_NOT_COLL_IVS = prove(
\r
6165 `!v. local_fan (V,E,FF) /\ v IN V ==> ~ collinear {vec 0,v,ivs_rho_node1 FF v}`,
\r
6166 NHANH EXISTS_INVERSE_OF_V THEN REPEAT STRIP_TAC THEN
\r
6167 DOWN THEN ASSUME_TAC2 (SPEC`vv:real^3 ` (GEN`v:real^3` LOCAL_FAN_CHARACTER_OF_RHO_NODE2)) THEN EXPAND_TAC "v" THEN
\r
6168 ASSUME_TAC2 (SPEC`vv:real^3 ` (GEN`v:real^3` IVS_RHO_IDD)) THEN
\r
6169 DOWN THEN DOWN THEN ASM_SIMP_TAC[INSERT_COMM]);;
\r
6177 let DIHV_NOT_CHANGE = prove(
\r
6178 ` &0 < c /\ a + b + c = &1 ==> dihV x y ( a % x + b % y + c % v ) w = dihV x y v w `,
\r
6179 SIMP_TAC[Trigonometry2.DIHV_FORMULAR; REAL_ARITH` a + b = &1 <=> a = &1 - b`;
\r
6180 VECTOR_ARITH` ((&1 - (b + c)) % x + b % y + c % v) - x = b % ( y - x ) + c % (v - x )`] THEN
\r
6181 SIMP_TAC[VECTOR_ADD_RDISTRIB; DOT_LADD; DOT_LMUL; VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; REAL_MUL_SYM] THEN
\r
6182 REWRITE_TAC[VECTOR_ARITH` (a + b ) - ( a + c ) = b - (c:real^N)`; GSYM VECTOR_MUL_ASSOC; GSYM VECTOR_SUB_LDISTRIB] THEN
\r
6183 ONCE_REWRITE_TAC[Trigonometry2.ARC_SYM] THEN
\r
6184 SIMP_TAC [GSYM Trigonometry2.WHEN_K_POS_ARCV_STABLE]);;
\r
6189 let LUNAR_IMP_INTERIOR_ANGLE_EQQ = prove_by_refinement
\r
6190 (`convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
6191 ==> interior_angle1 (vec 0) FF v = interior_angle1 (vec 0) FF w `,
\r
6192 [NHANH IVS_RNODE_IN_AFF_V;
\r
6193 NHANH NOT_COLL_RHONODE_SND_POINT;
\r
6194 ONCE_REWRITE_TAC[LUNAR_COMM];
\r
6195 NHANH IVS_RNODE_IN_AFF_V;
\r
6196 NHANH NOT_COLL_RHONODE_SND_POINT;
\r
6199 NHANH LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
\r
6200 REWRITE_TAC[lunar; INSERT_SUBSET];
\r
6202 MP_TAC2 CONVEX_LOFA_IMP_INANGLE_LE_PI;
\r
6204 SPEC `w:real^3 ` (GEN`v:real^3 ` CONVEX_LOFA_IMP_INANGLE_LE_PI));
\r
6206 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1];
\r
6209 ASSUME_TAC2 CVX_LO_IMP_LO;
\r
6210 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
\r
6211 ASSUME_TAC2 (SPEC `w:real^3 ` (GEN`v:real^3 ` LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
\r
6213 SUBGOAL_THEN` azim (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) =
\r
6214 dihV (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v)` MP_TAC;
\r
6216 MATCH_MP_TAC AZIM_LE_PI_EQ_DIHV;
\r
6218 MATCH_MP_TAC LOFA_IMP_NOT_COLL_IVS;
\r
6219 ASM_REWRITE_TAC[];
\r
6221 SUBGOAL_THEN` azim (vec 0) w (rho_node1 FF w) (ivs_rho_node1 FF w) =
\r
6222 dihV (vec 0) w (rho_node1 FF w) (ivs_rho_node1 FF w)` MP_TAC;
\r
6224 REMOVE_TAC THEN DOWN;
\r
6225 MATCH_MP_TAC AZIM_LE_PI_EQ_DIHV;
\r
6227 MATCH_MP_TAC LOFA_IMP_NOT_COLL_IVS;
\r
6228 ASM_REWRITE_TAC[];
\r
6229 DISCH_THEN SUBST1_TAC;
\r
6230 DISCH_THEN SUBST1_TAC;
\r
6231 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF v} `;
\r
6232 UNDISCH_TAC` ~collinear {vec 0, w, rho_node1 FF w} `;
\r
6237 UNDISCH_TAC` ivs_rho_node1 FF w IN aff_gt {vec 0, v} {rho_node1 FF v} `;
\r
6238 UNDISCH_TAC` ivs_rho_node1 FF v IN aff_gt {vec 0, w} {rho_node1 FF w} `;
\r
6239 ASM_REWRITE_TAC[IN_ELIM_THM];
\r
6240 PHA THEN STRIP_TAC;
\r
6241 UNDISCH_TAC` vec 0 IN conv0 {w,v:real^3}`;
\r
6242 REWRITE_TAC[Collect_geom.CONV0_SET2; IN_ELIM_THM; VECTOR_ARITH` vec 0 = a + b % y <=> a = ( -- b ) % y `];
\r
6245 ONCE_REWRITE_TAC[Trigonometry2.DIHV_SYM];
\r
6249 SUBGOAL_THEN` dihV (vec 0) ( -- b % v ) (ivs_rho_node1 FF v) (rho_node1 FF v) =
\r
6250 dihV (vec 0) ( v ) (ivs_rho_node1 FF v) (rho_node1 FF v)` MP_TAC;
\r
6251 MATCH_MP_TAC DIHV_SPECIAL_SCALE;
\r
6252 ASM_SIMP_TAC[REAL_ARITH` &0 < b ==> ~( -- b = &0)`];
\r
6255 SUBGOAL_THEN` dihV (vec 0) ( a % w ) (ivs_rho_node1 FF w) (rho_node1 FF w) =
\r
6256 dihV (vec 0) w (ivs_rho_node1 FF w) (rho_node1 FF w)` MP_TAC;
\r
6257 MATCH_MP_TAC DIHV_SPECIAL_SCALE;
\r
6258 ASM_SIMP_TAC[REAL_ARITH` &0 < b ==> ~(b = &0)`];
\r
6260 DISCH_THEN (SUBST1_TAC o SYM);
\r
6261 FIRST_ASSUM SUBST1_TAC;
\r
6263 SUBGOAL_THEN` dihV (vec 0) ( -- b % v ) (ivs_rho_node1 FF w) (rho_node1 FF w) =
\r
6264 dihV (vec 0) ( v ) (ivs_rho_node1 FF w) (rho_node1 FF w)` MP_TAC;
\r
6265 MATCH_MP_TAC DIHV_SPECIAL_SCALE;
\r
6266 ASM_SIMP_TAC[REAL_ARITH` &0 < b ==> ~( -- b = &0)`];
\r
6271 DISCH_THEN (SUBST1_TAC o SYM);
\r
6272 FIRST_ASSUM (SUBST1_TAC o SYM);
\r
6274 SUBGOAL_THEN` dihV (vec 0) ( a % w ) (ivs_rho_node1 FF v) (rho_node1 FF v) =
\r
6275 dihV (vec 0) ( w ) (ivs_rho_node1 FF v) (rho_node1 FF v)` MP_TAC;
\r
6276 MATCH_MP_TAC DIHV_SPECIAL_SCALE;
\r
6277 ASM_SIMP_TAC[REAL_ARITH` &0 < b ==> ~( b = &0)`];
\r
6282 ASM_SIMP_TAC[REWRITE_RULE[TAUT` a /\ b ==> c <=> a ==> b ==> c`] DIHV_NOT_CHANGE];
\r
6287 SUBGOAL_THEN` dihV (vec 0) (a % w ) (rho_node1 FF w) (rho_node1 FF v) =
\r
6288 dihV (vec 0) w (rho_node1 FF w) (rho_node1 FF v)` MP_TAC;
\r
6289 MATCH_MP_TAC DIHV_SPECIAL_SCALE;
\r
6290 ASM_SIMP_TAC[REAL_ARITH` &0 < b ==> ~(b = &0)`];
\r
6291 DISCH_THEN (SUBST1_TAC o SYM);
\r
6292 FIRST_X_ASSUM SUBST1_TAC;
\r
6294 MP_TAC2 (REAL_ARITH` &0 < b ==> ~( -- b = &0 ) `);
\r
6295 SIMP_TAC[DIHV_SPECIAL_SCALE; Trigonometry2.DIHV_SYM]]);;
\r
6301 let HKIRPEP = prove_by_refinement
\r
6302 (`convex_local_fan (V,E,FF) /\ lunar (v,w) V E
\r
6303 ==> (!u. u IN V DIFF {v, w} ==> interior_angle1 (vec 0) FF u = pi) /\
\r
6304 &0 < interior_angle1 (vec 0) FF v /\
\r
6305 interior_angle1 (vec 0) FF v <= pi /\
\r
6306 interior_angle1 (vec 0) FF v = interior_angle1 (vec 0) FF w /\
\r
6307 (?i. i < CARD V /\
\r
6310 w = ITER i (rho_node1 FF) v /\
\r
6311 {ITER l (rho_node1 FF) v | 0 < l /\ l < i} =
\r
6312 aff_gt {vec 0, v} {rho_node1 FF v} INTER V)/\
\r
6313 (?j. j < CARD V /\
\r
6316 v = ITER j (rho_node1 FF) w /\
\r
6317 {ITER l (rho_node1 FF) w | 0 < l /\ l < j} =
\r
6318 aff_gt {vec 0, v} {ivs_rho_node1 FF v} INTER V)`,
\r
6319 [NHANH HALP_CIRCLE_IS_INTERSECTION;
\r
6320 NHANH LUNAR_IMP_INTERIOR_ANGLE_EQQ;
\r
6321 NHANH (GSYM AFF_IVS_RHO_NODE_EQQ);
\r
6322 ONCE_REWRITE_TAC[LUNAR_COMM];
\r
6323 NHANH HALP_CIRCLE_IS_INTERSECTION;
\r
6324 NHANH LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;
\r
6325 SIMP_TAC[INSERT_COMM; LUNAR_IMP_INTERIOR_ANGLE_EQQ];
\r
6326 REWRITE_TAC[lunar; INSERT_SUBSET; INSERT_COMM];
\r
6328 ASSUME_TAC2 CONVEX_LOFA_IMP_INANGLE_LE_PI;
\r
6329 ASSUME_TAC2 CVX_LO_IMP_LO;
\r
6330 MP_TAC2 INTERIOR_ANGLE1_POS;
\r
6332 UNDISCH_TAC` interior_angle1 (vec 0) FF v = interior_angle1 (vec 0) FF w `;
\r
6333 DISCH_THEN (SUBST1_TAC o SYM);
\r
6334 ASM_REWRITE_TAC[]]);;
\r
6339 (* ============================ END ========================== *)
\r
6340 (* begin lemma EGHNAVX *)
\r
6343 let NEXT_PRO_IMP_ALLS = prove_by_refinement(
\r
6344 `!(le: A -> A -> bool). (! i. le (f i) ( f (i + 1) ))/\
\r
6345 (! a b c. le a b /\ le b c ==> le a c )
\r
6346 ==> (! i j. i < j ==> le (f i ) ( f j )) `,
\r
6347 [GEN_TAC THEN STRIP_TAC;
\r
6348 GEN_TAC THEN INDUCT_TAC;
\r
6350 REWRITE_TAC[ARITH_RULE` a < SUC b <=> a = b \/ a < b `];
\r
6352 ASM_REWRITE_TAC[ADD1];
\r
6354 FIRST_X_ASSUM NHANH;
\r
6355 REWRITE_TAC[ADD1];
\r
6356 ASM_MESON_TAC[]]);;
\r
6360 let FINITE_CARD1_IMP_SINGLETON = prove
\r
6361 (` FINITE (S:A -> bool) /\ CARD S = 1 ==> (? x. S = {x}) `,
\r
6362 ASM_CASES_TAC` S:A -> bool = {} ` THENL [
\r
6363 ASM_REWRITE_TAC[CARD_CLAUSES; ARITH_RULE`~( 0 = 1 )`]; DOWN THEN
\r
6364 REWRITE_TAC[EMPTY_NOT_EXISTS_IN] THEN REPEAT STRIP_TAC THEN
\r
6365 EXISTS_TAC`x:A` THEN MATCH_MP_TAC Hypermap.set_one_point THEN
\r
6366 ASM_REWRITE_TAC[]]);;
\r
6375 let SURJ_IMP_FINITE = prove(` SURJ (f:A -> B) A B /\ FINITE A ==> FINITE B `,
\r
6376 NHANH_PAT`\x. x ==> y` FINITE_IMAGE THEN
\r
6377 NHANH Wrgcvdr_cizmrrh.SURJ_IMP_S2_EQ_IMAGE_S1 THEN
\r
6378 STRIP_TAC THEN DOWN THEN ASM_REWRITE_TAC[]);;
\r
6382 let BIJ_FINITE_TOO = prove(` BIJ (f:A -> B) X Y /\ FINITE X ==> FINITE Y `,
\r
6383 REWRITE_TAC[BIJ] THEN PHA THEN NHANH SURJ_IMP_FINITE THEN SIMP_TAC[]);;
\r
6388 let EQ_IFF_IMP = MESON[]`(! a b. P a b <=> P b a ) <=> (! a b. P a b ==> P b a)`;;
\r
6393 let NOT_EMP_INJ_IMP_SURJ = prove_by_refinement
\r
6394 (`let f1 = (\y. if ?x. x IN X /\ f x = y then (@x. x IN X /\ f x = y )
\r
6395 else (@x. x IN X))
\r
6397 ~( X = {} ) /\ INJ (f:A -> B) X Y ==> SURJ f1 Y X`,
\r
6399 REWRITE_TAC[INJ; SURJ; EXISTS_IN];
\r
6404 ASM_CASES_TAC` ?x. x IN X /\ (f: A -> B) x = x' `;
\r
6405 ASM_REWRITE_TAC[];
\r
6410 EXISTS_TAC `(f: A -> B) x' `;
\r
6412 ASM_MESON_TAC[]]);;
\r
6418 let LOFA_V_NOT_EMP = prove(`local_fan (V,E, FF) ==> ~( V = {} )`,
\r
6419 REWRITE_TAC[local_fan; FAN; fan1] THEN LET_TAC THEN SET_TAC[]);;
\r
6424 let LOCAL_FAN_FINITE_V = prove(`local_fan (V,E,FF) ==> FINITE V`,
\r
6425 NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_FINITE_FF THEN
\r
6426 NHANH LOFA_IMP_BIJ_FF_V THEN REWRITE_TAC[BIJ] THEN
\r
6427 PHA THEN NHANH SURJ_IMP_FINITE THEN SIMP_TAC[]);;
\r
6434 let ITER_CARD_MINUS1_EQ_IVS_RN1 = prove_by_refinement
\r
6435 (` local_fan (V,E,FF) ==>
\r
6436 (! v. v IN V ==> ITER (CARD V - 1) (rho_node1 FF) v = ivs_rho_node1 FF v)`,
\r
6437 [NHANH LOFA_IMP_ITER_RHO_NODE_ID;
\r
6439 FIRST_X_ASSUM NHANH;
\r
6442 ASSUME_TAC2 LOFA_V_NOT_EMP;
\r
6443 ASSUME_TAC2 LOCAL_FAN_FINITE_V;
\r
6444 DOWN THEN NHANH CARD_EQ_0;
\r
6446 UNDISCH_TAC` ~(V:real^3 -> bool = {} )`;
\r
6447 FIRST_ASSUM (SUBST1_TAC o SYM);
\r
6449 NHANH (ARITH_RULE`~( x = 0 ) ==> x = x - 1 + 1 `);
\r
6450 ABBREV_TAC` u = CARD (V:real^3 -> bool) -1`;
\r
6451 SIMP_TAC[GSYM ADD1; ITER];
\r
6452 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
6453 SUBGOAL_THEN` ITER u (rho_node1 FF) v IN V ` ASSUME_TAC;
\r
6454 FIRST_X_ASSUM MATCH_MP_TAC;
\r
6455 FIRST_ASSUM ACCEPT_TAC;
\r
6457 UNDISCH_TAC` ITER u (rho_node1 FF) v IN V`;
\r
6458 UNDISCH_TAC` local_fan (V,E,FF)`;
\r
6460 NHANH IVS_RHO_IDD;
\r
6462 REWRITE_TAC[GSYM ITER];
\r
6463 FIRST_X_ASSUM (SUBST1_TAC o SYM);
\r
6464 ASM_REWRITE_TAC[]]);;
\r
6473 let FIRST_EQ0_LAST_LT_PI = prove_by_refinement
\r
6474 (`convex_local_fan (V,E,FF) /\
\r
6477 (!i. ITER i (rho_node1 FF) v0 = vv i) /\
\r
6478 (!i. azim (vec 0) v0 (vv 1) (vv i) = bta i)
\r
6480 bta (k - 1) <= pi `,
\r
6481 [REWRITE_TAC[convex_local_fan];
\r
6482 NHANH ITER_CARD_MINUS1_EQ_IVS_RN1;
\r
6486 ONCE_REWRITE_TAC[GSYM EQ_SYM_EQ];
\r
6489 REWRITE_TAC[ITER12; AZIM_REFL];
\r
6490 REWRITE_TAC[ITER12];
\r
6493 ASSUME_TAC2 (REWRITE_RULE[convex_local_fan] (SPEC `v0:real^3 `
\r
6494 (GEN `v:real^3 ` CONVEX_LOFA_IMP_INANGLE_LE_PI)));
\r
6496 REWRITE_TAC[interior_angle1; ivs_rho_node1]]);;
\r
6504 let PROJEC_EQ_0_IFF_COLL = prove_by_refinement
\r
6505 (` projection e (x:real^N) = vec 0 <=> (?t. x = t % e ) `,
\r
6507 REWRITE_TAC[Wrgcvdr_cizmrrh.PROJECT_EQ_VEC0_IMP_PARALLED];
\r
6509 ASM_REWRITE_TAC[projection];
\r
6510 ASM_CASES_TAC`(e:real^N) = vec 0 `;
\r
6511 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_SUB_REFL];
\r
6513 SIMP_TAC[GSYM DOT_EQ_0; DOT_LMUL; REAL_FIELD` ~( x = &0) ==> (a * x ) / x = a `; VECTOR_SUB_REFL; DOT_LZERO]]);;
\r
6521 let DETERMINE_WEDGE_IN_FAN = prove(` local_fan (V,E,FF) /\ x IN FF
\r
6522 ==> wedge_in_fan_ge x E = wedge_ge (vec 0) (FST x) (SND x)
\r
6523 (azim_cycle (EE (FST x) E) (vec 0) (FST x) (SND x)) `,
\r
6524 REWRITE_TAC[wedge_in_fan_ge2] THEN COND_CASES_TAC THENL [
\r
6525 REWRITE_TAC[]; PAT_ONCE_REWRITE_TAC`\x. y /\ x ==> z ` [GSYM PAIR] THEN
\r
6526 NHANH LOCAL_FAN_IMP_IN_V THEN ONCE_REWRITE_TAC[TAUT`(a/\b)/\c/\d <=> (a/\c)/\b/\d`] THEN
\r
6527 NHANH LOFA_CARD_EE_V_1 THEN
\r
6528 NHANH (ARITH_RULE` a = 2 ==> a > 1 `) THEN ASM_MESON_TAC[]]);;
\r
6534 let LOCAL_FAN_IMP_IN_V2 = prove(
\r
6535 `local_fan (V,E,FF) /\ x IN FF ==> FST x IN V /\ SND x IN V`,
\r
6536 PAT_ONCE_REWRITE_TAC`\x. y /\ x ==> l` [GSYM PAIR]
\r
6537 THEN PURE_REWRITE_TAC[LOCAL_FAN_IMP_IN_V]);;
\r
6547 let LOFA_DETERMINE_AZIM_IN_FA = prove(` local_fan (V,E,FF) /\ x IN FF
\r
6548 ==> azim_in_fan x E = azim (vec 0) (FST x) (SND x) ( azim_cycle (EE (FST x) E)
\r
6549 (vec 0) (FST x) (SND x) ) `,
\r
6550 NHANH LOCAL_FAN_IMP_IN_V2 THEN STRIP_TAC THEN
\r
6551 UNDISCH_TAC` FST (x:real^3 # real^3) IN V` THEN
\r
6552 UNDISCH_TAC` local_fan (V,E,FF)` THEN PHA THEN
\r
6553 NHANH LOFA_CARD_EE_V_1 THEN
\r
6554 NHANH (ARITH_RULE` a = 2 ==> a > 1 `) THEN
\r
6555 REWRITE_TAC[azim_in_fan2] THEN LET_TAC THEN SIMP_TAC[]);;
\r
6564 let PRIOR_TO_LESS_THAN_PI_LEMMA = prove_by_refinement
\r
6565 (` convex_local_fan (V,E,FF) /\ v IN V
\r
6566 ==> (! w. w IN V ==> azim (vec 0) v (rho_node1 FF v ) w <=
\r
6567 azim (vec 0) v (rho_node1 FF v)
\r
6568 (azim_cycle (EE v E) (vec 0) v (rho_node1 FF v)) ) `,
\r
6569 [REWRITE_TAC[convex_local_fan];
\r
6570 NHANH LOCAL_FAN_RHO_NODE_PROS2;
\r
6572 SUBGOAL_THEN` v, rho_node1 FF v IN FF` ASSUME_TAC;
\r
6574 ASM_REWRITE_TAC[];
\r
6576 UNDISCH_TAC` local_fan (V,E,FF)`;
\r
6578 NHANH DETERMINE_WEDGE_IN_FAN;
\r
6579 FIRST_X_ASSUM NHANH;
\r
6581 UNDISCH_TAC` V SUBSET wedge_in_fan_ge (v,rho_node1 FF v) E `;
\r
6582 REWRITE_TAC[SUBSET];
\r
6584 FIRST_ASSUM NHANH;
\r
6585 ASM_REWRITE_TAC[wedge_ge; IN_ELIM_THM];
\r
6595 let IN_V_IMP_AZIM_LESS_PI = prove_by_refinement
\r
6596 (` convex_local_fan (V,E,FF) /\ v IN V
\r
6597 ==> (! w. w IN V ==> azim (vec 0) v (rho_node1 FF v ) w <= pi ) `,
\r
6598 [NHANH PRIOR_TO_LESS_THAN_PI_LEMMA;
\r
6599 REWRITE_TAC[convex_local_fan];
\r
6600 NHANH LOCAL_FAN_RHO_NODE_PROS2;
\r
6602 SUBGOAL_THEN` v, rho_node1 FF v IN FF` ASSUME_TAC;
\r
6606 ASM_REWRITE_TAC[];
\r
6608 UNDISCH_TAC` local_fan (V,E,FF)`;
\r
6610 NHANH LOFA_DETERMINE_AZIM_IN_FA;
\r
6611 FIRST_X_ASSUM NHANH;
\r
6613 FIRST_X_ASSUM NHANH;
\r
6615 ASM_REAL_ARITH_TAC]);;
\r
6623 let NEXT_PRO_IMP_ALLS_STRICT = prove
\r
6624 (`! le. (! i. i + 1 < k ==> le ((f: num -> A) i) (f (i + 1))) /\ (! a b c. le a b /\ le b c ==> le a c )
\r
6625 ==> (! i j. i < j /\ j < k ==> le ( f i ) ( f j )) `,
\r
6626 GEN_TAC THEN STRIP_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [
\r
6627 REWRITE_TAC[LT]; REWRITE_TAC[ADD1]] THEN
\r
6628 UNDISCH_TAC` !i. i + 1 < k ==> le ((f:num -> A) i) (f (i + 1)) ` THEN
\r
6629 DISCH_THEN NHANH THEN REWRITE_TAC[ARITH_RULE` a < b + 1 <=> a < b \/ a = b `]
\r
6630 THEN NHANH (ARITH_RULE` a + 1 < b ==> a < b `) THEN ASM_MESON_TAC[]);;
\r
6637 let LOFA_IMP_V_DIFF = prove(` local_fan (V,E,FF) ==>
\r
6638 (! v. v IN V ==> ~( v = vec 0 )) `,
\r
6639 NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN THEN
\r
6640 NHANH FAN_IMP_V_DIFF THEN SIMP_TAC[]);;
\r
6646 let SIN_AZIM_POS_PI_LT = prove(
\r
6647 ` &0 <= sin (azim x y u v) <=> azim x y u v <= pi `,
\r
6648 REWRITE_TAC[REAL_ARITH` a <= b <=> ~( b < a )`; SIN_AZIM_NEG_PI_LT]);;
\r
6659 let SIN_AZIM_MUTUAL_SROSS = prove(
\r
6660 ` ( sin (azim (vec 0) u v w) < &0 <=> (u cross v) dot w < &0 ) /\
\r
6661 ( &0 < sin (azim (vec 0) u v w) <=> &0 < (u cross v) dot w )`,
\r
6662 MP_TAC (SPEC_ALL Trigonometry2.JBDNJJB) THEN REWRITE_TAC[re_eqvl] THEN
\r
6663 STRIP_TAC THEN DOWN_TAC THEN
\r
6664 SIMP_TAC[REAL_LT_MUL_EQ; REAL_ARITH` a * b < &0 <=> &0 < a * --b `] THEN
\r
6665 REWRITE_TAC[REAL_ARITH` &0 < -- a <=> a < &0 `]);;
\r
6669 let VECTOR_ADD_LDISTRIB1 = CONJ VECTOR_ADD_LDISTRIB VECTOR_MUL_ASSOC;;
\r
6672 let OPPOSITE_SIDES_IMP_INTER = prove_by_refinement (
\r
6673 ` (a:real^N) IN aff_gt {va, vb} {vc} /\ b IN aff_lt {va, vb} {vc}
\r
6674 /\ DISJOINT {va, vb} {vc} ==> ~(conv0 {a,b} INTER aff {va, vb} = {})`,
\r
6675 [NHANH Planarity.AFF_LT_2_1;
\r
6678 UNDISCH_TAC` a IN aff_gt {va, vb} {vc: real^N}`;
\r
6679 UNDISCH_TAC` b IN aff_lt {va, vb} {vc: real^N}`;
\r
6680 ASM_REWRITE_TAC[IN_ELIM_THM; Geomdetail.CONV0_SET2;
\r
6681 Collect_geom.AFF_2POINTS_INTERPRET; INTER_EQ_EM_EXPAND];
\r
6683 EXISTS_TAC` ( -- t3 ) / ( -- t3 + t3') % (a:real^N) + t3' / ( --t3 + t3') % b `;
\r
6685 EXISTS_TAC` --t3 / (--t3 + t3') `;
\r
6686 EXISTS_TAC` t3' / ( -- t3 + t3' )`;
\r
6687 REWRITE_TAC[ GSYM Geomdetail.SUM_TWO_RATIO];
\r
6689 MATCH_MP_TAC REAL_LT_DIV;
\r
6690 UNDISCH_TAC` t3 < &0 `;
\r
6691 UNDISCH_TAC` &0 < t3' `;
\r
6696 MATCH_MP_TAC REAL_LT_DIV;
\r
6697 UNDISCH_TAC` t3 < &0 `;
\r
6698 UNDISCH_TAC` &0 < t3' `;
\r
6703 UNDISCH_TAC` t3 < &0 `;
\r
6704 UNDISCH_TAC` &0 < t3' `;
\r
6709 ASM_REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; GSYM (REAL_ARITH`
\r
6710 ( x * a ) / b = ( a / b ) * x `); REAL_ARITH` -- a * b = -- (a * b)`;
\r
6711 VECTOR_ARITH` ( -- a / b ) % x = -- ((a / b ) % x ) `];
\r
6712 SIMP_TAC[REAL_MUL_SYM];
\r
6713 REWRITE_TAC[VECTOR_ARITH` -- (( a % va) + (b % vb) + x ) +
\r
6714 ( aa % va + bb % vb + x ) = (-- a + aa ) % va + (-- b + bb ) % vb `];
\r
6718 EXISTS_TAC` (--((t1' * t3) / (--t3 + t3')) + (t1 * t3') / (--t3 + t3'))`;
\r
6719 EXISTS_TAC` (--((t2' * t3) / (--t3 + t3')) + (t2 * t3') / (--t3 + t3')) `;
\r
6723 REWRITE_TAC[REAL_POLY_CONV `(--((t1' * t3) / (--t3 + t3')) +
\r
6724 (t1 * t3') / (--t3 + t3')) + --((t2' * t3) / (--t3 + t3')) +
\r
6725 (t2 * t3') / (--t3 + t3')`];
\r
6726 REWRITE_TAC[ REAL_ARITH` -- &1 * x * y = ( -- x ) * y `;
\r
6727 REAL_ARITH` a * b * c = ( a * b ) * c `;
\r
6728 REAL_ARITH` a * x + b * x = (a + b) * x`];
\r
6729 UNDISCH_TAC` t1 + t2 + t3 = &1 `;
\r
6730 UNDISCH_TAC` t1' + t2' + t3' = &1 `;
\r
6731 SIMP_TAC[ REAL_ARITH` a + b = &1 <=> a = &1 - b `; REAL_POLY_CONV` (&1 - (t2 + t3)) * t3' +
\r
6732 --(&1 - (t2' + t3')) * t3 +
\r
6736 MATCH_MP_TAC REAL_MUL_RINV;
\r
6737 ASM_REAL_ARITH_TAC]);;
\r
6742 let DISJOINT_DOUBLE_SING = SET_RULE` DISJOINT {a} {b} <=> ~( a = b ) `;;
\r
6746 let AFF_IN_TWO_PARTS = prove_by_refinement (
\r
6747 ` aff {x,y:real^N} = aff_ge {x} {y} UNION aff_lt {x} {y}`,
\r
6748 [REWRITE_TAC[HALFLINE];
\r
6749 ASM_CASES_TAC` x = y:real^N`;
\r
6750 ASM_REWRITE_TAC[AFF_XX_CASES; AFF2; UNION_EMPTY; FUN_EQ_THM; IN_ELIM_THM];
\r
6751 GEN_TAC THEN EQ_TAC;
\r
6754 ASM_REWRITE_TAC[REAL_ARITH` &0 <= &1 `];
\r
6755 CONV_TAC VECTOR_ARITH;
\r
6757 EXISTS_TAC` t:real`;
\r
6758 ASM_REWRITE_TAC[VECTOR_ADD_SYM];
\r
6760 REWRITE_TAC[ GSYM DISJOINT_DOUBLE_SING];
\r
6761 SIMP_TAC[AFF_LT_1_1; AFF2; EXTENSION; IN_UNION; IN_ELIM_THM];
\r
6762 STRIP_TAC THEN GEN_TAC;
\r
6765 ASM_CASES_TAC` &0 <= &1 - t`;
\r
6767 EXISTS_TAC` &1 - t `;
\r
6768 ASM_REWRITE_TAC[REAL_ARITH` a - ( a - b ) = b `];
\r
6770 EXISTS_TAC` t:real`;
\r
6771 EXISTS_TAC` &1 - t `;
\r
6772 ASM_REWRITE_TAC[];
\r
6773 ASM_REAL_ARITH_TAC;
\r
6774 MESON_TAC[REAL_ARITH` t = a - ( a - t ) `;REAL_ARITH` a + b = c <=> b = c - a `]]);;
\r
6781 let INTER_UNION_EMPTY = SET_RULE` X INTER (A UNION B) = {} <=>
\r
6782 X INTER A = {} /\ X INTER B = {}`
\r
6787 let CONV0_SUB_CONV = prove (
\r
6788 ` x IN conv0 S ==> x IN conv S`,
\r
6789 REWRITE_TAC[conv0; Collect_geom.conv; affsign; IN; sgn_gt; sgn_ge]
\r
6790 THEN MESON_TAC[REAL_ARITH` a < b ==> a <= b `]);;
\r
6796 let MONO_AZIM_AS_BTA_I = prove_by_refinement
\r
6797 (`convex_local_fan (V,E,FF) /\
\r
6800 (!v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v}) /\
\r
6801 (!i. ITER i (rho_node1 FF) v0 = vv i) /\
\r
6802 (!i. azim (vec 0) v0 (vv 1) (vv i) = bta i)
\r
6803 ==> (!i j. i < j /\ j < k ==> bta i <= bta j) `,
\r
6805 MATCH_MP_TAC NEXT_PRO_IMP_ALLS_STRICT;
\r
6806 REWRITE_TAC[REAL_LE_TRANS];
\r
6807 DOWN_TAC THEN REWRITE_TAC[convex_local_fan];
\r
6809 ASSUME_TAC2 LOFA_IMP_V_DIFF;
\r
6810 UNDISCH_TAC` v0:real^3 IN V `;
\r
6811 FIRST_ASSUM NHANH;
\r
6812 ONCE_REWRITE_TAC[EQ_SYM_EQ];
\r
6813 NHANH Trigonometry2.NOT_EQ_IMP_EXISTS_BASIC;
\r
6815 MP_TAC (SPECL [` vec 0:real^3 `;` v0:real^3 `;` (vv 1):real^3 `;
\r
6816 `(vv: num -> real^3) i `] azim);
\r
6818 FIRST_X_ASSUM MP_TAC;
\r
6819 SWITCH_TAC` ~( vec 0 = v0:real^3 )`;
\r
6820 DISCH_THEN ASSUME_TAC2;
\r
6823 MP_TAC (SPECL [` vec 0:real^3 `;` v0:real^3 `;` (vv 1):real^3 `;
\r
6824 `(vv: num -> real^3) (i +1) `] azim);
\r
6826 FIRST_X_ASSUM ASSUME_TAC2;
\r
6827 DOWN THEN STRIP_TAC;
\r
6829 REWRITE_TAC[VECTOR_SUB_RZERO];
\r
6833 UNDISCH_TAC` vv 1 = (r1' * cos psi') % e1 + (r1' * sin psi') % e2 + h1' % (v0:real^3)`;
\r
6834 UNDISCH_TAC` vv 1 = (r1 * cos psi) % e1 + (r1 * sin psi) % e2 + h1 % v0:real^3`;
\r
6835 UNDISCH_TAC` orthonormal e1 e2 e3`;
\r
6838 REWRITE_TAC[VECTOR_MUL_ASSOC];
\r
6839 NHANH (MESON[Trigonometry2.th]` orthonormal e1 e2 e3 /\
\r
6840 x = t1 % e1 + t2 % e2 + t3 % e3 /\
\r
6841 x = tt1 % e1 + tt2 % e2 + tt3 % e3
\r
6842 ==> tt1 = t1 /\ tt2 = t2 /\ tt3 = t3`);
\r
6847 SUBGOAL_THEN` ~collinear {vec 0, v0, vv 1:real^3}` ASSUME_TAC;
\r
6848 UNDISCH_TAC` !v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v:real^3} `;
\r
6849 DISCH_THEN MATCH_MP_TAC;
\r
6850 SWITCH_TAC` !i. ITER i (rho_node1 FF) v0 = vv i`;
\r
6851 FIRST_ASSUM (fun x -> REWRITE_TAC[x]);
\r
6852 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
6854 FIRST_X_ASSUM MATCH_MP_TAC;
\r
6855 FIRST_ASSUM ACCEPT_TAC;
\r
6857 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
6858 REWRITE_TAC[ITER12];
\r
6859 UNDISCH_TAC` v0 IN (V:real^3 -> bool)`;
\r
6860 FIRST_X_ASSUM NHANH;
\r
6863 USE_FIRST` ~collinear {vec 0, v0, vv 1:real^3} ==> &0 < r1 ` ASSUME_TAC2;
\r
6864 USE_FIRST` ~collinear {vec 0, v0, vv 1:real^3} ==> &0 < r1' ` ASSUME_TAC2;
\r
6866 ASSUME_TAC2 (SPECL [` r1': real`;` r1: real`;` psi': real`; `psi:real` ]
\r
6867 Trigonometry2.R_POS_SIN_COS_IDENT);
\r
6869 REWRITE_TAC[Trigonometry2.SIN_COS_IDEN_IFF_DIFFER_PERS];
\r
6874 SUBGOAL_THEN `vv (i:num) IN (V:real^3 -> bool) ` ASSUME_TAC;
\r
6875 SWITCH_TAC` !i. ITER i (rho_node1 FF) v0 = vv i `;
\r
6876 ASM_REWRITE_TAC[];
\r
6877 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
6878 FIRST_X_ASSUM MATCH_MP_TAC;
\r
6879 FIRST_ASSUM ACCEPT_TAC;
\r
6882 SUBGOAL_THEN` convex_local_fan (V,E,FF) ` MP_TAC;
\r
6883 ASM_REWRITE_TAC[convex_local_fan];
\r
6890 NHANH IN_V_IMP_AZIM_LESS_PI;
\r
6892 UNDISCH_TAC` v0:real^3 IN V`;
\r
6893 FIRST_ASSUM NHANH;
\r
6897 SUBGOAL_THEN` rho_node1 FF (vv (i:num)) = vv ( i + 1 ) ` ASSUME_TAC;
\r
6898 USE_FIRST` !i. ITER i (rho_node1 FF) v0 = vv i ` (fun x -> REWRITE_TAC[GSYM x]);
\r
6899 REWRITE_TAC[GSYM ADD1; ITER];
\r
6900 FIRST_ASSUM SUBST1_TAC;
\r
6901 REWRITE_TAC[SYM SIN_AZIM_POS_PI_LT];
\r
6902 REWRITE_TAC[REAL_ARITH` &0 <= a <=> ~( a < &0 ) `;SIN_AZIM_MUTUAL_SROSS ];
\r
6904 ABBREV_TAC` va = azim (vec 0) v0 (vv 1) (vv i) `;
\r
6905 ABBREV_TAC` vb = azim (vec 0) v0 (vv 1) (vv (i + 1 )) `;
\r
6906 ASM_REWRITE_TAC[];
\r
6908 ONCE_REWRITE_TAC[REAL_ADD_SYM];
\r
6909 REWRITE_TAC[Trigonometry2.SIN_COS_PERIODIC_IN_WHOLE; REAL_ARITH` a + b + c = (a + b ) + c `];
\r
6911 REWRITE_TAC[CROSS_LADD; CROSS_RADD; VECTOR_MUL_ASSOC; CROSS_LMUL; CROSS_RMUL;
\r
6912 CROSS_REFL; VECTOR_MUL_RZERO; VECTOR_ADD_RID; DOT_LADD; DOT_LMUL;
\r
6913 DOT_RMUL;DOT_CROSS_SELF; Collect_geom.ZERO_NEUTRAL];
\r
6916 REWRITE_TAC[DOT_LZERO; Collect_geom.ZERO_NEUTRAL];
\r
6917 ASSUME_TAC2 ORTHONORMAL_CROSS;
\r
6918 ASM_REWRITE_TAC[];
\r
6919 ONCE_REWRITE_TAC[CROSS_SKEW];
\r
6920 ASM_REWRITE_TAC[];
\r
6922 SUBGOAL_THEN` e3 dot (e3: real^3) = &1 ` ASSUME_TAC;
\r
6923 UNDISCH_TAC` orthonormal e1 e2 e3 `;
\r
6924 SIMP_TAC[orthonormal];
\r
6927 ASM_REWRITE_TAC[DOT_LNEG; REAL_RING` (r2 * a) * (r2' * b) * &1 +
\r
6928 (r2 * aa) * (r2' * bb) * -- &1
\r
6929 = r2 * r2' * (b * a - bb * aa ) `; GSYM SIN_SUB];
\r
6930 REWRITE_TAC[REAL_ARITH` (a + b ) - ( c + b ) = a - c `];
\r
6936 SUBGOAL_THEN` &0 < dist (v0, vec 0:real^3)` ASSUME_TAC;
\r
6937 ASM_REWRITE_TAC[GSYM DIST_NZ];
\r
6938 ASM_CASES_TAC` i = 0 `;
\r
6939 USE_FIRST` !i. azim (vec 0) v0 (vv 1) (vv i) = bta (i:num)`
\r
6940 (fun x -> REWRITE_TAC[GSYM x]);
\r
6942 USE_FIRST` i = 0 ` SUBST1_TAC;
\r
6943 USE_FIRST` !i. ITER i (rho_node1 FF) v0 = vv i` (fun x -> REWRITE_TAC[GSYM x]);
\r
6944 REWRITE_TAC[ITER; ITER12; GSYM ADD1; AZIM_SPEC_DEGENERATE; AZIM_REFL; REAL_LE_REFL];
\r
6948 SWITCH_TAC` vv (i:num) =
\r
6949 (r2 * cos (psi + va)) % e1 + (r2 * sin (psi + va)) % e2 + h2 % (v0:real^3)`;
\r
6950 SWITCH_TAC` vv (i + 1) =
\r
6951 (r2' * cos (psi' + vb)) % e1 + (r2' * sin (psi' + vb)) % e2 + h2' % (v0:real^3)`;
\r
6952 SWITCH_TAC` psi' = psi + real_of_int k' * &2 * pi `;
\r
6955 SUBGOAL_THEN` ~( vv i = v0:real^3 ) /\ ~(vv (i + 1 ) = v0 ) ` ASSUME_TAC;
\r
6956 UNDISCH_TAC` dist (v0:real^3,vec 0) % e3 IN (V:real^3 -> bool)`;
\r
6957 ASM_REWRITE_TAC[];
\r
6959 ASSUME_TAC2 (SPEC `v0: real^3 ` (GEN `v:real^3 ` LOFA_IMP_DIS_ELMS23));
\r
6961 FIRST_ASSUM (MP_TAC o (SPECL [`0`;` i:num`]));
\r
6965 ASM_REWRITE_TAC[ARITH_RULE` 0 < i <=> ~( i = 0 ) `];
\r
6966 UNDISCH_TAC` i + 1 < k `;
\r
6971 FIRST_ASSUM (MP_TAC o (SPECL [`0`;` i + 1`]));
\r
6972 REWRITE_TAC[ARITH_RULE` 0 < i + 1 `];
\r
6973 ASM_REWRITE_TAC[];
\r
6974 USE_FIRST` !i. ITER i (rho_node1 FF) v0 = vv i ` (fun x -> REWRITE_TAC[GSYM x]);
\r
6979 UNDISCH_TAC` (vv:num -> real^3) i IN V `;
\r
6980 UNDISCH_TAC` local_fan (V,E,FF) `;
\r
6982 NHANH LOFA_IN_V_SO_DO_RHO_NODE_V;
\r
6983 ASM_REWRITE_TAC[];
\r
6984 DOWN THEN DOWN THEN PHA THEN STRIP_TAC;
\r
6985 USE_FIRST` !v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v:real^3}`
\r
6986 (ASSUME_TAC2 o (SPEC` (vv:num -> real^3) i `));
\r
6988 USE_FIRST` !v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v:real^3}`
\r
6989 (ASSUME_TAC2 o (SPEC` (vv:num -> real^3) (i + 1) `));
\r
6990 USE_FIRST` ~collinear {vec 0, v0, (vv: num -> real^3) i} ==> &0 < r2 ` ASSUME_TAC2;
\r
6991 USE_FIRST` ~collinear {vec 0, v0, (vv: num -> real^3) (i + 1 )} ==> &0 < r2' ` ASSUME_TAC2;
\r
6993 UNDISCH_TAC` ~(dist (v0:real^3,vec 0) * r2 * r2' * sin (vb - va) < &0) `;
\r
6994 ASM_SIMP_TAC[REAL_LE_MUL_EQ; REAL_ARITH` ~( a < b ) <=> b <= a `];
\r
6998 MP_TAC (SPEC` v0:real^3 ` (GEN` v:real^3 ` IN_V_IMP_AZIM_LESS_PI));
\r
7000 ASM_REWRITE_TAC[];
\r
7001 UNDISCH_TAC` dist (v0:real^3,vec 0) % (e3:real^3) IN V`;
\r
7002 ASM_REWRITE_TAC[];
\r
7004 FIRST_ASSUM (MP_TAC2 o (SPEC` (vv:num -> real^3) i `));
\r
7005 FIRST_ASSUM (MP_TAC2 o (SPEC` (vv:num -> real^3) (i + 1 ) `));
\r
7006 ASM_REWRITE_TAC[];
\r
7008 SUBGOAL_THEN` rho_node1 FF v0 = vv 1` ASSUME_TAC;
\r
7009 SWITCH_TAC ` !i. ITER i (rho_node1 FF) v0 = vv i `;
\r
7014 FIRST_ASSUM (fun x -> REWRITE_TAC[x]);
\r
7015 USE_FIRST` !i. azim (vec 0) v0 (vv 1) (vv i) = bta i ` (fun x -> REWRITE_TAC[GSYM x]);
\r
7016 MP_TAC (SPECL [`vec 0:real^3 `;` v0:real^3 `;` (vv:num -> real^3) 1`;
\r
7017 ` (vv:num -> real^3) i `] AZIM_RANGE);
\r
7019 MP_TAC (SPECL [`vec 0:real^3 `;` v0:real^3 `;` (vv:num -> real^3) 1`;
\r
7020 ` (vv:num -> real^3) (i + 1) `] AZIM_RANGE);
\r
7021 REWRITE_TAC[ASSUME` azim (vec 0) v0 (vv 1) (vv (i + 1)) = vb `; ASSUME` azim (vec 0) v0 (vv 1) (vv i) = va `];
\r
7024 NHANH (REAL_ARITH` &0 <= vb /\
\r
7030 &0 <= sin (vb - va) ==> vb - va <= pi /\ -- pi <= vb - va `);
\r
7035 ASM_CASES_TAC ` ~(vb - va = -- pi) `;
\r
7036 ASM_CASES_TAC` vb - va < &0 `;
\r
7037 REPLICATE_TAC 3 DOWN THEN PHA;
\r
7038 REWRITE_TAC[REAL_ARITH` a <= b /\ ~( b = a ) /\ x < &0 <=> a < b /\ x < &0`];
\r
7040 ASSUME_TAC2 (SPEC ` vb - (va:real)` Trigonometry1.SIN_NEGPOS_PI);
\r
7041 SUBGOAL_THEN` sin (vb - va ) < &0 ` ASSUME_TAC;
\r
7042 ASM_REWRITE_TAC[];
\r
7043 ABBREV_TAC` xx = vb - va:real`;
\r
7044 UNDISCH_TAC` sin xx < &0 `;
\r
7045 UNDISCH_TAC` &0 <= sin xx `;
\r
7051 UNDISCH_TAC` &0 <= vb `;
\r
7052 UNDISCH_TAC` va <= pi `;
\r
7054 REWRITE_TAC[REAL_ARITH` vb - va = --pi /\ va <= pi /\ &0 <= vb <=>
\r
7055 vb = &0 /\ va = pi`];
\r
7058 UNDISCH_TAC` ~ collinear {vec 0, v0, vv (i + 1):real^3}`;
\r
7059 UNDISCH_TAC` ~ collinear {vec 0, v0, vv 1:real^3}`;
\r
7061 NHANH AZIM_EQ_0_ALT;
\r
7063 UNDISCH_TAC` ~ collinear {vec 0, v0, vv (i: num) :real^3}`;
\r
7064 UNDISCH_TAC` ~ collinear {vec 0, v0, vv 1:real^3}`;
\r
7066 NHANH AZIM_EQ_PI_ALT;
\r
7068 SWITCH_TAC` vv 1:real^3 =
\r
7069 (r1 * cos psi) % e1 + (r1 * sin psi) % e2 + (h1 * dist (v0:real^3,vec 0)) % e3`;
\r
7070 SWITCH_TAC`vv 1: real^3 =
\r
7071 (r1' * cos psi') % e1 +
\r
7072 (r1' * sin psi') % e2 +
\r
7073 (h1' * dist (v0: real^3,vec 0)) % e3`;
\r
7074 UNDISCH_TAC` va = pi `;
\r
7075 UNDISCH_TAC` vb = &0 `;
\r
7076 UNDISCH_TAC` azim (vec 0) v0 (vv 1) (vv (i + 1)) = &0 <=>
\r
7077 vv (i + 1) IN aff_gt {vec 0, v0} {vv 1}`;
\r
7078 UNDISCH_TAC`azim (vec 0) v0 (vv 1) (vv i) = pi <=>
\r
7079 vv i IN aff_lt {vec 0, v0} {vv 1} `;
\r
7082 ISPECL [` vec 0: real^3`;` v0: real^3`;` (vv:num -> real^3) 1` ] Fan.th3a) ;
\r
7086 ISPECL [` (vv:num -> real^3) 1 `;` (vv:num -> real^3) (i + 1)`;
\r
7087 ` (vv:num -> real^3) i`;`vec 0: real^3`; ` v0: real^3`] (GEN_ALL OPPOSITE_SIDES_IMP_INTER));
\r
7089 REWRITE_TAC[AFF_IN_TWO_PARTS; INTER_UNION_EMPTY; DE_MORGAN_THM];
\r
7091 ASSUME_TAC (ISPECL [`{vec 0:real^3}`;`{(vv: num -> real^3) (i + 1), vv i }`]
\r
7093 (GEN_ALL CONV_SUBSET_AFF_GE));
\r
7094 (* ****************** *)
\r
7097 ISPECL [`(vv: num -> real^3) (i + 1)`;` (vv:num -> real^3) i `]
\r
7098 Geomdetail.CONV02_SU_CONV2);
\r
7099 ASSUME_TAC2 LOCAL_FAN_RHO_NODE_PROS2;
\r
7100 DOWN THEN STRIP_TAC;
\r
7101 UNDISCH_TAC` (vv:num -> real^3) i IN V`;
\r
7102 FIRST_ASSUM NHANH;
\r
7105 UNDISCH_TAC ` local_fan (V,E,FF)`;
\r
7107 NHANH LOCAL_FAN_IN_FF_IN_ORD_PAIRS2;
\r
7108 ASM_REWRITE_TAC[];
\r
7109 NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
\r
7110 REWRITE_TAC[FAN; fan7];
\r
7113 FIRST_ASSUM (ASSUME_TAC o (ISPECL [`{v0:real^3}`;`{(vv: num -> real^3) i,
\r
7116 SUBGOAL_THEN `{v0: real^3} IN E UNION {{v} | v IN V}` MP_TAC;
\r
7118 UNDISCH_TAC`dist (v0: real^3,vec 0) % (e3:real^3) IN V`;
\r
7119 ASM_REWRITE_TAC[IN_UNION; IN_ELIM_THM];
\r
7124 UNDISCH_TAC` {v0:real^3} IN E UNION {{v} | v IN V} /\
\r
7125 {vv i, vv (i + 1)} IN E UNION {{v} | v IN V}
\r
7126 ==> aff_ge {vec 0} {v0} INTER aff_ge {vec 0} {vv i, vv (i + 1)} =
\r
7127 aff_ge {vec 0} ({v0} INTER {vv i, vv (i + 1)}) `;
\r
7131 SIMP_TAC[IN_UNION];
\r
7133 SUBGOAL_THEN `{v0: real^3} INTER {vv i, vv (i + 1)} = {}` SUBST1_TAC;
\r
7134 UNDISCH_TAC` ~(vv (i:num) = v0:real^3)`;
\r
7135 UNDISCH_TAC` ~(vv (i + 1) = v0:real^3)`;
\r
7136 REWRITE_TAC[Trigonometry2.INSERT_INTER_EMPTY; IN_INSERT; NOT_IN_EMPTY];
\r
7139 REWRITE_TAC[AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
\r
7140 UNDISCH_TAC` conv {vv (i + 1), (vv: num -> real^3) i} SUBSET
\r
7141 aff_ge {vec 0} {vv (i + 1), vv i}`;
\r
7142 UNDISCH_TAC` conv0 {vv (i + 1), (vv: num -> real^3) i} SUBSET
\r
7143 conv {vv (i + 1), (vv: num -> real^3) i}`;
\r
7145 SIMP_TAC[INSERT_COMM];
\r
7147 SET_RULE`a SUBSET b /\ b SUBSET c /\ x INTER c = S ==> x INTER a SUBSET S`);
\r
7150 UNDISCH_TAC` ~(conv0 {vv (i + 1), vv i} INTER aff_ge {vec 0} {v0:real^3} = {})`;
\r
7152 SIMP_TAC[INSERT_COMM; INTER_COMM; SET_RULE` ~( s = {}) /\ s SUBSET {x} <=>
\r
7155 NHANH (SET_RULE` A INTER B = {x} ==> x IN B`);
\r
7156 NHANH CONV0_SUB_CONV;
\r
7158 SUBGOAL_THEN` collinear {vec 0, (vv:num -> real^3) i, vv (i + 1)}` ASSUME_TAC;
\r
7159 ASM_REWRITE_TAC[Collect_geom.COLLINEAR_AS_IN_CONV2];
\r
7160 ASSUME_TAC2 (SPEC `(vv:num -> real^3 ) i ` (GEN `v: real^3`
\r
7161 LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
\r
7163 ASM_REWRITE_TAC[];
\r
7165 SUBGOAL_THEN` circular (V:real^3 -> bool) E ` MP_TAC;
\r
7166 REWRITE_TAC[circular];
\r
7167 EXISTS_TAC` (vv: num -> real^3) (i + 1) `;
\r
7168 EXISTS_TAC` (vv: num -> real^3) i`;
\r
7169 EXISTS_TAC` v0: real^3`;
\r
7173 ASSUME_TAC (ISPECL [`{vec 0:real^3}`;` {(vv:num -> real^3) (i + 1), vv i}`]
\r
7174 (GEN_ALL CONV0_SUBSET_AFF_GT));
\r
7175 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
7176 UNDISCH_TAC` (vv: num -> real^3) i IN V `;
\r
7177 FIRST_ASSUM (NHANH_PAT`\x. x ==> l`);
\r
7178 ASM_SIMP_TAC[ GSYM Wrgcvdr_cizmrrh.IN_E_IFF_IN_ORD_E; INSERT_COMM];
\r
7180 UNDISCH_TAC` dist (v0:real^3,vec 0) % (e3:real^3) IN V`;
\r
7183 UNDISCH_TAC` conv0 {vv (i + 1), (vv i):real^3} SUBSET aff_gt {vec 0} {vv (i + 1), vv i}`;
\r
7184 UNDISCH_TAC` ~(conv0 {vv (i + 1), vv i} INTER aff_lt {vec 0} {v0:real^3} = {})`;
\r
7186 SIMP_TAC[INSERT_COMM];
\r
7187 CONV_TAC SET_RULE;
\r
7190 ASSUME_TAC2 KCHMAMG;
\r
7191 DOWN THEN STRIP_TAC;
\r
7195 ABBREV_TAC `U = {ITER n (rho_node1 FF) v0 | n <= i + 1} `;
\r
7196 ABBREV_TAC` ee = v0 cross rho_node1 FF v0`;
\r
7197 MP_TAC (SPECL [`v0: real^3`;`A:real^3 -> bool`;` ee:real^3`;`i + 1`]
\r
7198 (GENL [` v:real^3 `;`P:real^3 -> bool`;`e:real^3`;`l: num`]
\r
7199 SEQUENCE_OF_RHO_NODE_IS_SUC));
\r
7201 ASM_REWRITE_TAC[];
\r
7202 UNDISCH_TAC` dist (v0:real^3,vec 0) % (e3:real^3) IN V`;
\r
7205 MATCH_MP_TAC SUBSET_TRANS;
\r
7206 EXISTS_TAC`V:real^3 -> bool`;
\r
7207 ASM_REWRITE_TAC[];
\r
7209 REWRITE_TAC[SUBSET; IN_ELIM_THM];
\r
7210 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
7216 DISCH_THEN (MP_TAC o (SPECL [`ITER i (rho_node1 FF) v0`;` i:num`]));
\r
7218 REWRITE_TAC[ARITH_RULE` a < a + 1 `];
\r
7219 DISCH_THEN (MP_TAC o (SPEC` v0:real^3`));
\r
7222 ASM_REWRITE_TAC[IN_ELIM_THM];
\r
7224 UNDISCH_TAC` ! i. ITER i (rho_node1 FF) v0 = vv i`;
\r
7225 PAT_ONCE_REWRITE_TAC`\x. x ==> y ` [EQ_SYM_EQ];
\r
7226 SIMP_TAC[ITER; LE_0];
\r
7228 ASM_REWRITE_TAC[];
\r
7229 SUBGOAL_THEN` &0 < sin ( azim (vec 0) ee v0 (vv (i + 1)))` ASSUME_TAC;
\r
7230 REWRITE_TAC[SIN_AZIM_MUTUAL_SROSS];
\r
7231 UNDISCH_TAC` vv (i + 1) IN aff_gt {vec 0, v0: real^3} {vv 1}`;
\r
7232 ASM_SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM];
\r
7234 ONCE_REWRITE_TAC[CROSS_TRIPLE];
\r
7235 ASM_REWRITE_TAC[CROSS_RADD; CROSS_RMUL; CROSS_REFL; CROSS_0; VECTOR_MUL_RZERO;
\r
7237 UNDISCH_TAC` v0 cross rho_node1 FF v0 = ee`;
\r
7238 ASM_SIMP_TAC[DOT_LMUL];
\r
7240 MATCH_MP_TAC REAL_LT_MUL;
\r
7241 ASM_REWRITE_TAC[DOT_POS_LT];
\r
7243 ASM_REWRITE_TAC[CROSS_EQ_0];
\r
7245 NHANH (REAL_ARITH` &0 < x ==> &0 <= x `);
\r
7246 REWRITE_TAC[SIN_AZIM_POS_PI_LT];
\r
7248 NHANH (REAL_ARITH` a <= h /\ b < a ==> b <= h `);
\r
7249 REWRITE_TAC[GSYM SIN_AZIM_POS_PI_LT];
\r
7250 REWRITE_TAC[REAL_ARITH` a <= b <=> ~( b < a)`; SIN_AZIM_MUTUAL_SROSS];
\r
7253 UNDISCH_TAC` (vv:num -> real^3) i IN aff_lt {vec 0, v0} {vv 1}`;
\r
7254 ASM_SIMP_TAC[Planarity.AFF_LT_2_1; IN_ELIM_THM];
\r
7256 ONCE_REWRITE_TAC[CROSS_TRIPLE];
\r
7257 ASM_REWRITE_TAC[CROSS_RADD; CROSS_RMUL; CROSS_0; CROSS_REFL; VECTOR_MUL_RZERO;
\r
7258 VECTOR_ADD_LID; DOT_LMUL];
\r
7259 UNDISCH_TAC` v0 cross rho_node1 FF v0 = ee`;
\r
7262 SUBGOAL_THEN` &0 < ee dot (ee:real^3)` MP_TAC;
\r
7263 REWRITE_TAC[DOT_POS_LT];
\r
7265 REWRITE_TAC[CROSS_EQ_0];
\r
7266 FIRST_X_ASSUM ACCEPT_TAC;
\r
7267 SIMP_TAC[REAL_LE_MUL_EQ; REAL_ARITH` ~( a < b) <=> b <= a`];
\r
7268 ASM_SIMP_TAC[REAL_ARITH` a <= b <=> ~(b < a )`]]);;
\r
7276 let SUCCESSIVE_RHO_NODE1_AFF_LT = prove_by_refinement
\r
7277 (` local_fan (V,E,FF) /\
\r
7279 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
7283 ==> ! i. 0 < i /\ i < l
\r
7284 ==> ITER (i - 1) (rho_node1 FF) v IN aff_lt {vec 0, ITER i (rho_node1 FF) v} {ITER (i + 1 ) (rho_node1 FF) v }`,
\r
7286 ABBREV_TAC` e = v cross rho_node1 FF v `;
\r
7287 ASSUME_TAC2 RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT;
\r
7289 FIRST_ASSUM (MP_TAC o (SPEC`i - 1 `));
\r
7290 FIRST_ASSUM (MP_TAC o (SPEC`i:num `));
\r
7292 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
7293 FIRST_ASSUM (MP_TAC o (SPECL [`v:real^3`;` i:num`]));
\r
7295 FIRST_X_ASSUM ACCEPT_TAC;
\r
7298 (SPEC` ITER i (rho_node1 FF) v `
\r
7299 (GEN` v: real^3` LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
\r
7301 SUBGOAL_THEN` {vec 0, ITER i (rho_node1 FF) v, rho_node1 FF (ITER i (rho_node1 FF) v)} SUBSET P` MP_TAC;
\r
7302 ASM_REWRITE_TAC[INSERT_SUBSET];
\r
7303 REWRITE_TAC[GSYM INSERT_SUBSET];
\r
7304 MATCH_MP_TAC SUBSET_TRANS;
\r
7305 EXISTS_TAC` U:real^3 -> bool`;
\r
7306 ASM_REWRITE_TAC[];
\r
7308 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; IN_ELIM_THM; GSYM ITER];
\r
7309 UNDISCH_TAC` i < l:num`;
\r
7310 MESON_TAC[ARITH_RULE` a < b:num ==> a <= b /\ SUC a <= b `];
\r
7311 UNDISCH_TAC` plane (P:real^3 -> bool)`;
\r
7313 NHANH THREE_NOT_COLL_DETER_PLANE;
\r
7315 SUBGOAL_THEN` ITER (i - 1) (rho_node1 FF) v IN P` ASSUME_TAC;
\r
7316 UNDISCH_TAC` U SUBSET (P:real^3 -> bool)`;
\r
7317 REWRITE_TAC[SUBSET];
\r
7318 DISCH_THEN MATCH_MP_TAC;
\r
7320 REWRITE_TAC[IN_ELIM_THM];
\r
7321 EXISTS_TAC` i - 1 `;
\r
7322 UNDISCH_TAC` i < l:num`;
\r
7324 CONV_TAC ARITH_RULE;
\r
7328 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM];
\r
7330 SUBGOAL_THEN` w < &0 ` ASSUME_TAC;
\r
7331 UNDISCH_TAC` i < l:num`;
\r
7332 NHANH (ARITH_RULE` a < b ==> a - 1 < b `);
\r
7333 UNDISCH_TAC` i < l
\r
7335 (ITER i (rho_node1 FF) v cross ITER (i + 1) (rho_node1 FF) v) dot e`;
\r
7337 UNDISCH_TAC` i - 1 < l
\r
7339 (ITER (i - 1) (rho_node1 FF) v cross
\r
7340 ITER (i - 1 + 1) (rho_node1 FF) v) dot
\r
7343 ASM_SIMP_TAC[ARITH_RULE` 0 < a ==> a - 1 + 1 = a `; GSYM ITER; ADD1;
\r
7344 CROSS_LADD; CROSS_LMUL; CROSS_0; CROSS_REFL];
\r
7345 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
\r
7348 ONCE_REWRITE_TAC[CROSS_SKEW];
\r
7349 REWRITE_TAC[VECTOR_MUL_RNEG];
\r
7350 REWRITE_TAC[GSYM VECTOR_MUL_LNEG; DOT_LMUL];
\r
7351 ASM_SIMP_TAC[REAL_LT_MUL_EQ];
\r
7353 UNDISCH_TAC`~collinear
\r
7354 {vec 0, ITER i (rho_node1 FF) v, rho_node1 FF
\r
7355 (ITER i (rho_node1 FF) v )}`;
\r
7358 SIMP_TAC[ITER; GSYM ADD1; IN_ELIM_THM];
\r
7360 EXISTS_TAC` u:real`;
\r
7361 EXISTS_TAC` v': real`;
\r
7362 EXISTS_TAC`w:real`;
\r
7363 ASM_REWRITE_TAC[]]);;
\r
7371 let IN_OPOSITE_SIDE_IMP_INTER = prove(
\r
7372 ` b IN aff_lt {va, vb} {vc} /\
\r
7373 DISJOINT {va, vb} {vc}
\r
7374 ==> ~(conv0 {vc, b} INTER aff {va, vb} = {})`,
\r
7375 NHANH DISJOINT_IMP_Z_IN_AFF_GT THEN STRIP_TAC THEN
\r
7376 MATCH_MP_TAC OPPOSITE_SIDES_IMP_INTER THEN ASM_REWRITE_TAC[]);;
\r
7384 let TWO_SIDES_SUCESSIVE = prove_by_refinement
\r
7385 (` local_fan (V,E,FF) /\
\r
7387 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
7391 ==> ! i. 0 < i /\ i < l
\r
7392 ==> ~( conv0 { ITER (i - 1) (rho_node1 FF) v, ITER (i + 1 ) (rho_node1 FF) v } INTER aff {vec 0, ITER i (rho_node1 FF) v} = {} )`,
\r
7393 [NHANH SUCCESSIVE_RHO_NODE1_AFF_LT;
\r
7395 FIRST_ASSUM NHANH;
\r
7396 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
7398 FIRST_ASSUM (ASSUME_TAC2 o (SPECL[`v:real^3`;`i:num`]));
\r
7399 ASSUME_TAC2 (SPEC`ITER i (rho_node1 FF) v ` (GEN `v:real^3 `
\r
7400 LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
\r
7401 DOWN THEN NHANH Fan.th3a;
\r
7402 STRIP_TAC THEN STRIP_TAC;
\r
7403 ONCE_REWRITE_TAC[INSERT_COMM];
\r
7404 MATCH_MP_TAC IN_OPOSITE_SIDE_IMP_INTER;
\r
7405 ONCE_REWRITE_TAC[INSERT_COMM];
\r
7406 ASM_REWRITE_TAC[GSYM ADD1; ITER]]);;
\r
7413 let LOCAL_FAN_CHARACTER_OF_RHO_NODE3 = prove(
\r
7414 `local_fan (V,E,FF) /\ v IN V ==>
\r
7415 ! i. ~ collinear {vec 0, ITER i (rho_node1 FF) v, ITER (i + 1) (rho_node1 FF) v}`,
\r
7416 NHANH LOCAL_FAN_ORBIT_MAP_VITER THEN STRIP_TAC THEN GEN_TAC THEN
\r
7417 FIRST_X_ASSUM (ASSUME_TAC2 o (SPECL [`v:real^3`;` i:num`])) THEN
\r
7418 REWRITE_TAC[GSYM ADD1; ITER] THEN
\r
7419 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2 THEN
\r
7420 ASM_REWRITE_TAC[]);;
\r
7428 let CNVX_IMP_INTERIOR_ANGLE_PI = prove_by_refinement
\r
7429 (` convex_local_fan (V,E,FF) /\
\r
7431 {ITER n (rho_node1 FF) v | n <= l} = U /\
\r
7435 ==> ! i. 0 < i /\ i < l
\r
7436 ==> interior_angle1 (vec 0) FF ( ITER i (rho_node1 FF) v) = pi `,
\r
7438 ABBREV_TAC` e = v cross rho_node1 FF v `;
\r
7439 ASSUME_TAC2 CVX_LO_IMP_LO;
\r
7440 ASSUME_TAC2 TWO_SIDES_SUCESSIVE;
\r
7444 DOWN THEN DOWN THEN PHA;
\r
7445 FIRST_ASSUM NHANH;
\r
7446 ONCE_REWRITE_TAC[INTER_COMM];
\r
7448 SUBGOAL_THEN` {ITER (i + 1) (rho_node1 FF) v, ITER (i - 1) (rho_node1 FF) v}
\r
7449 INTER aff {vec 0, ITER i (rho_node1 FF) v} = {} ` ASSUME_TAC;
\r
7450 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
7451 FIRST_ASSUM (MP_TAC o (SPECL [`v:real^3`;`i - 1 `]));
\r
7452 FIRST_ASSUM (MP_TAC o (SPECL [`v:real^3`;`i:num `]));
\r
7453 REPLICATE_TAC 2 (DISCH_THEN ASSUME_TAC2);
\r
7454 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE3;
\r
7455 FIRST_ASSUM (MP_TAC o (SPEC`i - 1 `));
\r
7456 FIRST_ASSUM (MP_TAC o (SPEC`i:num`));
\r
7458 ASSUME_TAC2 (ARITH_RULE`0 < i ==> i - 1 + 1 = i`);
\r
7460 SIMP_TAC[Collect_geom.PER_SET2];
\r
7463 SIMP_TAC[Collect_geom.PER_SET2];
\r
7465 ABBREV_TAC` a1 = ITER (i - 1) (rho_node1 FF) v`;
\r
7466 ABBREV_TAC` a2 = ITER i (rho_node1 FF) v`;
\r
7467 ABBREV_TAC` a3 = ITER (i + 1) (rho_node1 FF) v`;
\r
7468 UNDISCH_TAC` ~(a3 IN aff {a2, vec 0:real^3})`;
\r
7469 UNDISCH_TAC` ~(a1 IN aff {a2, vec 0: real^3})`;
\r
7472 ABBREV_TAC` w = ITER (i - 1) (rho_node1 FF) v`;
\r
7473 ABBREV_TAC` vv = ITER i (rho_node1 FF) v`;
\r
7474 ABBREV_TAC` u = ITER (i + 1) (rho_node1 FF) v`;
\r
7475 SUBGOAL_THEN` interior_angle1 (vec 0) FF vv = pi /\
\r
7476 rho_node1 FF vv IN P /\
\r
7477 ivs_rho_node1 FF vv IN P ` MP_TAC;
\r
7478 MATCH_MP_TAC OZQVSFF;
\r
7479 EXISTS_TAC` u: real^3`;
\r
7480 EXISTS_TAC` w:real^3`;
\r
7482 SIMP_TAC[Collect_geom.PER_SET2];
\r
7484 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
7486 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
7487 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v:real^3`;` i - 1 `]));
\r
7488 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v:real^3`;` i: num `]));
\r
7489 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v:real^3`;` i + 1 `]));
\r
7490 REPLICATE_TAC 3 DOWN THEN PHA;
\r
7496 ONCE_REWRITE_TAC[INSERT_SUBSET];
\r
7497 ASM_REWRITE_TAC[];
\r
7498 MATCH_MP_TAC SUBSET_TRANS;
\r
7499 EXISTS_TAC`U:real^3 -> bool`;
\r
7500 ASM_REWRITE_TAC[];
\r
7501 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
\r
7506 REWRITE_TAC[IN_ELIM_THM];
\r
7507 UNDISCH_TAC` i < l:num`;
\r
7508 NHANH (ARITH_RULE` a < b:num ==> a <= b /\ a - 1 <= b /\ a + 1 <= b`);
\r
7513 let INSERT_UNION2 = SET_RULE` (x INSERT S) UNION U = S UNION (x INSERT U)`;;
\r
7518 let EGHNAVX = prove_by_refinement
\r
7519 (`convex_local_fan (V,E,FF) /\
\r
7522 (!v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v}) /\
\r
7523 (!i. ITER i (rho_node1 FF) v0 = vv i) /\
\r
7524 (!i. azim (vec 0) v0 (vv 1) (vv i) = bta i)
\r
7526 bta (k - 1) <= pi /\
\r
7527 (!i j. i < j /\ j < k ==> bta i <= bta j) /\
\r
7528 (bta i = &0 /\ i < k
\r
7529 ==> (!j. 0 < j /\ j < i ==> interior_angle1 (vec 0) FF (vv j) = pi) /\
\r
7530 {vv k | 0 < k /\ k <= i} SUBSET aff_gt {vec 0, v0} {vv 1}) /\
\r
7531 (bta i = bta (k - 1) /\ 0 < i /\ i < k - 1
\r
7532 ==> (!j. i < j /\ j < k ==> interior_angle1 (vec 0) FF (vv j) = pi) /\
\r
7533 {vv n | i <= n /\ n < k} SUBSET aff_gt {vec 0, v0} {vv (k - 1)})`,
\r
7534 [NHANH MONO_AZIM_AS_BTA_I;
\r
7536 ASSUME_TAC2 FIRST_EQ0_LAST_LT_PI;
\r
7537 ASM_REWRITE_TAC[];
\r
7538 ASSUME_TAC2 CVX_LO_IMP_LO;
\r
7539 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;
\r
7540 ASSUME_TAC2 (SPEC` v0:real^3` (GEN`v:real^3` LOFA_IMP_DIS_ELMS23));
\r
7544 SUBGOAL_THEN` {vv k | 0 < k /\ k <= i} SUBSET aff_gt {vec 0, v0:real^3} {vv 1}` ASSUME_TAC;
\r
7545 REWRITE_TAC[SUBSET; IN_ELIM_THM];
\r
7547 SUBGOAL_THEN` azim (vec 0) v0 (vv 1) (vv k') = &0` ASSUME_TAC;
\r
7548 ASM_CASES_TAC` k' = i:num`;
\r
7549 ASM_REWRITE_TAC[];
\r
7550 UNDISCH_TAC` !i j. i < j /\ j < k ==> bta i <= (bta:num -> real) j`;
\r
7552 DISCH_THEN (MP_TAC o (SPECL [`k': num`;` i: num`]));
\r
7554 ASM_REWRITE_TAC[];
\r
7555 UNDISCH_TAC` k' <= i:num`;
\r
7556 UNDISCH_TAC` ~( k' = i:num)`;
\r
7560 ASM_REWRITE_TAC[];
\r
7561 SUBGOAL_THEN` &0 <= azim (vec 0) v0 (vv 1) (vv k')` MP_TAC;
\r
7562 REWRITE_TAC[AZIM_RANGE];
\r
7564 ASM_REWRITE_TAC[];
\r
7570 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
7571 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v0:real^3`));
\r
7572 FIRST_ASSUM (MP_TAC o (SPECL [`0`;`k': num`]));
\r
7575 ASM_REWRITE_TAC[];
\r
7576 UNDISCH_TAC` k' <= i:num`;
\r
7577 UNDISCH_TAC` i < k:num`;
\r
7580 REWRITE_TAC[ITER];
\r
7582 SUBGOAL_THEN` rho_node1 FF v0 = ITER 1 (rho_node1 FF) v0` MP_TAC;
\r
7583 REWRITE_TAC[ITER12];
\r
7587 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v0:real^3`;`1`]));
\r
7588 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v0:real^3`;`k':num`]));
\r
7590 ASM_REWRITE_TAC[];
\r
7592 UNDISCH_TAC` !v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v:real^3}`;
\r
7594 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`(vv:num -> real^3) 1 `));
\r
7595 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`(vv:num -> real^3) k' `));
\r
7596 DOWN THEN DOWN THEN PHA;
\r
7598 NHANH (GSYM AZIM_EQ_0_ALT);
\r
7600 ASM_REWRITE_TAC[];
\r
7602 ASSUME_TAC (ISPECL [`{vec 0, v0:real^3}`;` {(vv:num -> real^3) 1}`]
\r
7603 AFF_GT_SUBSET_AFFINE_HULL);
\r
7604 ASM_REWRITE_TAC[];
\r
7605 UNDISCH_TAC` !i. ITER i (rho_node1 FF) v0 = vv i`;
\r
7607 FIRST_ASSUM (fun x -> REWRITE_TAC[GSYM x]);
\r
7608 MATCH_MP_TAC (GEN_ALL CNVX_IMP_INTERIOR_ANGLE_PI);
\r
7609 EXISTS_TAC`E:(real^3 -> bool) -> bool`;
\r
7610 EXISTS_TAC` V:real^3 -> bool`;
\r
7611 EXISTS_TAC`{ITER n (rho_node1 FF) v0 | n <= i}`;
\r
7612 EXISTS_TAC` affine hull ({vec 0, v0:real^3} UNION {vv 1})`;
\r
7613 ASM_REWRITE_TAC[];
\r
7614 ASSUME_TAC2 (SPEC` v0:real^3` (GEN `v:real^3`
\r
7615 LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
\r
7617 REWRITE_TAC[INSERT_UNION2; UNION_EMPTY];
\r
7620 SUBGOAL_THEN` rho_node1 FF v0 = ITER 1 (rho_node1 FF) v0` ASSUME_TAC;
\r
7621 REWRITE_TAC[ITER12];
\r
7622 ASM_REWRITE_TAC[plane];
\r
7623 MESON_TAC[INSERT_COMM];
\r
7626 REWRITE_TAC[INSERT_UNION2; UNION_EMPTY];
\r
7627 MESON_TAC[Trigonometry2.IN_P_HULL_INSERT; INSERT_COMM];
\r
7630 REWRITE_TAC[SUBSET; IN_ELIM_THM];
\r
7632 ASM_CASES_TAC` n = 0 `;
\r
7633 ASM_REWRITE_TAC[];
\r
7635 SUBGOAL_THEN` vv 0 = ITER 0 (rho_node1 FF) v0` MP_TAC;
\r
7636 ASM_REWRITE_TAC[];
\r
7637 SIMP_TAC[ITER; Trigonometry2.IN_P_HULL_INSERT; INSERT_UNION2; UNION_EMPTY];
\r
7640 SUBGOAL_THEN` x IN {(vv:num ->real^3) k | 0 < k /\ k <= i}` MP_TAC;
\r
7641 REWRITE_TAC[IN_ELIM_THM];
\r
7642 EXISTS_TAC`n:num`;
\r
7643 ASM_REWRITE_TAC[];
\r
7646 UNDISCH_TAC` {vv k | 0 < k /\ k <= i} SUBSET aff_gt {vec 0, v0:real^3} {vv 1}`;
\r
7647 REWRITE_TAC[SUBSET];
\r
7649 UNDISCH_TAC` aff_gt {vec 0, v0:real^3} {vv 1} SUBSET affine hull ({vec 0, v0} UNION {vv 1})`;
\r
7650 REWRITE_TAC[SUBSET];
\r
7652 SIMP_TAC[INSERT_UNION2; UNION_EMPTY];
\r
7661 SUBGOAL_THEN` {vv n | i <= n /\ n < k} SUBSET aff_gt {vec 0, v0:real^3} {vv (k - 1)}` ASSUME_TAC;
\r
7662 REWRITE_TAC[SUBSET; IN_ELIM_THM];
\r
7664 SUBGOAL_THEN` azim (vec 0) v0 (vv 1) x = azim (vec 0) v0 (vv 1) (vv (k - 1))` ASSUME_TAC;
\r
7665 ASM_CASES_TAC` n = i:num`;
\r
7666 ASM_REWRITE_TAC[];
\r
7667 ASM_CASES_TAC` n = k - 1 `;
\r
7668 ASM_REWRITE_TAC[];
\r
7669 UNDISCH_TAC` !i j. i < j /\ j < k ==> bta i <= (bta:num -> real) j`;
\r
7671 FIRST_ASSUM (MP_TAC o (SPECL [`i:num`;` n:num`]));
\r
7674 FIRST_ASSUM (MP_TAC o (SPECL [`n:num`;`k - 1`]));
\r
7677 ASM_REWRITE_TAC[];
\r
7680 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v0:real^3`;`1`]));
\r
7681 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v0:real^3`;`n:num`]));
\r
7682 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v0:real^3`;`k - 1`]));
\r
7683 FIRST_ASSUM (MP_TAC o (SPECL [`0`;`n:num`]));
\r
7686 ASM_REWRITE_TAC[];
\r
7688 FIRST_ASSUM (MP_TAC o (SPECL [`0`;` k - 1`]));
\r
7690 ASM_REWRITE_TAC[];
\r
7693 ASM_REWRITE_TAC[];
\r
7695 REWRITE_TAC[ITER];
\r
7696 ASM_REWRITE_TAC[];
\r
7697 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;
\r
7698 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v0: real^3`));
\r
7699 SUBGOAL_THEN` rho_node1 FF v0 = ITER 1 (rho_node1 FF) v0` MP_TAC;
\r
7700 REWRITE_TAC[ITER12];
\r
7701 ASM_REWRITE_TAC[];
\r
7703 UNDISCH_TAC` ITER 1 (rho_node1 FF) v0 IN V `;
\r
7704 UNDISCH_TAC` ITER n (rho_node1 FF) v0 IN V `;
\r
7705 UNDISCH_TAC` ITER (k - 1) (rho_node1 FF) v0 IN V `;
\r
7706 UNDISCH_TAC` ~(rho_node1 FF v0 = v0) /\
\r
7707 v0,rho_node1 FF v0 IN ord_pairs E /\
\r
7708 ~collinear {vec 0, v0, rho_node1 FF v0}`;
\r
7709 ASM_REWRITE_TAC[];
\r
7711 UNDISCH_TAC` !v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v:real^3}`;
\r
7713 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`(vv:num -> real^3) 1 `));
\r
7714 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`(vv:num -> real^3) n `));
\r
7715 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`(vv:num -> real^3) (k - 1) `));
\r
7716 REPLICATE_TAC 3 DOWN THEN PHA;
\r
7717 NHANH AZIM_EQ_ALT;
\r
7720 UNDISCH_TAC` azim (vec 0) v0 (vv 1) x = azim (vec 0) v0 (vv 1) (vv (k - 1))`;
\r
7727 ASM_REWRITE_TAC[];
\r
7728 ABBREV_TAC` v00 = ITER i (rho_node1 FF) v0`;
\r
7729 MP_TAC (SPECL [`E:(real^3 -> bool) -> bool`;` V:real^3 -> bool`;
\r
7730 ` {ITER n (rho_node1 FF) v00 | n <= k - i}`;` affine hull {vec 0, v0:real^3, vv (k - 1)}`;
\r
7731 ` k - i:num`;` FF:real^3 # real^3 -> bool`;` v00: real^3`]
\r
7732 (GEN_ALL CNVX_IMP_INTERIOR_ANGLE_PI));
\r
7734 ASM_REWRITE_TAC[];
\r
7736 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v0:real^3`;`i:num`]));
\r
7738 FIRST_ASSUM SUBST1_TAC;
\r
7739 SIMP_TAC[Trigonometry2.IN_P_HULL_INSERT];
\r
7741 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v0:real^3`;`k - 1`]));
\r
7742 FIRST_ASSUM (MP_TAC o (SPECL [`0`;`k - 1`]));
\r
7744 MATCH_MP_TAC LT_TRANS;
\r
7745 EXISTS_TAC `i:num`;
\r
7746 ASM_REWRITE_TAC[];
\r
7748 ASM_REWRITE_TAC[];
\r
7749 UNDISCH_TAC` i < k - 1`;
\r
7751 REWRITE_TAC[ITER];
\r
7753 ASM_REWRITE_TAC[];
\r
7754 STRIP_TAC THEN STRIP_TAC;
\r
7755 SUBGOAL_THEN` ~ collinear {vec 0, v0:real^3, vv (k - 1)}` ASSUME_TAC;
\r
7756 DOWN THEN DOWN THEN PHA;
\r
7757 ASM_REWRITE_TAC[];
\r
7758 STRIP_TAC THEN CONJ_TAC;
\r
7759 REWRITE_TAC[plane];
\r
7762 ASSUME_TAC (ISPECL [`{vec 0, v0:real^3}`;`{(vv:num -> real^3) (k - 1)}`]
\r
7763 AFF_GT_SUBSET_AFFINE_HULL);
\r
7764 REWRITE_TAC[SUBSET; IN_ELIM_THM];
\r
7766 ASM_CASES_TAC` n = k - (i:num)`;
\r
7767 ASM_REWRITE_TAC[];
\r
7769 ASSUME_TAC2 (ARITH_RULE` i < k - 1 ==> k - i + i = (k:num) `);
\r
7770 ASM_REWRITE_TAC[ITER_ADD];
\r
7771 ASSUME_TAC2 LOFA_IMP_ITER_RHO_NODE_ID;
\r
7772 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`v0:real^3`));
\r
7774 ONCE_REWRITE_TAC[INSERT_COMM];
\r
7775 ASM_REWRITE_TAC[];
\r
7776 ASM_SIMP_TAC[Trigonometry2.IN_P_HULL_INSERT];
\r
7777 UNDISCH_TAC` aff_gt {vec 0, v0:real^3} {vv (k - 1)} SUBSET
\r
7778 affine hull ({vec 0, v0} UNION {vv (k - 1)})`;
\r
7779 REWRITE_TAC[INSERT_UNION2; UNION_EMPTY; INSERT_COMM; SUBSET];
\r
7780 DISCH_THEN MATCH_MP_TAC;
\r
7781 UNDISCH_TAC` {vv n | i <= n /\ n < k} SUBSET aff_gt {vec 0, v0:real^3} {vv (k - 1)}`;
\r
7782 REWRITE_TAC[SUBSET; IN_ELIM_THM; INSERT_COMM];
\r
7783 DISCH_THEN MATCH_MP_TAC;
\r
7784 EXISTS_TAC `n + i:num`;
\r
7785 ASM_REWRITE_TAC[];
\r
7787 REWRITE_TAC[ITER_ADD];
\r
7788 ASM_REWRITE_TAC[];
\r
7790 UNDISCH_TAC` n <= k - (i:num)`;
\r
7792 STRIP_TAC THEN GEN_TAC;
\r
7794 FIRST_X_ASSUM (MP_TAC o (SPEC` j - (i:num)`));
\r
7799 REWRITE_TAC[ITER_ADD];
\r
7800 UNDISCH_TAC` i < j:num`;
\r
7801 NHANH (ARITH_RULE` a < b:num ==> b - a + a = b `);
\r
7802 ASM_SIMP_TAC[]]);;
\r