Update from HH
[Flyspeck/.git] / text_formalization / local / LOCAL_LEMMAS.hl
1 (* ========================================================================== *)\r
2 (* FLYSPECK - BOOK FORMALIZATION                                              *)\r
3 (*                                                                            *)\r
4 (* Chapter: Local Fan                                                   *)\r
5 (* Author: Nguyen Quang Truong                                          *)\r
6 (* Date: 2010-05-09                                                           *)\r
7 (* ========================================================================== *)\r
8 \r
9 (* rho_fan interior_angle *)\r
10 \r
11 flyspeck_needs "local/LDURDPN.hl";;\r
12 \r
13 \r
14 module type Local_lemmas_type = sig\r
15 \r
16 end;;\r
17 \r
18 (* ================================================================ *)\r
19 (* lemma 6.13 - KOMWBWC *)\r
20 \r
21 module Local_lemmas = struct\r
22 \r
23 parse_as_infix("has_orders",(12,"right"));;\r
24 parse_as_infix("cyclic_on",(13,"right"));;\r
25 \r
26 open Ldurdpn;;\r
27 open Lvducxu;;\r
28 open Sphere;;\r
29 open Trigonometry1;;\r
30 open Trigonometry2;;\r
31 open Hypermap;;\r
32 open Fan;;\r
33 open Prove_by_refinement;;\r
34 open Wrgcvdr_cizmrrh;;\r
35 open Aff_sgn_tac;;\r
36 \r
37 \r
38 let rho_node1 = new_definition ` rho_node1 (FF:real^3 # real^3 -> bool) v = (@w. (v,w) IN FF)`;;\r
39 \r
40 let ivs_rho_node1 = new_definition ` ivs_rho_node1 (FF:real^3 # real^3 -> bool) v = (@a. a,v IN FF )`;;\r
41 \r
42 let SWITCH_TAC t = UNDISCH_TAC t THEN DISCH_THEN (ASSUME_TAC o GSYM);;\r
43 \r
44 \r
45 \r
46 \r
47 \r
48 \r
49 \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
56 DOWN;\r
57 UNDISCH_TAC ` face H (x':real^3 # real^3) SUBSET dart H`;\r
58 ASM_REWRITE_TAC[SUBSET];\r
59 DISCH_THEN NHANH;\r
60 DOWN_TAC;\r
61 REWRITE_TAC[FAN; darts_of_hyp; IN_UNION; Wrgcvdr_cizmrrh.IN_ORD_E_EQ_IN_E];\r
62 STRIP_TAC;\r
63 DOWN;\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
67 MESON_TAC[];\r
68 DOWN;\r
69 REWRITE_TAC[self_pairs; IN_ELIM_THM; PAIR_EQ];\r
70 MESON_TAC[]]);;\r
71 \r
72 \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
79 STRIP_TAC;\r
80 MP_TAC2 Wrgcvdr_cizmrrh.BIJ_BETWEEN_FF_AND_V;\r
81 REWRITE_TAC[BIJ];\r
82 STRIP_TAC;\r
83 SUBGOAL_THEN ` (!x. x IN V ==> x,rho_node1 FF x IN (FF:real^3 # real^3 -> bool))` ASSUME_TAC;\r
84 REPEAT STRIP_TAC;\r
85 REWRITE_TAC[rho_node1];\r
86 CONV_TAC SELECT_CONV;\r
87 DOWN THEN DOWN;\r
88 REWRITE_TAC[SURJ];\r
89 STRIP_TAC;\r
90 FIRST_ASSUM NHANH;\r
91 ASM_REWRITE_TAC[];\r
92 STRIP_TAC;\r
93 EXISTS_TAC ` SND (y:real^3 # real^3) `;\r
94 FIRST_X_ASSUM (SUBST1_TAC o SYM);\r
95 ASM_REWRITE_TAC[];\r
96 DOWN THEN SIMP_TAC[];\r
97 DOWN;\r
98 REWRITE_TAC[SURJ];\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
101 DISCH_THEN NHANH;\r
102 FIRST_X_ASSUM NHANH;\r
103 DOWN THEN DOWN;\r
104 ASM_REWRITE_TAC[INJ];\r
105 MESON_TAC[FST]]);;\r
106 \r
107 \r
108 \r
109 \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
116 STRIP_TAC;\r
117 REWRITE_TAC[VECTOR_ARITH` p = q + h % x <=> p - q = h % x `];\r
118 REPEAT STRIP_TAC;\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
126 \r
127 \r
128 \r
129 \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
135 REPEAT STRIP_TAC;\r
136 EQ_TAC;\r
137 ASM_MESON_TAC[];\r
138 STRIP_TAC;\r
139 DISJ2_TAC;\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
143 STRIP_TAC;\r
144 FIRST_ASSUM NHANH;\r
145 REWRITE_TAC[HAS_SIZE; Geomdetail.CARD2];\r
146 REPEAT STRIP_TAC;\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
149 PHA;\r
150 NHANH lemma_sub_support;\r
151 REWRITE_TAC[INSERT_SUBSET; IN];\r
152 ASM_MESON_TAC[]]);;\r
153 \r
154 \r
155 \r
156 \r
157 \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
162 STRIP_TAC;\r
163 FIRST_X_ASSUM (MP_TAC2 o (SPEC `{a,b:real^N}`));\r
164 ONCE_REWRITE_TAC[GSYM IN];\r
165 ASM_REWRITE_TAC[];\r
166 ASM_REWRITE_TAC[HAS_SIZE; Geomdetail.CARD2; PAIR_EQ];\r
167 MESON_TAC[];\r
168 ASM_REWRITE_TAC[];\r
169 EXISTS_TAC ` v:real^N`;\r
170 ASM_REWRITE_TAC[]]);;\r
171 \r
172 \r
173 \r
174 \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
180 [STRIP_TAC;\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
184 ASSUME_TAC2 (\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
188 \r
189 \r
190 \r
191 \r
192 \r
193 \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
198 \r
199 \r
200 \r
201 \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
204 \r
205 \r
206 \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
210 \r
211 \r
212 \r
213 \r
214 \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
218 \r
219 \r
220 \r
221 \r
222 \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
229 STRIP_TAC;\r
230 REWRITE_TAC[EXTENSION];\r
231 GEN_TAC;\r
232 EQ_TAC;\r
233 DOWN THEN NHANH (SMOOTH_GEN_ALL Trigonometry2.NONCOPLANAR_3_BASIS);\r
234 REWRITE_TAC[VECTOR_SUB_RZERO];\r
235 STRIP_TAC;\r
236 FIRST_X_ASSUM (MP_TAC o (SPEC ` x':real^3 - a`));\r
237 REPEAT STRIP_TAC;\r
238 SUBGOAL_THEN ` coplanar {a,b,c,x':real^3}` MP_TAC;\r
239 DOWN_TAC;\r
240 REWRITE_TAC[coplanar; INSERT_SUBSET; EMPTY_SUBSET];\r
241 MESON_TAC[];\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
244 STRIP_TAC;\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
249 DOWN_TAC;\r
250 NHANH NOT_COPLANAR_NOT_COLLINEAR;\r
251 ONCE_REWRITE_TAC[Trigonometry2.COLLINEAR_TRANSABLE];\r
252 REWRITE_TAC[VECTOR_SUB_RZERO];\r
253 MESON_TAC[];\r
254 DOWN_TAC;\r
255 NHANH (ISPEC ` affine ` HULL_MONO);\r
256 REWRITE_TAC[HULL_HULL; SUBSET];\r
257 MESON_TAC[]]);;\r
258 \r
259 \r
260 \r
261 \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
266 \r
267 \r
268 \r
269 \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
273 LET_TAC;\r
274 NHANH ELMS_OF_HYPERMAP_HYP;\r
275 REPEAT STRIP_TAC;\r
276 UNDISCH_TAC ` V = {v:real^3}`;\r
277 UNDISCH_TAC `FAN (vec 0:real^3,V,E) `;\r
278 PHA;\r
279 NHANH FAN_SINGLETON_V_DARTS;\r
280 NHANH (MESON[CARD_SINGLETON]` S = {c} ==> CARD S = 1 `);\r
281 STRIP_TAC;\r
282 UNDISCH_TAC ` CARD (dart (H:(real^3 # real^3) hypermap)) = 2 * CARD (FF:real^3 # real^3 -> bool)` ;\r
283 DOWN;\r
284 EXPAND_TAC "H";\r
285 ASM_SIMP_TAC[];\r
286 MESON_TAC[FACE_NOT_EMPTY; ARITH_RULE` 1 <= a ==> ~( 1 = 2 * a ) `]]);;\r
287 \r
288 \r
289 \r
290 \r
291 \r
292 let LOCAL_FAN_NOT_SING_FF = prove_by_refinement\r
293 (` local_fan (V,E,FF) ==> ~(? x. FF = {x})`,\r
294 [STRIP_TAC;\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
298 DOWN;\r
299 REWRITE_TAC[BIJ];\r
300 NHANH Wrgcvdr_cizmrrh.SURJ_IMP_S2_EQ_IMAGE_S1;\r
301 REPEAT STRIP_TAC;\r
302 FIRST_X_ASSUM SUBST_ALL_TAC;\r
303 DOWN;\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
306 MESON_TAC[]]);;\r
307 \r
308 \r
309 \r
310 \r
311 \r
312 \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
317 LET_TAC;\r
318 STRIP_TAC;\r
319 DOWN;\r
320 ASM_REWRITE_TAC[];\r
321 NHANH lemma_face_identity;\r
322 STRIP_TAC;\r
323 FIRST_X_ASSUM SUBST_ALL_TAC;\r
324 STRIP_TAC;\r
325 SUBGOAL_THEN ` face_map (H:(real^3 # real^3) hypermap) x = x ` ASSUME_TAC;\r
326 DOWN_TAC;\r
327 NHANH ELMS_OF_HYPERMAP_HYP;\r
328 IMP_TAC THEN SIMP_TAC[];\r
329 STRIP_TAC;\r
330 STRIP_TAC;\r
331 DOWN;\r
332 UNDISCH_TAC ` FAN (vec 0:real^3,V,E) `;\r
333 PHA;\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
338 \r
339 \r
340 \r
341 \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
347 LET_TAC;\r
348 NHANH lemma_face_subset;\r
349 ASM_REWRITE_TAC[SUBSET];\r
350 STRIP_TAC;\r
351 UNDISCH_TAC ` (x:real^3 # real^3) IN FF `;\r
352 ASM_REWRITE_TAC[];\r
353 FIRST_X_ASSUM NHANH;\r
354 ASM_REWRITE_TAC[darts_of_hyp; IN_UNION];\r
355 STRIP_TAC;\r
356 DOWN;\r
357 REWRITE_TAC[self_pairs; IN_ELIM_THM];\r
358 STRIP_TAC;\r
359 FIRST_X_ASSUM SUBST_ALL_TAC;\r
360 REPLICATE_TAC 4 DOWN;\r
361 REWRITE_TAC[]]);;\r
362 \r
363 \r
364 \r
365 \r
366 \r
367 \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
374 \r
375 \r
376 \r
377 \r
378 \r
379 \r
380 \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
386 STRIP_TAC;\r
387 FIRST_X_ASSUM NHANH;\r
388 FIRST_X_ASSUM NHANH;\r
389 GEN_TAC THEN IMP_TAC THEN REMOVE_TAC;\r
390 DOWN THEN PHA;\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
394 SIMP_TAC[]]);;\r
395 \r
396 \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
399 \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
404 \r
405 \r
406 \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
413 EQ_TAC;\r
414 STRIP_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
421 MESON_TAC[];\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
426 PHA;\r
427 MESON_TAC[INSERT_COMM];\r
428 STRIP_TAC;\r
429 DISJ1_TAC;\r
430 DOWN THEN DOWN;\r
431 MESON_TAC[];\r
432 DISJ1_TAC;\r
433 DOWN THEN DOWN THEN PHA;\r
434 MESON_TAC[INSERT_COMM]]);;\r
435 \r
436 \r
437 \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
441 \r
442 \r
443 \r
444 \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
449 DOWN_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
454 LET_TAC;\r
455 NHANH ELMS_OF_HYPERMAP_HYP;\r
456 ASM_REWRITE_TAC[];\r
457 STRIP_TAC;\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
460 STRIP_TAC;\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
465 ASM_REWRITE_TAC[];\r
466 MESON_TAC[]]);;\r
467 \r
468 \r
469 \r
470 \r
471 \r
472 \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
476 STRIP_TAC 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
481 STRIP_TAC THEN \r
482 FIRST_X_ASSUM MP_TAC2 THEN \r
483 DISCH_THEN MP_TAC2 THEN \r
484 SIMP_TAC[EQ_SYM_EQ]);;\r
485 \r
486 \r
487 \r
488 \r
489 \r
490 let LOCAL_FAN_RHO_NODE_PROS2 = ONCE_REWRITE_RULE[TAUT` a /\ b <=> b /\ a `] LOCAL_FAN_RHO_NODE_PROS;;\r
491 \r
492 \r
493 \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
497 \r
498 \r
499 \r
500 \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
505 STRIP_TAC;\r
506 GEN_TAC;\r
507 REWRITE_TAC[IN_ELIM_THM];\r
508 EQ_TAC;\r
509 STRIP_TAC;\r
510 SUBGOAL_THEN ` coplanar {x,y,z,x':real^3} ` ASSUME_TAC;\r
511 DOWN_TAC;\r
512 REWRITE_TAC[coplanar; plane; INSERT_SUBSET];\r
513 MESON_TAC[];\r
514 DOWN;\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
518  VECTOR_MUL_EQ_0];\r
519 DOWN THEN PHA;\r
520 SIMP_TAC[INSERT_SUBSET];\r
521 STRIP_TAC;\r
522 EXISTS_TAC` &1 `;\r
523 EXISTS_TAC ` &0 `;\r
524 REWRITE_TAC[REAL_ADD_RID; VECTOR_MUL_LZERO; VECTOR_MUL_LID; VECTOR_ADD_RID]]);;\r
525 \r
526 \r
527 \r
528 \r
529 \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
532 \r
533 \r
534 \r
535 \r
536 \r
537 \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
545 STRIP_TAC;\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
549 STRIP_TAC;\r
550 FIRST_ASSUM NHANH;\r
551 STRIP_TAC;\r
552 DOWN;\r
553 UNDISCH_TAC ` local_fan (V,E,FF) `;\r
554 PHA;\r
555 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;\r
556 REWRITE_TAC[ GSYM CROSS_EQ_0];\r
557 ASM_SIMP_TAC[];\r
558 EXPAND_TAC "U";\r
559 REWRITE_TAC[ARITH_RULE` a <= b <=> a < b + 1 `];\r
560 REWRITE_TAC[FINTE_OF_N_FIRST_ELMS2];\r
561 STRIP_TAC;\r
562 ASM_CASES_TAC ` l = 0 `;\r
563 ASM_REWRITE_TAC[ARITH_RULE ` x < 0 + 1 <=> x = 0`; IN_ELIM_THM];\r
564 CONJ_TAC;\r
565 REPEAT STRIP_TAC;\r
566 ASM_REWRITE_TAC[VECTOR_SUB_REFL; DOT_LZERO];\r
567 REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_ELIM_THM];\r
568 STRIP_TAC;\r
569 STRIP_TAC;\r
570 DOWN;\r
571 ASM_REWRITE_TAC[ITER; AFFINE_HULL_2; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];\r
572 STRIP_TAC;\r
573 SUBGOAL_THEN ` v dot (e:real^3) = &0` ASSUME_TAC;\r
574 EXPAND_TAC "e";\r
575 REWRITE_TAC[DOT_CROSS_SELF];\r
576 DOWN;\r
577 ASM_REWRITE_TAC[DOT_LMUL; REAL_ENTIRE; DOT_EQ_0];\r
578 STRIP_TAC;\r
579 FIRST_X_ASSUM SUBST_ALL_TAC;\r
580 DOWN;\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
585 MESON_TAC[];\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
590 EXPAND_TAC "U";\r
591 REWRITE_TAC[IN_ELIM_THM];\r
592 CONJ_TAC;\r
593 EXISTS_TAC ` 0`;\r
594 DOWN;\r
595 REWRITE_TAC[ITER];\r
596 ARITH_TAC;\r
597 EXISTS_TAC ` 1 `;\r
598 DOWN;\r
599 REWRITE_TAC[ITER1];\r
600 ARITH_TAC;\r
601 DOWN;\r
602 UNDISCH_TAC ` plane (P:real^3 -> bool) `;\r
603 PHA;\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
608 FIRST_ASSUM NHANH;\r
609 ASM_REWRITE_TAC[ARITH_RULE` a < b + 1 <=> a <= b `];\r
610 REPEAT STRIP_TAC;\r
611 SUBGOAL_THEN ` ! u. u IN U ==> (u:real^3) dot --e = &0 ` ASSUME_TAC;\r
612 REPEAT STRIP_TAC;\r
613 SUBGOAL_THEN ` {vec 0, v, rho_node1 FF v, u:real^3} SUBSET P` MP_TAC;\r
614 DOWN_TAC;\r
615 SIMP_TAC[INSERT_SUBSET];\r
616 STRIP_TAC;\r
617 DOWN;\r
618 UNDISCH_TAC ` U SUBSET (P:real^3 -> bool) `;\r
619 SET_TAC[];\r
620 UNDISCH_TAC `plane (P:real^3 -> bool) `;\r
621 REWRITE_TAC[plane];\r
622 STRIP_TAC;\r
623 ASM_REWRITE_TAC[];\r
624 STRIP_TAC;\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
629 SIMP_TAC[DOT_SYM];\r
630 REAL_ARITH_TAC;\r
631 ASM_SIMP_TAC[DOT_LSUB; VECTOR_SUB_LZERO];\r
632 REAL_ARITH_TAC;\r
633 REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER];\r
634 REPEAT STRIP_TAC;\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
639 SET_TAC[];\r
640 ASM_REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];\r
641 SUBGOAL_THEN ` U SUBSET (V:real^3 -> bool) ` MP_TAC;\r
642 EXPAND_TAC "U";\r
643 EXPAND_TAC "V";\r
644 REWRITE_TAC[GSYM POWER_TO_ITER; lemma_subset_orbit];\r
645 REWRITE_TAC[SUBSET];\r
646 STRIP_TAC;\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
651 MESON_TAC[]]);;\r
652 \r
653 \r
654 \r
655 \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
663 MESON_TAC[]);;\r
664 \r
665 \r
666 \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
673 \r
674 \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
682 \r
683 \r
684 \r
685 open Fan_misc;;\r
686 open Fan_defs;;\r
687 open Planarity;;\r
688 open Topology;;\r
689 \r
690 \r
691 \r
692 \r
693 let RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT = prove_by_refinement\r
694 (`local_fan (V,E,FF) /\\r
695  v IN V /\\r
696  {ITER n (rho_node1 FF) v | n <= l} = U /\\r
697  plane P /\\r
698  vec 0 IN P /\\r
699  U SUBSET P /\\r
700  v cross rho_node1 FF v = e\r
701  ==> (!i. i < l\r
702           ==> &0 <\r
703               (ITER i (rho_node1 FF) v cross ITER (i + 1) (rho_node1 FF) v) dot\r
704               e)`,\r
705 [STRIP_TAC;\r
706 INDUCT_TAC;\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
715 STRIP_TAC;\r
716 MP_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;\r
717 \r
718 \r
719 \r
720 \r
721 \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
724 STRIP_TAC;\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
731 EXPAND_TAC "U";\r
732 REWRITE_TAC[IN_ELIM_THM];\r
733 EXPAND_TAC "px";\r
734 EXPAND_TAC "py";\r
735 EXPAND_TAC "pz";\r
736 \r
737 MP_TAC2 (ARITH_RULE` SUC i < l ==> SUC i + 1 <= l /\ i <= l /\ i + 1 <= l`);\r
738 MESON_TAC[];\r
739 \r
740 STRIP_TAC;\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
743 DOWN;\r
744 PHA;\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
748 EXPAND_TAC "px";\r
749 EXPAND_TAC "py";\r
750 EXPAND_TAC "pz";\r
751 REWRITE_TAC[GSYM ITER; ADD1];\r
752 STRIP_TAC;\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
755 \r
756 ASM_SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET];\r
757 STRIP_TAC;\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
760 ASM_REWRITE_TAC[];\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
763 PHA;\r
764 ASM_SIMP_TAC[];\r
765 \r
766 REWRITE_TAC[AFFINE_HULL_3];\r
767 STRIP_TAC;\r
768 UNDISCH_TAC ` {px, py, pz} SUBSET (P:real^3 -> bool) `;\r
769 REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];\r
770 STRIP_TAC;\r
771 DOWN;\r
772 EXPAND_TAC "P";\r
773 REWRITE_TAC[IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];\r
774 STRIP_TAC;\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
781 DOWN;\r
782 REWRITE_TAC[REAL_ARITH` ~( a < &0 ) <=> &0 <= a `];\r
783 STRIP_TAC;\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
787 FIRST_ASSUM NHANH;\r
788 STRIP_TAC;\r
789 SUBGOAL_THEN ` px:real^3 IN V ` MP_TAC;\r
790 EXPAND_TAC "V";\r
791 EXPAND_TAC "px";\r
792 REWRITE_TAC[lemma_in_orbit; GSYM POWER_TO_ITER];\r
793 MP_TAC2 LOCAL_FAN_IMP_NOT_SEMI_IDE;\r
794 DISCH_THEN NHANH;\r
795 SWITCH_TAC ` pz = v' % px + w % (py:real^3) `;\r
796 ASM_REWRITE_TAC[];\r
797 STRIP_TAC;\r
798 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;\r
799 REWRITE_TAC[FAN; fan7];\r
800 STRIP_TAC;\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
804 STRIP_TAC;\r
805 DISJ2_TAC;\r
806 REWRITE_TAC[IN_ELIM_THM; EXTENSION; IN_INSERT; NOT_IN_EMPTY];\r
807 \r
808 EXISTS_TAC ` pz:real^3 `;\r
809 ASM_REWRITE_TAC[];\r
810 UNDISCH_TAC ` ITER (SUC i + 1) (rho_node1 FF) v:real^3 = pz:real^3`;\r
811 STRIP_TAC;\r
812 EXPAND_TAC "pz";\r
813 EXPAND_TAC "V";\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
819 EXPAND_TAC "py";\r
820 EXPAND_TAC "V";\r
821 EXPAND_TAC "px";\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
829 EXPAND_TAC "V";\r
830 EXPAND_TAC "py";\r
831 EXPAND_TAC "px";\r
832 REWRITE_TAC[GSYM ITER];\r
833 REWRITE_TAC[GSYM POWER_TO_ITER; lemma_in_orbit];\r
834 STRIP_TAC;\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
838 ASM_MESON_TAC[];\r
839 \r
840 \r
841 \r
842 REWRITE_TAC[AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];\r
843 STRIP_TAC;\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
846 CONJ_TAC;\r
847 REWRITE_TAC[IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];\r
848 EXPAND_TAC "pz";\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
855 DOWN;\r
856 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];\r
857 DOWN;\r
858 MESON_TAC[];\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
866 FIRST_ASSUM NHANH;\r
867 ASM_REWRITE_TAC[];\r
868 SIMP_TAC[];\r
869 \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
876 FIRST_ASSUM NHANH;\r
877 \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
881 \r
882 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;\r
883 REWRITE_TAC[FAN; fan7];\r
884 STRIP_TAC;\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
887 DISJ2_TAC;\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
891 ASM_REWRITE_TAC[];\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
896 DOWN_TAC;\r
897 NHANH Collect_geom.NOT_COL3_IMP_DIFF;\r
898 SIMP_TAC[DE_MORGAN_THM];\r
899 \r
900 STRIP_TAC;\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
903 CONJ_TAC;\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
907 PHA;\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
913 DISCH_TAC;\r
914 DISCH_THEN SUBST_ALL_TAC;\r
915 DOWN;\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
918 \r
919 \r
920 \r
921 \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
925 \r
926 \r
927 \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
938 \r
939 \r
940 \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
945 [STRIP_TAC;\r
946 MP_TAC2 (SPEC_ALL Planarity.JBDNJJB);\r
947 STRIP_TAC;\r
948 SUBGOAL_THEN` &0 < sin (azim (vec 0) u v w) ` ASSUME_TAC;\r
949 ASM_REWRITE_TAC[];\r
950 MATCH_MP_TAC REAL_LT_MUL;\r
951 ASM_REWRITE_TAC[];\r
952 MP_TAC (SPECL [`vec 0:real^3 `;` u:real^3`;` v:real^3 `;` w:real^3 `]\r
953  AZIM_RANGE);\r
954 ASM_CASES_TAC ` azim (vec 0) u v w <= pi `;\r
955 MP_TAC PI_POS;\r
956 REWRITE_TAC[REAL_ARITH` &0 < x <=> -- x < &0 `];\r
957 PHA;\r
958 NGOAC;\r
959 NHANH (REAL_ARITH` a < b /\ b <= c ==> a < c `);\r
960 STRIP_TAC;\r
961 MP_TAC2 (SPEC ` azim (vec 0) u v w ` Trigonometry1.SIN_NEGPOS_PI);\r
962 STRIP_TAC;\r
963 FIRST_X_ASSUM SUBST_ALL_TAC;\r
964 ASM_REWRITE_TAC[REAL_ARITH` -- x < &0 <=> &0 < x `];\r
965 STRIP_TAC;\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
969 PHA;\r
970 REWRITE_TAC[REAL_ARITH` ~( a < b /\ b < a ) `]]);;\r
971 \r
972 \r
973 \r
974 \r
975 \r
976 \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
980 \r
981 \r
982 \r
983 \r
984 \r
985 \r
986 \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
989          ~(x = v)\r
990          ==> aff_ge {x} {v} =\r
991              {y | ?t1 t2. &0 <= t2 /\ t1 + t2 = &1 /\ y = t1 % x + t2 % v} `;;\r
992 \r
993 \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
998 \r
999 \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
1003 STRIP_TAC;\r
1004 ASM_CASES_TAC ` v = a \/ v = (b:real^N) `;\r
1005 FIRST_ASSUM ACCEPT_TAC;\r
1006 DOWN;\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
1010 DISJ2_TAC;\r
1011 EXISTS_TAC `v:real^N`;\r
1012 ASM_REWRITE_TAC[];\r
1013 STRIP_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
1017 ASM_MESON_TAC[];\r
1018 DOWN;\r
1019 ONCE_REWRITE_TAC[EQ_SYM_EQ];\r
1020 NHANH X_IN_AFF_GE11;\r
1021 STRIP_TAC;\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
1025 \r
1026 \r
1027 \r
1028 \r
1029 \r
1030 \r
1031 \r
1032 \r
1033 let AFF_GE22 = \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
1037 \r
1038 let RHO_NODE_IS_SUCCESEOR_AZIM = prove_by_refinement\r
1039 (`local_fan (V,E,FF) /\\r
1040  v IN V /\\r
1041  {ITER n (rho_node1 FF) v | n <= l} = U /\\r
1042  plane P /\\r
1043  vec 0 IN P /\\r
1044  U SUBSET P /\\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
1050 REPEAT STRIP_TAC;\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
1063 STRIP_TAC;\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
1067 PHA;\r
1068 NHANH (SIMP_RULE[INSERT_COMM] MIXED_PROD_POS_IMP_RANGE_AZIM);\r
1069 ASM_REWRITE_TAC[];\r
1070 STRIP_TAC;\r
1071 ABBREV_TAC ` sx = ITER (n + 1 ) (rho_node1 FF) v:real^3 `;\r
1072 EXPAND_TAC "x";\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
1081 EXPAND_TAC "x";\r
1082 ASM_REWRITE_TAC[];\r
1083 \r
1084 MP_TAC2 LOCAL_FAN_RHO_NODE_PROS2;\r
1085 STRIP_TAC;\r
1086 FIRST_ASSUM NHANH;\r
1087 EXPAND_TAC "x";\r
1088 REWRITE_TAC[GSYM ITER; ADD1];\r
1089 ASM_SIMP_TAC[];\r
1090 \r
1091 SUBGOAL_THEN ` y:real^3 IN V ` ASSUME_TAC;\r
1092 UNDISCH_TAC ` y IN U:real^3 -> bool ` ;\r
1093 EXPAND_TAC "U";\r
1094 REWRITE_TAC[IN_ELIM_THM];\r
1095 STRIP_TAC;\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
1102 \r
1103 ASM_REWRITE_TAC[];\r
1104 UNDISCH_TAC ` ~(y:real^3 = rho_node1 FF (x:real^3)) `;\r
1105 EXPAND_TAC "x";\r
1106 REWRITE_TAC[ADD1; GSYM ITER];\r
1107 ASM_SIMP_TAC[];\r
1108 SUBGOAL_THEN ` rho_node1 (FF:real^3 # real^3 -> bool) x = sx ` ASSUME_TAC;\r
1109 EXPAND_TAC "x";\r
1110 REWRITE_TAC[ADD1; GSYM ITER];\r
1111 FIRST_ASSUM ACCEPT_TAC;\r
1112 \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
1117 \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
1122 STRIP_TAC;\r
1123 FIRST_ASSUM (MP_TAC o (SPEC ` y: real^3 `));\r
1124 REWRITE_TAC[VECTOR_SUB_RZERO];\r
1125 STRIP_TAC;\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
1130 NHANH th3; \r
1131 SIMP_TAC[Fan.AFF_GE_1_2];\r
1132 STRIP_TAC;\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
1137 STRIP_TAC;\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
1147 NHANH th3;\r
1148 SIMP_TAC[EQ_SYM_EQ];\r
1149 \r
1150 \r
1151 SIMP_TAC[AFF_GE22; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];\r
1152 STRIP_TAC;\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
1157 \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
1162 EXPAND_TAC "U";\r
1163 EXPAND_TAC "sx";\r
1164 EXPAND_TAC "x";\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
1172 DOWN;\r
1173 EXPAND_TAC "P";\r
1174 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];\r
1175 \r
1176 REPEAT STRIP_TAC;\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
1181 ANTS_TAC;\r
1182 DOWN THEN REMOVE_TAC;\r
1183 UNDISCH_TAC ` y = t1 % e + t2 % x + t3 % (sx:real^3) `;\r
1184 REMOVE_TAC;\r
1185 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];\r
1186 DOWN;\r
1187 FIRST_ASSUM NHANH;\r
1188 SIMP_TAC[];\r
1189 STRIP_TAC;\r
1190 STRIP_TAC;\r
1191 UNDISCH_TAC ` &0 = t1 `;\r
1192 DISCH_THEN (SUBST1_TAC o SYM);\r
1193 VECTOR_ARITH_TAC;\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
1201  AZIM_RANGE);\r
1202 REAL_ARITH_TAC]);;\r
1203 \r
1204 \r
1205 \r
1206 \r
1207 \r
1208 let FIRST_AZIM_CYCLE_EQ_RHO_NODE = prove_by_refinement\r
1209 (`local_fan (V,E,FF) /\\r
1210      v IN V /\\r
1211      {ITER n (rho_node1 FF) v | n <= l} = U /\\r
1212      plane P /\\r
1213      vec 0 IN P /\\r
1214      U SUBSET P /\\r
1215      v cross rho_node1 FF v = e\r
1216      ==> (!x n.\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
1221 REPEAT STRIP_TAC;\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
1228 SIMP_TAC[];\r
1229 STRIP_TAC;\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
1232 EXPAND_TAC "U";\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
1237 PHA;\r
1238 SIMP_TAC[IN];\r
1239 REPEAT STRIP_TAC;\r
1240 DOWN THEN DOWN;\r
1241 UNDISCH_TAC ` ~(rho_node1 FF x = (x:real^3)) `;\r
1242 SET_TAC[];\r
1243 \r
1244 ASSUME_TAC2 RHO_NODE_SET_IN_A_PLANE_IMP_POS_DIRECT;\r
1245 UNDISCH_TAC ` n < l:num `;\r
1246 PHA;\r
1247 FIRST_X_ASSUM NHANH;\r
1248 NHANH REAL_LT_IMP_NE;\r
1249 DOWN;\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
1254 \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
1261 DISJ2_TAC;\r
1262 FIRST_X_ASSUM SUBST1_TAC;\r
1263 REWRITE_TAC[REAL_LE_REFL];\r
1264 DISJ1_TAC;\r
1265 REPLICATE_TAC 4 DOWN THEN PHA;\r
1266 REWRITE_TAC[IN];\r
1267 MESON_TAC[]]);;\r
1268 \r
1269 \r
1270 \r
1271 \r
1272 \r
1273 \r
1274 let SEQUENCE_OF_RHO_NODE_IS_SUC = prove_by_refinement\r
1275 (`local_fan (V,E,FF) /\\r
1276        v IN V /\\r
1277        {ITER n (rho_node1 FF) v | n <= l} = U /\\r
1278        plane P /\\r
1279        vec 0 IN P /\\r
1280        U SUBSET P /\\r
1281        v cross rho_node1 FF v = e\r
1282        ==> (!x n.\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
1289 STRIP_TAC;\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
1294 DOWN;\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
1299 EXPAND_TAC "U";\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
1303 PHA;\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
1307 STRIP_TAC;\r
1308 ASM_CASES_TAC ` azim (vec 0) e x (rho_node1 FF x) = &0 `;\r
1309 DOWN;\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
1313 STRIP_TAC;\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
1317 DOWN;\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
1322 DOWN;\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
1327 STRIP_TAC;\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
1330 EXPAND_TAC "U";\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
1335 STRIP_TAC;\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
1341 SIMP_TAC[];\r
1342 STRIP_TAC;\r
1343 UNDISCH_TAC ` ~collinear {vec 0, (e:real^3), rho_node1  (FF:real^3 # real^3 -> bool) x}`;\r
1344 NHANH th3a;\r
1345 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];\r
1346 REPEAT STRIP_TAC;\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
1354 SIMP_TAC[];\r
1355 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;\r
1356 SUBGOAL_THEN ` x IN (V:real^3 -> bool) ` ASSUME_TAC;\r
1357 ASM_SIMP_TAC[];\r
1358 MP_TAC2 LOCAL_FAN_ITER_RHO_NODE_IN_V;\r
1359 DOWN;\r
1360 FIRST_X_ASSUM NHANH;\r
1361 STRIP_TAC;\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
1365 STRIP_TAC;\r
1366 MP_TAC2 (SET_RULE` y IN U /\ U SUBSET (P:real^3 -> bool) ==> y IN P`);\r
1367 EXPAND_TAC "P";\r
1368 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];\r
1369 STRIP_TAC;\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
1379 STRIP_TAC;\r
1380 FIRST_X_ASSUM (MP_TAC o (SPEC ` y:real^3 `));\r
1381 STRIP_TAC;\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
1385 STRIP_TAC;\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
1390 STRIP_TAC;\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
1396 REPEAT STRIP_TAC;\r
1397 FIRST_X_ASSUM (MP_TAC o (SPECL [`{y:real^3}`;` {rho_node1  (FF:real^3 # real^3 -> bool) x }`]));\r
1398 ANTS_TAC;\r
1399 ASSUME_TAC2 LOCAL_FAN_ITER_RHO_NODE_IN_V;\r
1400 REWRITE_TAC[IN_UNION; IN_ELIM_THM];\r
1401 CONJ_TAC;\r
1402 DISJ2_TAC;\r
1403 EXISTS_TAC `y:real^3 `;\r
1404 UNDISCH_TAC ` y IN U:real^3 -> bool`;\r
1405 EXPAND_TAC "U";\r
1406 REWRITE_TAC[IN_ELIM_THM];\r
1407 STRIP_TAC;\r
1408 REPLICATE_TAC 3 DOWN THEN PHA;\r
1409 SIMP_TAC[];\r
1410 DISJ2_TAC;\r
1411 EXISTS_TAC ` rho_node1 (FF:real^3 # real^3 -> bool) x `;\r
1412 EXPAND_TAC "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
1419 DISCH_THEN NHANH;\r
1420 NHANH th3b;\r
1421 SIMP_TAC[EQ_SYM_EQ];\r
1422 STRIP_TAC;\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
1429 PHA;\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
1432 STRIP_TAC;\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
1436 SIMP_TAC[];\r
1437 REMOVE_TAC;\r
1438 UNDISCH_TAC` &0 < t3`;\r
1439 REAL_ARITH_TAC;\r
1440 REMOVE_TAC;\r
1441 DISCH_THEN SUBST_ALL_TAC;\r
1442 DOWN THEN DOWN;\r
1443 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];\r
1444 MESON_TAC[];\r
1445 MP_TAC (MESON[AZIM_RANGE]` &0 <= azim (vec 0) e (rho_node1 FF (x:real^3)) y`);\r
1446 PHA;\r
1447 NHANH (REAL_ARITH` &0 <= a /\ a < b ==> ~( b = &0 ) `);\r
1448 STRIP_TAC;\r
1449 SWITCH_TAC ` x = ITER n (rho_node1 FF) (v:real^3) `;\r
1450 ASM_REWRITE_TAC[];\r
1451 DOWN_TAC;\r
1452 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {b,c,a}`];\r
1453 STRIP_TAC;\r
1454 UNDISCH_TAC ` ~collinear {vec 0, e, (y:real^3) }`;\r
1455 UNDISCH_TAC ` ~collinear {vec 0, e, x:real^3}`;\r
1456 PHA;\r
1457 NHANH AZIM_COMPL;\r
1458 ASM_REWRITE_TAC[];\r
1459 STRIP_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
1462 PHA;\r
1463 NHANH AZIM_COMPL;\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
1467 \r
1468 \r
1469 \r
1470 \r
1471 \r
1472 \r
1473 let V_AZIM_SMALLEST_ELMS = prove_by_refinement\r
1474 (`local_fan (V,E,FF) /\\r
1475  v IN V /\\r
1476  {ITER n (rho_node1 FF) v | n <= l} = U /\\r
1477  plane P /\\r
1478  vec 0 IN P /\\r
1479  U SUBSET P /\\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
1487 GEN_TAC;\r
1488 EXPAND_TAC "U";\r
1489 REWRITE_TAC[IN_ELIM_THM];\r
1490 STRIP_TAC;\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
1494 EXPAND_TAC "y";\r
1495 ASM_CASES_TAC ` n = 0 `;\r
1496 FIRST_X_ASSUM SUBST_ALL_TAC;\r
1497 DOWN;\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
1503 DOWN THEN DOWN;\r
1504 SPEC_TAC (`n:num`,` n:num`);\r
1505 INDUCT_TAC;\r
1506 REWRITE_TAC[];\r
1507 REPEAT STRIP_TAC;\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
1515 SIMP_TAC[ITER];\r
1516 ANTS_TAC;\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
1521 DOWN THEN DOWN;\r
1522 PHA;\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
1525 DISCH_THEN NHANH;\r
1526 SIMP_TAC[ITER1; ITER];\r
1527 EXPAND_TAC "ls";\r
1528 EXPAND_TAC "U";\r
1529 STRIP_TAC;\r
1530 REWRITE_TAC[IN_ELIM_THM];\r
1531 MESON_TAC[LE_REFL];\r
1532 UNDISCH_TAC ` ~(n' = 0)\r
1533       ==> ~(n' = l)\r
1534       ==> n' <= l\r
1535       ==> azim (vec 0) e ls v < azim (vec 0) e ls (ITER n' (rho_node1 FF) v)`;\r
1536 PHA;\r
1537 ANTS_TAC;\r
1538 REPLICATE_TAC 3 DOWN THEN PHA;\r
1539 ARITH_TAC;\r
1540 STRIP_TAC;\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
1546 ANTS_TAC;\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
1550 ANTS_TAC;\r
1551 UNDISCH_TAC ` SUC n' <= l `;\r
1552 UNDISCH_TAC ` ~( SUC n' = l ) `;\r
1553 PHA;\r
1554 REWRITE_TAC[ARITH_RULE` ~(SUC n' = l) /\ SUC n' <= l <=> n' < l /\ SUC n' < l`];\r
1555 FIRST_ASSUM NHANH;\r
1556 SIMP_TAC[ITER];\r
1557 STRIP_TAC;\r
1558 EXPAND_TAC "ls";\r
1559 EXPAND_TAC "U";\r
1560 REWRITE_TAC[IN_ELIM_THM];\r
1561 MESON_TAC[LE_REFL];\r
1562 DOWN THEN PHA;\r
1563 REWRITE_TAC[ITER];\r
1564 REAL_ARITH_TAC]);;\r
1565 \r
1566 \r
1567 \r
1568 \r
1569 \r
1570 let AZIM_LAST_POINT_IN_RHO_SET = prove_by_refinement\r
1571 (`local_fan (V,E,FF) /\\r
1572  v IN V /\\r
1573  {ITER n (rho_node1 FF) v | n <= l} = U /\\r
1574  plane P /\\r
1575  vec 0 IN P /\\r
1576  U SUBSET P /\\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
1582 STRIP_TAC;\r
1583 FIRST_X_ASSUM NHANH;\r
1584 STRIP_TAC;\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
1588 REMOVE_TAC;\r
1589 REWRITE_TAC[SET_RULE` {p n | n = 0 } = {p (0) }`; ITER];\r
1590 DISCH_THEN (SUBST1_TAC o SYM);\r
1591 EXPAND_TAC "ls";\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
1595 \r
1596 \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
1603 EXPAND_TAC "ls";\r
1604 EXPAND_TAC "U";\r
1605 REWRITE_TAC[IN_ELIM_THM];\r
1606 MESON_TAC[LE_REFL; LE_0; ITER];\r
1607 \r
1608 ASM_SIMP_TAC[ITER; LE_0];\r
1609 STRIP_TAC;\r
1610 CONJ_TAC;\r
1611 DOWN THEN DOWN THEN DOWN THEN PHA;\r
1612 SET_TAC[];\r
1613 CONJ_TAC;\r
1614 UNDISCH_TAC ` cyclic_set U (vec 0) (e:real^3) `;\r
1615 NHANH Wrgcvdr_cizmrrh.CYCLIC_SET_IMP_NOT_COLLINEAR;\r
1616 ASM_MESON_TAC[];\r
1617 CONJ_TAC;\r
1618 ONCE_REWRITE_TAC[GSYM IN];\r
1619 ASM_REWRITE_TAC[];\r
1620 REPEAT STRIP_TAC;\r
1621 ASM_CASES_TAC ` q = v:real^3 `;\r
1622 ASM_SIMP_TAC[REAL_LE_REFL];\r
1623 DISJ1_TAC;\r
1624 ASM_MESON_TAC[IN]]);;\r
1625 \r
1626 \r
1627 \r
1628 \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
1634 REWRITE_TAC[];\r
1635 FIRST_ASSUM NHANH;\r
1636 STRIP_TAC;\r
1637 SUBGOAL_THEN ` ITER l f (v:A) IN V ` ASSUME_TAC;\r
1638 EXPAND_TAC "V";\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
1642 DOWN;\r
1643 PHA;\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
1647 DOWN;\r
1648 UNDISCH_TAC ` l < k:num`;\r
1649 PHA;\r
1650 ONCE_REWRITE_TAC[ARITH_RULE` a < b <=> 0 < b - a `];\r
1651 NHANH Lvducxu.ITER_CYCLIC_ORBIT;\r
1652 SIMP_TAC[];\r
1653 ASM_MESON_TAC[\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
1656 \r
1657 \r
1658 \r
1659 \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
1664 \r
1665 \r
1666 \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
1670 \r
1671 \r
1672 \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
1683 ASM_SIMP_TAC[]);;\r
1684 \r
1685 \r
1686 \r
1687 \r
1688 let AZIM_LAST_POINT_IN_RHO_SET2 = prove(\r
1689 `    local_fan (V,E,FF) /\\r
1690        v IN V /\\r
1691        {ITER n (rho_node1 FF) v | n <= l} = U /\\r
1692        plane P /\\r
1693        vec 0 IN P /\\r
1694        U SUBSET P /\\r
1695        v cross rho_node1 FF v = e\r
1696        ==> ITER l (rho_node1 FF) v = ls /\\r
1697            l < CARD FF\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
1703 \r
1704 \r
1705 \r
1706 \r
1707 let KOMWBWC = prove_by_refinement(`!E V P l FF U e ls v.\r
1708  local_fan (V,E,FF) /\\r
1709        v IN V /\\r
1710        {ITER n (rho_node1 FF) v | n <= l} = U /\\r
1711  plane P /\\r
1712  vec 0 IN P /\\r
1713  U SUBSET P /\\r
1714  v cross rho_node1 FF v = e\r
1715  ==> cyclic_set U (vec 0) e /\\r
1716      (!i. i < l\r
1717           ==> &0 <\r
1718               (ITER i (rho_node1 FF) v cross ITER (i + 1) (rho_node1 FF) v) dot\r
1719               e) /\\r
1720      (!x n.\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
1724 l < CARD FF\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
1730 \r
1731 \r
1732 \r
1733 \r
1734 (* -------------------------------- *)\r
1735 (* ================================ *)\r
1736 (* -------------------------------- *)\r
1737 (*          lemma OZQVSFF           *)\r
1738 (* ================================ *)\r
1739 \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
1742 \r
1743 \r
1744 \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
1748 \r
1749 \r
1750 \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
1761 REAL_ARITH_TAC);;\r
1762 \r
1763 \r
1764 \r
1765 \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
1770 \r
1771 \r
1772 \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
1777 \r
1778 \r
1779 \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
1786 \r
1787 \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
1796 \r
1797 \r
1798 \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
1802 LET_TAC;\r
1803 REWRITE_TAC[dih2k; Lvducxu.HAS_ORD2_INTERPRET; Lvducxu.EDGE_MAP_RESO_INVERSE];\r
1804 LET_TAC;\r
1805 STRIP_TAC;\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
1816 STRIP_TAC;\r
1817 ASM_REWRITE_TAC[];\r
1818 STRIP_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
1827 STRIP_TAC;\r
1828 GEN_TAC THEN EQ_TAC;\r
1829 STRIP_TAC;\r
1830 DOWN THEN DOWN;\r
1831 FIRST_X_ASSUM NHANH;\r
1832 ASM_SIMP_TAC[];\r
1833 REPEAT STRIP_TAC;\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
1837 STRIP_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
1842 \r
1843 \r
1844 \r
1845 \r
1846 \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
1851 DOWN;\r
1852 REWRITE_TAC[SET_RULE` ~( x = {}) <=> ? a. a IN x `];\r
1853 REPEAT STRIP_TAC;\r
1854 UNDISCH_TAC` a:A IN V `;\r
1855 FIRST_ASSUM NHANH;\r
1856 STRIP_TAC;\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
1860 STRIP_TAC;\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
1865 STRIP_TAC;\r
1866 FIRST_X_ASSUM (MP_TAC o SYM);\r
1867 MP_TAC (ARITH_RULE` 0 < SUC n `);\r
1868 PHA;\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
1873 REPEAT STRIP_TAC;\r
1874 REWRITE_TAC[\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
1877 \r
1878 \r
1879 \r
1880 \r
1881 \r
1882 \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
1887 \r
1888 \r
1889 \r
1890 \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
1899 \r
1900 \r
1901 \r
1902 \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
1908 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
1911 DOWN;\r
1912 UNDISCH_TAC ` vv:real^3 IN V `;\r
1913 FIRST_ASSUM NHANH;\r
1914 ASSUME_TAC2 (\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
1918 REPEAT STRIP_TAC;\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
1922 PHA;\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
1925 DISCH_THEN NHANH;\r
1926 STRIP_TAC;\r
1927 DOWN;\r
1928 SIMP_TAC[PAIR_EQ; IN_INSERT];\r
1929 DOWN;\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
1936 STRIP_TAC;\r
1937 UNDISCH_TAC ` x IN V /\ v:real^3 IN V`;\r
1938 PHA;\r
1939 EXPAND_TAC "v";\r
1940 STRIP_TAC;\r
1941 DOWN;\r
1942 UNDISCH_TAC ` x:real^3 IN V `;\r
1943 UNDISCH_TAC ` vv:real^3 IN V `;\r
1944 PHA;\r
1945 FIRST_X_ASSUM NHANH;\r
1946 SIMP_TAC[IN_INSERT];\r
1947 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];\r
1948 STRIP_TAC;\r
1949 UNDISCH_TAC `v, rho_node1 FF v IN FF `;\r
1950 UNDISCH_TAC ` local_fan (V,E,FF) `;\r
1951 PHA;\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
1958 PHA;\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
1961 \r
1962 \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
1967 MESON_TAC[]);;\r
1968 \r
1969 \r
1970 \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
1975 \r
1976 \r
1977 \r
1978 \r
1979 \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
1983 \r
1984 \r
1985 \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
1995                    W u /\\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
2001 EXPAND_TAC "u";\r
2002 SUBGOAL_THEN ` ~(W SUBSET {p:real^3}) ` MP_TAC;\r
2003 ASM SET_TAC[];\r
2004 REWRITE_TAC[azim_cycle];\r
2005 SIMP_TAC[];\r
2006 DISCH_TAC;\r
2007 CONV_TAC SELECT_CONV;\r
2008 EXISTS_TAC `b:real^3 `;\r
2009 ASM_REWRITE_TAC[];\r
2010 EXPAND_TAC "W";\r
2011 CONJ_TAC;\r
2012 SET_TAC[];\r
2013 REWRITE_TAC[SET_RULE` ~(q = p) /\ {p, b} q <=> q = b /\ ~( q = p)`];\r
2014 SIMP_TAC[REAL_LE_REFL];\r
2015 ASM SET_TAC[]]);;\r
2016 \r
2017 \r
2018 \r
2019 \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
2025 \r
2026 \r
2027 \r
2028 \r
2029 \r
2030 \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
2041 STRIP_TAC;\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
2050 MP_TAC (\r
2051 SPECL [`v0:real^3`; ` v1:real^3 `;`w1:real^3 `;` x:real^3 `] AZIM_RANGE);\r
2052 MP_TAC (\r
2053 SPECL [`v0:real^3`; ` v1:real^3 `;`y:real^3 `;` w2:real^3 `] AZIM_RANGE);\r
2054 REAL_ARITH_TAC]);;\r
2055 \r
2056 \r
2057 \r
2058 \r
2059 \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
2063 plane P /\\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
2073 CONJ_TAC;\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
2080 DISCH_TAC;\r
2081 UNDISCH_TAC` v:real^3 IN V `;\r
2082 FIRST_ASSUM NHANH;\r
2083 STRIP_TAC;\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
2087 REPEAT DISCH_TAC;\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
2092 STRIP_TAC;\r
2093 FIRST_X_ASSUM SUBST1_TAC;\r
2094 CONJ_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
2101 REMOVE_TAC;\r
2102 DISCH_THEN NHANH;\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
2104 DISCH_TAC;\r
2105 FIRST_ASSUM NHANH;\r
2106 REWRITE_TAC[SUBSET];\r
2107 STRIP_TAC;\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
2116 SIMP_TAC[];\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
2120 PHA;\r
2121 NHANH EXISTS_INVERSE_OF_V;\r
2122 STRIP_TAC;\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
2126 LET_TAC;\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
2133 PHA;\r
2134 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;\r
2135 SIMP_TAC[INSERT_COMM];\r
2136 DOWN;\r
2137 UNDISCH_TAC ` azim (vec 0) v w u = pi `;\r
2138 PHA;\r
2139 DISCH_TAC;\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
2144 STRIP_TAC;\r
2145 UNDISCH_TAC ` vv:real^3 IN V `;\r
2146 FIRST_X_ASSUM NHANH;\r
2147 ASM_SIMP_TAC[];\r
2148 REPEAT STRIP_TAC;\r
2149 DOWN;\r
2150 FIRST_ASSUM NHANH;\r
2151 REWRITE_TAC[PAIR_EQ];\r
2152 UNDISCH_TAC `local_fan (V,E,FF) `;\r
2153 PHA;\r
2154 NGOAC;\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
2159 EXPAND_TAC "v";\r
2160 MESON_TAC[];\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
2163 EXPAND_TAC "d";\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
2167 CONJ_TAC;\r
2168 FIRST_X_ASSUM SUBST1_TAC;\r
2169 DOWN;\r
2170 ASM_REWRITE_TAC[];\r
2171 REAL_ARITH_TAC;\r
2172 FIRST_ASSUM SUBST1_TAC;\r
2173 STRIP_TAC;\r
2174 \r
2175 SUBGOAL_THEN ` ~collinear {v, rho_node1 FF v, vec 0} /\ ~collinear {d, v, vec 0} ` ASSUME_TAC;\r
2176 \r
2177 \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
2181 \r
2182 FIRST_X_ASSUM NHANH;\r
2183 ASM_SIMP_TAC[INSERT_COMM];\r
2184 \r
2185 \r
2186 \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
2191 \r
2192 \r
2193 \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
2201 STRIP_TAC;\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
2203 DOWN;\r
2204 ASM_SIMP_TAC[];\r
2205 DOWN;\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
2209 MATCH_MP_TAC (\r
2210 SET_RULE` A SUBSET S /\ B SUBSET S ==> a IN A /\ b IN B ==> a IN S /\ b IN S `);\r
2211 CONJ_TAC;\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
2224 \r
2225 \r
2226 \r
2227 (* ============================================= *)\r
2228 (* ============================================= *)\r
2229 (* ============================================= *)\r
2230 (* ============================================= *)\r
2231 (*              lemma KCHMAMG                    *)\r
2232 \r
2233 \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
2237 \r
2238 \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
2242 DISCH_TAC;\r
2243 EXISTS_TAC ` a / ( a + b ) `;\r
2244 EXISTS_TAC ` b / ( a + b ) `;\r
2245 CONJ_TAC;\r
2246 MATCH_MP_TAC REAL_LT_DIV;\r
2247 DOWN;\r
2248 REAL_ARITH_TAC;\r
2249 CONJ_TAC;\r
2250 MATCH_MP_TAC REAL_LT_DIV;\r
2251 DOWN;\r
2252 REAL_ARITH_TAC;\r
2253 CONJ_TAC;\r
2254 DOWN;\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
2258 \r
2259 \r
2260 (* lemma about intersection between conv0 {x,y} and\r
2261 aff {w,v} in affine hull {a,b,c} *)\r
2262 \r
2263 \r
2264 \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
2271 STRIP_TAC;\r
2272 DOWN;\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
2275 STRIP_TAC;\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
2281 CONJ_TAC;\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
2285 EXPAND_TAC "u'";\r
2286 REWRITE_TAC[REAL_ARITH` &1 - ( a + b) + a + b = &1 `];\r
2287 VECTOR_ARITH_TAC;\r
2288 EXISTS_TAC ` v' / ( v' + w') `;\r
2289 EXISTS_TAC ` w' / ( v' + w') `;\r
2290 CONJ_TAC;\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
2295 CONJ_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
2303 \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
2307 STRIP_TAC;\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
2313 CONJ_TAC;\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
2317 EXPAND_TAC "u'";\r
2318 REWRITE_TAC[REAL_ARITH` &1 - ( a + b) + a + b = &1 `];\r
2319 VECTOR_ARITH_TAC;\r
2320 EXISTS_TAC ` v' / ( v' + w') `;\r
2321 EXISTS_TAC ` w' / ( v' + w') `;\r
2322 CONJ_TAC;\r
2323 MATCH_MP_TAC REAL_LT_DIV_NEG;\r
2324 ASM_SIMP_TAC[REAL_ARITH` a < &0 /\ b < &0 ==> a + b < &0`];\r
2325 \r
2326 \r
2327 CONJ_TAC;\r
2328 MATCH_MP_TAC REAL_LT_DIV_NEG;\r
2329 ASM_SIMP_TAC[REAL_ARITH` a < &0 /\ b < &0 ==> a + b < &0`];\r
2330 \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
2334 \r
2335 \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
2338 \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
2340 REPEAT STRIP_TAC;\r
2341 FIRST_ASSUM (SUBST1_TAC o SYM);\r
2342 DOWN_TAC;\r
2343 \r
2344 ASM_CASES_TAC ` v' = &0 \/ w' = &0`;\r
2345 DOWN;\r
2346 SPEC_TAC (`v:real^N`,`v:real^N `);\r
2347 SPEC_TAC (`w:real^N`,`w:real^N `);\r
2348 \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
2355 \r
2356 CONJ_TAC;\r
2357 ONCE_REWRITE_TAC[TAUT` a ==> b ==> c <=> b ==> a ==> c `];\r
2358 REPEAT GEN_TAC;\r
2359 DISCH_TAC;\r
2360 ANTS_TAC;\r
2361 DOWN;\r
2362 SIMP_TAC[INSERT_COMM; REAL_ADD_SYM; CONJ_SYM; VECTOR_ADD_SYM];\r
2363 ONCE_REWRITE_TAC[EQ_SYM_EQ];\r
2364 SIMP_TAC[];\r
2365 SIMP_TAC[INSERT_COMM];\r
2366 \r
2367 REPEAT GEN_TAC;\r
2368 \r
2369 \r
2370 DISCH_THEN SUBST_ALL_TAC;\r
2371 STRIP_TAC;\r
2372 DOWN;\r
2373 EXPAND_TAC "u'";\r
2374 REWRITE_TAC[VECTOR_ARITH` z = (&1 - (&0 + w')) % x + &0 % v + w' % w <=>\r
2375 z - x = w' % ( w - x ) `];\r
2376 DOWN;\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
2382 \r
2383 \r
2384 \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
2391 REPEAT STRIP_TAC;\r
2392 EXISTS_TAC `u:real^N`;\r
2393 EXISTS_TAC `v:real^N `;\r
2394 \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
2397 \r
2398 CONJ_TAC;\r
2399 EXISTS_TAC ` &1 - t3 / (w' * (t2' - t2)) `;\r
2400 DOWN THEN DOWN;\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
2403 \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
2414 \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
2420 \r
2421 CONJ_TAC;\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
2426 ASSUME_TAC2 (\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
2431  &1 `);\r
2432 ASM_REWRITE_TAC[];\r
2433 \r
2434 MATCH_MP_TAC REAL_LT_DIV_NEG;\r
2435 UNDISCH_TAC ` &0 < t2 `;\r
2436 UNDISCH_TAC ` t2' < &0 `;\r
2437 REAL_ARITH_TAC;\r
2438 DOWN;\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
2442 STRIP_TAC;\r
2443 PHA;\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
2451 IMP_TAC;\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
2455 CONJ_TAC;\r
2456 ONCE_REWRITE_TAC[TAUT` a ==> b ==> c <=> b ==> a ==> c `];\r
2457 REPEAT GEN_TAC THEN STRIP_TAC;\r
2458 ANTS_TAC;\r
2459 DOWN_TAC;\r
2460 SIMP_TAC[INSERT_COMM; REAL_ADD_SYM; VECTOR_ADD_SYM];\r
2461 ONCE_REWRITE_TAC[EQ_SYM_EQ];\r
2462 SIMP_TAC[];\r
2463 SIMP_TAC[VECTOR_ADD_SYM; INSERT_COMM];\r
2464 REPEAT STRIP_TAC;\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
2469 \r
2470 \r
2471 EXPAND_TAC "x'";\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
2475 \r
2476 SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE];\r
2477 REPEAT STRIP_TAC;\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
2483  t22 % x -\r
2484  ww % w +\r
2485  w'' % w =\r
2486  z <=> z + ( t22 - u' - tt ) % x = vv % u + (w'' - ww) % w `];\r
2487 \r
2488 SUBGOAL_THEN ` &1 + ((v'' * t1) / t2 - u' - (v'' * t1') / t2) =\r
2489 (v'' * t2') / t2 + (w'' - (v'' * t3) / t2) ` ASSUME_TAC;\r
2490 ASM_SIMP_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
2496 EXPAND_TAC "u'";\r
2497 SIMP_TAC[REAL_ARITH` a + b = c <=> a = c - b `];\r
2498 REAL_ARITH_TAC;\r
2499 ABBREV_TAC ` tu = (v'' * t2') / t2 `;\r
2500 ABBREV_TAC ` tw = (w'' - (v'' * t3) / t2) `;\r
2501 STRIP_TAC;\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
2505 EXPAND_TAC "set";\r
2506 REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET; IN_INTER];\r
2507 SUBGOAL_THEN ` &0 < tu /\ &0 < tw ` ASSUME_TAC;\r
2508 CONJ_TAC;\r
2509 EXPAND_TAC "tu";\r
2510 MATCH_MP_TAC REAL_LT_DIV;\r
2511 ASM_REWRITE_TAC[REAL_MUL_POS_LT];\r
2512 EXPAND_TAC "tw";\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
2518 CONJ_TAC;\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
2526 DOWN;\r
2527 NHANH (REAL_ARITH` &0 < a /\ &0 < b ==> ~( a + b = &0) `);\r
2528 CONV_TAC REAL_FIELD;\r
2529 DOWN;\r
2530 REWRITE_TAC[IN_CONV0]]);;\r
2531 \r
2532 \r
2533 \r
2534 \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
2537 \r
2538 \r
2539 \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
2544 \r
2545 \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
2549 [STRIP_TAC;\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
2554 REWRITE_TAC[aff];\r
2555 STRIP_TAC;\r
2556 FIRST_X_ASSUM SUBST_ALL_TAC;\r
2557 DOWN;\r
2558 PHA;\r
2559 DOWN;\r
2560 REWRITE_TAC[INSERT_INSERT; AFFINE_HULL_SING; aff; INSERT_SUBSET; IN_INSERT;\r
2561 NOT_IN_EMPTY];\r
2562 SIMP_TAC[]]);;\r
2563 \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
2570 DISCH_TAC 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
2574 \r
2575 \r
2576 \r
2577 \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
2581 \r
2582 \r
2583 \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
2587 STRIP_TAC;\r
2588 ASM_CASES_TAC` a = x :real^N `;\r
2589 ASM_REWRITE_TAC[];\r
2590 DOWN;\r
2591 ASM_REWRITE_TAC[];\r
2592 DISCH_THEN (SUBST1_TAC o SYM);\r
2593 REWRITE_TAC[];\r
2594 MATCH_MP_TAC AFF2_DET_BY_TWO_POINTS;\r
2595 DOWN;\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
2598 \r
2599 \r
2600 \r
2601 \r
2602 \r
2603 \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
2611 \r
2612 \r
2613 \r
2614 \r
2615 let CONDS_FOR_INTER_AFF_CONV0 = prove_by_refinement\r
2616 (`&0 < t2 /\\r
2617  &0 < t3 /\\r
2618  t1 + t2 + t3 = ss /\\r
2619  t = t1 % x + t2 % v + t3 % (w:real^N) /\\r
2620  t1' + t2' = ss /\\r
2621  t = t1' % x + t2' % u\r
2622  ==> (?tt. tt IN aff {x, u} /\ tt IN conv0 {v, w})`,\r
2623 [STRIP_TAC;\r
2624 DOWN;\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
2627 STRIP_TAC;\r
2628 EXISTS_TAC` &1 / (t2 + t3 ) % ( (t1' - t1) % x + t2' % (u:real^N) )`;\r
2629 CONJ_TAC;\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
2635 DOWN;\r
2636 REMOVE_TAC;\r
2637 DOWN;\r
2638 DOWN THEN REMOVE_TAC;\r
2639 DOWN_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
2644 \r
2645 \r
2646 \r
2647 \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
2654 REPEAT STRIP_TAC;\r
2655 ABBREV_TAC ` ss = &1 `;\r
2656 MATCH_MP_TAC CONDS_FOR_INTER_AFF_CONV0;\r
2657 DOWN THEN DOWN;\r
2658 ASM_SIMP_TAC[]]);;\r
2659 \r
2660 \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
2664 STRIP_TAC;\r
2665 EXISTS_TAC ` a - b:real^N `;\r
2666 FIRST_X_ASSUM NHANH;\r
2667 REPEAT STRIP_TAC;\r
2668 EXISTS_TAC ` t - t':real `;\r
2669 ASM_REWRITE_TAC[];\r
2670 CONV_TAC VECTOR_ARITH]);;\r
2671 \r
2672 \r
2673 \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
2678 STRIP_TAC;\r
2679 SUBGOAL_THEN ` ? c. a - b:real^N = c % u ` ASSUME_TAC;\r
2680 ASM_SIMP_TAC[];\r
2681 \r
2682 REWRITE_TAC[SUBSET];\r
2683 GEN_TAC;\r
2684 UNDISCH_TAC ` b:real^N  IN S `;\r
2685 PHA;\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
2691 DOWN THEN DOWN;\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
2699 MESON_TAC[]]);;\r
2700 \r
2701 \r
2702 \r
2703 \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
2708 STRIP_TAC;\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
2713 DOWN;\r
2714 ONCE_REWRITE_TAC[INSERT_COMM];\r
2715 REWRITE_TAC[SUBSET; Planarity.POINT_IN_LINE];\r
2716 DISCH_TAC;\r
2717 CONJ_TAC;\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
2723 \r
2724 \r
2725 \r
2726 \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
2732 \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
2738 \r
2739 \r
2740 \r
2741 \r
2742 \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
2746 [STRIP_TAC;\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
2756 DOWN;\r
2757 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE];\r
2758 STRIP_TAC;\r
2759 MATCH_MP_TAC REAL_LE_DIV;\r
2760 UNDISCH_TAC ` &0 < t `;\r
2761 REAL_ARITH_TAC;\r
2762 DOWN THEN DOWN;\r
2763 NHANH PRESERABLE_AFF_GE_SUBSET;\r
2764 SET_TAC[]]);;\r
2765 \r
2766 \r
2767 \r
2768 \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
2775 STRIP_TAC;\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
2779 ASM_MESON_TAC[];\r
2780 DOWN THEN DOWN;\r
2781 SIMP_TAC[SET_RULE` ~(a = b) <=> {a} INTER {b} = {} `; AFF_GE_EQ_AFFINE_HULL];\r
2782 REWRITE_TAC[AFFINE_HULL_SING];\r
2783 NHANH AFF_GE_EQ;\r
2784 REPEAT STRIP_TAC;\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
2788 DOWN;\r
2789 ASM_SIMP_TAC[IN_INSERT; NOT_IN_EMPTY]]);;\r
2790 \r
2791 \r
2792 \r
2793 \r
2794 \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
2798 \r
2799 \r
2800 \r
2801 \r
2802 \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
2807 STRIP_TAC;\r
2808 STRIP_TAC;\r
2809 ASSUME_TAC2 (\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
2814 DOWN_TAC;\r
2815 SIMP_TAC[EQ_SYM_EQ; INSERT_SUBSET];\r
2816 DOWN;\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
2821 STRIP_TAC;\r
2822 ASM_CASES_TAC ` &0 < t' \/ &0 < t'' `;\r
2823 \r
2824 (* very smart way *)\r
2825 \r
2826 REPLICATE_TAC 5 DOWN;\r
2827 REMOVE_TAC;\r
2828 DOWN_TAC;\r
2829 DAO;\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
2834 MATCH_MP_TAC (\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
2836 CONJ_TAC;\r
2837 ONCE_REWRITE_TAC[EQ_SYM_EQ];\r
2838 SIMP_TAC[INSERT_COMM];\r
2839 \r
2840 REWRITE_TAC[Geomdetail.CARD3];\r
2841 REPEAT STRIP_TAC;\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
2844 \r
2845 MATCH_MP_TAC (\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
2848 DOWN_TAC;\r
2849 SIMP_TAC[INSERT_SUBSET; DE_MORGAN_THM];\r
2850 \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
2857 \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
2867 DOWN THEN DOWN;\r
2868 REWRITE_TAC[VECTOR_ARITH` u = t' % v + (&1 - t') % x <=> \r
2869 u - x = t'% ( v - x ) `];\r
2870 REPEAT STRIP_TAC;\r
2871 ASSUME_TAC2 (REAL_ARITH` t' < &0 ==> ~( t' = &0) `);\r
2872 SWITCH_TAC ` u - x = t' % (v - x:real^N)`;\r
2873 DOWN;\r
2874 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE];\r
2875 STRIP_TAC;\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
2879 DOWN_TAC;\r
2880 SIMP_TAC[INSERT_SUBSET; Geomdetail.CARD3; DE_MORGAN_THM; REAL_ARITH ` a * &1 / b = a / b `];\r
2881 STRIP_TAC;\r
2882 MATCH_MP_TAC REAL_LT_DIV_NEG;\r
2883 ASM_REWRITE_TAC[]]);;\r
2884 \r
2885 \r
2886 \r
2887 \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
2891 MATCH_MP_TAC (\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
2898 \r
2899 \r
2900 \r
2901 \r
2902 \r
2903 \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
2909 GEN_TAC;\r
2910 CONJ_TAC;\r
2911 MESON_TAC[REAL_ARITH` ~( &1 < &0 ) `];\r
2912 CONJ_TAC;\r
2913 MESON_TAC[REAL_ARITH` ~( &1 <= &0 ) `];\r
2914 GEN_TAC;\r
2915 EQ_TAC;\r
2916 STRIP_TAC;\r
2917 FIRST_X_ASSUM SUBST_ALL_TAC;\r
2918 DOWN_TAC;\r
2919 SIMP_TAC[VECTOR_MUL_LID];\r
2920 STRIP_TAC;\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
2925 \r
2926 \r
2927 \r
2928 \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
2933 DOWN;\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
2937 REPEAT STRIP_TAC;\r
2938 DOWN;\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
2941 \r
2942 \r
2943 \r
2944 \r
2945 let INTER_EQ_EM_EXPAND = SET_RULE` A INTER B = {} <=> ~( ?x. x IN A /\ x IN B )`;;\r
2946 \r
2947 \r
2948 \r
2949 \r
2950 \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
2960 ASM_SIMP_TAC[];\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
2963 ASM_SIMP_TAC[];\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
2973 \r
2974 \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
2981 \r
2982 \r
2983 \r
2984 \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
2990 \r
2991 \r
2992 \r
2993 \r
2994 \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
2998 \r
2999 \r
3000 let AFF_GT_AFF_LT_INTERPRET = prove_by_refinement\r
3001 ( `! x:real^N. DISJOINT {x} {v, w} /\ DISJOINT {x} {u}\r
3002          ==> ((?a b c.\r
3003                    a < &0 /\\r
3004                    &0 < b /\\r
3005                    &0 < c /\\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
3009 EQ_TAC;\r
3010 ASM_SIMP_TAC[Planarity.AFF_GT_1_2; AFF_LT_1_1; IN_INTER; IN_ELIM_THM];\r
3011 STRIP_TAC;\r
3012 EXISTS_TAC ` (x:real^N) + a % (u - x) `;\r
3013 CONJ_TAC;\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
3019 CONJ_TAC;\r
3020 REAL_ARITH_TAC;\r
3021 VECTOR_ARITH_TAC;\r
3022 EXISTS_TAC ` &1 - a `;\r
3023 EXISTS_TAC `a:real `;\r
3024 ASM_REWRITE_TAC[];\r
3025 CONJ_TAC;\r
3026 REAL_ARITH_TAC;\r
3027 FIRST_X_ASSUM (SUBST1_TAC o SYM);\r
3028 VECTOR_ARITH_TAC;\r
3029 ASM_SIMP_TAC[Planarity.AFF_GT_1_2; AFF_LT_1_1; IN_INTER; IN_ELIM_THM];\r
3030 STRIP_TAC;\r
3031 EXISTS_TAC ` t2':real `;\r
3032 EXISTS_TAC ` t2:real ` ;\r
3033 EXISTS_TAC ` t3:real `;\r
3034 ASM_REWRITE_TAC[];\r
3035 DOWN;\r
3036 DOWN;\r
3037 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `];\r
3038 REMOVE_TAC;\r
3039 DOWN;\r
3040 REMOVE_TAC;\r
3041 DOWN;\r
3042 DOWN;\r
3043 SIMP_TAC[REAL_ARITH` a + b = &1 <=> a = &1 - b `];\r
3044 REMOVE_TAC;\r
3045 REMOVE_TAC;\r
3046 VECTOR_ARITH_TAC]);;\r
3047 \r
3048 \r
3049 \r
3050 \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
3054 \r
3055 \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
3064 REPEAT STRIP_TAC;\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
3071 \r
3072 \r
3073 \r
3074 \r
3075 \r
3076 let EXISTS_INTERSECTION_PROPERPLY = prove_by_refinement\r
3077 (` (~(z:real^N = x) /\\r
3078        DISJOINT {x} {v, w} /\\r
3079        ~(x = u) /\\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
3083        ==> (?a b t.\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
3088 STRIP_TAC;\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
3097 STRIP_TAC;\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
3103 ASM_SIMP_TAC[];\r
3104 UNDISCH_TAC ` ~(aff_gt {x} {v, w} INTER aff_lt {x} {u:real^N} = {}) `;\r
3105 SET_TAC[];\r
3106 STRIP_TAC;\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
3113 STRIP_TAC;\r
3114 SUBGOAL_THEN ` w IN aff {x, u:real^N} ` MP_TAC;\r
3115 DOWN THEN DOWN;\r
3116 NHANH AFF2_ITR_CONV0_IMP_SAME_ENDS;\r
3117 SIMP_TAC[];\r
3118 STRIP_TAC;\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
3121 REWRITE_TAC[];\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
3126 DOWN_TAC;\r
3127 DAO;\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
3133 CONJ_TAC;\r
3134 SIMP_TAC[INSERT_COMM; DISJ_SYM];\r
3135 REPEAT STRIP_TAC;\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
3139 CONJ_TAC;\r
3140 STRIP_TAC;\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
3152 SET_TAC[];\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
3155 CONJ_TAC;\r
3156 DOWN THEN DOWN THEN DOWN;\r
3157 SET_TAC[];\r
3158 REWRITE_TAC[GSYM EXISTS_IN];\r
3159 MATCH_MP_TAC (\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
3163 \r
3164 \r
3165 \r
3166 \r
3167 \r
3168 \r
3169 let LOFA_V_SUBSET_AFF_HULL = prove_by_refinement\r
3170 (`!w v.\r
3171      v,w IN FF /\\r
3172      convex_local_fan (V,E,FF) /\\r
3173      u IN V /\\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
3180 SIMP_TAC[];\r
3181 NHANH LOCAL_FAN_ORBIT_MAP_V;\r
3182 PHA;\r
3183 ONCE_REWRITE_TAC[TAUT` a /\b/\c/\d <=> (a/\c)/\b/\d`];\r
3184 NHANH LOCAL_FAN_IMP_IN_V;\r
3185 REPEAT STRIP_TAC;\r
3186 UNDISCH_TAC ` v:real^3 IN V`;\r
3187 FIRST_ASSUM NHANH;\r
3188 STRIP_TAC;\r
3189 FIRST_X_ASSUM (SUBST1_TAC o SYM);\r
3190 REWRITE_TAC[orbit_map; SUBSET; IN_ELIM_THM; ARITH_RULE` a >= 0`];\r
3191 REPEAT STRIP_TAC;\r
3192 ASM_REWRITE_TAC[];\r
3193 SPEC_TAC (`n:num`,`n:num`);\r
3194 INDUCT_TAC;\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
3198 ANTS_TAC;\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
3205 STRIP_TAC;\r
3206 EXPAND_TAC "V";\r
3207 REWRITE_TAC[orbit_map; IN_ELIM_THM; ARITH_RULE` a >= 0`];\r
3208 MESON_TAC[];\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
3212 STRIP_TAC;\r
3213 SUBGOAL_THEN ` ~(b IN aff {vec 0, (rho_node1 FF POWER n') v})` MP_TAC;\r
3214 DOWN;\r
3215 DOWN;\r
3216 NHANH AFF2_ITR_CONV0_IMP_SAME_ENDS;\r
3217 SIMP_TAC[];\r
3218 DOWN THEN PHA;\r
3219 REWRITE_TAC[SET_RULE` ~( x IN S ) /\ ~(y IN S ) <=> {x,y} INTER S = {} `];\r
3220 STRIP_TAC;\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
3242 SET_TAC[];\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
3245 DOWN;\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
3253 DISCH_THEN NHANH;\r
3254 SIMP_TAC[];\r
3255 STRIP_TAC;\r
3256 CONJ_TAC;\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
3264 SET_TAC[];\r
3265 DOWN;\r
3266 SIMP_TAC[COM_POWER; o_THM]]);;\r
3267 \r
3268 \r
3269 \r
3270 \r
3271 \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
3276 \r
3277 \r
3278 \r
3279 \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
3285 [REPEAT GEN_TAC;\r
3286 STRIP_TAC;\r
3287 EQ_TAC;\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
3292 MESON_TAC[];\r
3293 STRIP_TAC;\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
3302 ARITH_TAC]);;\r
3303 \r
3304 \r
3305 \r
3306 \r
3307 \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
3311 [STRIP_TAC;\r
3312 INDUCT_TAC;\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
3316 STRIP_TAC;\r
3317 MP_TAC (ARITH_RULE` 0 < SUC l `);\r
3318 ASM_SIMP_TAC[ CARD_RECUSIVE_EQ; ARITH_RULE` SUC l - 1 = l `];\r
3319 REPEAT STRIP_TAC;\r
3320 DOWN THEN PHA;\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
3325 ARITH_TAC]);;\r
3326 \r
3327 \r
3328 let LEMMA_SUBSET_ORBIT_MAP = REWRITE_RULE[POWER_TO_ITER] Hypermap.lemma_subset_orbit;;\r
3329 \r
3330 \r
3331 \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
3337 \r
3338 \r
3339 \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
3347 ARITH_TAC;\r
3348 SUBGOAL_THEN ` {ITER n f v:A | n < CARD V} SUBSET V ` ASSUME_TAC;\r
3349 DOWN;\r
3350 FIRST_X_ASSUM NHANH;\r
3351 STRIP_TAC;\r
3352 ABBREV_TAC ` nn = CARD (V:A -> bool) `;\r
3353 EXPAND_TAC "V";\r
3354 REWRITE_TAC[ARITH_RULE ` a < b ==> a <= b - 1 `; LEMMA_SUBSET_ORBIT_MAP_LT];\r
3355 DOWN_TAC;\r
3356 SIMP_TAC[EQ_SYM_EQ];\r
3357 NHANH SELF_CYCLIC_IMP_FINITE;\r
3358 ONCE_REWRITE_TAC[EQ_SYM_EQ];\r
3359 STRIP_TAC;\r
3360 ASM_SIMP_TAC[GSYM SUBSET_CARD_EQ]]);;\r
3361 \r
3362 \r
3363 \r
3364 \r
3365 let lemma_in_orbit_iter = REWRITE_RULE[POWER_TO_ITER] Hypermap.lemma_in_orbit;;\r
3366 \r
3367 \r
3368 \r
3369 \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
3372 \r
3373 \r
3374 (* ==================================== *)\r
3375 \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
3379      (?A. plane A /\\r
3380           vec 0 IN A /\\r
3381           V SUBSET A /\\r
3382           (?e. (!x. x IN A ==> e dot x = &0) /\\r
3383                cyclic_set V (vec 0) e /\\r
3384                (!v. v IN V\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
3392 STRIP_TAC;\r
3393 DOWN_TAC;\r
3394 NGOAC;\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
3398 PHA;\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
3402 MATCH_MP_TAC (\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
3405 CONJ_TAC;\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
3409 CONJ_TAC;\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
3414 PHA;\r
3415 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;\r
3416 STRIP_TAC;\r
3417 CONJ_TAC;\r
3418 EXISTS_TAC ` vec 0:real^3 `;\r
3419 EXISTS_TAC ` v:real^3 `;\r
3420 EXISTS_TAC ` w:real^3 `;\r
3421 DOWN;\r
3422 SIMP_TAC[];\r
3423 \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
3432 STRIP_TAC;\r
3433 ASSUME_TAC2 LOFA_IN_V_SO_DO_RHO_NODE_V;\r
3434 DOWN THEN DOWN;\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
3437 STRIP_TAC;\r
3438 PHA;\r
3439 FIRST_ASSUM (NHANH_PAT`\x. x ==> y ` );\r
3440 STRIP_TAC;\r
3441 ASSUME_TAC2 DETER_RHO_NODE;\r
3442 CONJ_TAC;\r
3443 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM];\r
3444 REPEAT STRIP_TAC;\r
3445 ASM_REWRITE_TAC[];\r
3446 EXPAND_TAC "e";\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
3451 \r
3452 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_V;\r
3453 DOWN THEN NHANH LOOP_SET_DETER_FIRTS_ELMS;\r
3454 STRIP_TAC;\r
3455 UNDISCH_TAC` v:real^3 IN V `;\r
3456 FIRST_X_ASSUM (NHANH_PAT`\x. x ==> y`);\r
3457 \r
3458 FIRST_ASSUM (NHANH_PAT`\x. x ==> y`);\r
3459 STRIP_TAC;\r
3460 SUBGOAL_THEN` ITER (CARD (V:real^3 -> bool)) (rho_node1 FF) v IN V ` ASSUME_TAC;\r
3461 DOWN;\r
3462 EXPAND_TAC "V";\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
3469 STRIP_TAC;\r
3470 \r
3471 MP_TAC2 (\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
3477 CONJ_TAC;\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
3485 STRIP_TAC;\r
3486 \r
3487 \r
3488 \r
3489 \r
3490 GEN_TAC THEN STRIP_TAC;\r
3491 CONJ_TAC;\r
3492 DOWN;\r
3493 UNDISCH_TAC` {ITER n (rho_node1 FF) v | n < CARD V} = V`;\r
3494 STRIP_TAC;\r
3495 EXPAND_TAC "V";\r
3496 REWRITE_TAC[IN_ELIM_THM];\r
3497 ONCE_REWRITE_TAC[CONJ_SYM];\r
3498 STRIP_TAC;\r
3499 DOWN THEN DOWN THEN PHA;\r
3500 ASM_SIMP_TAC[];\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
3505 MESON_TAC[];\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
3510 STRIP_TAC;\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
3518           ==> &0 <\r
3519               (ITER i (rho_node1 FF) v cross ITER (i + 1) (rho_node1 FF) v) dot\r
3520               e `;\r
3521 DISCH_THEN NHANH;\r
3522 STRIP_TAC;\r
3523 DOWN;\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
3529 \r
3530 ASM_CASES_TAC ` pi <= azim (vec 0) e v' (rho_node1 FF v') `;\r
3531 STRIP_TAC;\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
3539 REAL_ARITH_TAC;\r
3540 UNDISCH_TAC ` &0 < sin a `;\r
3541 MESON_TAC[REAL_ARITH` &0 < a ==> ~(a <= &0 ) `];\r
3542 DOWN;\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
3548 \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
3552 ASM_SIMP_TAC[];\r
3553 DOWN;\r
3554 \r
3555 SIMP_TAC[AZIM_DIHV_SAME];\r
3556 \r
3557 REPEAT STRIP_TAC;\r
3558 REWRITE_TAC[Trigonometry2.DIHV_FORMULAR; VECTOR_SUB_RZERO];\r
3559 \r
3560 SUBGOAL_THEN` v' dot e = &0 /\ rho_node1 FF v' dot (e:real^3) = &0 ` MP_TAC;\r
3561 \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
3565 DOWN;\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
3568 DISCH_THEN NHANH;\r
3569 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM];\r
3570 STRIP_TAC THEN STRIP_TAC;\r
3571 ASM_REWRITE_TAC[];\r
3572 EXPAND_TAC "e";\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
3576 REAL_ARITH_TAC;\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
3581 REMOVE_TAC;\r
3582 DOWN;\r
3583 MESON_TAC[Trigonometry2.WHEN_A_B_POS_ARCV_STABLE];\r
3584 STRIP_TAC;\r
3585 \r
3586 REPEAT STRIP_TAC;\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
3598 ANTS_TAC;\r
3599 ASM_REWRITE_TAC[];\r
3600 MP_TAC2 (SET_RULE` v' :real^3 IN V /\ V SUBSET A ==> v' IN A`);\r
3601 SIMP_TAC[];\r
3602 DISCH_TAC;\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
3608 STRIP_TAC;\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
3612 SET_TAC[];\r
3613 \r
3614 \r
3615 \r
3616 STRIP_TAC;\r
3617 SUBGOAL_THEN ` ~(b IN aff {vec 0, v':real^3}) ` MP_TAC;\r
3618 DOWN THEN DOWN;\r
3619 NHANH AFF2_ITR_CONV0_IMP_SAME_ENDS;\r
3620 SIMP_TAC[];\r
3621 \r
3622 \r
3623 \r
3624 DOWN THEN PHA;\r
3625 REWRITE_TAC[SET_RULE` ~( a IN X) /\ ~( b IN X ) <=> {a,b} INTER X = {}`];\r
3626 STRIP_TAC;\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
3630 ANTS_TAC;\r
3631 SUBGOAL_THEN` {a,b} SUBSET (V:real^3 -> bool) ` MP_TAC;\r
3632 \r
3633 \r
3634 \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
3644 DISCH_THEN NHANH;\r
3645 ASM_SIMP_TAC[];\r
3646 DOWN THEN PHA THEN REMOVE_TAC;\r
3647 DOWN THEN SIMP_TAC[INSERT_COMM];\r
3648 SET_TAC[];\r
3649 SIMP_TAC[]]);;\r
3650 \r
3651 \r
3652 (* ========================================================= *)\r
3653 (* JULY *)\r
3654 \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
3661 \r
3662 \r
3663 \r
3664 \r
3665 let AZIM_EQ_0_GE_ALT2 = prove_by_refinement\r
3666 (` !v0 v1 w x.\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
3671 DOWN_TAC;\r
3672 REWRITE_TAC[AZIM_EQ_0_GE_ALT];\r
3673 DOWN;\r
3674 SIMP_TAC[AZIM_DEGENERATE];\r
3675 DOWN;\r
3676 NHANH Fan.th3a;\r
3677 NHANH Topology.aff_subset_aff_ge;\r
3678 NHANH Fan.th3b;\r
3679 SIMP_TAC[GSYM Trigonometry2.NOT_EQ_IMP_AFF_AND_COLL3];\r
3680 SET_TAC[]]);;\r
3681 \r
3682 \r
3683 \r
3684 \r
3685 \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
3690 NHANH Fan.th3b1;\r
3691 ONCE_REWRITE_TAC[INSERT_COMM];\r
3692 NHANH Fan.th3b1;\r
3693 STRIP_TAC;\r
3694 SUBGOAL_THEN` DISJOINT {v1,v0} {w2,w1:real^3}` ASSUME_TAC;\r
3695 ASM SET_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
3699 \r
3700 \r
3701 \r
3702 ASM_CASES_TAC` azim v0 v1 w1 w2 = &0 `;\r
3703 \r
3704 ASM_SIMP_TAC[IN_ELIM_THM; REAL_LE_ANTISYM; REAL_ARITH` &0 = a <=> a = &0`];\r
3705 DOWN;\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
3709 \r
3710 \r
3711 (* *)\r
3712 SUBGOAL_THEN` DISJOINT {v0,v1} {w1: real^3}` MP_TAC;\r
3713 DOWN THEN SET_TAC[];\r
3714 DOWN THEN DOWN;\r
3715 SIMP_TAC[Collect_geom.simp_def2; AFF_GE22; INSERT_COMM];\r
3716 REWRITE_TAC[IN_ELIM_THM; SUBSET];\r
3717 REPEAT STRIP_TAC;\r
3718 DOWN;\r
3719 ASM_REWRITE_TAC[];\r
3720 SIMP_TAC[];\r
3721 STRIP_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
3727 \r
3728 \r
3729 CONJ_TAC;\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
3737 STRIP_TAC;\r
3738 DOWN_TAC THEN SIMP_TAC[INSERT_COMM];\r
3739 STRIP_TAC;\r
3740 ASSUME_TAC2 WEDGE_LUNE_GT;\r
3741 \r
3742 \r
3743 \r
3744 REWRITE_TAC[EXTENSION; IN_ELIM_THM];\r
3745 GEN_TAC;\r
3746 EQ_TAC;\r
3747 ASM_SIMP_TAC[AZIM_EQ_0_GE_ALT2];\r
3748 STRIP_TAC;\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
3752 DISCH_THEN NHANH;\r
3753 SIMP_TAC[];\r
3754 \r
3755 DOWN;\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
3758 STRIP_TAC;\r
3759 UNDISCH_TAC ` &0 < azim v0 v1 w1 x `;\r
3760 DOWN;\r
3761 SIMP_TAC[AZIM_DEGENERATE];\r
3762 DISCH_TAC;\r
3763 REAL_ARITH_TAC;\r
3764 \r
3765 \r
3766 \r
3767 STRIP_TAC;\r
3768 DOWN;\r
3769 ASM_SIMP_TAC[AZIM_EQ_ALT];\r
3770 STRIP_TAC;\r
3771 \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
3775 SET_TAC[];\r
3776 DOWN;\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
3783 \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
3787 SIMP_TAC[];\r
3788 DOWN;\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
3791 \r
3792 ASM_SIMP_TAC[AFF_GE22; IN_ELIM_THM];\r
3793 STRIP_TAC;\r
3794 ASM_CASES_TAC ` yy = &0 `;\r
3795 FIRST_X_ASSUM SUBST_ALL_TAC;\r
3796 \r
3797 UNDISCH_TAC` ~collinear {v0, v1, w1:real^3}`;\r
3798 NHANH AZIM_EQ_0_GE_ALT2;\r
3799 STRIP_TAC;\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
3803 DOWN;\r
3804 SIMP_TAC[Collect_geom.simp_def2];\r
3805 ASM_REWRITE_TAC[IN_ELIM_THM];\r
3806 STRIP_TAC;\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
3812 REAL_ARITH_TAC;\r
3813 FIRST_X_ASSUM SUBST_ALL_TAC;\r
3814 REWRITE_TAC[AZIM_RANGE];\r
3815 \r
3816 \r
3817 \r
3818 ASM_CASES_TAC` collinear {v0,v1,x:real^3} `;\r
3819 DOWN;\r
3820 SIMP_TAC[AZIM_DEGENERATE; AZIM_RANGE];\r
3821 \r
3822 \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
3830 REMOVE_TAC;\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
3839 REAL_ARITH_TAC;\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
3848 DOWN;\r
3849 REWRITE_TAC[wedge; IN_ELIM_THM];\r
3850 IMP_TAC;\r
3851 REMOVE_TAC;\r
3852 REAL_ARITH_TAC]);;\r
3853 \r
3854 \r
3855 \r
3856 \r
3857 \r
3858 \r
3859 \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
3863 \r
3864 ONCE_REWRITE_TAC[GSYM (SPEC ` -- (u:real^3) ` AZIM_TRANSLATION)];\r
3865 \r
3866 REWRITE_TAC[VECTOR_ARITH` -- a + (a:real^N) = vec 0`;VECTOR_ARITH` -- a + b = b - a:real^N `; re_eqvl];\r
3867 REPEAT STRIP_TAC;\r
3868 ASM_REWRITE_TAC[];\r
3869 EQ_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
3873 STRIP_TAC;\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
3877 STRIP_TAC;\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
3883 DOWN;\r
3884 REAL_ARITH_TAC]);;\r
3885 \r
3886 \r
3887 \r
3888 \r
3889 \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
3893 REPEAT STRIP_TAC;\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
3898 STRIP_TAC;\r
3899 ASM_REWRITE_TAC[VECTOR_SUB_REFL];\r
3900 ASM_SIMP_TAC[REAL_LE_MUL_EQ]]);;\r
3901 \r
3902 \r
3903 \r
3904 \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
3908 REPEAT STRIP_TAC;\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
3913 CONJ_TAC;\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
3918 \r
3919 \r
3920 \r
3921 \r
3922 \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
3931 \r
3932 \r
3933 \r
3934 \r
3935 \r
3936 \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
3940           else {x | T}) `,\r
3941 PAT_ONCE_REWRITE_TAC `\x. x = y ` [GSYM PAIR]\r
3942 THEN REWRITE_TAC[wedge_in_fan_ge]);;\r
3943 \r
3944 \r
3945 \r
3946 \r
3947 \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
3953 \r
3954 \r
3955 \r
3956 \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
3961 \r
3962 \r
3963 \r
3964 \r
3965 \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
3971 \r
3972 \r
3973 \r
3974 \r
3975 \r
3976 \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
3980 [STRIP_TAC;\r
3981 SUBGOAL_THEN ` ~( t2 + t3 = &0 ) ` ASSUME_TAC;\r
3982 DOWN_TAC;\r
3983 REAL_ARITH_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
3987 CONJ_TAC;\r
3988 MATCH_MP_TAC REAL_LE_DIV;\r
3989 DOWN_TAC THEN REAL_ARITH_TAC;\r
3990 CONJ_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
3994 \r
3995 \r
3996 \r
3997 \r
3998 \r
3999 \r
4000 \r
4001 \r
4002 \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
4007 STRIP_TAC;\r
4008 DOWN;\r
4009 FIRST_X_ASSUM NHANH;\r
4010 REWRITE_TAC[azim_in_fan2; wedge_in_fan_ge2];\r
4011 LET_TAC;\r
4012 STRIP_TAC;\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
4016 STRIP_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
4020        else &2 * pi) <=\r
4021       pi `;\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
4025        else {x | T}) `;\r
4026 PHA;\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
4038 REPEAT STRIP_TAC;\r
4039 UNDISCH_TAC` vv:real^3 IN V `;\r
4040 FIRST_X_ASSUM NHANH;\r
4041 STRIP_TAC;\r
4042 DOWN;\r
4043 UNDISCH_TAC ` local_fan (V,E,FF) `;\r
4044 PHA;\r
4045 NHANH LOCAL_FAN_IN_FF_NOT_COLLINEAR;\r
4046 ASM_REWRITE_TAC[];\r
4047 STRIP_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
4052 ASM_SIMP_TAC[];\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
4063 SET_TAC[];\r
4064 \r
4065 SIMP_TAC[Fan.AFF_GE_1_2; SUBSET; IN_ELIM_THM];\r
4066 REPEAT STRIP_TAC;\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
4073 DOWN;\r
4074 UNDISCH_TAC ` conv {v, w} SUBSET wedge_ge (vec 0) (FST x) (SND x) d `;\r
4075 REWRITE_TAC[SUBSET];\r
4076 DISCH_THEN NHANH;\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
4080 EXPAND_TAC "p";\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
4086 DOWN;\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
4090 DOWN;\r
4091 SET_TAC[];\r
4092 ASM_SIMP_TAC[COLLINEAR_LEMMA_ALT];\r
4093 STRIP_TAC;\r
4094 SUBGOAL_THEN ` collinear {vec 0, FST (x:real^3 # real^3), x'}` MP_TAC;\r
4095 SIMP_TAC[COLLINEAR_LEMMA_ALT];\r
4096 DISJ2_TAC;\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
4099 SIMP_TAC[];\r
4100 ASM_REWRITE_TAC[];\r
4101 DISCH_TAC;\r
4102 VECTOR_ARITH_TAC;\r
4103 \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
4107 \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
4111 SIMP_TAC[];\r
4112 DISCH_TAC;\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
4115 \r
4116 ASM_REWRITE_TAC[REAL_ADD_LID];\r
4117 ASM_SIMP_TAC[Fan.th3a];\r
4118 SIMP_TAC[]]);;\r
4119 \r
4120 (* begin new lemma *)\r
4121 (* =============== *)\r
4122 (* =============== *)\r
4123 \r
4124 \r
4125 \r
4126 \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
4129 ==> w1 = w2`,\r
4130 [NHANH LOFA_IMP_BIJ_VV;\r
4131 STRIP_TAC;\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
4135 \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
4138 DOWN_TAC;\r
4139 REWRITE_TAC[BIJ; INJ; INSERT_SUBSET];\r
4140 MESON_TAC[]]);;\r
4141 \r
4142 \r
4143 \r
4144 \r
4145 \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
4152 \r
4153 \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
4157 \r
4158 \r
4159 \r
4160 \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
4164 \r
4165 \r
4166 \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
4171 \r
4172 \r
4173 \r
4174 \r
4175 \r
4176 \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
4180 DOWN;\r
4181 REWRITE_TAC[interior_angle1];\r
4182 NHANH EXISTS_INVERSE_OF_V;\r
4183 REPEAT STRIP_TAC;\r
4184 MP_TAC2 LOCAL_FAN_RHO_NODE_PROS2;\r
4185 STRIP_TAC;\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
4192 DOWN;\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
4206 \r
4207 MP_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;\r
4208 STRIP_TAC THEN STRIP_TAC;\r
4209 \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
4212 REMOVE_TAC;\r
4213 DOWN;\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
4218 \r
4219 (* ======================================================================== *)\r
4220 \r
4221 \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
4227 STRIP_TAC;\r
4228 FIRST_X_ASSUM (MP_TAC o (SPECL [`{v:real^N}`;`{w:real^N}`]));\r
4229 ANTS_TAC;\r
4230 REWRITE_TAC[IN_UNION; IN_ELIM_THM];\r
4231 UNDISCH_TAC` {v, w:real^N} SUBSET V`;\r
4232 SET_TAC[];\r
4233 ASM_SIMP_TAC[SET_RULE` ~( a = b ) ==> {a} INTER {b} = {} `;\r
4234 AFFINE_HULL_SING; AFF_GE_EQ_AFFINE_HULL];\r
4235 STRIP_TAC;\r
4236 MP_TAC (ISPECL [`x:real^N`;` v:real^N`] (CONJUNCT2 ENDS_IN_HALFLINE));\r
4237 DOWN THEN DOWN;\r
4238 REMOVE_TAC;\r
4239 DOWN;\r
4240 REWRITE_TAC[INSERT_SUBSET];\r
4241 FIRST_ASSUM NHANH;\r
4242 SET_TAC[]]);;\r
4243 \r
4244 \r
4245 \r
4246 \r
4247 \r
4248 \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
4251 [IMP_TAC;\r
4252 SIMP_TAC[AFF_LT_1_1; IN_ELIM_THM];\r
4253 REPEAT STRIP_TAC;\r
4254 DOWN;\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
4261 STRIP_TAC;\r
4262 EXISTS_TAC` &1 / t1 `;\r
4263 EXISTS_TAC ` ( -- t2 ) / t1 `;\r
4264 CONJ_TAC;\r
4265 MATCH_MP_TAC REAL_LT_DIV;\r
4266 ASM_REWRITE_TAC[];\r
4267 REAL_ARITH_TAC;\r
4268 CONJ_TAC;\r
4269 MATCH_MP_TAC REAL_LT_DIV;\r
4270 ASM_REWRITE_TAC[REAL_ARITH` &0 < -- a <=> a < &0 `];\r
4271 REWRITE_TAC[];\r
4272 UNDISCH_TAC` t1 + t2 = &1 `;\r
4273 UNDISCH_TAC ` ~( t1 = &0 ) `;\r
4274 CONV_TAC REAL_FIELD]);;\r
4275 \r
4276 \r
4277 \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
4283 STRIP_TAC;\r
4284 UNDISCH_TAC ` {v, w:real^N} SUBSET V`;\r
4285 REWRITE_TAC[INSERT_SUBSET];\r
4286 ASM_MESON_TAC[];\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
4296 ASM SET_TAC[];\r
4297 \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
4302 \r
4303 \r
4304 \r
4305 \r
4306 \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
4311 EQ_TAC;\r
4312 REWRITE_TAC[Collect_geom.AFF_2POINTS_INTERPRET; IN_ELIM_THM];\r
4313 STRIP_TAC;\r
4314 ASSUME_TAC2 (REAL_ARITH` ta + tb = &1 /\ a' + b' = &1 ==> ta <= a' \/ tb <= b' `);\r
4315 DOWN_TAC;\r
4316 DAO;\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
4325 \r
4326 SIMP_TAC[UNION_COMM; VECTOR_ADD_SYM; REAL_ADD_SYM];\r
4327 ONCE_REWRITE_TAC[EQ_SYM_EQ];\r
4328 SIMP_TAC[];\r
4329 REPEAT STRIP_TAC;\r
4330 \r
4331 \r
4332 REWRITE_TAC[IN_UNION; IN_ELIM_THM; HALFLINE];\r
4333 DISJ2_TAC;\r
4334 EXISTS_TAC` tb - ( ta / a' ) * b' `;\r
4335 CONJ_TAC;\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
4344 EXPAND_TAC "x";\r
4345 EXPAND_TAC "x'";\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
4348 CONJ_TAC;\r
4349 REPLICATE_TAC 4 DOWN;\r
4350 REMOVE_TAC;\r
4351 DOWN THEN DOWN;\r
4352 REMOVE_TAC;\r
4353 DOWN;\r
4354 PHA;\r
4355 CONV_TAC REAL_FIELD;\r
4356 \r
4357 \r
4358 REPLICATE_TAC 4 DOWN;\r
4359 REMOVE_TAC;\r
4360 DOWN THEN DOWN;\r
4361 REMOVE_TAC;\r
4362 DOWN;\r
4363 PHA;\r
4364 CONV_TAC REAL_FIELD;\r
4365 \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
4382 DOWN;\r
4383 ASM_SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET];\r
4384 ONCE_REWRITE_TAC[INSERT_COMM];\r
4385 ASM_REWRITE_TAC[];\r
4386 \r
4387 REWRITE_TAC[GSYM aff];\r
4388 PHA;\r
4389 SET_TAC[]]);;\r
4390 \r
4391 \r
4392 \r
4393 \r
4394 \r
4395 \r
4396 \r
4397 \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
4401 SIMP_TAC[]);;\r
4402 \r
4403 \r
4404 \r
4405 let EMPTY_NOT_EXISTS_IN = SET_RULE` a = {} <=> ~(? x. x IN a ) `;;\r
4406 \r
4407 \r
4408 \r
4409 \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
4417 STRIP_TAC;\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
4438 DOWN THEN DOWN;\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
4447 REPEAT STRIP_TAC;\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
4454 SET_TAC[];\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
4462 SET_TAC[];\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
4466 DOWN THEN DOWN;\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
4476 SIMP_TAC[];\r
4477 STRIP_TAC THEN STRIP_TAC;\r
4478 CONJ_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
4484 SIMP_TAC[];\r
4485 STRIP_TAC;\r
4486 REWRITE_TAC[IN_UNION; DE_MORGAN_THM];\r
4487 CONJ_TAC;\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
4493 MESON_TAC[];\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
4499 MESON_TAC[];\r
4500 DOWN;\r
4501 REWRITE_TAC[aff];\r
4502 MESON_TAC[];\r
4503 CONJ_TAC;\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
4506 REWRITE_TAC[aff];\r
4507 MATCH_MP_TAC HULL_MONO;\r
4508 REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET];\r
4509 REWRITE_TAC[EMPTY_SUBSET];\r
4510 STRIP_TAC;\r
4511 CONJ_TAC;\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
4515 DOWN;\r
4516 REWRITE_TAC[SUBSET];\r
4517 DISCH_THEN MATCH_MP_TAC;\r
4518 FIRST_ASSUM ACCEPT_TAC;\r
4519 REWRITE_TAC[aff];\r
4520 MESON_TAC[INSERT_COMM; Trigonometry2.IN_P_HULL_INSERT];\r
4521 ASM_SIMP_TAC[INSERT_COMM]]);;\r
4522 \r
4523 \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
4528 THEN SET_TAC[]);;\r
4529 \r
4530 \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
4535 THEN SET_TAC[]);;\r
4536 \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
4542 \r
4543 \r
4544 \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
4549 \r
4550 \r
4551 \r
4552 \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
4557 \r
4558 \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
4561 \r
4562 \r
4563 let CONV2_SUBSET_AFF_GE_2S = \r
4564 MATCH_MP P_SET3_IMP_SET2 (GEN_ALL CONV3_SUBSET_AFF_GE_3S);;\r
4565 \r
4566 \r
4567 \r
4568 \r
4569 \r
4570 \r
4571 \r
4572 \r
4573 (* ------------------------------------------------------------------------- *)\r
4574 (* Search (automatically updates)                                            *)\r
4575 (* ------------------------------------------------------------------------- *)\r
4576 \r
4577 let full t = mk_comb(mk_var("<full term>",W mk_fun_ty (type_of t)),t);;\r
4578 \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
4584   | _ -> 1;;\r
4585 \r
4586 let sortlength_thml thml =  \r
4587   let ltml = map \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
4590     map snd stml;;\r
4591 \r
4592 let search_thml  =\r
4593   let rec immediatesublist l1 l2 =\r
4594     match (l1,l2) with\r
4595       [],_ -> true\r
4596     | _,[] -> false\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
4600       [],_ -> true\r
4601     | _,[] -> false\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
4607     match tm with\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
4616 \r
4617 \r
4618 \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
4621 \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
4624 \r
4625 let (FIRST_PAT_X_ASSUM:term list -> thm_tactic -> tactic) =\r
4626   fun pat ttac ->\r
4627     FIRST_PAT_ASSUM pat (fun th -> UNDISCH_THEN (concl th) ttac);;\r
4628 (* ================================================================== *)\r
4629 \r
4630 \r
4631 \r
4632 \r
4633 \r
4634 \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
4639 CONJ_TAC;\r
4640 REWRITE_TAC[];\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
4647 \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
4654 \r
4655 \r
4656 \r
4657 \r
4658 \r
4659 \r
4660 \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
4663 \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
4669 \r
4670 \r
4671 \r
4672 let FIRST_IN_AFF = prove(` a IN aff ( a INSERT S ) `,\r
4673 REWRITE_TAC[aff; Trigonometry2.IN_P_HULL_INSERT]);;\r
4674 \r
4675 \r
4676 \r
4677 \r
4678 \r
4679 \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
4686 REPEAT STRIP_TAC;\r
4687 ASM_REWRITE_TAC[];\r
4688 UNDISCH_TAC ` l <= n:num`;\r
4689 SPEC_TAC (`l:num`,`l:num`);\r
4690 INDUCT_TAC;\r
4691 REWRITE_TAC[ITER];\r
4692 DISCH_TAC;\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
4700 STRIP_TAC;\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
4704 REPEAT STRIP_TAC;\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
4710 ANTS_TAC;\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
4717 ANTS_TAC;\r
4718 UNDISCH_TAC` SUC l' <= n `;\r
4719 ARITH_TAC;\r
4720 \r
4721 \r
4722 MP_TAC2 (SPEC `l':num` (GEN `l:num` LOFA_IMP_DIS_ELMS));\r
4723 CONJ_TAC;\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
4728 ARITH_TAC;\r
4729 DISCH_THEN (MP_TAC o (SPEC`0`));\r
4730 ANTS_TAC;\r
4731 UNDISCH_TAC` ~( l' = 0)`;\r
4732 ARITH_TAC;\r
4733 ASM_SIMP_TAC[IN_DIFF; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM; ITER];\r
4734 REPEAT STRIP_TAC;\r
4735 \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
4740 \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
4744 CONJ_TAC;\r
4745 MESON_TAC[FIRST_IN_AFF; INSERT_COMM];\r
4746 \r
4747 SUBGOAL_THEN` aff {vec 0, v:real^3} SUBSET aff {vec 0, v, rho_node1 FF v }` MP_TAC;\r
4748 REWRITE_TAC[aff];\r
4749 MATCH_MP_TAC HULL_MONO;\r
4750 SET_TAC[];\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
4756 STRIP_TAC;\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
4760 \r
4761 \r
4762 \r
4763 \r
4764 \r
4765 \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
4772 STRIP_TAC;\r
4773 STRIP_TAC;\r
4774 ASM_SIMP_TAC[REAL_ENTIRE; DE_MORGAN_THM];\r
4775 DISJ2_TAC;\r
4776 CONJ_TAC;\r
4777 UNDISCH_TAC` &0 < t `;\r
4778 REAL_ARITH_TAC;\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
4786 SIMP_TAC[]]);;\r
4787 \r
4788 \r
4789 \r
4790 \r
4791 \r
4792 \r
4793 \r
4794 \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
4799 \r
4800 \r
4801 \r
4802 \r
4803 \r
4804 \r
4805 \r
4806 let RHO_NODE1_MONO_WITH_AZIM = prove_by_refinement\r
4807 (` local_fan (V,E,FF) /\\r
4808      v IN V /\\r
4809      {ITER n (rho_node1 FF) v | n <= l} = U /\\r
4810      plane P /\\r
4811      vec 0 IN P /\\r
4812      U SUBSET P /\\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
4817 [STRIP_TAC;\r
4818 GEN_TAC;\r
4819 INDUCT_TAC;\r
4820 REWRITE_TAC[LT];\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
4825 PHA;\r
4826 NHANH (ARITH_RULE` SUC a <= b ==> a < b `);\r
4827 IMP_TAC;\r
4828 DISCH_THEN NHANH;\r
4829 STRIP_TAC;\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
4836 DOWN;\r
4837 REAL_ARITH_TAC;\r
4838 \r
4839 \r
4840 \r
4841 \r
4842 \r
4843 (* 7777777 *)\r
4844 DISCH_THEN MATCH_MP_TAC;\r
4845 ASSUME_TAC2 LOFA_IMP_DIS_ELMS2;\r
4846 EXPAND_TAC "U";\r
4847 REWRITE_TAC[IN_ELIM_THM];\r
4848 CONJ_TAC;\r
4849 EXISTS_TAC ` 0`;\r
4850 REWRITE_TAC[ITER; LE_0];\r
4851 \r
4852 FIRST_ASSUM (MP_TAC o (SPECL [`0`;` n:num`]));\r
4853 FIRST_ASSUM (MP_TAC o (SPECL [`0`;` n + 1`]));\r
4854 PHA;\r
4855 ASM_REWRITE_TAC[GSYM ADD1];\r
4856 \r
4857 IMP_TAC;\r
4858 ANTS_TAC;\r
4859 REWRITE_TAC[LT_0];\r
4860 ASSUME_TAC2 LOFA_IMP_CARD_FF_V_EQ;\r
4861 ASM_REWRITE_TAC[];\r
4862 SIMP_TAC[ITER];\r
4863 \r
4864 ASSUME_TAC2 LOFA_IMP_CARD_FF_V_EQ;\r
4865 STRIP_TAC;\r
4866 ANTS_TAC;\r
4867 UNDISCH_TAC` ~( n = 0 ) `;\r
4868 UNDISCH_TAC` SUC n < CARD (V:real^3 -> bool) `;\r
4869 ASM_REWRITE_TAC[];\r
4870 ARITH_TAC;\r
4871 SIMP_TAC[];\r
4872 \r
4873 STRIP_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
4877 ANTS_TAC;\r
4878 REPLICATE_TAC 4 DOWN THEN PHA;\r
4879 ARITH_TAC;\r
4880 ASSUME_TAC2 SEQUENCE_OF_RHO_NODE_IS_SUC;\r
4881 \r
4882 FIRST_X_ASSUM (MP_TAC o (SPECL [` ITER m (rho_node1 FF) v`;` m:num`]));\r
4883 REWRITE_TAC[];\r
4884 ANTS_TAC;\r
4885 DOWN;\r
4886 ARITH_TAC;\r
4887 \r
4888 DISCH_THEN (MP_TAC o (SPEC ` v:real^3 `));\r
4889 ANTS_TAC;\r
4890 EXPAND_TAC "U";\r
4891 REWRITE_TAC[IN_ELIM_THM];\r
4892 EXISTS_TAC `0`;\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
4898 REAL_ARITH_TAC;\r
4899 \r
4900 ASSUME_TAC2 LOFA_IMP_DIS_ELMS2;\r
4901 ANTS_TAC;\r
4902 FIRST_X_ASSUM (MP_TAC o (SPECL [`0` ;` m:num `]));\r
4903 PHA;\r
4904 ANTS_TAC;\r
4905 REPLICATE_TAC 3 DOWN THEN PHA;\r
4906 ASSUME_TAC2 LOFA_IMP_CARD_FF_V_EQ;\r
4907 ASM_REWRITE_TAC[];\r
4908 ARITH_TAC;\r
4909 SIMP_TAC[ITER];\r
4910 ANTS_TAC;\r
4911 \r
4912 FIRST_X_ASSUM (MP_TAC o (SPECL [`0` ;`SUC m`]));\r
4913 PHA;\r
4914 ANTS_TAC;\r
4915 \r
4916 ASSUME_TAC2 LOFA_IMP_CARD_FF_V_EQ;\r
4917 ASM_REWRITE_TAC[];\r
4918 ARITH_TAC;\r
4919 SIMP_TAC[ITER];\r
4920 \r
4921 REWRITE_TAC[ITER];\r
4922 REAL_ARITH_TAC]);;\r
4923 \r
4924 \r
4925 \r
4926 \r
4927 \r
4928 \r
4929 \r
4930 \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
4936 REAL_ARITH_TAC);;\r
4937 \r
4938 \r
4939 \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
4942      ==> (!i l.\r
4943               i < l /\ l < CARD V\r
4944               ==> ~(ITER l (rho_node1 FF) v = ITER i (rho_node1 FF) v))`;;\r
4945 \r
4946 \r
4947 \r
4948 \r
4949 \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
4953 \r
4954 \r
4955 \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
4962 \r
4963 \r
4964 \r
4965 \r
4966 \r
4967 \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
4971 \r
4972 \r
4973 \r
4974 \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
4982 \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
4986 STRIP_TAC;\r
4987 SUBGOAL_THEN` orbit_map (rho_node1 FF) v = (V:real^3 -> bool) `ASSUME_TAC;\r
4988 ASM_SIMP_TAC[];\r
4989 SUBGOAL_THEN` {ITER n (rho_node1 FF) v | n < CARD V} = V `ASSUME_TAC;\r
4990 ASM_SIMP_TAC[];\r
4991 UNDISCH_TAC` w:real^3 IN V `;\r
4992 EXPAND_TAC "V";\r
4993 REWRITE_TAC[IN_ELIM_THM];\r
4994 STRIP_TAC;\r
4995 EXISTS_TAC` n:num`;\r
4996 ASM_REWRITE_TAC[SUBSET; IN_ELIM_THM];\r
4997 REPEAT STRIP_TAC;\r
4998 \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
5004 EXPAND_TAC "w";\r
5005 EXPAND_TAC "V";\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
5012 STRIP_TAC;\r
5013 MP_TAC2 (SPEC `n:num` (GEN `l:num` FIRST_AZIM_CYCLE_EQ_RHO_NODE));\r
5014 EXPAND_TAC "P";\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
5022 SIMP_TAC[];\r
5023 MP_TAC2 (SPEC `n:num ` (GEN ` l:num` RHO_NODE1_MONO_WITH_AZIM));\r
5024 EXPAND_TAC "P";\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
5029 REWRITE_TAC[aff];\r
5030 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE;\r
5031 ASM_SIMP_TAC[];\r
5032 STRIP_TAC;\r
5033 FIRST_ASSUM (ASSUME_TAC o (SPECL [`0`;` l:num`]));\r
5034 DOWN;\r
5035 ANTS_TAC;\r
5036 ASM_REWRITE_TAC[];\r
5037 UNDISCH_TAC` l < n:num`;\r
5038 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;\r
5039 ARITH_TAC;\r
5040 \r
5041 \r
5042 FIRST_ASSUM (ASSUME_TAC o (SPECL [` l:num`;`n:num`]));\r
5043 DOWN;\r
5044 ANTS_TAC;\r
5045 ASM_REWRITE_TAC[LE_REFL];\r
5046 \r
5047 \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
5052 \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
5057 STRIP_TAC;\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
5063 REAL_ARITH_TAC;\r
5064 FIRST_X_ASSUM (SUBST1_TAC o SYM);\r
5065 ASM_REWRITE_TAC[GSYM VECTOR_MUL_LNEG];\r
5066 \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
5070 REAL_ARITH_TAC;\r
5071 REWRITE_TAC[];\r
5072 EXPAND_TAC "e";\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
5078 SIMP_TAC[];\r
5079 \r
5080 \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
5088 \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
5092 \r
5093 \r
5094 \r
5095 \r
5096 \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
5101 STRIP_TAC;\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
5106 REAL_ARITH_TAC;\r
5107 FIRST_X_ASSUM (SUBST1_TAC o SYM);\r
5108 ASM_REWRITE_TAC[GSYM VECTOR_MUL_LNEG];\r
5109 \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
5113 REAL_ARITH_TAC;\r
5114 REWRITE_TAC[];\r
5115 EXPAND_TAC "e";\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
5121 SIMP_TAC[];\r
5122 \r
5123 ASM_REWRITE_TAC[];\r
5124 SWITCH_TAC` w = ITER n (rho_node1 FF) v `;\r
5125 ASM_REWRITE_TAC[];\r
5126 REPEAT STRIP_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
5130 STRIP_TAC;\r
5131 \r
5132 \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
5138 EXPAND_TAC "U";\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
5143 ARITH_TAC;\r
5144 \r
5145 \r
5146 REWRITE_TAC[aff; AFFINE_HULL_3; IN_ELIM_THM];\r
5147 STRIP_TAC;\r
5148 ASM_REWRITE_TAC[];\r
5149 \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
5153 \r
5154 \r
5155 SUBGOAL_THEN` &0 < e dot (e:real^3)` ASSUME_TAC;\r
5156 REWRITE_TAC[DOT_POS_LT];\r
5157 EXPAND_TAC "e";\r
5158 REWRITE_TAC[CROSS_EQ_0];\r
5159 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2;\r
5160 ASM_REWRITE_TAC[];\r
5161 \r
5162 ASM_SIMP_TAC[REAL_LT_MUL_EQ];\r
5163 MP_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;\r
5164 NHANH Fan.th3a;\r
5165 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM];\r
5166 REPEAT STRIP_TAC;\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
5172 \r
5173 \r
5174 \r
5175 \r
5176 \r
5177 \r
5178 \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
5184 \r
5185 STRIP_TAC;\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
5189 DOWN;\r
5190 REMOVE_TAC;\r
5191 DOWN;\r
5192 DOWN;\r
5193 REMOVE_TAC;\r
5194 FIRST_X_ASSUM (NHANH_PAT`\x. x ==> y`);\r
5195 STRIP_TAC;\r
5196 EXPAND_TAC "V";\r
5197 REWRITE_TAC[lemma_in_orbit_iter];\r
5198 EXPAND_TAC "V";\r
5199 REWRITE_TAC[IN_ELIM_THM];\r
5200 STRIP_TAC;\r
5201 DOWN;\r
5202 ASM_CASES_TAC` n = 0 `;\r
5203 ASM_REWRITE_TAC[ITER];\r
5204 \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
5210 \r
5211 SUBGOAL_THEN` 0 < m ` MP_TAC;\r
5212 UNDISCH_TAC` n < cc:num`;\r
5213 EXPAND_TAC "m";\r
5214 ARITH_TAC;\r
5215 \r
5216 PHA;\r
5217 NHANH Lvducxu.ITER_CYCLIC_ORBIT;\r
5218 \r
5219 SUBGOAL_THEN` ITER n f (v:A) IN V ` MP_TAC;\r
5220 EXPAND_TAC "V";\r
5221 REWRITE_TAC[IN_ELIM_THM];\r
5222 EXISTS_TAC `n:num`;\r
5223 ASM_REWRITE_TAC[];\r
5224 \r
5225 ASM_SIMP_TAC[];\r
5226 \r
5227 REPEAT STRIP_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
5232 \r
5233 UNDISCH_TAC` ~ ( n = 0 ) `;\r
5234 ARITH_TAC]);;\r
5235 \r
5236 \r
5237 \r
5238 \r
5239 \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
5244 \r
5245 \r
5246 \r
5247 \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
5251 \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
5255 \r
5256 \r
5257 \r
5258 \r
5259 \r
5260 let collinear_fan22 = \r
5261 MESON[Fan.collinear_fan]`collinear {x, v,u} <=> u IN aff {x, v} \/ (x = v)`;;\r
5262 \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
5267 \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
5272 \r
5273 \r
5274 \r
5275 \r
5276 \r
5277 \r
5278 \r
5279 \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
5283 [STRIP_TAC;\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
5286 DOWN;\r
5287 NHANH (SPEC `e:real^N` (GEN `v:real^N` IN_CONV0_IMP_COLL_ENDS_AFF));\r
5288 DOWN;\r
5289 ASM_SIMP_TAC[INSERT_COMM];\r
5290 SIMP_TAC[];\r
5291 DISCH_TAC;\r
5292 DOWN_TAC;\r
5293 SPEC_TAC (`x:real^3`,`x:real^3`);\r
5294 GEOM_ORIGIN_TAC `x:real^3`;\r
5295 REPEAT STRIP_TAC;\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
5300 \r
5301 MATCH_MP_TAC Ldurdpn.AFF_CONV0_IN_AFF_LT;\r
5302 DOWN_TAC;\r
5303 SIMP_TAC[INSERT_COMM]]);;\r
5304 \r
5305 \r
5306 \r
5307 \r
5308 \r
5309 \r
5310 \r
5311 \r
5312 \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
5316 SET_TAC[]);;\r
5317 \r
5318 \r
5319 \r
5320 \r
5321 \r
5322 \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
5328 \r
5329 \r
5330 \r
5331 \r
5332 \r
5333 \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
5337 STRIP_TAC;\r
5338 EQ_TAC;\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
5342 REAL_ARITH_TAC;\r
5343 DOWN;\r
5344 REAL_ARITH_TAC;\r
5345 ASM_SIMP_TAC [ PI_TO_TWO_PI_NEG_SIN]]);;\r
5346 \r
5347 \r
5348 \r
5349 \r
5350 \r
5351 \r
5352 \r
5353 \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
5357  i + 1 < CARD 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
5360 STRIP_TAC;\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
5365 \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
5376 SIMP_TAC[];\r
5377 \r
5378 UNDISCH_TAC` lunar (v:real^3,w) V E `;\r
5379 REWRITE_TAC[lunar; INSERT_SUBSET];\r
5380 STRIP_TAC;\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
5385 \r
5386 DOWN THEN DOWN;\r
5387 EXPAND_TAC "v";\r
5388 ASM_SIMP_TAC[INSERT_COMM];\r
5389 ASM_REWRITE_TAC[ARITH_RULE` a + 1 < b <=> a < b /\ ~(a + 1 = b )`];\r
5390 STRIP_TAC;\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
5408 STRIP_TAC;\r
5409 ASSUME_TAC2 CVX_LO_IMP_LO;\r
5410 ASM_REWRITE_TAC[plane];\r
5411 EXPAND_TAC "P";\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
5416 REWRITE_TAC[aff];\r
5417 MP_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;\r
5418 \r
5419 \r
5420 \r
5421 STRIP_TAC;\r
5422 FIRST_X_ASSUM (ASSUME_TAC o (SPECL [`i:num`;` i + 1`]));\r
5423 DOWN;\r
5424 ANTS_TAC;\r
5425 EXPAND_TAC "l";\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
5428 \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
5432 ASM_SIMP_TAC[];\r
5433 EXPAND_TAC "e";\r
5434 STRIP_TAC;\r
5435 \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
5440 \r
5441 REWRITE_TAC[GSYM SIN_AZIM_NEG_PI_LT];\r
5442 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF v} `;\r
5443 NHANH Fan.th3a;\r
5444 NHANH AFF_GT_2_1;\r
5445 STRIP_TAC;\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
5448 STRIP_TAC;\r
5449 MP_TAC (\r
5450 SPECL [`e:real^3`;` v:real^3`;` ITER l (rho_node1 FF) v`] Trigonometry2.JBDNJJB);\r
5451 REWRITE_TAC[re_eqvl];\r
5452 STRIP_TAC;\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
5459 \r
5460 ASM_SIMP_TAC[GSYM CROSS_EQ_0];\r
5461 \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
5465 \r
5466 \r
5467 \r
5468 \r
5469 \r
5470 \r
5471 \r
5472 \r
5473 \r
5474 \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
5477  &0 < t /\\r
5478  &0 < tt /\\r
5479  a1 + b1 + t = &1 /\\r
5480  a2 + b2 + tt = &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
5483      &0 < tt / t`,\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
5487 STRIP_TAC;\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
5491 STRIP_TAC;\r
5492 CONJ_TAC;\r
5493 VECTOR_ARITH_TAC;\r
5494 CONJ_TAC;\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
5499 REPEAT STRIP_TAC;\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
5504 \r
5505 \r
5506 \r
5507 \r
5508 \r
5509 \r
5510 \r
5511 \r
5512 \r
5513 \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
5519 STRIP_TAC;\r
5520 UNDISCH_TAC` vec 0 IN conv0 {v,w:real^3}`;\r
5521 \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
5526 \r
5527 NHANH IN_CONV0_EQ_EQ;\r
5528 SIMP_TAC[INSERT_COMM];\r
5529 STRIP_TAC;\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
5534 \r
5535 ONCE_REWRITE_TAC[INSERT_COMM];\r
5536 STRIP_TAC;\r
5537 MATCH_MP_TAC LOCAL_FAN_CHARACTER_OF_RHO_NODE2;\r
5538 DOWN_TAC;\r
5539 SIMP_TAC[convex_local_fan; lunar; INSERT_SUBSET]]);;\r
5540 \r
5541 \r
5542 \r
5543 \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
5549 \r
5550 REWRITE_TAC[convex_local_fan; lunar; INSERT_SUBSET];\r
5551 STRIP_TAC;\r
5552 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;\r
5553 DOWN THEN DOWN THEN PHA;\r
5554 NHANH Fan.th3a;\r
5555 SIMP_TAC[AFF_GT_2_1; INTER_EQ_EM_EXPAND; IN_ELIM_THM];\r
5556 REPEAT STRIP_TAC;\r
5557 DOWN THEN ASM_REWRITE_TAC[GSYM ITER; ADD1];\r
5558 STRIP_TAC;\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
5561 \r
5562 \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
5569 \r
5570 \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
5573 \r
5574 \r
5575 \r
5576 \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
5583 NHANH Fan.th3a;\r
5584 REPEAT STRIP_TAC;\r
5585 REWRITE_TAC[GSYM SUBSET_ANTISYM_EQ];\r
5586 CONJ_TAC;\r
5587 MATCH_MP_TAC AFF_GT_MONO_LEFT;\r
5588 SET_TAC[];\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
5594 NHANH Fan.th3a;\r
5595 STRIP_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
5598 DOWN;\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
5601 REPEAT STRIP_TAC;\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
5606 STRIP_TAC;\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
5612 CONJ_TAC;\r
5613 UNDISCH_TAC` t1 + t2 + t3 + t4 = &1 `;\r
5614 REAL_ARITH_TAC;\r
5615 VECTOR_ARITH_TAC]);;\r
5616 \r
5617 \r
5618 \r
5619 \r
5620 \r
5621 \r
5622 \r
5623 \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
5630 STRIP_TAC;\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
5643 \r
5644 \r
5645 \r
5646 \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
5652 STRIP_TAC;\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
5657 DISCH_TAC;\r
5658 VECTOR_ARITH_TAC;\r
5659 DOWN;\r
5660 REWRITE_TAC[SET_RULE`~DISJOINT {b, c} {w} <=> w = b \/ w = c`];\r
5661 STRIP_TAC;\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
5666 SET_TAC[];\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
5671 SET_TAC[]]);;\r
5672 \r
5673 \r
5674 \r
5675 \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
5680 STRIP_TAC;\r
5681 ASM_REWRITE_TAC[];\r
5682 DOWN;\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
5686 STRIP_TAC;\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
5691 DISCH_TAC;\r
5692 VECTOR_ARITH_TAC;\r
5693 DOWN;\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
5696 \r
5697 \r
5698 \r
5699 \r
5700 \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
5705 \r
5706 \r
5707 \r
5708 \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
5713 NHANH Fan.th3a;\r
5714 STRIP_TAC;\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
5717 REPEAT STRIP_TAC;\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
5722 CONJ_TAC;\r
5723 MATCH_MP_TAC REAL_LT_MUL;\r
5724 ASM_REWRITE_TAC[];\r
5725 CONJ_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
5729 \r
5730 \r
5731 \r
5732 \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
5737 \r
5738 \r
5739 \r
5740 \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
5745 PHA THEN IMP_TAC;\r
5746 NHANH Fan.th3a;\r
5747 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM];\r
5748 REPEAT STRIP_TAC;\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
5752 DOWN;\r
5753 PHA;\r
5754 NHANH FOR_AFF_GT_NOT_INTERSECTION2;\r
5755 MESON_TAC[]]);;\r
5756 \r
5757 \r
5758 \r
5759 \r
5760 \r
5761 \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
5768 \r
5769 \r
5770 \r
5771 \r
5772 \r
5773 \r
5774 \r
5775 \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
5779                 i + 1 < CARD 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
5784 STRIP_TAC;\r
5785 EXISTS_TAC` i:num`;\r
5786 ASM_REWRITE_TAC[];\r
5787 CONJ_TAC;\r
5788 STRIP_TAC;\r
5789 FIRST_X_ASSUM SUBST_ALL_TAC;\r
5790 DOWN_TAC;\r
5791 REWRITE_TAC[lunar; ITER];\r
5792 STRIP_TAC;\r
5793 UNDISCH_TAC` ~( v = w:real^3)`;\r
5794 ASM_REWRITE_TAC[];\r
5795 STRIP_TAC;\r
5796 FIRST_X_ASSUM SUBST_ALL_TAC;\r
5797 DOWN_TAC;\r
5798 REWRITE_TAC[lunar; ITER12; INSERT_SUBSET; convex_local_fan];\r
5799 STRIP_TAC;\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
5804 \r
5805 \r
5806 \r
5807 \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
5815 STRIP_TAC;\r
5816 EXISTS_TAC` i:num`;\r
5817 ASM_REWRITE_TAC[];\r
5818 CONJ_TAC;\r
5819 STRIP_TAC;\r
5820 FIRST_X_ASSUM SUBST_ALL_TAC;\r
5821 DOWN_TAC;\r
5822 REWRITE_TAC[lunar; ITER];\r
5823 STRIP_TAC;\r
5824 UNDISCH_TAC` ~( v = w:real^3)`;\r
5825 ASM_REWRITE_TAC[];\r
5826 STRIP_TAC;\r
5827 FIRST_X_ASSUM SUBST_ALL_TAC;\r
5828 DOWN_TAC;\r
5829 REWRITE_TAC[lunar; ITER12; INSERT_SUBSET; convex_local_fan];\r
5830 STRIP_TAC;\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
5835 \r
5836 \r
5837 \r
5838 \r
5839 \r
5840 \r
5841 \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
5847 \r
5848 \r
5849 \r
5850 \r
5851 \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
5858 STRIP_TAC;\r
5859 FIRST_ASSUM (SUBST1_TAC o SYM);\r
5860 MATCH_MP_TAC COLL_IN_AFF_GT_AFF_GT_EQ;\r
5861 \r
5862 ASSUME_TAC2 (ONCE_REWRITE_RULE[LUNAR_COMM] NOT_COLL_RHONODE_SND_POINT);\r
5863 DOWN;\r
5864 SIMP_TAC[];\r
5865 STRIP_TAC;\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
5874 SIMP_TAC[];\r
5875 STRIP_TAC;\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
5882 STRIP_TAC;\r
5883 UNDISCH_TAC` lunar (w,v:real^3) V E `;\r
5884 REWRITE_TAC[lunar; INSERT_SUBSET];\r
5885 STRIP_TAC;\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
5889 STRIP_TAC;\r
5890 EXPAND_TAC "V";\r
5891 REWRITE_TAC[lemma_in_orbit_iter]]);;\r
5892 \r
5893 \r
5894 \r
5895 \r
5896 \r
5897 \r
5898 \r
5899 \r
5900 \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
5904 SIMP_TAC[]);;\r
5905 \r
5906 \r
5907 \r
5908 \r
5909 \r
5910 \r
5911 \r
5912 \r
5913 \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
5920 \r
5921 \r
5922 \r
5923 \r
5924 \r
5925 \r
5926 \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
5930                 ~(i = 0) /\\r
5931                 ~(i = 1) /\\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
5941 STRIP_TAC;\r
5942 EXISTS_TAC` i':num`;\r
5943 CONJ_TAC;\r
5944 ASM_REWRITE_TAC[];\r
5945 CONJ_TAC;\r
5946 ASM_REWRITE_TAC[];\r
5947 CONJ_TAC;\r
5948 ASM_REWRITE_TAC[];\r
5949 CONJ_TAC;\r
5950 FIRST_ASSUM ACCEPT_TAC;\r
5951 REWRITE_TAC[GSYM SUBSET_ANTISYM_EQ; SUBSET_INTER];\r
5952 CONJ_TAC;\r
5953 DOWN THEN SIMP_TAC[];\r
5954 SIMP_TAC[SUBSET; IN_ELIM_THM];\r
5955 REPEAT STRIP_TAC;\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
5962 EXPAND_TAC "V";\r
5963 REWRITE_TAC[lemma_in_orbit_iter];\r
5964 MP_TAC NOT_INTERSECTION_BWT_AFF_GTS;\r
5965 ANTS_TAC;\r
5966 REWRITE_TAC[convex_local_fan];\r
5967 CONJ_TAC;\r
5968 CONJ_TAC;\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
5973 STRIP_TAC;\r
5974 \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
5978 STRIP_TAC;\r
5979 \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
5983 DOWN;\r
5984 EXPAND_TAC "V";\r
5985 SIMP_TAC[IN_ELIM_THM];\r
5986 ASSUME_TAC2 LOCAL_FAN_CHARACTER_OF_RHO_NODE2;\r
5987 \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
5990 \r
5991 DOWN;\r
5992 SIMP_TAC[Planarity.POINT_IN_LINE1];\r
5993 \r
5994 SUBGOAL_THEN ` convex_local_fan (V,E,FF) ` ASSUME_TAC;\r
5995 REWRITE_TAC[convex_local_fan];\r
5996 CONJ_TAC;\r
5997 FIRST_ASSUM ACCEPT_TAC;\r
5998 FIRST_ASSUM ACCEPT_TAC;\r
5999 \r
6000 \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
6004 \r
6005 \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
6009 \r
6010 STRIP_TAC;\r
6011 ASM_CASES_TAC` n = 0 `;\r
6012 FIRST_X_ASSUM SUBST_ALL_TAC;\r
6013 DOWN;\r
6014 REWRITE_TAC[ITER];\r
6015 DISCH_THEN SUBST_ALL_TAC;\r
6016 \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
6019 SIMP_TAC[];\r
6020 \r
6021 \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
6028 \r
6029 ASM_REWRITE_TAC[];\r
6030 EXPAND_TAC "w";\r
6031 ASM_REWRITE_TAC[];\r
6032 \r
6033 \r
6034 \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
6039 STRIP_TAC;\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
6051 CONJ_TAC;\r
6052 CONJ_TAC;\r
6053 UNDISCH_TAC` i' < n:num`;\r
6054 ARITH_TAC;\r
6055 ASM_CASES_TAC` n - i' < i:num`;\r
6056 DOWN THEN REWRITE_TAC[];\r
6057 DOWN;\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
6060 PHA;\r
6061 NHANH (ARITH_RULE` a < b /\ c <= a:num ==> c < b `);\r
6062 \r
6063 STRIP_TAC;\r
6064 MP_TAC2 LOFA_IMP_DIS_ELMS23;\r
6065 DISCH_THEN (MP_TAC o (SPECL [`0`;` (i:num) + i' `]));\r
6066 ANTS_TAC;\r
6067 ASM_SIMP_TAC[ARITH_RULE` ~ (a = 0 ) ==> 0 < a + b `];\r
6068 \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
6073 \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
6076       {} `;\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
6080 \r
6081 \r
6082 \r
6083 \r
6084 \r
6085 \r
6086 \r
6087 \r
6088 \r
6089 \r
6090 \r
6091 \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
6095 STRIP_TAC;\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
6108                else &2 * pi) <=\r
6109               pi /\\r
6110               V SUBSET wedge_in_fan_ge x E`;\r
6111 DISCH_THEN NHANH;\r
6112 LET_TAC;\r
6113 SWITCH_TAC` EE v E = {rho_node1 FF v, vv} `;\r
6114 ASM_SIMP_TAC[ARITH_RULE` a = 2 ==> a > 1 `];\r
6115 STRIP_TAC;\r
6116 DOWN THEN DOWN THEN PHA;\r
6117 \r
6118 ASSUME_TAC2 (SPEC `vv:real^3 ` (GEN` v:real^3 ` IVS_RHO_IDD));\r
6119 EXPAND_TAC "d";\r
6120 SIMP_TAC[];\r
6121 UNDISCH_TAC` {rho_node1 FF v, vv} = EE v E `;\r
6122 DISCH_THEN (SUBST1_TAC o SYM);\r
6123 EXPAND_TAC "v";\r
6124 DOWN;\r
6125 SIMP_TAC[interior_angle1; GSYM ivs_rho_node1; AZIM_CYCLE_TWO_POINT_SET]]);;\r
6126 \r
6127 \r
6128 \r
6129 \r
6130 \r
6131 \r
6132 \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
6137 \r
6138 \r
6139 \r
6140 \r
6141 \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
6146 \r
6147 \r
6148 \r
6149 \r
6150 \r
6151 \r
6152 \r
6153 \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
6159 \r
6160 \r
6161 \r
6162 \r
6163 \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
6170 \r
6171 \r
6172 \r
6173 \r
6174 \r
6175 \r
6176 \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
6185 \r
6186 \r
6187 \r
6188 \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
6197 \r
6198 \r
6199 NHANH LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;\r
6200 REWRITE_TAC[lunar; INSERT_SUBSET];\r
6201 STRIP_TAC;\r
6202 MP_TAC2 CONVEX_LOFA_IMP_INANGLE_LE_PI;\r
6203 MP_TAC2 (\r
6204 SPEC `w:real^3 ` (GEN`v:real^3 ` CONVEX_LOFA_IMP_INANGLE_LE_PI));\r
6205 \r
6206 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1];\r
6207 \r
6208 \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
6212 REPEAT DISCH_TAC;\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
6215 DOWN;\r
6216 MATCH_MP_TAC AZIM_LE_PI_EQ_DIHV;\r
6217 ASM_SIMP_TAC[];\r
6218 MATCH_MP_TAC LOFA_IMP_NOT_COLL_IVS;\r
6219 ASM_REWRITE_TAC[];\r
6220 \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
6223 DOWN;\r
6224 REMOVE_TAC THEN DOWN;\r
6225 MATCH_MP_TAC AZIM_LE_PI_EQ_DIHV;\r
6226 ASM_SIMP_TAC[];\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
6233 PHA;\r
6234 NHANH Fan.th3a;\r
6235 NHANH AFF_GT_2_1;\r
6236 STRIP_TAC;\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
6243 STRIP_TAC;\r
6244 \r
6245 ONCE_REWRITE_TAC[Trigonometry2.DIHV_SYM];\r
6246 \r
6247 \r
6248 \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
6253 \r
6254 \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
6259 \r
6260 DISCH_THEN (SUBST1_TAC o SYM);\r
6261 FIRST_ASSUM SUBST1_TAC;\r
6262 \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
6267 SIMP_TAC[];\r
6268 REMOVE_TAC;\r
6269 \r
6270 \r
6271 DISCH_THEN (SUBST1_TAC o SYM);\r
6272 FIRST_ASSUM (SUBST1_TAC o SYM);\r
6273 \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
6278 \r
6279 SIMP_TAC[];\r
6280 \r
6281 \r
6282 ASM_SIMP_TAC[REWRITE_RULE[TAUT` a /\ b ==> c <=> a ==> b ==> c`] DIHV_NOT_CHANGE];\r
6283 \r
6284 REMOVE_TAC;\r
6285 \r
6286 \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
6293 \r
6294 MP_TAC2 (REAL_ARITH` &0 < b ==> ~( -- b = &0 ) `);\r
6295 SIMP_TAC[DIHV_SPECIAL_SCALE; Trigonometry2.DIHV_SYM]]);;\r
6296 \r
6297 \r
6298 \r
6299 \r
6300 \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
6308                 ~(i = 0) /\\r
6309                 ~(i = 1) /\\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
6314                 ~(j = 0) /\\r
6315                 ~(j = 1) /\\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
6327 STRIP_TAC;\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
6331 STRIP_TAC;\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
6335 \r
6336 \r
6337 \r
6338 \r
6339 (* ============================ END ========================== *)\r
6340 (*                      begin lemma EGHNAVX                    *)\r
6341 \r
6342 \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
6349 REWRITE_TAC[LT];\r
6350 REWRITE_TAC[ARITH_RULE` a < SUC b <=> a = b \/ a < b `];\r
6351 STRIP_TAC;\r
6352 ASM_REWRITE_TAC[ADD1];\r
6353 DOWN;\r
6354 FIRST_X_ASSUM NHANH;\r
6355 REWRITE_TAC[ADD1];\r
6356 ASM_MESON_TAC[]]);;\r
6357 \r
6358 \r
6359 \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
6367 \r
6368 \r
6369 \r
6370 \r
6371 \r
6372 \r
6373 \r
6374 \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
6379 \r
6380 \r
6381 \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
6384 \r
6385 \r
6386 \r
6387 \r
6388 let EQ_IFF_IMP = MESON[]`(! a b. P a b <=> P b a ) <=> (! a b. P a b ==> P b a)`;;\r
6389 \r
6390 \r
6391 \r
6392 \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
6396 in\r
6397  ~( X = {} ) /\ INJ (f:A -> B) X Y ==> SURJ f1 Y X`,\r
6398 [LET_TAC;\r
6399 REWRITE_TAC[INJ; SURJ; EXISTS_IN];\r
6400 STRIP_TAC;\r
6401 CONJ_TAC;\r
6402 REPEAT STRIP_TAC;\r
6403 EXPAND_TAC "f1";\r
6404 ASM_CASES_TAC` ?x. x IN X /\ (f: A -> B) x = x' `;\r
6405 ASM_REWRITE_TAC[];\r
6406 DOWN;\r
6407 MESON_TAC[];\r
6408 ASM_MESON_TAC[];\r
6409 REPEAT STRIP_TAC;\r
6410 EXISTS_TAC `(f: A -> B) x' `;\r
6411 EXPAND_TAC "f1";\r
6412 ASM_MESON_TAC[]]);;\r
6413 \r
6414 \r
6415 \r
6416 \r
6417 \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
6420 \r
6421 \r
6422 \r
6423 \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
6428 \r
6429 \r
6430 \r
6431 \r
6432 \r
6433 \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
6438 STRIP_TAC;\r
6439 FIRST_X_ASSUM NHANH;\r
6440 REPEAT STRIP_TAC;\r
6441 EXPAND_TAC "v";\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
6445 STRIP_TAC;\r
6446 UNDISCH_TAC` ~(V:real^3 -> bool = {} )`;\r
6447 FIRST_ASSUM (SUBST1_TAC o SYM);\r
6448 \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
6456 STRIP_TAC;\r
6457 UNDISCH_TAC` ITER u (rho_node1 FF) v IN V`;\r
6458 UNDISCH_TAC` local_fan (V,E,FF)`;\r
6459 PHA;\r
6460 NHANH IVS_RHO_IDD;\r
6461 SIMP_TAC[];\r
6462 REWRITE_TAC[GSYM ITER];\r
6463 FIRST_X_ASSUM (SUBST1_TAC o SYM);\r
6464 ASM_REWRITE_TAC[]]);;\r
6465 \r
6466 \r
6467 \r
6468 \r
6469 \r
6470 \r
6471 \r
6472 \r
6473 let FIRST_EQ0_LAST_LT_PI = prove_by_refinement\r
6474 (`convex_local_fan (V,E,FF) /\\r
6475  v0 IN V /\\r
6476  CARD V = k /\\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
6479  ==> bta 1 = &0 /\\r
6480      bta (k - 1) <= pi `,\r
6481 [REWRITE_TAC[convex_local_fan];\r
6482 NHANH ITER_CARD_MINUS1_EQ_IVS_RN1;\r
6483 STRIP_TAC;\r
6484 DOWN;\r
6485 DOWN;\r
6486 ONCE_REWRITE_TAC[GSYM EQ_SYM_EQ];\r
6487 SIMP_TAC[];\r
6488 REPEAT STRIP_TAC;\r
6489 REWRITE_TAC[ITER12; AZIM_REFL];\r
6490 REWRITE_TAC[ITER12];\r
6491 EXPAND_TAC "k";\r
6492 ASM_SIMP_TAC[];\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
6495 DOWN;\r
6496 REWRITE_TAC[interior_angle1; ivs_rho_node1]]);;\r
6497 \r
6498 \r
6499 \r
6500 \r
6501 \r
6502 \r
6503 \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
6506 [EQ_TAC;\r
6507 REWRITE_TAC[Wrgcvdr_cizmrrh.PROJECT_EQ_VEC0_IMP_PARALLED];\r
6508 STRIP_TAC;\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
6512 DOWN;\r
6513 SIMP_TAC[GSYM DOT_EQ_0; DOT_LMUL; REAL_FIELD` ~( x = &0) ==> (a * x ) / x = a `; VECTOR_SUB_REFL; DOT_LZERO]]);;\r
6514 \r
6515 \r
6516 \r
6517 \r
6518 \r
6519 \r
6520 \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
6529 \r
6530 \r
6531 \r
6532 \r
6533 \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
6538 \r
6539 \r
6540 \r
6541 \r
6542 \r
6543 \r
6544 \r
6545 \r
6546 \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
6556 \r
6557 \r
6558 \r
6559 \r
6560 \r
6561 \r
6562 \r
6563 \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
6571 STRIP_TAC;\r
6572 SUBGOAL_THEN` v, rho_node1 FF v IN FF` ASSUME_TAC;\r
6573 DOWN;\r
6574 ASM_REWRITE_TAC[];\r
6575 DOWN;\r
6576 UNDISCH_TAC` local_fan (V,E,FF)`;\r
6577 PHA;\r
6578 NHANH DETERMINE_WEDGE_IN_FAN;\r
6579 FIRST_X_ASSUM NHANH;\r
6580 STRIP_TAC;\r
6581 UNDISCH_TAC` V SUBSET wedge_in_fan_ge (v,rho_node1 FF v) E `;\r
6582 REWRITE_TAC[SUBSET];\r
6583 STRIP_TAC;\r
6584 FIRST_ASSUM NHANH;\r
6585 ASM_REWRITE_TAC[wedge_ge; IN_ELIM_THM];\r
6586 SIMP_TAC[]]);;\r
6587 \r
6588 \r
6589 \r
6590 \r
6591 \r
6592 \r
6593 \r
6594 \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
6601 STRIP_TAC;\r
6602 SUBGOAL_THEN` v, rho_node1 FF v IN FF` ASSUME_TAC;\r
6603 DOWN;\r
6604 REMOVE_TAC;\r
6605 DOWN;\r
6606 ASM_REWRITE_TAC[];\r
6607 DOWN;\r
6608 UNDISCH_TAC` local_fan (V,E,FF)`;\r
6609 PHA;\r
6610 NHANH LOFA_DETERMINE_AZIM_IN_FA;\r
6611 FIRST_X_ASSUM NHANH;\r
6612 DOWN;\r
6613 FIRST_X_ASSUM NHANH;\r
6614 REPEAT STRIP_TAC;\r
6615 ASM_REAL_ARITH_TAC]);;\r
6616 \r
6617 \r
6618 \r
6619 \r
6620 \r
6621 \r
6622 \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
6631 \r
6632 \r
6633 \r
6634 \r
6635 \r
6636 \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
6641 \r
6642 \r
6643 \r
6644 \r
6645 \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
6649 \r
6650 \r
6651 \r
6652 \r
6653 \r
6654 \r
6655 \r
6656 \r
6657 \r
6658 \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
6666 \r
6667 \r
6668 \r
6669 let VECTOR_ADD_LDISTRIB1 = CONJ VECTOR_ADD_LDISTRIB VECTOR_MUL_ASSOC;;\r
6670 \r
6671 \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
6676 NHANH AFF_GT_2_1;\r
6677 STRIP_TAC;\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
6682 REPEAT STRIP_TAC;\r
6683 EXISTS_TAC` ( -- t3 ) / ( -- t3 + t3') % (a:real^N) + t3' / ( --t3 + t3') % b `;\r
6684 CONJ_TAC;\r
6685 EXISTS_TAC` --t3 / (--t3 + t3') `;\r
6686 EXISTS_TAC` t3' / ( -- t3 + t3' )`;\r
6687 REWRITE_TAC[ GSYM Geomdetail.SUM_TWO_RATIO];\r
6688 CONJ_TAC;\r
6689 MATCH_MP_TAC REAL_LT_DIV;\r
6690 UNDISCH_TAC` t3 < &0 `;\r
6691 UNDISCH_TAC` &0 < t3' `;\r
6692 PHA;\r
6693 REAL_ARITH_TAC;\r
6694 \r
6695 CONJ_TAC;\r
6696 MATCH_MP_TAC REAL_LT_DIV;\r
6697 UNDISCH_TAC` t3 < &0 `;\r
6698 UNDISCH_TAC` &0 < t3' `;\r
6699 PHA;\r
6700 REAL_ARITH_TAC;\r
6701 \r
6702 \r
6703 UNDISCH_TAC` t3 < &0 `;\r
6704 UNDISCH_TAC` &0 < t3' `;\r
6705 PHA;\r
6706 REAL_ARITH_TAC;\r
6707 \r
6708 \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
6715 \r
6716 \r
6717 \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
6720 REWRITE_TAC[];\r
6721 \r
6722 \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
6733       t2 * t3' +\r
6734       --t2' * t3 `];\r
6735 REPEAT STRIP_TAC;\r
6736 MATCH_MP_TAC REAL_MUL_RINV;\r
6737 ASM_REAL_ARITH_TAC]);;\r
6738 \r
6739 \r
6740 \r
6741 \r
6742 let DISJOINT_DOUBLE_SING = SET_RULE` DISJOINT {a} {b} <=> ~( a = b ) `;;\r
6743 \r
6744 \r
6745 \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
6752 STRIP_TAC;\r
6753 EXISTS_TAC `&1 `;\r
6754 ASM_REWRITE_TAC[REAL_ARITH` &0 <= &1 `];\r
6755 CONV_TAC VECTOR_ARITH;\r
6756 STRIP_TAC;\r
6757 EXISTS_TAC` t:real`;\r
6758 ASM_REWRITE_TAC[VECTOR_ADD_SYM];\r
6759 DOWN;\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
6763 EQ_TAC;\r
6764 STRIP_TAC;\r
6765 ASM_CASES_TAC` &0 <= &1 - t`;\r
6766 DISJ1_TAC;\r
6767 EXISTS_TAC` &1 - t `;\r
6768 ASM_REWRITE_TAC[REAL_ARITH` a - ( a - b ) = b `];\r
6769 DISJ2_TAC;\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
6775 \r
6776 \r
6777 \r
6778 \r
6779 \r
6780 \r
6781 let INTER_UNION_EMPTY = SET_RULE` X INTER (A UNION B) = {} <=>\r
6782 X INTER A = {} /\ X INTER B = {}`\r
6783 \r
6784 \r
6785 \r
6786 \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
6791 \r
6792 \r
6793 \r
6794 \r
6795 \r
6796 let MONO_AZIM_AS_BTA_I = prove_by_refinement\r
6797 (`convex_local_fan (V,E,FF) /\\r
6798  v0 IN V /\\r
6799  CARD V = k /\\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
6804 [STRIP_TAC;\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
6808 REPEAT STRIP_TAC;\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
6814 STRIP_TAC;\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
6817 STRIP_TAC;\r
6818 FIRST_X_ASSUM MP_TAC;\r
6819 SWITCH_TAC` ~( vec 0 = v0:real^3 )`;\r
6820 DISCH_THEN ASSUME_TAC2;\r
6821 DOWN;\r
6822 STRIP_TAC;\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
6825 STRIP_TAC;\r
6826 FIRST_X_ASSUM ASSUME_TAC2;\r
6827 DOWN THEN STRIP_TAC;\r
6828 DOWN_TAC;\r
6829 REWRITE_TAC[VECTOR_SUB_RZERO];\r
6830 STRIP_TAC;\r
6831 \r
6832 \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
6836 PHA;\r
6837 EXPAND_TAC "v0";\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
6843 STRIP_TAC;\r
6844 \r
6845 \r
6846 \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
6853 CONJ_TAC;\r
6854 FIRST_X_ASSUM MATCH_MP_TAC;\r
6855 FIRST_ASSUM ACCEPT_TAC;\r
6856 \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
6861 SIMP_TAC[];\r
6862 \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
6865 \r
6866 ASSUME_TAC2 (SPECL [` r1': real`;` r1: real`;` psi': real`; `psi:real` ]\r
6867  Trigonometry2.R_POS_SIN_COS_IDENT);\r
6868 DOWN;\r
6869 REWRITE_TAC[Trigonometry2.SIN_COS_IDEN_IFF_DIFFER_PERS];\r
6870 STRIP_TAC;\r
6871 \r
6872 \r
6873 \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
6880 \r
6881 DOWN;\r
6882 SUBGOAL_THEN` convex_local_fan (V,E,FF) ` MP_TAC;\r
6883 ASM_REWRITE_TAC[convex_local_fan];\r
6884 \r
6885 \r
6886 \r
6887 \r
6888 \r
6889 PHA;\r
6890 NHANH IN_V_IMP_AZIM_LESS_PI;\r
6891 STRIP_TAC;\r
6892 UNDISCH_TAC` v0:real^3 IN V`;\r
6893 FIRST_ASSUM NHANH;\r
6894 \r
6895 \r
6896 \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
6903 \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
6907 \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
6910 EXPAND_TAC "v0";\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
6914 STRIP_TAC;\r
6915 DOWN;\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
6921 \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
6925 \r
6926 \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
6931 \r
6932 \r
6933 \r
6934 \r
6935 \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
6941 \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
6945 \r
6946 \r
6947 \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
6953 \r
6954 \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
6958 STRIP_TAC;\r
6959 ASSUME_TAC2 (SPEC `v0: real^3 ` (GEN `v:real^3 ` LOFA_IMP_DIS_ELMS23));\r
6960 \r
6961 FIRST_ASSUM (MP_TAC o (SPECL [`0`;` i:num`]));\r
6962 \r
6963 PHA;\r
6964 ANTS_TAC;\r
6965 ASM_REWRITE_TAC[ARITH_RULE` 0 < i <=> ~( i = 0 ) `];\r
6966 UNDISCH_TAC` i + 1 < k `;\r
6967 ARITH_TAC;\r
6968 \r
6969 \r
6970 \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
6975 SIMP_TAC[ITER];\r
6976 \r
6977 \r
6978 STRIP_TAC;\r
6979 UNDISCH_TAC` (vv:num -> real^3) i IN V `;\r
6980 UNDISCH_TAC` local_fan (V,E,FF) `;\r
6981 PHA;\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
6987 \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
6992 \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
6995 \r
6996 \r
6997 \r
6998 MP_TAC (SPEC` v0:real^3 ` (GEN` v:real^3 ` IN_V_IMP_AZIM_LESS_PI));\r
6999 ANTS_TAC;\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
7003 DISCH_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
7007 \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
7010 DOWN;\r
7011 SIMP_TAC[ITER12];\r
7012 \r
7013 \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
7018 \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
7022 \r
7023 PHA;\r
7024 NHANH (REAL_ARITH` &0 <= vb /\\r
7025  vb < &2 * pi /\\r
7026  &0 <= va /\\r
7027  va < &2 * pi /\\r
7028  vb <= pi /\\r
7029  va <= pi /\\r
7030  &0 <= sin (vb - va) ==> vb - va <= pi /\ -- pi <= vb - va `);\r
7031 STRIP_TAC;\r
7032 \r
7033 \r
7034 \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
7039 STRIP_TAC;\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
7046 REAL_ARITH_TAC;\r
7047 \r
7048 DOWN;\r
7049 REAL_ARITH_TAC;\r
7050 \r
7051 UNDISCH_TAC` &0 <= vb `;\r
7052 UNDISCH_TAC` va <= pi `;\r
7053 DOWN THEN PHA;\r
7054 REWRITE_TAC[REAL_ARITH` vb - va = --pi /\ va <= pi /\ &0 <= vb <=> \r
7055 vb = &0 /\ va = pi`];\r
7056 STRIP_TAC;\r
7057 \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
7060 PHA;\r
7061 NHANH AZIM_EQ_0_ALT;\r
7062 STRIP_TAC;\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
7065 PHA;\r
7066 NHANH AZIM_EQ_PI_ALT;\r
7067 STRIP_TAC;\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
7080 ASM_SIMP_TAC[];\r
7081 ASSUME_TAC2 (\r
7082 ISPECL [` vec 0: real^3`;` v0: real^3`;` (vv:num -> real^3) 1` ] Fan.th3a) ;\r
7083 \r
7084 REPEAT STRIP_TAC;\r
7085 ASSUME_TAC2 (\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
7088 DOWN;\r
7089 REWRITE_TAC[AFF_IN_TWO_PARTS; INTER_UNION_EMPTY; DE_MORGAN_THM];\r
7090 STRIP_TAC;\r
7091 ASSUME_TAC (ISPECL [`{vec 0:real^3}`;`{(vv: num -> real^3) (i + 1), vv i }`]\r
7092 \r
7093  (GEN_ALL CONV_SUBSET_AFF_GE));\r
7094 (* ****************** *)\r
7095 \r
7096 ASSUME_TAC (\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
7103 STRIP_TAC;\r
7104 DOWN;\r
7105 UNDISCH_TAC ` local_fan (V,E,FF)`;\r
7106 PHA;\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
7111 STRIP_TAC;\r
7112 DOWN THEN DOWN;\r
7113 FIRST_ASSUM (ASSUME_TAC o (ISPECL [`{v0:real^3}`;`{(vv: num -> real^3) i, \r
7114 vv (i + 1)}`]));\r
7115 STRIP_TAC;\r
7116 SUBGOAL_THEN `{v0: real^3} IN E UNION {{v} | v IN V}` MP_TAC;\r
7117 \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
7120 MESON_TAC[];\r
7121 \r
7122 \r
7123 REPEAT STRIP_TAC;\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
7128 ANTS_TAC;\r
7129 DOWN THEN DOWN;\r
7130 PHA;\r
7131 SIMP_TAC[IN_UNION];\r
7132 \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
7137 MESON_TAC[];\r
7138 \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
7144 PHA;\r
7145 SIMP_TAC[INSERT_COMM];\r
7146 NHANH (\r
7147 SET_RULE`a SUBSET b /\ b SUBSET c /\ x INTER c = S ==> x INTER a SUBSET S`);\r
7148 STRIP_TAC;\r
7149 DOWN;\r
7150 UNDISCH_TAC` ~(conv0 {vv (i + 1), vv i} INTER aff_ge {vec 0} {v0:real^3} = {})`;\r
7151 PHA;\r
7152 SIMP_TAC[INSERT_COMM; INTER_COMM; SET_RULE` ~( s = {}) /\ s SUBSET {x} <=> \r
7153 s = {x}`];\r
7154 \r
7155 NHANH (SET_RULE` A INTER B = {x} ==> x IN B`);\r
7156 NHANH CONV0_SUB_CONV;\r
7157 STRIP_TAC;\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
7162 DOWN;\r
7163 ASM_REWRITE_TAC[];\r
7164 \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
7170 \r
7171 \r
7172 \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
7179 STRIP_TAC;\r
7180 UNDISCH_TAC` dist (v0:real^3,vec 0) % (e3:real^3) IN V`;\r
7181 ASM_SIMP_TAC[];\r
7182 STRIP_TAC;\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
7185 PHA;\r
7186 SIMP_TAC[INSERT_COMM];\r
7187 CONV_TAC SET_RULE;\r
7188 \r
7189 STRIP_TAC;\r
7190 ASSUME_TAC2 KCHMAMG;\r
7191 DOWN THEN STRIP_TAC;\r
7192 \r
7193 \r
7194 \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
7200 ANTS_TAC;\r
7201 ASM_REWRITE_TAC[];\r
7202 UNDISCH_TAC` dist (v0:real^3,vec 0) % (e3:real^3) IN V`;\r
7203 ASM_SIMP_TAC[];\r
7204 STRIP_TAC;\r
7205 MATCH_MP_TAC SUBSET_TRANS;\r
7206 EXISTS_TAC`V:real^3 -> bool`;\r
7207 ASM_REWRITE_TAC[];\r
7208 EXPAND_TAC "U";\r
7209 REWRITE_TAC[SUBSET; IN_ELIM_THM];\r
7210 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;\r
7211 DOWN THEN DOWN;\r
7212 MESON_TAC[];\r
7213 \r
7214 \r
7215 \r
7216 DISCH_THEN (MP_TAC o (SPECL [`ITER i (rho_node1 FF) v0`;` i:num`]));\r
7217 ANTS_TAC;\r
7218 REWRITE_TAC[ARITH_RULE` a < a + 1 `];\r
7219 DISCH_THEN (MP_TAC o (SPEC` v0:real^3`));\r
7220 ANTS_TAC;\r
7221 EXPAND_TAC "U";\r
7222 ASM_REWRITE_TAC[IN_ELIM_THM];\r
7223 EXISTS_TAC`0`;\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
7227 \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
7233 STRIP_TAC;\r
7234 ONCE_REWRITE_TAC[CROSS_TRIPLE];\r
7235 ASM_REWRITE_TAC[CROSS_RADD; CROSS_RMUL; CROSS_REFL; CROSS_0; VECTOR_MUL_RZERO;\r
7236  VECTOR_ADD_LID];\r
7237 UNDISCH_TAC` v0 cross rho_node1 FF v0 = ee`;\r
7238 ASM_SIMP_TAC[DOT_LMUL];\r
7239 STRIP_TAC;\r
7240 MATCH_MP_TAC REAL_LT_MUL;\r
7241 ASM_REWRITE_TAC[DOT_POS_LT];\r
7242 EXPAND_TAC "ee";\r
7243 ASM_REWRITE_TAC[CROSS_EQ_0];\r
7244 DOWN;\r
7245 NHANH (REAL_ARITH` &0 < x ==> &0 <= x `);\r
7246 REWRITE_TAC[SIN_AZIM_POS_PI_LT];\r
7247 PHA;\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
7251 STRIP_TAC;\r
7252 DOWN;\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
7255 STRIP_TAC;\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
7260 ASM_SIMP_TAC[];\r
7261 STRIP_TAC;\r
7262 SUBGOAL_THEN` &0 < ee dot (ee:real^3)` MP_TAC;\r
7263 REWRITE_TAC[DOT_POS_LT];\r
7264 EXPAND_TAC "ee";\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
7269 \r
7270 \r
7271 \r
7272 \r
7273 \r
7274 \r
7275 \r
7276 let SUCCESSIVE_RHO_NODE1_AFF_LT = prove_by_refinement\r
7277 (`  local_fan (V,E,FF) /\\r
7278      v IN V /\\r
7279      {ITER n (rho_node1 FF) v | n <= l} = U /\\r
7280      plane P /\\r
7281      vec 0 IN P /\\r
7282      U SUBSET P\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
7285 [STRIP_TAC;\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
7288 GEN_TAC;\r
7289 FIRST_ASSUM (MP_TAC o (SPEC`i - 1 `));\r
7290 FIRST_ASSUM (MP_TAC o (SPEC`i:num `));\r
7291 REPEAT STRIP_TAC;\r
7292 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;\r
7293 FIRST_ASSUM (MP_TAC o (SPECL [`v:real^3`;` i:num`]));\r
7294 ANTS_TAC;\r
7295 FIRST_X_ASSUM ACCEPT_TAC;\r
7296 STRIP_TAC;\r
7297 ASSUME_TAC2 \r
7298 (SPEC` ITER i (rho_node1 FF) v ` \r
7299 (GEN` v: real^3` LOCAL_FAN_CHARACTER_OF_RHO_NODE2));\r
7300 DOWN;\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
7307 EXPAND_TAC "U";\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
7312 PHA;\r
7313 NHANH THREE_NOT_COLL_DETER_PLANE;\r
7314 STRIP_TAC;\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
7319 EXPAND_TAC "U";\r
7320 REWRITE_TAC[IN_ELIM_THM];\r
7321 EXISTS_TAC` i - 1 `;\r
7322 UNDISCH_TAC` i < l:num`;\r
7323 REWRITE_TAC[];\r
7324 CONV_TAC ARITH_RULE;\r
7325 \r
7326 DOWN;\r
7327 EXPAND_TAC "P";\r
7328 REWRITE_TAC[AFFINE_HULL_3; IN_ELIM_THM];\r
7329 STRIP_TAC;\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
7334       ==> &0 <\r
7335           (ITER i (rho_node1 FF) v cross ITER (i + 1) (rho_node1 FF) v) dot e`;\r
7336 DISCH_THEN NHANH;\r
7337 UNDISCH_TAC` i - 1 < l\r
7338       ==> &0 <\r
7339           (ITER (i - 1) (rho_node1 FF) v cross\r
7340            ITER (i - 1 + 1) (rho_node1 FF) v) dot\r
7341           e`;\r
7342 DISCH_THEN NHANH;\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
7346 STRIP_TAC;\r
7347 DOWN;\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
7352 REAL_ARITH_TAC;\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
7356 NHANH Fan.th3a;\r
7357 NHANH AFF_LT_2_1;\r
7358 SIMP_TAC[ITER; GSYM ADD1; IN_ELIM_THM];\r
7359 STRIP_TAC;\r
7360 EXISTS_TAC` u:real`;\r
7361 EXISTS_TAC` v': real`;\r
7362 EXISTS_TAC`w:real`;\r
7363 ASM_REWRITE_TAC[]]);;\r
7364 \r
7365 \r
7366 \r
7367 \r
7368 \r
7369 \r
7370 \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
7377 \r
7378 \r
7379 \r
7380 \r
7381 \r
7382 \r
7383 \r
7384 let TWO_SIDES_SUCESSIVE = prove_by_refinement\r
7385 (`  local_fan (V,E,FF) /\\r
7386      v IN V /\\r
7387      {ITER n (rho_node1 FF) v | n <= l} = U /\\r
7388      plane P /\\r
7389      vec 0 IN P /\\r
7390      U SUBSET P\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
7394 STRIP_TAC;\r
7395 FIRST_ASSUM NHANH;\r
7396 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;\r
7397 GEN_TAC;\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
7407 \r
7408 \r
7409 \r
7410 \r
7411 \r
7412 \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
7421 \r
7422 \r
7423 \r
7424 \r
7425 \r
7426 \r
7427 \r
7428 let CNVX_IMP_INTERIOR_ANGLE_PI = prove_by_refinement\r
7429 (` convex_local_fan (V,E,FF) /\\r
7430      v IN V /\\r
7431      {ITER n (rho_node1 FF) v | n <= l} = U /\\r
7432      plane P /\\r
7433      vec 0 IN P /\\r
7434      U SUBSET P\r
7435 ==> ! i. 0 < i /\ i < l \r
7436          ==> interior_angle1 (vec 0) FF ( ITER i (rho_node1 FF) v) = pi `,\r
7437 [STRIP_TAC;\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
7441 GEN_TAC;\r
7442 DOWN THEN PHA;\r
7443 STRIP_TAC;\r
7444 DOWN THEN DOWN THEN PHA;\r
7445 FIRST_ASSUM NHANH;\r
7446 ONCE_REWRITE_TAC[INTER_COMM];\r
7447 STRIP_TAC;\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
7457 STRIP_TAC;\r
7458 ASSUME_TAC2 (ARITH_RULE`0 < i ==> i - 1 + 1 = i`);\r
7459 DOWN;\r
7460 SIMP_TAC[Collect_geom.PER_SET2];\r
7461 DOWN;\r
7462 NHANH Fan.th3c;\r
7463 SIMP_TAC[Collect_geom.PER_SET2];\r
7464 REPEAT STRIP_TAC;\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
7470 SET_TAC[];\r
7471 \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
7481 DOWN_TAC;\r
7482 SIMP_TAC[Collect_geom.PER_SET2];\r
7483 STRIP_TAC;\r
7484 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITER;\r
7485 CONJ_TAC;\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
7491 EXPAND_TAC "u";\r
7492 EXPAND_TAC "vv";\r
7493 EXPAND_TAC "w";\r
7494 SIMP_TAC[];\r
7495 \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
7502 EXPAND_TAC "U";\r
7503 EXPAND_TAC "u";\r
7504 EXPAND_TAC "vv";\r
7505 EXPAND_TAC "w";\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
7509 MESON_TAC[];\r
7510 SIMP_TAC[]]);;\r
7511 \r
7512 \r
7513 let INSERT_UNION2 = SET_RULE` (x INSERT S) UNION U = S UNION (x INSERT U)`;;\r
7514 \r
7515 \r
7516 \r
7517 \r
7518 let EGHNAVX = prove_by_refinement\r
7519 (`convex_local_fan (V,E,FF) /\\r
7520  v0 IN V /\\r
7521  CARD V = k /\\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
7525  ==> bta 1 = &0 /\\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
7535 STRIP_TAC;\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
7541 \r
7542 CONJ_TAC;\r
7543 STRIP_TAC;\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
7546 REPEAT STRIP_TAC;\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
7551 \r
7552 DISCH_THEN (MP_TAC o (SPECL [`k': num`;` i: num`]));\r
7553 ANTS_TAC;\r
7554 ASM_REWRITE_TAC[];\r
7555 UNDISCH_TAC` k' <= i:num`;\r
7556 UNDISCH_TAC` ~( k' = i:num)`;\r
7557 PHA;\r
7558 ARITH_TAC;\r
7559 \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
7563 \r
7564 ASM_REWRITE_TAC[];\r
7565 REAL_ARITH_TAC;\r
7566 \r
7567 \r
7568 \r
7569 \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
7573 PHA;\r
7574 ANTS_TAC;\r
7575 ASM_REWRITE_TAC[];\r
7576 UNDISCH_TAC` k' <= i:num`;\r
7577 UNDISCH_TAC` i < k:num`;\r
7578 ARITH_TAC;\r
7579 \r
7580 REWRITE_TAC[ITER];\r
7581 DOWN;\r
7582 SUBGOAL_THEN` rho_node1 FF v0 = ITER 1 (rho_node1 FF) v0` MP_TAC;\r
7583 REWRITE_TAC[ITER12];\r
7584 ASM_SIMP_TAC[];\r
7585 \r
7586 \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
7589 DOWN THEN DOWN;\r
7590 ASM_REWRITE_TAC[];\r
7591 REPEAT STRIP_TAC;\r
7592 UNDISCH_TAC` !v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v:real^3}`;\r
7593 STRIP_TAC;\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
7597 \r
7598 NHANH (GSYM AZIM_EQ_0_ALT);\r
7599 SIMP_TAC[];\r
7600 ASM_REWRITE_TAC[];\r
7601 \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
7606 STRIP_TAC;\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
7616 CONJ_TAC;\r
7617 REWRITE_TAC[INSERT_UNION2; UNION_EMPTY];\r
7618 \r
7619 DOWN;\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
7624 \r
7625 CONJ_TAC;\r
7626 REWRITE_TAC[INSERT_UNION2; UNION_EMPTY];\r
7627 MESON_TAC[Trigonometry2.IN_P_HULL_INSERT; INSERT_COMM];\r
7628 \r
7629 \r
7630 REWRITE_TAC[SUBSET; IN_ELIM_THM];\r
7631 REPEAT STRIP_TAC;\r
7632 ASM_CASES_TAC` n = 0 `;\r
7633 ASM_REWRITE_TAC[];\r
7634 \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
7638 \r
7639 \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
7644 DOWN;\r
7645 ARITH_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
7648 DISCH_THEN NHANH;\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
7651 DISCH_THEN NHANH;\r
7652 SIMP_TAC[INSERT_UNION2; UNION_EMPTY];\r
7653 \r
7654 \r
7655 \r
7656 \r
7657 \r
7658 \r
7659 \r
7660 STRIP_TAC;\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
7663 REPEAT STRIP_TAC;\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
7670 STRIP_TAC;\r
7671 FIRST_ASSUM (MP_TAC o (SPECL [`i:num`;` n:num`]));\r
7672 ANTS_TAC;\r
7673 ASM_ARITH_TAC;\r
7674 FIRST_ASSUM (MP_TAC o (SPECL [`n:num`;`k - 1`]));\r
7675 ANTS_TAC;\r
7676 ASM_ARITH_TAC;\r
7677 ASM_REWRITE_TAC[];\r
7678 REAL_ARITH_TAC;\r
7679 \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
7684 PHA;\r
7685 ANTS_TAC;\r
7686 ASM_REWRITE_TAC[];\r
7687 ASM_ARITH_TAC;\r
7688 FIRST_ASSUM (MP_TAC o (SPECL [`0`;` k - 1`]));\r
7689 ANTS_TAC;\r
7690 ASM_REWRITE_TAC[];\r
7691 ASM_ARITH_TAC;\r
7692 ANTS_TAC;\r
7693 ASM_REWRITE_TAC[];\r
7694 ASM_ARITH_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
7702 REPEAT STRIP_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
7710 REPEAT STRIP_TAC;\r
7711 UNDISCH_TAC` !v. v IN V /\ ~(v = v0) ==> ~collinear {vec 0, v0, v:real^3}`;\r
7712 STRIP_TAC;\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
7718 \r
7719 \r
7720 UNDISCH_TAC` azim (vec 0) v0 (vv 1) x = azim (vec 0) v0 (vv 1) (vv (k - 1))`;\r
7721 ASM_SIMP_TAC[];\r
7722 \r
7723 \r
7724 \r
7725 \r
7726 \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
7733 ANTS_TAC;\r
7734 ASM_REWRITE_TAC[];\r
7735 \r
7736 FIRST_ASSUM (ASSUME_TAC2 o (SPECL [`v0:real^3`;`i:num`]));\r
7737 DOWN;\r
7738 FIRST_ASSUM SUBST1_TAC;\r
7739 SIMP_TAC[Trigonometry2.IN_P_HULL_INSERT];\r
7740 \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
7743 ANTS_TAC;\r
7744 MATCH_MP_TAC LT_TRANS;\r
7745 EXISTS_TAC `i:num`;\r
7746 ASM_REWRITE_TAC[];\r
7747 ANTS_TAC;\r
7748 ASM_REWRITE_TAC[];\r
7749 UNDISCH_TAC` i < k - 1`;\r
7750 ARITH_TAC;\r
7751 REWRITE_TAC[ITER];\r
7752 DOWN;\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
7760 DOWN THEN DOWN;\r
7761 MESON_TAC[];\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
7765 REPEAT STRIP_TAC;\r
7766 ASM_CASES_TAC` n = k - (i:num)`;\r
7767 ASM_REWRITE_TAC[];\r
7768 EXPAND_TAC "v00";\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
7773 DOWN;\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
7786 EXPAND_TAC "v00";\r
7787 REWRITE_TAC[ITER_ADD];\r
7788 ASM_REWRITE_TAC[];\r
7789 DOWN;\r
7790 UNDISCH_TAC` n <= k - (i:num)`;\r
7791 ARITH_TAC;\r
7792 STRIP_TAC THEN GEN_TAC;\r
7793 STRIP_TAC;\r
7794 FIRST_X_ASSUM (MP_TAC o (SPEC` j - (i:num)`));\r
7795 ANTS_TAC;\r
7796 DOWN THEN DOWN;\r
7797 ARITH_TAC;\r
7798 EXPAND_TAC "v00";\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
7803 \r
7804 \r
7805 \r
7806 \r
7807 \r
7808 \r
7809 \r
7810 \r
7811 end;;\r