Update from HH
[Flyspeck/.git] / text_formalization / local / local_lemmas1.hl
1
2 (* ============================================================= *)
3 (* ============================================================= *)
4 (* ============================================================= *)
5 (* =============================================================
6 #use "/home/user1/flyspeck/working/boot.hl";;
7 needs "/home/user1/flyspeck/working/local_lemmas1.hl";;
8    ============================================================= *)
9
10 (*
11
12 let build_sequence = 
13   ["general/sphere.hl";
14    "leg/geomdetail.hl";
15    "leg/affprops.hl";
16    "leg/cayleyR_def.hl";
17    "leg/enclosed_def.hl";
18    "leg/collect_geom.hl";
19 (* flyspeck_needs  "leg/collect_geom2.hl";*) (* slow and rarely needed *)
20
21   "jordan/refinement.hl"; 
22   "jordan/lib_ext.hl"; 
23   "jordan/hash_term.hl"; 
24   "jordan/parse_ext_override_interface.hl"; 
25   "jordan/goal_printer.hl"; 
26   "jordan/real_ext.hl";  
27   "jordan/tactics_jordan.hl"; 
28   "jordan/num_ext_nabs.hl";   
29   "jordan/taylor_atn.hl";
30   "jordan/float.hl"; 
31   "jordan/flyspeck_constants.hl";
32   "jordan/misc_defs_and_lemmas.hl"; 
33
34    "nonlinear/ineqdata3q1h.hl";
35    "nonlinear/ineq.hl";
36    "nonlinear/parse_ineq.hl";
37    "nonlinear/vukhacky_tactics.hl" ;
38
39    "trigonometry/trig1.hl";
40    "trigonometry/trig2.hl";
41    "nonlinear/compute_2158872499.hl"; (* need trig1.hl trig2.hl *)
42
43    "trigonometry/trigonometry.hl";
44    "trigonometry/delta_x.hl";
45    "trigonometry/euler_complement.hl";
46    "trigonometry/euler_multivariate.hl";
47    "trigonometry/euler_main_theorem.hl";
48
49    "volume/vol1.hl";
50    "hypermap/hypermap.hl";  (*  svn 1898 not compatible with other files *)
51
52    "fan/fan_defs.hl";
53    "fan/introduction.hl";
54    "fan/topology.hl";
55    "fan/fan_misc.hl";
56    "fan/planarity.hl";   (* svn 1717 -- 1792 has errors. Build fails. *)
57    "fan/polyhedron.hl";
58    "fan/HypermapAndFan.hl";
59    "fan/Conforming.hl";  
60
61    "packing/pack1.hl"; 
62    "packing/pack2.hl";
63    "packing/pack_defs.hl";
64    "packing/pack_concl.hl";
65    "packing/pack3.hl";  (* needs pack_defs.hl *)
66    "packing/Rogers.hl";
67
68    "packing/TARJJUW.hl"; (* weakly_saturated def. modified in svn 1912.  *)
69    "packing/TIWWFYQ.hl";
70    "packing/RHWVGNP.hl";
71    "packing/DRUQUFE.hl";
72    "packing/BBDTRGC_def.hl";
73    "packing/NOPZSEH_def.hl";
74    "packing/JNRJQSM_def.hl";
75    "packing/KHEJKCI.hl";
76    "packing/IDBEZAL.hl";
77    "packing/JJGTQMN_def.hl";
78    "packing/PHZVPFY_def.hl";
79
80    (* ky's stuff *)
81    "packing/beta_pair_thm.hl";
82    "packing/lemma_negligible.hl";
83
84
85  (*   "local/local_defs.hl"; *)
86    "local/WRGCVDR_CIZMRRH.hl";
87    "local/LVDUCXU.hl";
88    "local/LDURDPN.hl";
89    "local/LOCAL_LEMMAS.hl"];;
90
91 (* 1897 has an error Unbound value ivs_rho_node1*)
92
93 let build_all() =
94   (* (needs "Multivariate/flyspeck.ml"; *)
95    map flyspeck_needs build_sequence;;
96 build_all();;
97
98 *)
99
100 (* ============================================================== *)
101 (* ============================================================== *)
102 (* ============================================================== *)
103
104 module Local_lemmas1 = struct
105
106 open Ldurdpn;;
107 open Lvducxu;;
108 open Sphere;;
109 open Trigonometry1;;
110 open Trigonometry2;;
111 open Hypermap;;
112 open Fan;;
113 open Prove_by_refinement;;
114 open Wrgcvdr_cizmrrh;;
115 open Aff_sgn_tac;;
116 open Fan_misc;;
117 open Fan_defs;;
118 open Planarity;;
119 open Topology;;
120 open Local_lemmas;;
121
122
123 (* deprecated 2013-02-22:
124
125 let spherical_map = new_definition ` spherical_map (e1,e2,e3) (r,theta, phi) = 
126 (r * cos theta * sin phi) % e1 +
127 (r * sin theta * sin phi ) % e2 + (r * cos phi) % e3 `;;
128
129 ` spherical_coor v0 (e1,e2,e3) v = (dist (v0,v), azim v0 (v0 + e3) (v0 + e1) v, arcV v0 (v0 + e3) v)`;;
130
131 *)
132
133 let lunar_deform = new_definition ` lunar_deform (e1,e2,e3) t x = 
134 (norm x * cos (( &1 - t) * (azim (vec 0) e3 e1 x )) * sin (arcV (vec 0) e3 x)) % e1 +
135 (norm x * sin ( ( &1 - t ) * (azim (vec 0) e3 e1 x )) * sin (arcV (vec 0) e3 x)) % e2 +
136 (norm x * cos (arcV (vec 0) e3 x )) % e3`;;
137
138 let normize = new_definition` normize (v:real^N) = (&1 / norm v) % v`;;
139
140 let deformation = new_definition 
141 ` deformation ff V (a,b) <=> (&0) IN real_interval (a,b) /\
142 (! v r. v IN V /\ r IN real_interval (a,b) ==> (ff v) continuous atreal r) /\
143 (!v. v IN V ==> ff v (&0) = v )`;;
144
145 let localization = new_definition `localization (V, E) FF = (v_prime V FF, e_prime E FF) `;;
146
147
148
149 (* deprecated 2013-02-22:
150 let v_slice = new_definition ` v_slice f (v,w) = 
151 { ITER i f v | ! j. j < i ==> ~( ITER j f v = w ) }`;;
152
153
154 let e_slice = new_definition ` e_slice f (v,w) = 
155 {w,v} INSERT 
156 { {ITER i f v, ITER (i + 1) f v} | ! j. j < i + 1 ==> ~( ITER j f v = w)} `;;
157
158
159 let f_slice = new_definition ` f_slice f (v,w) = 
160 (w,v) INSERT
161 { (ITER i f v, ITER (i + 1) f v) | ! j. j < i + 1 ==> ~ (ITER j f v = w)} `;;
162 *)
163
164
165
166
167 let LUNAR_DEFORM_PRESERVE_NORM = prove(`orthonormal e1 e2 e3 ==>
168 norm (lunar_deform (e1,e2,e3) t x) = norm x `,
169 SIMP_TAC[NORM_EQ; lunar_deform; orthonormal; DOT_RADD; DOT_LADD; DOT_RMUL; 
170 DOT_LMUL; DOT_SYM; REAL_MUL_RZERO; Collect_geom.ZERO_NEUTRAL] THEN 
171 ABBREV_TAC` aa = ((&1 - t) * azim (vec 0) e3 e1 x) ` THEN 
172 ABBREV_TAC` bb = arcV (vec 0) e3 (x:real^3)` THEN REWRITE_TAC[
173 REAL_ARITH` (norm x * cos aa * sin bb) * (norm x * cos aa * sin bb) * &1 +
174      (norm x * sin aa * sin bb) * (norm x * sin aa * sin bb) * &1 +
175      (norm x * cos bb) * (norm x * cos bb) * &1 =
176 (norm x pow 2 ) * (sin bb pow 2 * ( sin aa pow 2 + cos aa pow 2 ) + cos bb pow 2 )`] THEN 
177 REWRITE_TAC[SIN_CIRCLE; REAL_MUL_RID; DOT_SQUARE_NORM]);;
178
179
180
181
182 let ACR_REFL = prove(` ~( u = v ) ==> arcV u v v = &0 `,
183 REWRITE_TAC[arcV; DOT_SQUARE_NORM; GSYM POW_2] THEN 
184 NHANH (NORM_ARITH` ~( u = v ) ==> ~(norm (v - u) = &0)`) THEN 
185 SIMP_TAC[REAL_FIELD` ~(x = &0) ==> x pow 2 / x pow 2 = &1 `; ACS_1]);;
186
187
188
189
190 let ARC_OPPOSITE = prove(` ~(u = v) ==> arcV u v (&2 % u - v ) = pi `,
191 REWRITE_TAC[arcV; VECTOR_ARITH` &2 % u - v - u = -- (v - u)`; DOT_RNEG;
192  NORM_NEG; DOT_SQUARE_NORM; GSYM POW_2] THEN 
193 NHANH (NORM_ARITH` ~(u = v) ==> ~( norm (v - u)= &0 )`) THEN 
194 SIMP_TAC[ACS_NEG_1; REAL_FIELD` ~( x = &0 ) ==> -- ( x pow 2) / ( x pow 2 ) = -- &1 `]);;
195
196
197
198
199
200
201 let ARCV_EQ_0 = prove(` ~(u = v) /\ &0 < t ==> arcV u v (u + t % (v - u)) = &0`,
202 NHANH ACR_REFL THEN ONCE_REWRITE_TAC[Trigonometry2.ARCV_VEC0_FORM] THEN 
203 SIMP_TAC[VECTOR_ARITH`(a + b) - a:real^N = b`; GSYM
204  Trigonometry2.WHEN_K_POS_ARCV_STABLE]);;
205
206 let ARCV_EQ_0_ORIGIN = prove(`~( u = vec 0) /\ &0 < t ==> arcV (vec 0) u (t % u) = &0`,
207 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN NHANH ARCV_EQ_0 THEN 
208 SIMP_TAC[VECTOR_ARITH` vec 0 + t % (u - vec 0) = t % u`]);;
209
210
211 let ARCV_PI_OPPOSITE = prove(`~(u = v) /\ t < &0 ==> arcV u v (u + t % (v - u)) = pi`,
212 NHANH ARC_OPPOSITE THEN ONCE_REWRITE_TAC[Trigonometry2.ARCV_VEC0_FORM] THEN 
213 SIMP_TAC[VECTOR_ARITH`(a + b) - a:real^N = b`; VECTOR_ARITH` &2 % u - v - u = -- (v - u)`] THEN 
214 ONCE_REWRITE_TAC[VECTOR_ARITH` a % x = (-- a) % ( -- x)`] THEN 
215 SIMP_TAC[GSYM Trigonometry2.WHEN_K_POS_ARCV_STABLE; REAL_ARITH` t < &0 <=> &0 < -- t `]);;
216
217
218
219
220
221
222
223 let DOT_0_ARCV = prove(` (v - u) dot (w - u) = &0 ==> arcV u v w = pi / &2 `,
224 SIMP_TAC[arcV; Collect_geom.REAL_DIV_LZERO; ACS_0]);;
225
226 let ARCV_DEGENERATE = prove(` arcV u u v = pi / &2 /\ arcV u v u = pi / &2 `,
227 CONJ_TAC THENL [MATCH_MP_TAC DOT_0_ARCV THEN 
228 REWRITE_TAC[VECTOR_SUB_REFL; DOT_LZERO];
229 MATCH_MP_TAC DOT_0_ARCV THEN 
230 REWRITE_TAC[VECTOR_SUB_REFL; DOT_RZERO]]);;
231
232
233
234
235
236 let ARCV_DIRECTIONS = prove(`~( u = v) ==> 
237 (arcV u v (u + t % (v - u)) = &0 <=> &0 < t) /\
238 (arcV u v (u + t % (v - u)) = pi <=> t < &0)`,
239 ASM_CASES_TAC` t = &0` THENL [
240 ASM_REWRITE_TAC[REAL_LT_REFL; VECTOR_MUL_LZERO; VECTOR_ADD_RID; ARCV_DEGENERATE]
241 THEN STRIP_TAC THEN MP_TAC PI_NZ THEN REAL_ARITH_TAC;
242 DOWN THEN REWRITE_TAC[REAL_ARITH` ~(a = &0) <=> &0 < a \/ a < &0`] THEN 
243 MESON_TAC[ARCV_EQ_0; ARCV_PI_OPPOSITE; PI_NZ]]);;
244
245
246
247
248
249 let ARCV_ORI_DIRECTIONS = prove(` ~( v = vec 0) ==>
250 (arcV (vec 0) v (t % v) = &0 <=> &0 < t) /\
251          (arcV (vec 0) v (t % v) = pi <=> t < &0)`,
252 ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN NHANH ARCV_DIRECTIONS THEN 
253 SIMP_TAC[EQ_SYM_EQ; VECTOR_ADD_LID; VECTOR_SUB_RZERO]);;
254
255
256
257
258 let REAL_NEG_MUL_EQ = prove(` a < &0 ==> ( a * x < &0 <=> &0 < x ) /\
259 (&0 < a * x <=> x < &0)  `,
260 REWRITE_TAC[REAL_ARITH` a < &0 <=> &0 < -- a `; REAL_ARITH` -- ( a * x) = -- a * x `] THEN 
261 SIMP_TAC[REAL_LT_MUL_EQ] THEN 
262 ONCE_REWRITE_TAC[REAL_ARITH` a * b = -- a * -- b `] THEN 
263 SIMP_TAC[REAL_LT_MUL_EQ]);;
264
265
266
267
268
269 let NOT_EQ_0 = REAL_ARITH` ~( x = &0 ) <=> &0 < x \/ x < &0 `;;
270
271
272 let SIN_ARCV_EQ_0 = prove(` ~( u = v) /\ ~( t = &0) ==> sin (arcV u v (u + t % (v - u))) = &0`,
273 REWRITE_TAC[NOT_EQ_0] THEN STRIP_TAC THENL [
274 ASM_SIMP_TAC[ARCV_EQ_0; SIN_0];
275 ASM_SIMP_TAC[ARCV_PI_OPPOSITE; SIN_PI]]);;
276
277
278 let COLLINEAR_SIN_ARCV_0 = prove(` collinear {u,v,x} /\ ~(u = x) /\ ~(u = v) ==> sin (arcV u v (x:real^N)) = &0`,
279 REWRITE_TAC[Local_lemmas.collinear_fan22; AFF2; IN_ELIM_THM] THEN 
280 STRIP_TAC THENL [
281
282 ASM_REWRITE_TAC[] THEN UNDISCH_TAC` x = t % u + (&1 - t) % (v:real^N)` THEN 
283 ASM_CASES_TAC` t = &1 ` THENL [
284 ASM_REWRITE_TAC[REAL_SUB_REFL; VECTOR_ADD_RID; VECTOR_MUL_LZERO; VECTOR_MUL_LID];
285
286 REWRITE_TAC[VECTOR_ARITH` t % u + (&1 - t) % v = u + (&1 - t) % ( v - u)`] THEN 
287 STRIP_TAC THEN MATCH_MP_TAC SIN_ARCV_EQ_0 THEN 
288 ASM_REWRITE_TAC[REAL_ARITH` a - b = &0 <=> b = a`]];
289
290 DOWN THEN ASM_REWRITE_TAC[]]);;
291
292
293
294
295
296
297
298
299
300
301
302 let COLL_AFF_GT_2_1 = prove(`!x v w:real^N.
303            ~collinear {x, v, w}
304            ==> aff_gt {x, v} {w} =
305                {y | ?t1 t2 t3.
306                         &0 < t3 /\
307                         t1 + t2 + t3 = &1 /\
308                         y = t1 % x + t2 % v + t3 % w}`,
309 NHANH Fan.th3a THEN SIMP_TAC[AFF_GT_2_1]);;
310
311
312
313
314 let COLL_EQ_DEPENDENT = prove_by_refinement (
315 ` collinear {vec 0, x, y:real^N} <=> ? tx ty. ~( tx = &0 /\ ty = &0) /\ tx % x + ty % y = vec 0`,
316 [EQ_TAC;
317 REWRITE_TAC[COLLINEAR_LEMMA_ALT];
318 STRIP_TAC;
319 EXISTS_TAC` &1 `;
320 EXISTS_TAC` &0`;
321 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
322 REAL_ARITH_TAC;
323
324 EXISTS_TAC` -- (c:real)`;
325 EXISTS_TAC` &1 `;
326 ASM_REWRITE_TAC[VECTOR_MUL_LID; REAL_ARITH` ~( &1 = &0)`];
327 VECTOR_ARITH_TAC;
328
329 SPEC_TAC (`y:real^N`,`y:real^N`);
330 SPEC_TAC (`x:real^N`,`x:real^N`);
331 MATCH_MP_TAC (
332 MESON[]` (!x y tx ty. P x y tx ty ==> P y x ty tx) /\
333      (!x y. Q x y ==> Q y x) /\
334      (!x y tx ty. ~(ty = &0) /\ P x y tx ty ==> Q x y)
335      ==> ! x y. (?tx ty. ~(tx = &0 /\ ty = &0) /\ P x y tx ty)
336      ==> Q x y `);
337 SIMP_TAC[VECTOR_ADD_SYM; INSERT_COMM];
338 REWRITE_TAC[SIMP_RULE[INSERT_COMM] COLLINEAR_LEMMA_ALT];
339 REPEAT STRIP_TAC;
340 DISJ2_TAC;
341 EXISTS_TAC` ( -- tx ) / ty `;
342 DOWN;
343 NHANH_PAT`\x. x ==> y` (MESON[]` x = y ==> &1 / ty % x = &1 / ty % y`);
344 REWRITE_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; VECTOR_MUL_RZERO];
345 ASM_SIMP_TAC[REAL_FIELD` ~(x = &0) ==> &1 / x * x = &1 `; VECTOR_MUL_LID];
346 SIMP_TAC[VECTOR_ARITH` a + b = vec 0 <=> b = -- a `];
347 STRIP_TAC;
348 VECTOR_ARITH_TAC]);;
349
350
351
352
353
354
355
356
357 let NOT_COLL_ORTHONORMAL = prove_by_refinement (
358 ` ~ collinear {vec 0, x, y:real^N} ==> ?u. u IN aff {vec 0, x, y} /\
359  norm u = &1 /\ x dot u = &0 `,
360 [NHANH Fan.th3b;
361 REWRITE_TAC[COLL_EQ_DEPENDENT; NOT_EXISTS_THM; DE_MORGAN_THM];
362 STRIP_TAC;
363 EXISTS_TAC` normize  ((x dot y) % x + -- (x dot x) % (y:real^N))`;
364 REWRITE_TAC[aff; AFFINE_HULL_3; IN_ELIM_THM];
365 CONJ_TAC;
366 REWRITE_TAC[normize; Local_lemmas.VECTOR_ADD_LDISTRIB1; VECTOR_MUL_RZERO; 
367 VECTOR_ADD_LID];
368 MESON_TAC[REAL_ARITH`&1 - a + a = &1 `];
369
370 REWRITE_TAC[normize; GSYM Trigonometry2.NOT_VEC0_UNITABLE];
371 CONJ_TAC;
372 SUBGOAL_THEN` ~(x dot (x:real^N) = &0)` MP_TAC;
373 ASM_REWRITE_TAC[DOT_EQ_0];
374 ONCE_REWRITE_TAC[REAL_ARITH` a = &0 <=> -- a = &0`];
375 ASM_MESON_TAC[];
376
377 REWRITE_TAC[DOT_RADD; DOT_RMUL; REAL_ARITH` a * b + -- b * a = &0`; REAL_MUL_RZERO]]);;
378
379
380
381
382
383
384
385
386
387 let NORM1_NOT_0 = prove(` norm x = &1 ==> ~( x = vec 0) `,
388 NHANH (REAL_ARITH` x = &1 ==> &0 < x `) THEN SIMP_TAC[NORM_POS_LT]);;
389
390
391
392
393 let ARCV_DETER_DIRECTION = prove_by_refinement (
394 ` (x:real^N) = tu % u + ty % y /\ &0 < ty /\
395 ~( collinear {vec 0,  u, y}) /\ norm x = &1 /\ norm y = &1 /\
396 arcV (vec 0) u x = arcV (vec 0) u y ==> x = y`,
397 [NHANH NOT_COLL_ORTHONORMAL;
398 NHANH Fan.th3b;
399 NHANH NORM1_NOT_0;
400 STRIP_TAC;
401 MP_TAC (ISPECL [`u' :real^N`;` u:real^N` ] Rogers.IN_PLANE_NOT_COLLINEAR);
402 ANTS_TAC;
403 ASM_REWRITE_TAC[];
404 STRIP_TAC;
405
406 UNDISCH_TAC` u' IN aff {vec 0, u, y:real^N}`;
407 REWRITE_TAC[aff; AFFINE_HULL_3; IN_ELIM_THM];
408 STRIP_TAC;
409 ASM_CASES_TAC` w = &0`;
410 UNDISCH_TAC` u dot (u':real^N) = &0`;
411 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_MUL_LZERO; VECTOR_ADD_LID; 
412 VECTOR_ADD_RID; DOT_RMUL; REAL_ENTIRE; DOT_EQ_0];
413 DISCH_THEN SUBST_ALL_TAC;
414 UNDISCH_TAC` u' = u'' % vec 0 + &0 % u + w % (y:real^N)`;
415 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_MUL_LZERO; VECTOR_ADD_LID; 
416 VECTOR_ADD_RID];
417
418 UNDISCH_TAC`u' = u'' % vec 0 + v % u + w % (y:real^N) `;
419 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
420 ONCE_REWRITE_TAC[VECTOR_ARITH` a = u % x + (y:real^N) <=> y = ( -- u) % x + a`];
421 ABBREV_TAC` tt <=> x = (y:real^N)`;
422 ASM_SIMP_TAC[Ldurdpn.VECTOR_SCALE_CHANGE; VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC];
423 STRIP_TAC;
424 UNDISCH_TAC` x = tu % u + ty % (y:real^N)`;
425 ASM_SIMP_TAC[VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC; VECTOR_ARITH` a % x + b % x + c = (a + b) % x + c`];
426 ABBREV_TAC` x1 = tu + ty * &1 / w * --v `;
427 ABBREV_TAC` x2 = ty * &1 / w `;
428 STRIP_TAC;
429 UNDISCH_TAC` arcV (vec 0) u x = arcV (vec 0) u (y:real^N)`;
430 NHANH (MESON[]` a = b ==> cos a = cos b `);
431 SWITCH_TAC` ~(y:real^N = vec 0)`;
432 ASSUME_TAC2 (ISPEC`x:real^N` (GEN_ALL NORM1_NOT_0));
433 SWITCH_TAC` ~(x:real^N = vec 0)`;
434 SWITCH_TAC` x = x1 % u + x2 % (u':real^N)`;
435 SWITCH_TAC` (y:real^N) = (&1 / w * --v) % u + &1 / w % u'`;
436 ASM_SIMP_TAC[Trigonometry2.NOT_EQ_IMPCOS_ARC; VECTOR_SUB_RZERO; REAL_MUL_RID];
437
438 SUBGOAL_THEN` &0 < norm (u:real^N)` MP_TAC;
439 ASM_REWRITE_TAC[NORM_POS_LT];
440 SIMP_TAC[REAL_FIELD` &0 < x ==> (a / x = b / x <=> a = b )`];
441 EXPAND_TAC "x";
442 EXPAND_TAC "y";
443 REWRITE_TAC[DOT_RADD; DOT_RMUL];
444 ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_RID];
445
446
447
448 SIMP_TAC[NORM_POS_LT; GSYM DOT_EQ_0; REAL_EQ_MUL_RCANCEL];
449 REPEAT STRIP_TAC;
450 SUBGOAL_THEN` x  dot (x:real^N) = y dot (y:real^N)` MP_TAC;
451 ASM_REWRITE_TAC[DOT_SQUARE_NORM];
452
453
454 EXPAND_TAC "x";
455 EXPAND_TAC "y";
456 REWRITE_TAC[DOT_LADD; DOT_RADD; DOT_LMUL; DOT_RMUL];
457 ASM_REWRITE_TAC[DOT_SYM; REAL_MUL_RZERO; REAL_ADD_LID; REAL_ADD_RID;
458  REAL_ARITH` a + b = a + c <=> b = c`];
459 ASM_REWRITE_TAC[REAL_EQ_MUL_RCANCEL; REAL_RING`a * b * c = (a*b)*c`;
460  DOT_EQ_0];
461 REWRITE_TAC[REAL_ARITH` a * a = b * b <=> (a - b) * ( a + b ) = &0`; REAL_ENTIRE; REAL_SUB_0];
462 STRIP_TAC;
463 EXPAND_TAC "tt";
464 EXPAND_TAC "x";
465 EXPAND_TAC "y";
466 REPLICATE_TAC 2 (FIRST_X_ASSUM SUBST1_TAC);
467 REWRITE_TAC[];
468
469
470 DOWN;
471 EXPAND_TAC "x2";
472 REWRITE_TAC[REAL_ARITH` a * x + x = ( a + &1) * x `; REAL_ENTIRE];
473 ASM_SIMP_TAC[REAL_ARITH` &0 < a ==> ~( a + &1 = &0) `; REAL_FIELD` ~( x = &0)
474  ==> ~( &1 / x = &0) `]]);;
475
476
477
478
479
480
481
482
483 let NORM_NORMIZE = REWRITE_RULE[GSYM normize] Trigonometry2.NOT_VEC0_UNITABLE;;
484
485
486
487 let ARCV_EQ_IMP_NORMIZE = prove_by_refinement (
488 ` (x:real^N) IN aff_gt {vec 0, u} {y} /\ ~ collinear {vec 0, u, y} /\
489 arcV (vec 0) u x = arcV (vec 0) u y ==> normize x = normize y `,
490 [NHANH COLL_AFF_GT_2_1;
491 STRIP_TAC;
492 UNDISCH_TAC` x IN aff_gt {vec 0, u} {y:real^N} `;
493 ASM_REWRITE_TAC[IN_ELIM_THM; VECTOR_MUL_RZERO; VECTOR_ADD_LID];
494 NHANH_PAT`\x. x ==> y` (MESON[]` x = y ==> (&1 /norm x) % x = (&1 / norm x) % y `);
495 STRIP_TAC;
496 MP_TAC (ISPECL [`&1 `;` &1 / norm (y:real^N)`;`u:real^N`;` y:real^N`] COLLINEAR_SCALE_ALL);
497 SUBGOAL_THEN` &0 < norm (y:real^N) /\ &0 < norm (x:real^N)` ASSUME_TAC;
498 REWRITE_TAC[NORM_POS_LT];
499 UNDISCH_TAC` ~ collinear {vec 0, u, y:real^N}`;
500 NHANH Trigonometry2.NOT_COLLINEAR_IMP_2_UNEQUAL;
501 SIMP_TAC[];
502 REPEAT STRIP_TAC;
503 UNDISCH_TAC` x = t2 % u + t3 % (y:real^N)`;
504 ASM_REWRITE_TAC[];
505 ASSUME_TAC2 (REAL_ARITH` &0 < t3 ==> ~( t3 = &0) `);
506 ASM_MESON_TAC[COLL_EQ_DEPENDENT];
507
508
509 ANTS_TAC;
510 DOWN;
511 CONV_TAC REAL_FIELD;
512
513 SUBGOAL_THEN `&0 < &1 / norm (x:real^N) * t3 ` MP_TAC;
514 REWRITE_TAC[REAL_ARITH` &1 / a * b = b / a `];
515 MATCH_MP_TAC REAL_LT_DIV;
516 ASM_REWRITE_TAC[];
517
518
519
520 REWRITE_TAC[VECTOR_MUL_LID];
521 STRIP_TAC;
522 DISCH_THEN (ASSUME_TAC o SYM);
523 DOWN THEN DOWN THEN DOWN;
524 ONCE_REWRITE_TAC[Collect_geom.POS_EQ_INV_POS];
525 NHANH (ISPECL [`u:real^N`;` &1 / norm (v:real^N)`;`v:real^N`] (GEN_ALL
526  Trigonometry2.WHEN_K_POS_ARCV_STABLE));
527 REWRITE_TAC[GSYM Collect_geom.POS_EQ_INV_POS];
528 DOWN;
529 REWRITE_TAC[NORM_POS_LT; Trigonometry2.NOT_VEC0_UNITABLE; VECTOR_ADD_LDISTRIB;
530  VECTOR_MUL_ASSOC];
531 REPEAT STRIP_TAC;
532 REWRITE_TAC[normize];
533 MATCH_MP_TAC (GEN_ALL ARCV_DETER_DIRECTION);
534 EXISTS_TAC` (&1 / norm (x:real^N) * t2)`;
535 EXISTS_TAC` (&1 / norm (x:real^N) * t3) * (norm (y:real^N)) `;
536 EXISTS_TAC` u:real^N`;
537 FIRST_X_ASSUM (SUBST1_TAC o SYM);
538 ABBREV_TAC` nx = &1 / norm x % (x:real^N)`;
539 ABBREV_TAC` ny = &1 / norm y % (y:real^N)`;
540 SWITCH_TAC` x = t2 % u + t3 % (y:real^N)`;
541 SWITCH_TAC` nx = (&1 / norm (x:real^N) * t2) % u + (&1 / norm x * t3) % (y:real^N)`;
542 ASM_REWRITE_TAC[];
543
544 CONJ_TAC;
545 EXPAND_TAC "ny";
546 REWRITE_TAC[VECTOR_MUL_ASSOC; REAL_ARITH` (a*b)*c = a*b*c`];
547 SUBGOAL_THEN` norm (y:real^N) * &1 / norm y = &1 ` SUBST1_TAC;
548 MATCH_MP_TAC (REAL_FIELD` &0 < a ==> a * &1 / a = &1 `);
549 UNDISCH_TAC` norm (ny:real^N) = &1 `;
550 EXPAND_TAC "ny";
551 REWRITE_TAC[NORM_POS_LT; GSYM normize; NORM_NORMIZE];
552 ASM_REWRITE_TAC[REAL_MUL_RID];
553
554 CONJ_TAC;
555 MATCH_MP_TAC REAL_LT_MUL;
556 UNDISCH_TAC` norm (ny:real^N) = &1 `;
557 EXPAND_TAC "ny";
558 SIMP_TAC[NORM_POS_LT; GSYM normize; NORM_NORMIZE];
559 ASM_REWRITE_TAC[];
560 ASM_MESON_TAC[]]);;
561
562
563
564
565
566
567 let AZIM_AND_ARCV_EQ_IMP_PARA = prove_by_refinement  (
568 ` ~ collinear {v0,u,v} /\ azim v0 u v x = azim v0 u v y /\
569 arcV v0 u x = arcV v0 u y ==> y = v0 \/ (? t. &0 <= t /\ x - v0 = t % (y - v0)) `,
570 [ASM_CASES_TAC` collinear {v0,u,y:real^3}`;
571 ASM_SIMP_TAC[AZIM_DEGENERATE];
572 ASM_CASES_TAC` collinear {v0,u,x:real^3}`;
573 NHANH Fan.th3b;
574 NHANH (REWRITE_RULE[GSYM RIGHT_IMP_FORALL_THM]
575  Trigonometry2.NOT_EQ_IMP_AFF_AND_COLL3);
576 STRIP_TAC;
577 SWITCH_TAC` !u'. u' IN aff {v0, u} <=> collinear {v0, u, u':real^3}`;
578 UNDISCH_TAC` collinear {v0, u, y:real^3}`;
579 UNDISCH_TAC` collinear {v0, u, x:real^3}`;
580 ASM_REWRITE_TAC[Trigonometry2.AFF2; IN_ELIM_THM];
581 REPEAT STRIP_TAC;
582 ASM_REWRITE_TAC[VECTOR_ARITH` (t % v0 + (&1 - t) % u) - v0 = (&1 - t) % ( u - v0)`];
583
584 ASM_CASES_TAC` t' = &1 `;
585 DISJ1_TAC;
586 ASM_REWRITE_TAC[REAL_SUB_REFL; VECTOR_MUL_LZERO; VECTOR_MUL_LID; VECTOR_ADD_RID];
587
588
589 DISJ2_TAC;
590 EXISTS_TAC` ( &1 - t ) / ( &1 - t')`;
591 ASM_SIMP_TAC[VECTOR_MUL_ASSOC; REAL_FIELD` ~(t' = &1) ==> 
592 ((&1 - t) / (&1 - t')) * (&1 - t') = &1 - t `];
593 UNDISCH_TAC` arcV v0 u x = arcV v0 (u:real^3) y `;
594 ONCE_REWRITE_TAC[Trigonometry2.ARCV_VEC0_FORM];
595 ASM_REWRITE_TAC[VECTOR_ARITH` (t % v0 + (&1 - t) % u) - v0 = (&1 - t) % (u - v0)`];
596
597 ASSUME_TAC2 (REAL_FIELD` ~( t' = &1 ) ==> 
598 &1 - t = ((&1 - t)/ (&1 - t')) * ( &1 - t')`);
599 ABBREV_TAC` tt = (&1 - t) / (&1 - t') `;
600 ASM_REWRITE_TAC[];
601 ASSUME_TAC2 (REAL_ARITH`~( t' = &1 ) ==> &0 < &1 - t' \/ &1 - t' < &0 `);
602 FIRST_X_ASSUM DISJ_CASES_TAC;
603 SUBGOAL_THEN` arcV (vec 0) (u:real^3 - v0) ((&1 - t') % (u - v0)) = &0` SUBST1_TAC;
604 MATCH_MP_TAC ARCV_EQ_0_ORIGIN;
605 ASM_REWRITE_TAC[VECTOR_ARITH` a - b = vec 0 <=> b = a `];
606 UNDISCH_TAC` ~(v0 = u:real^3)`;
607 ONCE_REWRITE_TAC[VECTOR_ARITH`a = b <=> b - a = vec 0`];
608 SIMP_TAC[ARCV_ORI_DIRECTIONS];
609 STRIP_TAC;
610 UNDISCH_TAC` &0 < &1 - t'`;
611 SIMP_TAC[REAL_LT_MUL_EQ; REAL_LT_IMP_LE];
612 ASSUME_TAC2 (ISPECL [`&1 - t'`;` u:real^3`;`v0:real^3`] (GEN_ALL
613  ( ONCE_REWRITE_RULE[Trigonometry2.ARCV_VEC0_FORM] ARCV_PI_OPPOSITE)));
614 DOWN;
615 SIMP_TAC[VECTOR_ARITH`(a + b:real^N) - a = b `];
616 STRIP_TAC;
617 UNDISCH_TAC` ~( v0 = u:real^3)`;
618 ONCE_REWRITE_TAC[VECTOR_ARITH` a = b <=> b - a = vec 0`];
619 SIMP_TAC[ARCV_ORI_DIRECTIONS];
620 STRIP_TAC;
621 UNDISCH_TAC` &1 - t' < &0 `;
622 SIMP_TAC[ONCE_REWRITE_RULE[REAL_MUL_SYM] REAL_NEG_MUL_EQ; REAL_LT_IMP_LE];
623
624
625
626
627
628
629
630 UNDISCH_TAC` collinear {v0, u, y:real^3}`;
631 NHANH Fan.th3b;
632 ASM_CASES_TAC` y = v0:real^3`;
633 ASM_REWRITE_TAC[];
634
635
636 REPEAT STRIP_TAC;
637 SUBGOAL_THEN` sin (arcV v0 u (y:real^3)) = &0` MP_TAC;
638 MATCH_MP_TAC COLLINEAR_SIN_ARCV_0;
639 ASM_REWRITE_TAC[];
640 SUBGOAL_THEN` ~(sin (arcV v0 u (x:real^3)) = &0 )` MP_TAC;
641 MATCH_MP_TAC Trigonometry2.NOT_COLLINEAR_IMP_NOT_SIN0;
642 ASM_REWRITE_TAC[];
643 ASM_SIMP_TAC[];
644
645
646 ASM_CASES_TAC` x = v0:real^3`;
647 STRIP_TAC;
648 DISJ2_TAC;
649 EXISTS_TAC` &0 `;
650 ASM_REWRITE_TAC[REAL_LE_REFL; VECTOR_SUB_REFL; VECTOR_MUL_LZERO];
651
652
653 ASM_CASES_TAC` collinear {v0, u, x:real^3}`;
654 STRIP_TAC;
655 SUBGOAL_THEN` sin (arcV v0 u (x:real^3)) = &0` MP_TAC;
656 MATCH_MP_TAC COLLINEAR_SIN_ARCV_0;
657 ASM_REWRITE_TAC[];
658 MATCH_MP_TAC Fan.th3b;
659 EXISTS_TAC` v:real^3`;
660 FIRST_ASSUM ACCEPT_TAC;
661 UNDISCH_TAC` ~collinear {v0, u, y:real^3}`;
662 ASM_SIMP_TAC[Trigonometry2.NOT_COLLINEAR_IMP_NOT_SIN0];
663 STRIP_TAC;
664
665 ASSUME_TAC2 (ISPECL [`v0:real^3`;` u:real^3`;`v:real^3`; ` x:real^3`;`
666  y:real^3`] AZIM_EQ_ALT);
667 UNDISCH_TAC` ~collinear {v0, u, y:real^3}`;
668 NHANH COLL_AFF_GT_2_1;
669 STRIP_TAC;
670 DISJ2_TAC;
671 UNDISCH_TAC` azim v0 u v x = azim v0 u v (y:real^3)`;
672 ASM_REWRITE_TAC[IN_ELIM_THM; REAL_ARITH` a + b = &1 <=> a = &1 - b`];
673 STRIP_TAC;
674 DOWN;
675 ASM_REWRITE_TAC[VECTOR_ARITH` x = (&1 - (t2 + t3)) % v0 + t2 % u + t3 % y <=> 
676 x - v0 = t2 % ( u - v0) + t3 % (y - v0) `];
677 ABBREV_TAC` xx = x - v0:real^3`;
678 ABBREV_TAC` uu = u - v0:real^3 `;
679 ABBREV_TAC` yy = y - v0:real^3`;
680 STRIP_TAC;
681 EXISTS_TAC` t3:real`;
682
683 UNDISCH_TAC` arcV v0 u x = arcV v0 u (y:real^3)`;
684 NHANH (MESON[]`arcV v0 u x = arcV v0 u y ==> cos (arcV v0 u x) = cos (arcV v0 u y)`);
685 ASSUME_TAC2 (ISPECL [`v0:real^3`;`u:real^3`;` x:real^3`]
686  Collect_geom.NOT_COL3_IMP_DIFF);
687 ASSUME_TAC2 (ISPECL [`v0:real^3`;`u:real^3`;` y:real^3`]
688  Collect_geom.NOT_COL3_IMP_DIFF);
689 DOWN THEN DOWN;
690 REWRITE_TAC[DE_MORGAN_THM];
691 ASM_SIMP_TAC[Trigonometry2.NOT_EQ_IMPCOS_ARC];
692
693 STRIP_TAC THEN STRIP_TAC;
694 SUBGOAL_THEN` &0 < norm (xx:real^3) /\ &0 < norm (uu:real^3) /\
695 &0 < norm (yy:real^3)` MP_TAC;
696 REWRITE_TAC[NORM_POS_LT];
697 EXPAND_TAC "xx";
698 EXPAND_TAC "uu";
699 EXPAND_TAC "yy";
700 REWRITE_TAC[VECTOR_SUB_EQ];
701 ASM_REWRITE_TAC[];
702
703 REPEAT STRIP_TAC;
704 ASM_SIMP_TAC[REAL_LT_IMP_LE];
705
706 SUBGOAL_THEN` normize  (xx:real^3) = normize  (yy:real^3)` MP_TAC;
707 MATCH_MP_TAC (GEN_ALL ARCV_EQ_IMP_NORMIZE);
708 EXISTS_TAC` uu:real^3`;
709 CONJ_TAC;
710 UNDISCH_TAC` ~collinear {v0, u, y:real^3}`;
711 ONCE_REWRITE_TAC[Trigonometry2.COLLINEAR_TRANSABLE];
712 NHANH_PAT`\x. x ==> y` COLL_AFF_GT_2_1;
713 ASM_SIMP_TAC[];
714 STRIP_TAC;
715 REWRITE_TAC[IN_ELIM_THM];
716 EXISTS_TAC` t1:real`;
717 EXISTS_TAC` t2:real`;
718 EXISTS_TAC` t3:real`;
719 ASM_REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
720 REAL_ARITH_TAC;
721
722 UNDISCH_TAC` ~ collinear {v0, u, y:real^3}`;
723 UNDISCH_TAC` arcV v0 u x = arcV v0 u (y:real^3)`;
724 ONCE_REWRITE_TAC[Trigonometry2.ARCV_VEC0_FORM];
725 ONCE_REWRITE_TAC[Trigonometry2.COLLINEAR_TRANSABLE];
726 ASM_SIMP_TAC[VECTOR_SUB_RZERO];
727
728
729
730 ASM_REWRITE_TAC[normize; VECTOR_ADD_LDISTRIB; VECTOR_MUL_ASSOC];
731 ONCE_REWRITE_TAC[VECTOR_ARITH` a + x % b = y % b <=> a + (x - y) % b = vec 0`];
732
733 ASM_CASES_TAC` ~( (&1 / norm (t2 % uu + t3 % (yy:real^3)) * t2) = &0)`;
734 STRIP_TAC;
735 SUBGOAL_THEN` collinear {vec 0, uu, yy:real^3}` MP_TAC;
736 REWRITE_TAC[COLL_EQ_DEPENDENT];
737 DOWN THEN DOWN THEN MESON_TAC[];
738
739
740
741 UNDISCH_TAC` ~ collinear {v0, u, y:real^3}`;
742 ONCE_REWRITE_TAC[Trigonometry2.COLLINEAR_TRANSABLE];
743 ASM_SIMP_TAC[VECTOR_SUB_RZERO];
744
745
746
747 DOWN;
748 SIMP_TAC[REAL_ENTIRE];
749 ASSUME_TAC2 (REAL_FIELD` &0 < norm (xx:real^3) ==> ~( &1 / norm xx = &0) `);
750 DOWN;
751 ASM_SIMP_TAC[VECTOR_MUL_LZERO; REAL_SUB_REFL; VECTOR_ADD_LID]]);;
752
753
754
755
756
757
758
759 let NORM_CAUCHY_SCHWARZ_FRAC2 = prove(` -- &1 <= (u dot v) / (norm u * norm v) /\
760              (u dot v) / (norm u * norm (v:real^N)) <= &1 `,
761 ASM_CASES_TAC`~((u:real^N) = vec 0) /\ ~((v: real^N) = vec 0)` THEN 
762 ASM_SIMP_TAC[Trigonometry1.NORM_CAUCHY_SCHWARZ_FRAC] THEN 
763 DOWN THEN REWRITE_TAC[DE_MORGAN_THM] THEN STRIP_TAC THENL [
764 ASM_REWRITE_TAC[DOT_LZERO] THEN REAL_ARITH_TAC;
765 ASM_REWRITE_TAC[DOT_RZERO] THEN REAL_ARITH_TAC]);;
766
767
768 let COS_ARCV_EQ_ARCV = prove(
769 ` cos (arcV x y z) = cos (arcV xx yy zz) <=> arcV x y z = arcV xx yy zz `,
770 EQ_TAC THENL [REWRITE_TAC[arcV] THEN STRIP_TAC THEN MATCH_MP_TAC COS_INJ_PI THEN 
771 DOWN THEN MESON_TAC[ACS_BOUNDS; NORM_CAUCHY_SCHWARZ_FRAC2];SIMP_TAC[]]);;
772
773
774
775 let ARCV_BOUNDS = prove(` &0 <= arcV (x:real^N) y z /\ arcV x y z <= pi `,
776 REWRITE_TAC[arcV] THEN MATCH_MP_TAC ACS_BOUNDS THEN 
777 REWRITE_TAC[NORM_CAUCHY_SCHWARZ_FRAC2]);;
778
779
780
781
782
783 let SIN_ARCV_EQ_0_EQ_LAP = prove(
784 `  sin (arcV x y (z:real^N)) = &0 <=> arcV x y z = &0 \/ arcV x y z = pi `,
785 MP_TAC ARCV_BOUNDS THEN MP_TAC PI_POS THEN 
786 MESON_TAC[REAL_ARITH` &0 < x /\ &0 <= a ==> -- x < a`; Trigonometry1.SIN_NEGPOS_PI]);;
787
788
789
790
791
792
793 let ORTHONORMAL_NOT_COLLINEAR = prove(
794 ` orthonormal e1 e2 e3 ==> ~ collinear {vec 0, e3, e1} `,
795 REWRITE_TAC[orthonormal; GSYM CROSS_EQ_0] THEN 
796 ONCE_REWRITE_TAC[GSYM CROSS_TRIPLE] THEN REPEAT STRIP_TAC THEN 
797 FIRST_X_ASSUM SUBST_ALL_TAC THEN DOWN THEN 
798 REWRITE_TAC[DOT_LZERO; REAL_LT_REFL]);;
799
800
801
802
803 let LUNAR_DEFORM_INJ = prove_by_refinement (
804 ` orthonormal e1 e2 e3 /\ &0 <= t /\ t < &1 ==> 
805 (! x y. lunar_deform (e1,e2,e3) t x = lunar_deform (e1,e2,e3) t y ==> x = y )`,
806 [REPEAT STRIP_TAC;
807 ASM_CASES_TAC` (x:real^3)  = vec 0`;
808 ASSUME_TAC2 (SPEC` y:real^3 ` (GEN `x:real^3 ` LUNAR_DEFORM_PRESERVE_NORM));
809 ASSUME_TAC2 LUNAR_DEFORM_PRESERVE_NORM;
810 DOWN;
811 DOWN;
812 ASM_SIMP_TAC[NORM_0; NORM_EQ_0];
813
814  
815 DOWN THEN DOWN;
816 NHANH_PAT`\a. a ==> b ` (MESON[]` a = b ==> norm a = norm b `);
817 ASM_SIMP_TAC[LUNAR_DEFORM_PRESERVE_NORM];
818 REWRITE_TAC[lunar_deform];
819 ASM_SIMP_TAC[ORTHONORMAL_IMP_INDEPENDENT_EXPLICIT; GSYM NORM_POS_LT];
820 REPEAT STRIP_TAC;
821 UNDISCH_TAC` norm (x:real^3) * cos (arcV (vec 0) e3 x) = norm y * cos (arcV (vec 0) e3 (y:real^3))`;
822 ASM_SIMP_TAC[REAL_EQ_MUL_LCANCEL; REAL_POS_NZ; COS_ARCV_EQ_ARCV];
823 STRIP_TAC;
824 ASM_CASES_TAC` sin (arcV (vec 0) e3 (x:real^3)) = &0`;
825 DOWN;
826
827
828 NHANH (REWRITE_RULE[CONTRAPOS_THM] Trigonometry2.NOT_COLLINEAR_IMP_NOT_SIN0);
829 ASM_REWRITE_TAC[];
830 NHANH (REWRITE_RULE[CONTRAPOS_THM] Trigonometry2.NOT_COLLINEAR_IMP_NOT_SIN0);
831 REWRITE_TAC[COLLINEAR_LEMMA_ALT];
832 SUBGOAL_THEN` ~(e3:real^3 = vec 0) ` MP_TAC;
833 UNDISCH_TAC` orthonormal e1 e2 e3`;
834 REWRITE_TAC[orthonormal];
835 REPEAT STRIP_TAC;
836 FIRST_X_ASSUM SUBST_ALL_TAC;
837 UNDISCH_TAC` vec 0 dot (vec 0: real^3) = &1`;
838 REWRITE_TAC[DOT_LZERO];
839 REAL_ARITH_TAC;
840 SIMP_TAC[SIN_ARCV_EQ_0_EQ_LAP];
841 STRIP_TAC THEN STRIP_TAC;
842 REPEAT STRIP_TAC;
843 SUBGOAL_THEN` arcV (vec 0) e3 (x:real^3) = &0` MP_TAC;
844 ASM_REWRITE_TAC[];
845 UNDISCH_TAC` arcV (vec 0) e3 (y:real^3) = &0`;
846 PHA;
847 UNDISCH_TAC` ~( (e3:real^3) = vec 0) `;
848 DOWN THEN DOWN;
849 SIMP_TAC[ARCV_ORI_DIRECTIONS];
850 REPEAT STRIP_TAC;
851 UNDISCH_TAC` norm (x:real^3) = norm (y:real^3)`;
852 ASM_SIMP_TAC[NORM_MUL; Trigonometry2.LT_IMP_ABS_REFL; REAL_EQ_MUL_RCANCEL; NORM_EQ_0];
853
854 SUBGOAL_THEN` arcV (vec 0) e3 (x:real^3) = pi` MP_TAC;
855 ASM_REWRITE_TAC[];
856 UNDISCH_TAC` arcV (vec 0) e3 (y:real^3) = pi`;
857 PHA;
858 UNDISCH_TAC` ~( (e3:real^3) = vec 0) `;
859 DOWN THEN DOWN;
860 SIMP_TAC[ARCV_ORI_DIRECTIONS];
861 REPEAT STRIP_TAC;
862 UNDISCH_TAC` norm (x:real^3) = norm (y:real^3)`;
863 ASM_REWRITE_TAC[NORM_MUL];
864 ONCE_REWRITE_TAC[GSYM REAL_ABS_NEG];
865 DOWN THEN DOWN;
866 REWRITE_TAC[REAL_ARITH` a < &0 <=> &0 < -- a `];
867 ASM_SIMP_TAC[NORM_MUL; Trigonometry2.LT_IMP_ABS_REFL; REAL_EQ_MUL_RCANCEL; NORM_EQ_0];
868 SIMP_TAC[REAL_ARITH` -- a = -- b <=> a = b `];
869
870 UNDISCH_TAC` norm x *
871       sin ((&1 - t) * azim (vec 0) e3 e1 x) *
872       sin (arcV (vec 0) e3 x) =
873       norm y *
874       sin ((&1 - t) * azim (vec 0) e3 e1 y) *
875       sin (arcV (vec 0) e3 y)`;
876 UNDISCH_TAC` norm x *
877       cos ((&1 - t) * azim (vec 0) e3 e1 x) *
878       sin (arcV (vec 0) e3 x) =
879       norm y *
880       cos ((&1 - t) * azim (vec 0) e3 e1 y) *
881       sin (arcV (vec 0) e3 y)`;
882 DOWN;
883 ASM_SIMP_TAC[REAL_EQ_MUL_RCANCEL; REAL_EQ_MUL_LCANCEL; REAL_POS_NZ];
884 REPEAT STRIP_TAC;
885 SUBGOAL_THEN` (&1 - t) * azim (vec 0) e3 e1 x = (&1 - t) * azim (vec 0) e3 e1 y` MP_TAC;
886 MATCH_MP_TAC SIN_COS_INJ;
887 ASM_REWRITE_TAC[];
888 MATCH_MP_TAC (REAL_FIELD` &0 <= x /\ x < a /\ &0 <= y /\ y < a ==> abs ( x - y) < a `);
889 SPEC_TAC (`x:real^3`,`x:real^3`);
890 SPEC_TAC (`y:real^3`,`y:real^3`);
891
892 MATCH_MP_TAC (MESON[]`(! x. P x /\ L x ) ==> (! y x. P x /\ L x /\ P y /\ L y)`);
893 GEN_TAC;
894 CONJ_TAC;
895 MATCH_MP_TAC REAL_LE_MUL;
896 REWRITE_TAC[AZIM_RANGE];
897 UNDISCH_TAC` t < &1 ` THEN REAL_ARITH_TAC;
898 REWRITE_TAC[REAL_SUB_RDISTRIB; REAL_MUL_LID];
899 MATCH_MP_TAC (
900 REAL_FIELD` azim (vec 0) e3 e1 x' < &2 * pi /\ &0 <= t * azim (vec 0) e3 e1 x'
901 ==> azim (vec 0) e3 e1 x' - t * azim (vec 0) e3 e1 x' < &2 * pi`);
902 REWRITE_TAC[AZIM_RANGE];
903 MATCH_MP_TAC REAL_LE_MUL;
904 ASM_REWRITE_TAC[AZIM_RANGE];
905
906 ASM_SIMP_TAC[REAL_EQ_MUL_LCANCEL; REAL_ARITH` t < a ==> ~( a - t = &0)`];
907 ASSUME_TAC2 ORTHONORMAL_NOT_COLLINEAR;
908 STRIP_TAC;
909 ASSUME_TAC2 (
910 SPECL[`e1:real^3`;`e3:real^3`;`x:real^3`;`y:real^3`;` vec 0:real^3`]
911   (GEN_ALL AZIM_AND_ARCV_EQ_IMP_PARA));
912 DOWN;
913 ASM_SIMP_TAC[GSYM NORM_EQ_0; REAL_POS_NZ; VECTOR_SUB_RZERO];
914 STRIP_TAC;
915
916 UNDISCH_TAC` norm (x:real^3) = norm (y:real^3)`;
917 ASM_SIMP_TAC[NORM_MUL; REAL_ARITH` a * x = x <=> ( a - &1 ) * x = &0`; REAL_ENTIRE; REAL_POS_NZ];
918 UNDISCH_TAC` &0 <= t'`;
919 SIMP_TAC[GSYM REAL_ABS_REFL; REAL_SUB_0; VECTOR_MUL_LID]]);;
920
921
922
923
924
925 let GRAPH_IMAGE_IMAGE = prove_by_refinement (
926 `graph E /\ (! x y. (f:real^N -> real^M) x = f y ==> x = y) 
927 ==> graph (IMAGE (IMAGE f) E)`,
928 [REWRITE_TAC[graph; HAS_SIZE_2_EXISTS; IMAGE; IN_ELIM_THM; IN];
929 IMP_TAC;
930 DISCH_THEN NHANH;
931 REPEAT STRIP_TAC;
932 EXISTS_TAC` (f:real^N -> real^M) x' `;
933 EXISTS_TAC` (f:real^N -> real^M) y `;
934 CONJ_TAC;
935 ASM_MESON_TAC[];
936 STRIP_TAC;
937 ASM_REWRITE_TAC[IN_ELIM_THM];
938 MESON_TAC[]]);;
939
940
941
942
943
944
945 let LUNAR_DEFORM_ORIGIN = prove(` lunar_deform (e1,e2,e3) t (vec 0) = vec 0`,
946 REWRITE_TAC[lunar_deform; NORM_0; REAL_MUL_LZERO; VECTOR_MUL_LZERO;
947  VECTOR_ADD_RID]);;
948
949
950
951
952
953 let orthonormal1 = prove(`!e1 e2 e3.
954          orthonormal e1 e2 e3 <=>
955          norm e1 = &1 /\
956          norm e2 = &1 /\
957          norm e3 = &1 /\
958          e1 dot e2 = &0 /\
959          e1 dot e3 = &0 /\
960          e2 dot e3 = &0 /\
961          &0 < (e1 cross e2) dot e3 `,
962 REWRITE_TAC[orthonormal; NORM_EQ_1]);;
963
964
965
966
967
968
969
970 let ORTHO_SPHERICAL_AZIM = prove_by_refinement(`orthonormal e1 e2 e3 /\ 
971 x = ( r * cos theta) % e1 + (r * sin theta) % e2 + h % e3 /\
972 &0 < r /\
973 &0 <= theta /\ theta < &2 * pi 
974 ==> azim (vec 0) e3 e1 x = theta `,
975 [STRIP_TAC;
976 MP_TAC (ISPECL [` vec 0:real^3 `;` e3: real^3 `;` e1: real^3 `;` x:real^3 `;` &0 `;
977 `h:real`;` &1 `;` r:real`;` e1:real^3 `;` e2: real^3`;` e3:real^3`;` &0`;
978 `theta: real`] AZIM_UNIQUE);
979 ANTS_TAC;
980 ASM_REWRITE_TAC[VECTOR_SUB_RZERO; dist; SIN_0; COS_0; REAL_ADD_LID;
981  VECTOR_MUL_LZERO; REAL_MUL_RZERO; VECTOR_ADD_RID; REAL_MUL_RID; VECTOR_MUL_LID];
982 REWRITE_TAC[REAL_ARITH` &0 < &1 `];
983 DOWN_TAC;
984 SIMP_TAC[orthonormal1; VECTOR_MUL_LID; GSYM NORM_EQ_0; REAL_ARITH` ~(&1 = &0)`];
985
986 SIMP_TAC[]]);;
987
988
989
990
991 let COS_ARCV = prove_by_refinement(`cos (arcV v0 u (w:real^N)) =
992            ((u - v0) dot (w - v0)) / (norm (u - v0) * norm (w - v0))`,
993 [ASM_CASES_TAC` ~(v0 = u) /\ ~(v0 = w:real^N)`;
994 DOWN THEN REWRITE_TAC[Trigonometry2.NOT_EQ_IMPCOS_ARC]; DOWN;
995 REWRITE_TAC[DE_MORGAN_THM]; STRIP_TAC;
996 ASM_SIMP_TAC[VECTOR_SUB_REFL; arcV; DOT_LZERO; REAL_ARITH` &0 / x = &0`; ACS_0;
997 COS_PI2];
998 ASM_SIMP_TAC[VECTOR_SUB_REFL; arcV; DOT_RZERO; REAL_ARITH` &0 / x = &0`; ACS_0;
999 COS_PI2]]);;
1000
1001
1002
1003
1004
1005
1006 let LUNAR_DEFORM_ARCV_PRESERVED = prove(`orthonormal e1 e2 e3 ==>
1007 arcV (vec 0) e3 x = arcV (vec 0) e3 (lunar_deform (e1,e2,e3) t x) `,
1008 ASM_CASES_TAC` (x:real^3) = vec 0 ` THENL [
1009 ASM_REWRITE_TAC[LUNAR_DEFORM_ORIGIN];
1010 SIMP_TAC[LUNAR_DEFORM_PRESERVE_NORM; arcV; orthonormal; VECTOR_SUB_RZERO] THEN 
1011 SIMP_TAC[lunar_deform; DOT_RADD; DOT_RMUL; DOT_SYM; REAL_MUL_RZERO; REAL_ADD_LID; REAL_MUL_RID; COS_ARCV; VECTOR_SUB_RZERO; GSYM NORM_EQ_1; REAL_MUL_LID] THEN 
1012 DOWN THEN SIMP_TAC[GSYM NORM_EQ_0; REAL_FIELD` ~( a = &0) ==> a * b / a = b`; NORM_EQ_1; REAL_MUL_RID]]);;
1013
1014
1015
1016 (* ========================================================================= *)
1017 (* ========================================================================= *)
1018
1019
1020
1021 Local_lemmas.LUNAR_IMP_INTERIOR_ANGLE1_EQ_PI;;
1022 Local_lemmas.interior_angle1;;
1023 Wrgcvdr_cizmrrh.lunar;;
1024 Local_lemmas.HKIRPEP;;
1025
1026 (* because interior_angle1 (vec 0) FF v <= pi and
1027 interior_angle1 x FF v = azim x v (rho_node1 FF v) (@a. a,v IN FF)
1028 ,  the condition theta (ivs_rho_node1 FF v) <= &0
1029 is satisfied automatically *)
1030
1031
1032 g ` convex_local_fan (V,E,FF) /\ lunar (v,w) V E /\
1033 orthonormal e1 e2 e3 /\ v = a % e3 /\ &0 < a /\
1034 rho_node1 FF v IN aff_gt {vec 0, e3} {e1} /\
1035 lunar_deform (e1,e2,e3) t = f /\ &0 <= t /\ t < &1
1036 ==>
1037 convex_local_fan (IMAGE f V, IMAGE (\S. IMAGE f S) E, IMAGE (\ (m,n). f m, f n) FF) 
1038  /\
1039 lunar (v,w) (IMAGE f V) (IMAGE (\S. IMAGE f S) E) /\
1040 CARD (IMAGE f V) = CARD V`;;
1041
1042
1043
1044
1045 g ` convex_local_fan (V,E,FF) /\ lunar (v,w) V E /\
1046 orthonormal e1 e2 e3 /\ v = a % e3 /\ &0 < a /\
1047 rho_node1 FF v IN aff_gt {vec 0, e3} {e1} /\
1048 lunar_deform (e1,e2,e3) t = f /\ &0 <= t /\ t < &1
1049 ==> FAN (vec 0,IMAGE f V,IMAGE ( IMAGE f ) E) `;;
1050 e (REWRITE_TAC[convex_local_fan]);;
1051 e (NHANH Local_lemmas.LOCAL_FAN_ORBIT_MAP_V);;
1052 e (REWRITE_TAC[local_fan; FAN]);;
1053 e (LET_TAC);;
1054 e (STRIP_TAC);;
1055 e (CONJ_TAC);;
1056 e (UNDISCH_TAC` UNIONS E SUBSET (V:real^3 -> bool) `);;
1057 e (REWRITE_TAC[GSYM IMAGE_UNIONS]);;
1058 e (SET_TAC[]);;
1059
1060 e (CONJ_TAC);;
1061 e (MATCH_MP_TAC GRAPH_IMAGE_IMAGE);;
1062 e (ASM_REWRITE_TAC[]);;
1063 e (EXPAND_TAC "f");;
1064 e (MATCH_MP_TAC LUNAR_DEFORM_INJ);;
1065 e (ASM_REWRITE_TAC[]);;
1066
1067 e (REWRITE_TAC[fan1; fan2; fan6; fan7]);;
1068 e (CONJ_TAC);;
1069
1070 e (UNDISCH_TAC` fan1 ((vec 0:real^3),(V:real^3 -> bool),(E:(real^3 -> bool) -> bool))`);;
1071 e (REWRITE_TAC[fan1]);;
1072 e (SIMP_TAC[FINITE_IMAGE]);;
1073 e (SET_TAC[]);;
1074 e (ASSUME_TAC2 LUNAR_DEFORM_INJ);;
1075
1076 e (CONJ_TAC);;
1077 e (UNDISCH_TAC` fan2 (vec 0,V: real^3 -> bool,(E:(real^3 -> bool) -> bool)) `);;
1078 e (REWRITE_TAC[fan2]);;
1079 e (DOWN);;
1080 e (MP_TAC LUNAR_DEFORM_ORIGIN);;
1081 e (ASM_REWRITE_TAC[IN_IMAGE]);;
1082 e (MESON_TAC[]);;
1083
1084 e (CONJ_TAC);;
1085 e (GEN_TAC);;
1086 e (UNDISCH_TAC` fan6 (vec 0,V:real^3 -> bool,E:(real^3 -> bool) -> bool ) `);;
1087 e (REWRITE_TAC[IN_IMAGE; IMAGE; fan6]);;
1088 e (STRIP_TAC);;
1089 e (FIRST_ASSUM NHANH);;
1090 e (STRIP_TAC);;
1091 e (MP_TAC Local_lemmas.HKIRPEP);;
1092 e (ANTS_TAC);;
1093 e (ASM_REWRITE_TAC[convex_local_fan; local_fan]);;
1094 e (CONV_TAC (ONCE_DEPTH_CONV let_CONV));;
1095 e (SWITCH_TAC ` FF = face H (x:real^3 # real^3 )`);;
1096 e (ASM_REWRITE_TAC[FAN; fan6]);;
1097 e (EXISTS_TAC `x:(real^3 #real^3)`);;
1098 e (ASM_REWRITE_TAC[]);;
1099 e (STRIP_TAC);;
1100 e (UNDISCH_TAC` graph (E: (real^3 -> bool) -> bool) `);;
1101 e (REWRITE_TAC[graph]);;
1102 e (STRIP_TAC);;
1103 e (UNDISCH_TAC`(x': real^3 -> bool) IN E `);;
1104 e (REWRITE_TAC[IN]);;
1105 e (FIRST_ASSUM NHANH);;
1106 e (REWRITE_TAC[HAS_SIZE]);;
1107 e (NHANH Rogers.CARD_2_IMP_DOUBLE);;
1108 e (STRIP_TAC);;
1109
1110 e (UNDISCH_TAC` v = ITER j (rho_node1 FF) w`);;
1111 e (USE_FIRST `w = ITER i (rho_node1 FF) v` (fun x -> REWRITE_TAC[x; ITER_ADD]));;
1112 e (ASSUME_TAC2 (ARITH_RULE` ~(j = 0) ==> 0 < j + i `));;
1113 e (DOWN THEN PHA);;
1114 e (ONCE_REWRITE_TAC[EQ_SYM_EQ]);;
1115 e (NHANH Lvducxu.ITER_CYCLIC_ORBIT);;
1116
1117
1118 (*
1119  ` special_fan (V,E,FF,S) <=> 
1120 packing V /\ 
1121 V SUBSET ball (vec 0, &1) /\
1122 convex_local_fan (V,E,FF) /\ 
1123 S SUBSET E /\ 
1124 (! v w. {v,w} IN S ==> dist (v,w) = &2 * t0 ) /\
1125 (! v w. {v,w} IN E ==> dist (v,w) <= &2 * t0 ) /\
1126 (! v w. 
1127   v IN V /\ w IN V /\ ~( v = w ) /\ ~( {v,w} IN E ) 
1128   ==> &2 * t0 <= dist (v,w)) /\
1129 let r = CARD E - CARD S in 
1130 CARD S <= 3 /\
1131 3 - CARD S <= r /\ r <= 6 - 2 * (CARD S)`;;
1132 *)
1133
1134 (* ================================================== *)
1135 (* LEMMA YOLCBTG *)
1136 (* ============= *)
1137
1138
1139
1140
1141
1142 let AFF_CONV0_INTERSECTION_LEMMA = prove_by_refinement 
1143 (`! u x y (z:real^3). 
1144 coplanar {u,x,y,z} /\ 
1145 ~ collinear {u,x,y} /\
1146 ~ collinear {u,y,z} /\ 
1147 ~ collinear {u,z,x} 
1148 ==> ~ ( aff {u,x} INTER conv0 {y,z} = {} /\
1149     aff {u,y} INTER conv0 {x,z} = {} /\
1150     aff {u,z} INTER conv0 {x,y} = {} ) `,
1151 [REWRITE_TAC[coplanar];
1152 REPEAT STRIP_TAC;
1153 SUBGOAL_THEN` affine hull {u', v, w} = affine hull {u,x,y:real^3}` MP_TAC;
1154 MATCH_MP_TAC Local_lemmas.SUBSET_NOT_COLLINEAR_AFFINE_HULL_EQ;
1155 ASM_REWRITE_TAC[];
1156 MATCH_MP_TAC SUBSET_TRANS;
1157 EXISTS_TAC` {u,x,y,z:real^3}` ;
1158 ASM_REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET];
1159 STRIP_TAC;
1160 SUBGOAL_THEN` {z:real^3} SUBSET affine hull {u', v, w} ` MP_TAC;
1161 MATCH_MP_TAC SUBSET_TRANS;
1162 EXISTS_TAC` {u,x,y,z:real^3}`;
1163 ASM_REWRITE_TAC[INSERT_SUBSET; IN_INSERT; EMPTY_SUBSET];
1164
1165 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; AFFINE_HULL_3; IN_ELIM_THM];
1166 STRIP_TAC;
1167 ASM_CASES_TAC` &0 < v' /\ &0 < w' `; 
1168 ABBREV_TAC` tt = &0 % u + &1 % (z:real^3) `;
1169 SUBGOAL_THEN` (?tt. tt IN aff {u, z:real^3} /\ tt IN conv0 {x, y})` MP_TAC;
1170 MATCH_MP_TAC (GEN_ALL Local_lemmas.CONDS_FOR_INTER_AFF_CONV0);
1171 EXISTS_TAC` u'': real` ;
1172 EXISTS_TAC` v': real `;
1173 EXISTS_TAC` w': real`;
1174 EXISTS_TAC` &1 `;
1175 EXISTS_TAC` tt: real^3 `;
1176 EXISTS_TAC`&0 `;
1177 EXISTS_TAC` &1 `;
1178 ASM_REWRITE_TAC[REAL_ADD_LID];
1179 EXPAND_TAC "tt";
1180 REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LZERO; VECTOR_ADD_LID];
1181 ASM_REWRITE_TAC[];
1182 UNDISCH_TAC` aff {u, z} INTER conv0 {x, y:real^3} = {}`;
1183 REWRITE_TAC[Local_lemmas.INTER_EQ_EM_EXPAND];
1184
1185 DOWN_TAC;
1186 SPEC_TAC (`v':real`,`v':real`);
1187 SPEC_TAC (`w':real`,`w':real`);
1188 SPEC_TAC (`x:real^3`,` x:real^3 `);
1189 SPEC_TAC (`y:real^3`,` y:real^3`);
1190 MATCH_MP_TAC (MESON[REAL_ARITH` a <= b \/ b <= a`]` (! y x b a. P y x b a 
1191 ==> P x y a b) /\ (! y x b a. b <= a ==> P y x b a) ==>
1192  (! y x b a. P y x b a) `);
1193 SIMP_TAC[INSERT_COMM; REAL_ADD_SYM; VECTOR_ADD_SYM; CONJ_SYM];
1194 CONJ_TAC;
1195 MESON_TAC[];
1196
1197 REPEAT STRIP_TAC;
1198 ASM_CASES_TAC` &0 < w' `;
1199 UNDISCH_TAC` w' <= v':real`;
1200 DOWN THEN DOWN THEN PHA;
1201 REAL_ARITH_TAC;
1202
1203 ASM_CASES_TAC` w' = &0 `;
1204 FIRST_X_ASSUM SUBST_ALL_TAC;
1205 DOWN_TAC;
1206 REWRITE_TAC[REAL_ADD_RID; VECTOR_MUL_LZERO; VECTOR_ADD_RID;
1207  Local_lemmas.collinear_fan22; Collect_geom.AFF_2POINTS_INTERPRET;
1208  IN_ELIM_THM];
1209 STRIP_TAC;
1210 UNDISCH_TAC` z = u'' % u + v' % (x:real^3)`;
1211 UNDISCH_TAC` u'' + v' = &1 `;
1212 UNDISCH_TAC` ~((?ta tb. ta + tb = &1 /\ z = ta % u + tb % x) \/ u = (x:real^3))`;
1213 MESON_TAC[];
1214
1215 ASM_CASES_TAC` v' = &0 `;
1216 FIRST_X_ASSUM SUBST_ALL_TAC;
1217 DOWN_TAC;
1218 REWRITE_TAC[REAL_ADD_LID; VECTOR_MUL_LZERO; VECTOR_ADD_LID;
1219  Local_lemmas.collinear_fan22; Collect_geom.AFF_2POINTS_INTERPRET;
1220  IN_ELIM_THM];
1221 MESON_TAC[];
1222
1223
1224 DOWN;
1225 REWRITE_TAC[REAL_ARITH` a = &0 <=> ~( &0 < a \/ a < &0 )`];
1226 STRIP_TAC;
1227 UNDISCH_TAC` z = u'' % u + v' % x + w' % (y:real^3)`;
1228 PURE_ONCE_REWRITE_TAC[VECTOR_ARITH` z = a % x + b + w' % (y:real^N) <=>
1229 b = ( -- a) % x + ( -- w') % y + &1 % z `];
1230 STRIP_TAC;
1231 SUBGOAL_THEN` (?tt. tt IN aff {u, x:real^3} /\ tt IN conv0 {y, z})` MP_TAC;
1232 MATCH_MP_TAC (GEN_ALL Local_lemmas.CONDS_FOR_INTER_AFF_CONV0);
1233 EXISTS_TAC` -- u'':real `;
1234 EXISTS_TAC` -- w':real `;
1235 EXISTS_TAC` &1 `;
1236 EXISTS_TAC` v': real `;
1237 EXISTS_TAC` v' % x:real^3 `;
1238 EXISTS_TAC` &0 `;
1239 EXISTS_TAC` v':real`;
1240 ASM_REWRITE_TAC[REAL_ARITH` &0 < &1 `; REAL_ADD_LID; VECTOR_MUL_LZERO;
1241  VECTOR_ADD_LID];
1242 ASM_REAL_ARITH_TAC;
1243 UNDISCH_TAC` aff {u, x} INTER conv0 {y, z:real^3} = {}`;
1244 REWRITE_TAC[Local_lemmas.INTER_EQ_EM_EXPAND];
1245
1246
1247
1248
1249 UNDISCH_TAC` z = u'' % u + v' % x + w' % (y:real^3)`;
1250 PURE_ONCE_REWRITE_TAC[VECTOR_ARITH` z = u'' % u + v' % x + w' % y <=>
1251 -- z = ( -- u'') % u + ( -- v') % x + ( -- w') % y `];
1252 STRIP_TAC;
1253 SUBGOAL_THEN` (?tt. tt IN aff {u, z:real^3} /\ tt IN conv0 {x, y})` MP_TAC;
1254 MATCH_MP_TAC (GEN_ALL Local_lemmas.CONDS_FOR_INTER_AFF_CONV0);
1255 EXISTS_TAC` -- u'':real `;
1256 EXISTS_TAC` -- v':real `;
1257 EXISTS_TAC` -- w' `;
1258 EXISTS_TAC` -- &1 `;
1259 EXISTS_TAC` -- z :real^3 `;
1260 EXISTS_TAC` &0 `;
1261 EXISTS_TAC` -- &1`;
1262 ASM_REWRITE_TAC[REAL_ADD_LID; VECTOR_MUL_LZERO; VECTOR_ADD_LID];
1263 ASM_REWRITE_TAC[VECTOR_ARITH` -- &1 % x = -- (x:real^N)`];
1264 ASM_REAL_ARITH_TAC;
1265 UNDISCH_TAC` aff {u, z} INTER conv0 {x, y:real^3} = {}`;
1266 REWRITE_TAC[Local_lemmas.INTER_EQ_EM_EXPAND]]);;
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276 let CVLF_COLLINEAR_CIRCULAR_LUNAR = prove(
1277 ` convex_local_fan (V,E,FF) /\ {v,w} SUBSET V /\ collinear {vec 0, v, w} /\
1278 ~ (v = w) ==> circular V E \/ lunar (v,w) V E `,
1279 ASM_CASES_TAC` circular (V:real^3 -> bool) E` THENL [
1280 ASM_REWRITE_TAC[]; STRIP_TAC THEN DISJ2_TAC THEN 
1281 REWRITE_TAC[lunar] THEN ASM_REWRITE_TAC[]]);;
1282
1283
1284
1285
1286
1287 let CVLF_FLAT_ANGLE_LEMMA = prove_by_refinement(
1288 ` convex_local_fan (V,E,FF) /\
1289      {v, w} SUBSET V /\
1290      collinear {vec 0, v, w} /\
1291      ~(v = w) ==>
1292 ! z. z IN V /\ ~( z = v ) /\ ~( z = w ) ==>
1293 interior_angle1 (vec 0) FF z = pi `,
1294 [NHANH CVLF_COLLINEAR_CIRCULAR_LUNAR;
1295 STRIP_TAC;
1296 ASSUME_TAC2 Local_lemmas.KCHMAMG;
1297 DOWN THEN IMP_TAC;
1298 DISCH_TAC THEN REMOVE_TAC;
1299 ASM_SIMP_TAC[];
1300 ASSUME_TAC2 Local_lemmas.HKIRPEP;
1301 DOWN;
1302 SIMP_TAC[IN_DIFF; IN_INSERT; DE_MORGAN_THM; NOT_IN_EMPTY]]);;
1303
1304
1305
1306
1307 (* ============================================================== *)
1308
1309
1310
1311
1312 let TOW_REAL_EXISTS_COMBINED = prove_by_refinement 
1313 (` (? e1. &0 < e1 /\ (! t. -- e1 < t /\ t < e1 ==> P t )) /\
1314 (? e1. &0 < e1 /\ (! t. -- e1 < t /\ t < e1 ==> Q t ))
1315 ==> (? e1. &0 < e1 /\ (! t. -- e1 < t /\ t < e1 ==> P t /\ Q t ))`,
1316 [STRIP_TAC;
1317 ASM_CASES_TAC` e1 < e1':real `;
1318 EXISTS_TAC` e1:real `;
1319 ASM_REWRITE_TAC[];
1320 GEN_TAC;
1321 ASM_SIMP_TAC[];
1322 SUBGOAL_THEN` -- e1' < -- (e1:real) ` MP_TAC;
1323 DOWN;
1324 REAL_ARITH_TAC;
1325 ASM_MESON_TAC[REAL_LT_TRANS];
1326
1327 EXISTS_TAC` e1':real`;
1328 ASM_REWRITE_TAC[];
1329 GEN_TAC;
1330 ASM_SIMP_TAC[];
1331 SUBGOAL_THEN` ~(-- e1' < -- e1:real) ` MP_TAC;
1332 DOWN;
1333 REAL_ARITH_TAC;
1334 ASM_MESON_TAC[REAL_ARITH` ~( a < b) /\ a < c ==> b < (c:real) `]]);;
1335
1336
1337
1338
1339
1340
1341
1342
1343 let CONTINUOUS_FUNS_DISTINCT_POINTS = prove_by_refinement
1344 (`f continuous atreal r /\ g continuous atreal rr /\ ~ ((f:real -> real^N) r = g rr) 
1345 ==> ? d. &0 < d /\ 
1346 (! x y. abs (x - r) < d /\ abs ( y - rr) < d ==> ~( f x = g y) )`,
1347 [REWRITE_TAC[continuous_atreal];
1348 STRIP_TAC;
1349 FIRST_X_ASSUM (MP_TAC o (SPEC` dist ((f:real -> real^N) r, g (rr:real)) / &2`));
1350 FIRST_X_ASSUM (MP_TAC o (SPEC` dist ((f:real -> real^N) r, g (rr:real)) / &2`));
1351 SUBGOAL_THEN` &0 < dist ((f:real -> real^N) r,g (rr:real)) / &2 ` ASSUME_TAC;
1352 ASM_REWRITE_TAC[REAL_ARITH` &0 < a / &2 <=> &0 < a `; GSYM DIST_NZ];
1353
1354 ANTS_TAC;
1355 FIRST_ASSUM ACCEPT_TAC;
1356
1357 STRIP_TAC;
1358 ANTS_TAC;
1359 FIRST_ASSUM ACCEPT_TAC;
1360
1361 STRIP_TAC;
1362 EXISTS_TAC` min d d' `;
1363 ASM_REWRITE_TAC[REAL_LT_MIN];
1364 FIRST_X_ASSUM NHANH;
1365 FIRST_X_ASSUM NHANH;
1366 REPEAT STRIP_TAC;
1367
1368 MP_TAC (SPECL [` (f:real -> real^N) r`; `(f:real -> real^N) x`; 
1369 `(g:real -> real^N) rr `] DIST_TRIANGLE);
1370 MP_TAC (SPECL [` (f:real -> real^N) x`; `(g:real -> real^N) y`; 
1371 `(g:real -> real^N) rr `] DIST_TRIANGLE);
1372 PHA;
1373 NHANH (REAL_ARITH` a <= b + c /\ x <= y + a ==> x - y - c <= b `);
1374 STRIP_TAC;
1375
1376 SUBGOAL_THEN` &0 < dist ((f:real -> real^N) x,(g:real -> real^N) y)` MP_TAC;
1377 DOWN;
1378 MATCH_MP_TAC (REAL_ARITH` &0 < b ==> b <= a ==> &0 < a `);
1379 MATCH_MP_TAC (REAL_ARITH` a < x / &2 /\ b < x / &2 ==> &0 < x - a - b `);
1380 UNDISCH_TAC` dist ((f:real -> real^N) x,f (r:real)) < dist ((f:real ->
1381  real^N) r,g (rr:real)) / &2`;
1382 ASM_REWRITE_TAC[DIST_SYM];
1383
1384 ASM_REWRITE_TAC[GSYM DIST_NZ]]);;
1385
1386
1387
1388
1389 let CONTINUOUS_TWO_POINTS_DISTINCT =
1390 MESON[CONTINUOUS_FUNS_DISTINCT_POINTS]
1391 ` ff (v1:real^N) continuous atreal r /\ ff v2 continuous atreal r /\
1392 ~(ff v1 r = ff v2 r ) ==> 
1393 ? d. &0 < d /\ 
1394 (! t. abs ( t - r ) < d ==> ~( ff v1 t = ((ff v2 t ):real^M))) `;;
1395
1396
1397
1398
1399
1400
1401 let CONTINUOUS_FUN_DISTINCT_FINITE_SET = prove_by_refinement
1402 (`! V. FINITE (V:real^N -> bool) ==>
1403 (! v1. v1 IN V /\ ~( v0 = v1) ==> ~ (ff v0 r = ff v1 r)) /\
1404 (! v. v IN v0 INSERT V ==> ff v continuous atreal r )
1405 ==> ? d. &0 < d /\
1406 (! t. abs (t - r) < d ==> 
1407   (! v1. v1 IN V /\ ~(v0 = v1 ) ==>
1408     ~( ff v0 t = ((ff v1 t):real^M))))`,
1409 [MATCH_MP_TAC FINITE_INDUCT_STRONG;
1410 REWRITE_TAC[NOT_IN_EMPTY];
1411
1412 CONJ_TAC;
1413 DISCH_TAC;
1414 EXISTS_TAC` &1 `;
1415 REAL_ARITH_TAC;
1416
1417 REPEAT STRIP_TAC;
1418 UNDISCH_TAC` (!v1. (v1:real^N) IN V /\ ~(v0 = v1) ==> ~((ff v0 r):real^M = ff v1 r)) /\
1419       (!v. v IN v0 INSERT V ==> ff v continuous atreal r)
1420       ==> (?d. &0 < d /\
1421                (!t. abs (t - r) < d
1422                     ==> (!v1. v1 IN V /\ ~(v0 = v1) ==> ~(ff v0 t = ff v1 t)))) `;
1423 ANTS_TAC;
1424 DOWN THEN DOWN THEN PHA;
1425 SIMP_TAC[IN_INSERT];
1426 MESON_TAC[];
1427 STRIP_TAC;
1428
1429 ASM_CASES_TAC` v0 = x:real^N `;
1430 EXISTS_TAC` d:real `;
1431 ASM_REWRITE_TAC[IN_INSERT];
1432 DOWN THEN DOWN THEN PHA;
1433 MESON_TAC[];
1434 SUBGOAL_THEN` ff (v0:real^N) continuous atreal r /\
1435      ff x continuous atreal r /\
1436      ~(ff v0 r = (ff x r):real^M) ` MP_TAC;
1437 DOWN_TAC;
1438 REWRITE_TAC[IN_INSERT];
1439 MESON_TAC[];
1440
1441 NHANH CONTINUOUS_TWO_POINTS_DISTINCT;
1442 STRIP_TAC;
1443 EXISTS_TAC` min d d'`;
1444 ASM_REWRITE_TAC[REAL_LT_MIN; IN_INSERT];
1445 ASM_MESON_TAC[]]);;
1446
1447
1448
1449
1450
1451
1452
1453 let CONTINUOUS_ATREAL_INJ_PRESERVED = prove_by_refinement 
1454 (`! V. FINITE (V:real^N -> bool) ==>
1455 (! v1 v2. v1 IN V /\ v2 IN V /\ ~( v1 = v2) ==> ~ (ff v1 r = ff v2 r)) /\
1456 (! v. v IN V ==> ff v continuous atreal r )
1457 ==> ? d. &0 < d /\
1458 (! t. abs (t - r) < d ==> 
1459   (! v1 v2. v1 IN V /\ v2 IN V /\ ~(v1 = v2 ) ==>
1460     ~( ff v1 t = ((ff v2 t):real^M))))`,
1461 [MATCH_MP_TAC FINITE_INDUCT_STRONG;
1462 REWRITE_TAC[NOT_IN_EMPTY];
1463 CONJ_TAC;
1464 EXISTS_TAC` &1 `;
1465 REAL_ARITH_TAC;
1466
1467 REPEAT STRIP_TAC;
1468 SUBGOAL_THEN` (!v1 v2. (v1:real^N) IN V /\ v2 IN V /\ ~(v1 = v2) ==> ~(ff v1 r = (ff v2 r):real^M)) /\
1469       (!v. v IN V ==> ff v continuous atreal r) ` MP_TAC;
1470 DOWN THEN DOWN THEN PHA;
1471 SIMP_TAC[IN_INSERT];
1472
1473 DISCH_TAC;
1474 SUBGOAL_THEN` (?d. &0 < d /\
1475                (!t. abs (t - r) < d
1476                     ==> (!v1 v2.
1477                              v1 IN V /\ v2 IN V /\ ~(v1 = (v2:real^N))
1478                              ==> ~(ff v1 t = (ff v2 t):real^M))))` MP_TAC;
1479 DOWN;
1480 FIRST_X_ASSUM ACCEPT_TAC;
1481 STRIP_TAC;
1482
1483 MP_TAC (SPEC_ALL (
1484 ISPECL [`r:real `;` x:real^N `] (GEN_ALL CONTINUOUS_FUN_DISTINCT_FINITE_SET)));
1485 PHA;
1486 ANTS_TAC;
1487 UNDISCH_TAC `!(v1:real^N) v2.
1488           v1 IN x INSERT V /\ v2 IN x INSERT V /\ ~(v1 = v2)
1489           ==> ~(ff v1 (r:real) = (ff v2 r):real^M) `;
1490 ASM_SIMP_TAC[IN_INSERT];
1491 STRIP_TAC;
1492
1493 EXISTS_TAC` min d d' `;
1494 REWRITE_TAC[REAL_LT_MIN];
1495 ASM_REWRITE_TAC[];
1496 FIRST_X_ASSUM NHANH;
1497 DOWN;
1498 FIRST_X_ASSUM NHANH;
1499 SIMP_TAC[IN_INSERT];
1500 MESON_TAC[]]);;
1501
1502
1503
1504
1505
1506
1507
1508 let CONTINUOUS_ATREAL_DISTINCT = prove_by_refinement
1509 (`ff v continuous atreal r /\ ~((ff: real^N -> real -> real^M) v r = v0)
1510  ==> (?d. &0 < d /\ (!t. abs (t - r) < d ==> ~(ff v t = v0)))`,
1511 [REWRITE_TAC[continuous_atreal; DIST_NZ];
1512 IMP_TAC;
1513 DISCH_THEN (NHANH_PAT`\x. x ==> y `);
1514 STRIP_TAC;
1515 EXISTS_TAC` d:real `;
1516 ASM_REWRITE_TAC[];
1517 FIRST_X_ASSUM NHANH;
1518 REPEAT STRIP_TAC;
1519
1520 MP_TAC (ISPECL[` (ff:real^N -> real -> real^M ) v r `;` 
1521 (ff:real^N -> real -> real^M ) v t `; `v0:real^M `] DIST_TRIANGLE);
1522 DOWN;
1523 REWRITE_TAC[DIST_SYM];
1524 REAL_ARITH_TAC]);;
1525
1526
1527
1528
1529
1530 let CONTINUOUS_ATREAL_DISTINCT_FINITE = prove_by_refinement
1531 (`! V. FINITE (V:real^N -> bool)
1532          ==> (!v1. v1 IN V ==> ~(ff v1 r = (v0:real^M))) /\
1533              (!v. v IN V ==> ff v continuous atreal r)
1534          ==> (?d. &0 < d /\
1535                   (!t. abs (t - r) < d
1536                        ==> (!v1. v1 IN V ==> ~(ff v1 t = v0))))`,
1537 [MATCH_MP_TAC FINITE_INDUCT;
1538 REWRITE_TAC[NOT_IN_EMPTY];
1539 CONJ_TAC;
1540 EXISTS_TAC ` &1 `;
1541 REAL_ARITH_TAC; 
1542 REPEAT STRIP_TAC;
1543 UNDISCH_TAC ` (!v1. (v1:real^N) IN s ==> ~(ff v1 r = (v0:real^M))) /\
1544       (!v. v IN s ==> ff v continuous atreal r)
1545       ==> (?d. &0 < d /\
1546                (!t. abs (t - r) < d ==> (!v1. v1 IN s ==> ~(ff v1 t = v0)))) `;
1547 ANTS_TAC;
1548 DOWN_TAC;
1549 SIMP_TAC[IN_INSERT];
1550 STRIP_TAC;
1551 MP_TAC (SPEC`x:real^N ` (GEN`v:real^N` CONTINUOUS_ATREAL_DISTINCT));
1552 ANTS_TAC;
1553 DOWN_TAC;
1554 SIMP_TAC[IN_INSERT];
1555 STRIP_TAC;
1556 EXISTS_TAC` min d d' `;
1557 ASM_REWRITE_TAC[REAL_LT_MIN];
1558 FIRST_X_ASSUM NHANH;
1559 DOWN;
1560 FIRST_X_ASSUM NHANH;
1561 SIMP_TAC[IN_INSERT];
1562 MESON_TAC[]]);;
1563
1564
1565
1566
1567
1568
1569 let REAL_CONTINUOUS_SUM_FUNS = prove_by_refinement
1570 (` f real_continuous at x /\ g real_continuous at x 
1571 ==> (\x. f x + g x) real_continuous at x `,
1572 [REWRITE_TAC[real_continuous_at];
1573 STRIP_TAC;
1574 STRIP_TAC;
1575 PAT_ONCE_REWRITE_TAC`\x. x ==> y `[REAL_ARITH` &0 < a <=> &0 < a / &2 `];
1576 FIRST_X_ASSUM (NHANH_PAT`\x. x ==> y `);
1577 FIRST_X_ASSUM (NHANH_PAT`\x. x /\ z ==> y `);
1578 STRIP_TAC;
1579 EXISTS_TAC` min d d' `;
1580 ASM_REWRITE_TAC[REAL_LT_MIN];
1581 FIRST_X_ASSUM NHANH;
1582 DOWN;
1583 FIRST_X_ASSUM NHANH;
1584 STRIP_TAC THEN GEN_TAC;
1585 REAL_ARITH_TAC]);;
1586
1587
1588 let REAL_CON_IMP_OPP_FUN_TOO = prove_by_refinement(
1589 ` f real_continuous at (x:real^N) ==> (\x. -- f x) real_continuous at x`,
1590 [REWRITE_TAC[real_continuous_at];
1591 REPEAT STRIP_TAC;
1592 SUBGOAL_THEN` (?d. &0 < d /\ (!x'. dist (x',(x:real^N)) < d ==> abs (f x' - f x) < e))` MP_TAC;
1593 DOWN; ASM_REWRITE_TAC[]; STRIP_TAC; EXISTS_TAC` d:real `;
1594 ASM_REWRITE_TAC[REAL_ARITH` -- x - -- y = -- (x - y ) `; REAL_ABS_NEG]]);;
1595
1596
1597 let REAL_CONTINUOUS_SUB_FUNS = prove(
1598 ` f real_continuous at (x:real^N) /\
1599 g real_continuous at x ==>
1600 (\x. f x - g x) real_continuous at x `,
1601 STRIP_TAC THEN DOWN THEN NHANH_PAT`\x. x ==> y ` REAL_CON_IMP_OPP_FUN_TOO THEN 
1602 STRIP_TAC THEN REWRITE_TAC[REAL_ARITH` a - b = a + -- b `] THEN 
1603 MATCH_MP_TAC REAL_CONTINUOUS_SUM_FUNS THEN ASM_REWRITE_TAC[]);;
1604
1605
1606
1607
1608
1609 let INV_VNI = prove(` inv x = &1 / x `,
1610 PAT_ONCE_REWRITE_TAC `\x. inv x = y` [REAL_ARITH` x = x / &1 `]
1611 THEN REWRITE_TAC[REAL_INV_DIV]);;
1612
1613
1614
1615
1616
1617 let INV_INEQUAL_GENERAL = prove(
1618 ` &0 < e /\ &0 < x /\ x < y ==> e / y < e / x `,
1619 NHANH REAL_LT_INV2 THEN ONCE_REWRITE_TAC[REAL_ARITH` a / b = a * ( &1 / b ) `]
1620 THEN REWRITE_TAC[INV_VNI] THEN STRIP_TAC THEN MATCH_MP_TAC REAL_LT_LMUL THEN 
1621 ASM_REWRITE_TAC[]);;
1622
1623
1624
1625
1626
1627 let REAL_CONTINUOUS_IMP_MUL_FUN = prove_by_refinement
1628 (` f real_continuous at (x:real^N) /\
1629 g real_continuous at x ==>
1630 (\x. (f x) * (g x)) real_continuous at x `,
1631 [REWRITE_TAC[real_continuous_at];
1632 REPEAT STRIP_TAC;
1633 ONCE_REWRITE_TAC[REAL_RING` a * b - x * y = (a - x ) * b + (b - y) * x`];
1634
1635
1636
1637
1638
1639
1640 FIRST_X_ASSUM (MP_TAC o (SPEC` e / (&2 * max (abs (f (x:real^N))) (&1))`));
1641 ANTS_TAC;
1642 MATCH_MP_TAC REAL_LT_DIV;
1643 ASM_REWRITE_TAC[REAL_LT_MAX; REAL_ARITH` &0 < &2 * z <=> &0 < z `];
1644 REAL_ARITH_TAC;
1645 STRIP_TAC;
1646
1647 FIRST_X_ASSUM (MP_TAC o (SPEC` e / (&2 * (abs (g (x:real^N)) + e / (&2 * max (abs (f (x:real^N))) (&1))) )`));
1648 ANTS_TAC;
1649 MATCH_MP_TAC REAL_LT_DIV;
1650 ASM_REWRITE_TAC[REAL_LT_MAX; REAL_ARITH` &0 < &2 * z <=> &0 < z `];
1651 MATCH_MP_TAC (REAL_ARITH` &0 < x ==> &0 < abs a + x `);
1652 MATCH_MP_TAC REAL_LT_DIV;
1653 ASM_REWRITE_TAC[REAL_LT_MAX; REAL_ARITH` &0 < &2 * z <=> &0 < z `];
1654 REAL_ARITH_TAC;
1655
1656
1657
1658 STRIP_TAC;
1659 EXISTS_TAC `min d d'`;
1660 ASM_REWRITE_TAC[REAL_LT_MIN];
1661 GEN_TAC;
1662 FIRST_X_ASSUM NHANH;
1663 FIRST_X_ASSUM NHANH;
1664 STRIP_TAC;
1665 SUBGOAL_THEN` abs (g (x':real^N)) < abs (g x) + e / (&2 * max (abs (f (x:real^N))) (&1))` MP_TAC;
1666 ASM_REAL_ARITH_TAC;
1667 ASM_CASES_TAC` f (x:real^N) = &0 `;
1668 FIRST_X_ASSUM SUBST_ALL_TAC;
1669 DOWN;
1670 SIMP_TAC[REAL_MUL_RZERO; REAL_ADD_RID; REAL_SUB_RZERO];
1671 UNDISCH_TAC` &0 < e `;
1672 REWRITE_TAC[REAL_ABS_MUL];
1673 REPEAT STRIP_TAC;
1674 SUBGOAL_THEN` abs (f (x':real^N)) * abs (g (x':real^N)) < ( e / (&2 * (abs (g x) + e / (&2 * max (abs (&0)) (&1))))) * (abs (g x) + e / (&2 * max (abs (&0)) (&1)))` MP_TAC;
1675
1676 MATCH_MP_TAC REAL_LT_MUL2;
1677 ASM_REWRITE_TAC[REAL_ABS_POS; REAL_ABS_0; real_max; REAL_ARITH` &0 <= &1 `; REAL_MUL_RID];
1678 ASSUME_TAC2 (REAL_ARITH` &0 < e ==> &0 < abs (g (x:real^N)) + e / &2`);
1679 DOWN;
1680 UNDISCH_TAC` &0 < e `;
1681 SIMP_TAC[REAL_FIELD` &0 < a ==> e / (&2 * a) * a = e / &2 `; REAL_ABS_0; real_max; REAL_ARITH` &0 <= &1 `; REAL_MUL_RID];
1682
1683 REAL_ARITH_TAC;
1684
1685 STRIP_TAC;
1686 MATCH_MP_TAC (REAL_ARITH` abs a + abs b < e ==> abs ( a + b ) < e `);
1687 REWRITE_TAC[REAL_ABS_MUL];
1688 MATCH_MP_TAC (REAL_ARITH` a < e / &2 /\ b < e / &2 ==> a + b < e `);
1689 CONJ_TAC;
1690 SUBGOAL_THEN` abs (f x' - f (x:real^N)) * abs (g x') < ( e / (&2 * (abs (g x) + 
1691 e / (&2 * max (abs (f x)) (&1))))) * (abs (g x) + e / (&2 * max (abs (f x)) (&1)))` MP_TAC;
1692 MATCH_MP_TAC REAL_LT_MUL2;
1693 ASM_REWRITE_TAC[REAL_ABS_POS];
1694 SUBGOAL_THEN` &0 < abs (g (x:real^N)) + e / (&2 * max (abs (f x)) (&1))` MP_TAC;
1695 MATCH_MP_TAC (REAL_ARITH` &0 < b ==> &0 < abs a + b `);
1696 MATCH_MP_TAC REAL_LT_DIV;
1697 ASM_REWRITE_TAC[];
1698 REAL_ARITH_TAC;
1699
1700 SIMP_TAC[REAL_FIELD` &0 < a ==> e / ( &2 * a ) * a = e / &2 `];
1701 ASM_CASES_TAC` max (abs (f x)) (&1) = abs (f (x:real^N)) `;
1702
1703
1704
1705
1706 UNDISCH_TAC` ~( f (x:real^N) = &0) `;
1707 REWRITE_TAC[REAL_ABS_NZ];
1708 UNDISCH_TAC` abs (g x' - g (x:real^N)) < e / (&2 * max (abs (f (x:real^N))) (&1))`;
1709 PHA;
1710 NHANH REAL_LT_RMUL;
1711 ASM_REWRITE_TAC[];
1712 IMP_TAC;
1713 SIMP_TAC[REAL_FIELD` &0 < a ==> x / (&2 * a ) * a = x / &2 `];
1714
1715
1716
1717
1718
1719 SUBGOAL_THEN` e / &2 / max (abs (f x)) (&1) < e / &2 / abs (f (x:real^N))` MP_TAC;
1720 MATCH_MP_TAC INV_INEQUAL_GENERAL;
1721 ASM_REWRITE_TAC[REAL_ARITH`&0 < a / &2 <=> &0 < a `; GSYM REAL_ABS_NZ];
1722 DOWN;
1723 REAL_ARITH_TAC;
1724 UNDISCH_TAC` abs (g x' - g (x:real^N)) < e / (&2 * max (abs (f (x:real^N))) (&1))`;
1725 PHA;
1726 REWRITE_TAC[REAL_FIELD` a / &2 / c = a / ( &2 * c ) `];
1727 NHANH (REAL_ARITH` a < b /\ b < c ==> a < c `);
1728 STRIP_TAC;
1729 UNDISCH_TAC` ~( f (x:real^N) = &0)`;
1730 REWRITE_TAC[REAL_ABS_NZ];
1731 DOWN THEN PHA;
1732 NHANH REAL_LT_RMUL;
1733 IMP_TAC;
1734 SIMP_TAC[REAL_FIELD` &0 < a ==> e / (&2 * a ) * a = e / &2 `]]);;
1735
1736
1737
1738
1739
1740
1741
1742 (* tch 2013/07/27. renamed variables t0 -> t in CON_ATREAL_REAL_CON CON_ATREAL_REAL_CON2
1743    to avoid clash with constant t0 in Geomdetail. *)
1744
1745 let CON_ATREAL_REAL_CON = prove(`! f (v0:real^N). f continuous atreal t ==>
1746  (\t. dist ( f t, v0)) real_continuous atreal t `,
1747 REWRITE_TAC[continuous_atreal; real_continuous_atreal] THEN 
1748 REPEAT STRIP_TAC THEN DOWN THEN 
1749 FIRST_X_ASSUM (NHANH_PAT `\x. x ==> y `) THEN STRIP_TAC THEN 
1750 EXISTS_TAC` d:real` THEN ASM_REWRITE_TAC[] THEN 
1751 FIRST_X_ASSUM NHANH THEN STRIP_TAC THEN CONV_TAC NORM_ARITH);;
1752
1753
1754
1755 let CON_ATREAL_REAL_CON2 = prove(
1756 `! f (v0:real^N). f continuous atreal t /\ g continuous atreal t ==>
1757  (\t. dist ( f t, g t)) real_continuous atreal t `,
1758 REWRITE_TAC[continuous_atreal; real_continuous_atreal] THEN 
1759 REPEAT STRIP_TAC THEN DOWN THEN 
1760 PAT_ONCE_REWRITE_TAC`\x. x ==> y `[REAL_ARITH` &0 < a <=> &0 < a / &2 `] THEN
1761 REPEAT (FIRST_X_ASSUM (NHANH_PAT `\x. x ==> y `)) THEN
1762 STRIP_TAC THEN EXISTS_TAC `min d d'` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
1763 REPEAT (FIRST_X_ASSUM NHANH) THEN STRIP_TAC THEN CONV_TAC NORM_ARITH);;
1764
1765
1766
1767 (* ============================================================== *)
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782 let SET2_HAS_SIZE2 = prove_by_refinement (` {(a: A),b} HAS_SIZE 2 <=> ~( a = b) `,
1783 [REWRITE_TAC[HAS_SIZE_2_EXISTS; IN_INSERT; NOT_IN_EMPTY];
1784 (* !s. s HAS_SIZE 2 <=>
1785            (?x y. ~(x = y) /\ (!z. z IN s <=> z = x \/ z = y))) *)
1786 EQ_TAC; STRIP_TAC; DOWN_TAC; MESON_TAC[]; STRIP_TAC; 
1787 EXISTS_TAC` a: A`; EXISTS_TAC` b:A`; ASM_REWRITE_TAC[]]);;
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799 let DIJ_AFF_GE_PARTITION = prove_by_refinement (` DISJOINT {u,v} {w} ==>
1800 aff_ge {u,v} {w} = aff {u,v} UNION aff_gt {u, v} {w} `,
1801 [SIMP_TAC[Fan.AFF_GE_2_1; AFF2; AFF_GT_2_1];
1802 STRIP_TAC;
1803 REWRITE_TAC[FUN_EQ_THM; IN_ELIM_THM; REWRITE_RULE[IN] IN_UNION];
1804 STRIP_TAC;
1805 EQ_TAC;
1806 STRIP_TAC;
1807 ASM_CASES_TAC` t3 = &0 `;
1808 DISJ1_TAC;
1809 EXISTS_TAC `t1: real `;
1810 ASM_REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_RID];
1811 UNDISCH_TAC` t1 + t2 + t3 = &1 `;
1812 ASM_SIMP_TAC[REAL_ADD_RID; REAL_ARITH` a + b = &1 <=> b = &1 - a `];
1813 DISJ2_TAC;
1814 ASM_MESON_TAC[REAL_ARITH` &0 <= a /\ ~( a = &0) ==> &0 < a `];
1815
1816 STRIP_TAC;
1817 EXISTS_TAC` t: real `;
1818 EXISTS_TAC` &1 - t `;
1819 EXISTS_TAC` &0 `;
1820 ASM_REWRITE_TAC[REAL_LE_REFL; VECTOR_MUL_LZERO; VECTOR_ADD_RID];
1821 REAL_ARITH_TAC;
1822 ASM_MESON_TAC[REAL_LT_IMP_LE]]);;
1823
1824
1825
1826
1827
1828
1829
1830 let AFF_GE_WEDGE_DISJOINTION = prove_by_refinement (
1831 ` aff_ge {v0, v1} {w1} INTER wedge v0 v1 w1 w2 = {} /\
1832 aff_ge {v0, v1} {w2} INTER wedge v0 v1 w1 w2 = {}`,
1833 [ASM_CASES_TAC` collinear {v0, v1, w1:real^3} `;
1834 ASM_SIMP_TAC[WEDGE_DEGENERATE; INTER_EMPTY];
1835
1836 REWRITE_TAC[wedge];
1837 CONJ_TAC;
1838 DOWN;
1839 ASM_SIMP_TAC[Local_lemmas.INTER_EQ_EM_EXPAND; GSYM Local_lemmas.AZIM_EQ_0_GE_ALT2];
1840 REWRITE_TAC[IN_ELIM_THM];
1841 REPEAT STRIP_TAC;
1842 DOWN THEN DOWN;
1843 ASM_REWRITE_TAC[];
1844 REAL_ARITH_TAC;
1845
1846 ASM_CASES_TAC` collinear {v0, v1, w2:real^3 } `;
1847 ASM_SIMP_TAC[AZIM_DEGENERATE; Local_lemmas.INTER_EQ_EM_EXPAND; IN_ELIM_THM];
1848 REWRITE_TAC[REAL_ARITH` ~( a < x /\ x < a )`];
1849
1850 DOWN;
1851 NHANH Fan.th3a;
1852 NHANH DIJ_AFF_GE_PARTITION;
1853 SIMP_TAC[IN_UNION; Local_lemmas.INTER_EQ_EM_EXPAND; IN_ELIM_THM];
1854 NHANH (REWRITE_RULE[CONTRAPOS_THM] Fan.th3c);
1855 REPEAT STRIP_TAC;
1856 DOWN THEN DOWN;
1857 ASM_SIMP_TAC[AZIM_DEGENERATE];
1858 REAL_ARITH_TAC;
1859 ASSUME_TAC2 (SPECL [`v0:real^3 `;` v1:real^3`;` w1: real^3 `;`x:real^3 `;` w2: real^3 `]AZIM_EQ_ALT);
1860 ASM_MESON_TAC[REAL_ARITH` ~( a < a ) `]]);;
1861
1862
1863
1864
1865
1866
1867
1868
1869 let HAS_SIZE_2_EXISTS2 = prove(
1870 ` S HAS_SIZE 2 <=> ? x y. ~( x = y) /\ S = {x,y} `,
1871 REWRITE_TAC[HAS_SIZE_2_EXISTS] THEN SET_TAC[]);;
1872
1873
1874
1875
1876
1877
1878 let FAN_E_SUB_V = prove(
1879 ` FAN (vec 0, V, E) /\  {x,y} IN E ==> x IN V /\ y IN V `,
1880 REWRITE_TAC[FAN; UNIONS_SUBSET; SUBSET] THEN STRIP_TAC THEN 
1881 DOWN THEN FIRST_ASSUM NHANH THEN SIMP_TAC[IN_INSERT]);;
1882
1883
1884 let LOCAL_E_SUB_V = prove(
1885 ` local_fan (V,E,FF) /\ {x,y} IN E ==> x IN V /\ y IN V `,
1886 REWRITE_TAC[local_fan] THEN LET_TAC THEN MESON_TAC[FAN_E_SUB_V]);;
1887
1888
1889
1890
1891
1892 let EDGE_NOT_INTER_WITH_WEDGE 
1893 = prove(` aff {v0, v1} INTER wedge v0 v1 w1 w2 = {} `,
1894 REWRITE_TAC[wedge; Local_lemmas.INTER_EQ_EM_EXPAND; IN_ELIM_THM]
1895 THEN NHANH Fan.th3c THEN MESON_TAC[]);;
1896
1897
1898
1899
1900
1901
1902 let AFF_GE11_SUB_AFF2 = prove(` aff_ge {v0} {v1} SUBSET aff {v0, v1} `,
1903 REWRITE_TAC[HALFLINE; AFF2; SUBSET; IN_ELIM_THM] THEN 
1904 REPEAT STRIP_TAC THEN EXISTS_TAC` &1 - t ` THEN 
1905 ASM_REWRITE_TAC[REAL_ARITH` a - (a - b) = b `]);;
1906
1907
1908
1909
1910
1911
1912 let PROVE_SLICING_FAN = prove_by_refinement
1913 (`local_fan (V,E,FF) /\
1914 v IN V /\ w IN V /\ ~( v = w) /\
1915 (! z t. z IN {v, w} /\ t IN (V DIFF {z}) ==> ~ collinear {vec 0, z, t}) /\
1916 (! x. x IN FF ==> aff_gt {vec 0} {v,w} SUBSET wedge_in_fan_gt x E)
1917 ==> FAN (vec 0, V, E UNION {{v,w}}) `,
1918 [REWRITE_TAC[FAN; local_fan; UNIONS_UNION; UNIONS_1; UNION_SUBSET];
1919 LET_TAC;
1920 SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET; graph; SET_RULE` (A UNION B) x <=> 
1921 A x \/ B x `; MESON[]`(!x. P x \/ Q x ==> L x) <=> (! x. P x ==> L x ) /\
1922 (! x. Q x ==> L x )`];
1923
1924 SIMP_TAC[SET2_HAS_SIZE2; Geomdetail.IN_ACT_SING];
1925 ONCE_REWRITE_TAC[EQ_SYM_EQ];
1926 SIMP_TAC[SET2_HAS_SIZE2; fan1; fan2; fan6; fan7; IN_UNION; MESON[]` 
1927 (!x. P x \/ Q x ==> L x) <=> (! x. P x ==> L x) /\ (!x. Q x ==> L x) `; Geomdetail.IN_ACT_SING];
1928 STRIP_TAC;
1929 CONJ_TAC;
1930 GEN_TAC;
1931 SIMP_TAC[Local_lemmas.INSERT_UNION2; UNION_EMPTY];
1932
1933 STRIP_TAC;
1934 FIRST_X_ASSUM MATCH_MP_TAC;
1935 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
1936
1937 ONCE_REWRITE_TAC[TAUT` (a \/ b) \/ c <=> b \/ a \/ c `];
1938 ONCE_REWRITE_TAC[TAUT` (a \/ b) /\ (x \/ y) ==> l <=> ( a /\ x ==> l) /\
1939 ( a /\ y ==> l ) /\ ( b /\ x ==> l) /\ (b /\ y ==> l) `];
1940 ASM_SIMP_TAC[INTER_IDEMPOT];
1941
1942 MATCH_MP_TAC (
1943 MESON[]` (! e1 e2. L e1 e2 ==> L e2 e1) /\ (! e1 e2. e1 = x /\ Q e2 ==> L x e2)
1944 ==> (! e1 e2. (e1 = x /\ Q e2 ==> L x e2) /\ (Q e1 /\ e2 = x ==> L e1 x))`);
1945 SIMP_TAC[INTER_COMM];
1946
1947
1948 REPEAT STRIP_TAC;
1949 SUBGOAL_THEN` (e2: real^3 -> bool) HAS_SIZE 2` ASSUME_TAC;
1950 DOWN;
1951 ASM_REWRITE_TAC[IN];
1952
1953 DOWN;
1954 REWRITE_TAC[HAS_SIZE_2_EXISTS2];
1955 STRIP_TAC;
1956
1957 SUBGOAL_THEN` (x':real^3, y:real^3) IN FF \/ (y,x') IN FF ` MP_TAC;
1958 MATCH_MP_TAC Local_lemmas.LOFA_IN_E_IMP_IN_FF;
1959 ASM_REWRITE_TAC[local_fan];
1960 LET_TAC;
1961 ASM_REWRITE_TAC[FAN; graph; fan1; fan6; fan7; fan2; IN_UNION];
1962 CONJ_TAC;
1963 EXISTS_TAC` x:real^3 # real^3 `;
1964 ASM_REWRITE_TAC[];
1965 FIRST_X_ASSUM (SUBST1_TAC o SYM);
1966 FIRST_ASSUM ACCEPT_TAC;
1967
1968 ASM_REWRITE_TAC[];
1969
1970 DOWN THEN DOWN THEN PHA;
1971 SPEC_TAC (`x':real^3 `,` x': real^3 `);
1972 SPEC_TAC (`y:real^3 `,` y: real^3 `);
1973 REWRITE_TAC[TAUT` a /\ b /\ c <=> (a/\b) /\ c `];
1974 MATCH_MP_TAC (MESON[]`(! x y. Q x y ==> Q y x) /\
1975 (! x y. Q x y /\ P x y ==> L x y ) /\ (! x y. L x y ==> L y x)
1976 ==> (! (x:real^3) (y:real^3). Q x y /\ (P x y \/ P y x) ==> L x y )`);
1977 SIMP_TAC[INSERT_COMM];
1978 REPEAT STRIP_TAC;
1979
1980 SUBGOAL_THEN `~collinear {vec 0, v, w:real^3}` ASSUME_TAC;
1981 FIRST_X_ASSUM MATCH_MP_TAC;
1982 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; DE_MORGAN_THM; NOT_IN_EMPTY];
1983 DOWN;
1984 NHANH Planarity.aff_ge_eq_aff_gt_union_aff_ge;
1985 SIMP_TAC[UNION_OVER_INTER];
1986 STRIP_TAC;
1987
1988 UNDISCH_TAC `y':real^3, y:real^3 IN FF `;
1989 FIRST_ASSUM NHANH;
1990 REWRITE_TAC[wedge_in_fan_gt];
1991
1992 SUBGOAL_THEN` local_fan (V,E,FF)` MP_TAC;
1993 ASM_REWRITE_TAC[IN_UNION; local_fan; FAN; fan1; fan2; fan6; fan7; graph];
1994 LET_TAC;
1995 ASM_REWRITE_TAC[];
1996 EXISTS_TAC` x:real^3 # real^3 `;
1997 ASM_REWRITE_TAC[];
1998 STRIP_TAC;
1999 STRIP_TAC;
2000 ASSUME_TAC2 (SPEC`y': real^3 ` (GEN `x:real^3 `
2001  Local_lemmas.LOCAL_FAN_IMP_IN_V));
2002
2003 SUBGOAL_THEN` CARD (EE (y':real^3) E) = 2 ` ASSUME_TAC;
2004 MATCH_MP_TAC Local_lemmas.LOFA_CARD_EE_V_1;
2005 ASM_SIMP_TAC[];
2006 FIRST_X_ASSUM SUBST_ALL_TAC;
2007 DOWN THEN DOWN THEN PHA;
2008 REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2009
2010 STRIP_TAC;
2011 MP_TAC (REWRITE_RULE[EMPTY_SUBSET; INSERT_SUBSET; IN_INSERT] 
2012 (ISPECL [` {y':real^3} `;` {vec 0, y':real^3}`; `{y:real^3 }`] 
2013 (GEN_ALL Local_lemmas.AFF_GE_MONO_TRANS)));
2014 SUBGOAL_THEN` ~ (y':real^3 = vec 0 )` MP_TAC;
2015 UNDISCH_TAC` y':real^3 IN V `;
2016 UNDISCH_TAC` ~( vec 0 IN (V:real^3 -> bool)) `;
2017 MESON_TAC[];
2018
2019 SIMP_TAC[SET_RULE` ~( y' = vec 0) ==> {vec 0, y'} DIFF {y'} = {vec 0} `];
2020 REWRITE_TAC[Local_lemmas.INSERT_UNION2; UNION_EMPTY];
2021 REPEAT STRIP_TAC;
2022
2023 MP_TAC (SPECL [` vec 0:real^3 `;` y':real^3`;` y:real^3 `; 
2024 ` (azim_cycle  (EE y' E) (vec 0) y' y) `] (GEN_ALL AFF_GE_WEDGE_DISJOINTION));
2025 STRIP_TAC;
2026 SUBGOAL_THEN` aff_ge {vec 0} {y:real^3, y'} INTER aff_gt {vec 0} {v, w} = {} ` MP_TAC;
2027 REPLICATE_TAC 3 DOWN THEN PHA;
2028 SET_TAC[];
2029
2030 SIMP_TAC[UNION_EMPTY];
2031 STRIP_TAC;
2032
2033
2034 UNDISCH_TAC` !e1 e2.
2035           (e1 IN E \/ e1 IN {{v:real^3} | v IN V}) /\
2036           (e2 IN E \/ e2 IN {{v} | v IN V})
2037           ==> aff_ge {vec 0} e1 INTER aff_ge {vec 0} e2 =
2038               aff_ge {vec 0} (e1 INTER e2) `;
2039 STRIP_TAC;
2040 SUBGOAL_THEN` ({y, y'} IN E \/ {y, y'} IN {{v:real^3} | v IN V}) /\
2041           ({v} IN E \/ {v} IN {{v} | v IN V})` MP_TAC;
2042 UNDISCH_TAC` (e2:real^3 -> bool) IN E `;
2043 ASM_SIMP_TAC[IN_ELIM_THM];
2044
2045 STRIP_TAC;
2046 DISJ2_TAC;
2047 EXISTS_TAC` v:real^3 `;
2048 ASM_REWRITE_TAC[];
2049 FIRST_ASSUM NHANH;
2050 SIMP_TAC[];
2051
2052 REMOVE_TAC;
2053 SUBGOAL_THEN` ({y, y'} IN E \/ {y, y'} IN {{v:real^3} | v IN V}) /\
2054           ({w} IN E \/ {w} IN {{v} | v IN V})` MP_TAC;
2055 UNDISCH_TAC` (e2:real^3 -> bool) IN E `;
2056 ASM_SIMP_TAC[IN_ELIM_THM];
2057 STRIP_TAC;
2058 DISJ2_TAC;
2059 EXISTS_TAC` w:real^3 `;
2060 ASM_REWRITE_TAC[];
2061 FIRST_ASSUM NHANH;
2062 SIMP_TAC[];
2063 REMOVE_TAC;
2064
2065 ASM_CASES_TAC` {y, y'} INTER {v, w:real^3} = {} `;
2066 DOWN;
2067 NHANH (SET_RULE` S INTER {a,b} = {} ==> S INTER {a} = {} /\ S INTER {b} = {}`);
2068
2069 SIMP_TAC[UNION_IDEMPOT];
2070
2071
2072
2073
2074 ASM_CASES_TAC` {y, y': real^3} INTER {v} = {} \/
2075 {y, y': real^3} INTER {w} = {}`;
2076 DOWN THEN DOWN;
2077 SPEC_TAC (`w:real^3 `,` w:real^ 3 `);
2078 SPEC_TAC (`v:real^3 `,` v:real^ 3 `);
2079 MATCH_MP_TAC (MESON[]` (! x y. A x y ==> A y x) /\
2080 (! x y. B x y ==> B y x ) /\
2081 (! x y. A x y ==> M x ==> B x y)
2082 ==> (! x y. A x y ==> M x \/ M y ==> B x y ) `);
2083
2084 SIMP_TAC[INSERT_COMM; UNION_COMM];
2085
2086 PHA;
2087 NHANH (SET_RULE` ~({y, y'} INTER {v, w} = {}) /\ {y, y'} INTER {v} = {}
2088 ==> {y, y'} INTER {v, w} = {w} /\ {y, y'} INTER {w} = {w}`);
2089 SIMP_TAC[];
2090 REPEAT STRIP_TAC;
2091 REWRITE_TAC[AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
2092 MATCH_MP_TAC (SET_RULE` x IN S ==> {x} UNION S = S `);
2093 REWRITE_TAC[IN_ELIM_THM; HALFLINE];
2094 EXISTS_TAC ` &0 `;
2095 REWRITE_TAC[REAL_LE_REFL];
2096 VECTOR_ARITH_TAC;
2097
2098 DOWN THEN DOWN THEN PHA;
2099 UNDISCH_TAC` ~ ( w = v:real^3)`;
2100 PHA;
2101
2102 NHANH (SET_RULE `~(w = v) /\
2103  ~({y, y'} INTER {v, w} = {}) /\
2104  ~({y, y'} INTER {v} = {} \/ {y, y'} INTER {w} = {})
2105 ==> {y,y'} = {v, w} `);
2106 STRIP_TAC;
2107 UNDISCH_TAC` aff_ge {vec 0} {y, y'} INTER aff_gt {vec 0} {v:real^3, w} = {}`;
2108 ASM_REWRITE_TAC[];
2109 NHANH (SET_RULE` (A UNION B) INTER A = {} ==> A = {} `);
2110
2111 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3 }` MP_TAC;
2112 UNDISCH_TAC` ~( vec 0 IN (V:real^3 -> bool)) `;
2113 UNDISCH_TAC` (v:real^3) IN V `;
2114 UNDISCH_TAC` (w:real^3) IN V `;
2115 REWRITE_TAC[DISJOINT; Trigonometry2.INSERT_INTER_EMPTY; IN_INSERT; NOT_IN_EMPTY];
2116 MESON_TAC[];
2117
2118 NHANH Planarity.AFF_GT_1_2;
2119 SIMP_TAC[];
2120 REPEAT STRIP_TAC;
2121 DOWN;
2122 REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY];
2123 DISCH_THEN (MP_TAC o (SPEC` (&1 / &2) % v + (&1 / &2 ) % (w:real^3)`));
2124 REWRITE_TAC[NOT_EXISTS_THM];
2125 DISCH_THEN (MP_TAC o (SPECL [` &0 `;` &1 / &2`;` &1 / &2 `]));
2126 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID; REAL_ARITH` &0 < &1 / &2 /\
2127 &0 + &1 / &2 + &1 / &2 = &1`];
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137 DOWN;
2138 REWRITE_TAC[IN_ELIM_THM];
2139 STRIP_TAC;
2140 SUBGOAL_THEN` local_fan (V,E, FF) ` MP_TAC;
2141 ASM_REWRITE_TAC[local_fan; FAN; fan1; fan2; fan6; fan7; graph];
2142 LET_TAC;
2143 ASM_REWRITE_TAC[IN_UNION];
2144 EXISTS_TAC` x: real^3 # real^3 `;
2145 ASM_REWRITE_TAC[];
2146 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
2147 STRIP_TAC;
2148 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`v': real^3`));
2149 UNDISCH_TAC` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E`;
2150 DISCH_THEN (ASSUME_TAC2 o (SPEC `v',rho_node1 FF v' `));
2151
2152 SUBGOAL_THEN` ~((v:real^3 ) = vec 0)/\ ~( (w:real^3) = vec 0) ` MP_TAC;
2153 UNDISCH_TAC` v:real^3 IN V `;
2154 UNDISCH_TAC` w:real^3 IN V `;
2155 UNDISCH_TAC` ~( vec 0 IN (V:real^3 -> bool)) `;
2156 MESON_TAC[];
2157 NHANH Wrgcvdr_cizmrrh.AFF_GE_TO_AFF_GT2_GE1;
2158
2159 DOWN;
2160 REWRITE_TAC[wedge_in_fan_gt];
2161
2162 ASSUME_TAC2 (
2163 SPEC` v':real^3 ` (GEN `v:real^3 ` Local_lemmas.LOFA_CARD_EE_V_1));
2164 ASM_REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2165
2166 MP_TAC (SPECL [` vec 0: real^3 `;` v': real^3 `; ` rho_node1 FF v' `; 
2167 `(azim_cycle  (EE v' E) (vec 0) v' (rho_node1 FF v')) `] 
2168 (GEN_ALL EDGE_NOT_INTER_WITH_WEDGE));
2169 MP_TAC (ISPECL [` vec 0:real^3 `;` v':real^3`] (GEN_ALL AFF_GE11_SUB_AFF2));
2170 PHA;
2171 NHANH (SET_RULE` a SUBSET B /\ B INTER S = {} /\ l ==> a INTER S = {} `);
2172 STRIP_TAC;
2173 ASM_REWRITE_TAC[UNION_OVER_INTER];
2174
2175 SUBGOAL_THEN` aff_ge {vec 0} {v'} INTER aff_gt {vec 0} {v, w:real^3} = {}` ASSUME_TAC;
2176 DOWN;
2177 MATCH_MP_TAC (SET_RULE` a SUBSET b ==> x INTER b = {} ==> x INTER a = {} `);
2178 FIRST_X_ASSUM ACCEPT_TAC;
2179 ASM_REWRITE_TAC[UNION_EMPTY];
2180
2181 UNDISCH_TAC` !e1 e2.
2182           (e1 IN E \/ e1 IN {{v:real^3} | v IN V}) /\
2183           (e2 IN E \/ e2 IN {{v} | v IN V})
2184           ==> aff_ge {vec 0} e1 INTER aff_ge {vec 0} e2 =
2185               aff_ge {vec 0} (e1 INTER e2)`;
2186 STRIP_TAC;
2187 FIRST_ASSUM (MP_TAC o (SPECL [` {v':real^3} `;` {v:real^3}`]));
2188 ANTS_TAC;
2189 ASM_REWRITE_TAC[IN_ELIM_THM];
2190 UNDISCH_TAC` v:real^3 IN V `;
2191 UNDISCH_TAC` v':real^3 IN V `;
2192 MESON_TAC[];
2193
2194
2195 FIRST_ASSUM (MP_TAC o (SPECL [` {v':real^3} `;` {w:real^3}`]));
2196 ANTS_TAC;
2197 ASM_REWRITE_TAC[IN_ELIM_THM];
2198 UNDISCH_TAC` w:real^3 IN V `;
2199 UNDISCH_TAC` v':real^3 IN V `;
2200 MESON_TAC[];
2201
2202 SIMP_TAC[];
2203 REPEAT STRIP_TAC;
2204
2205 ASM_CASES_TAC` {v'} INTER {v, w} = {v':real^3} `;
2206 DOWN;
2207 SIMP_TAC[];
2208 UNDISCH_TAC` ~( w = (v:real^3) )`;
2209 PHA;
2210 NHANH (SET_RULE`{v'} INTER {v, w} = {v'}
2211 ==> v = v' \/ w = v' `);
2212 NHANH (SET_RULE` ~( a = b ) ==> {a} INTER {b} = {} `);
2213 STRIP_TAC;
2214 ASM_REWRITE_TAC[];
2215 FIRST_X_ASSUM SUBST_ALL_TAC;
2216 DOWN THEN DOWN THEN PHA;
2217 SIMP_TAC[INTER_IDEMPOT; INTER_COMM; AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
2218 STRIP_TAC;
2219
2220 MP_TAC (ISPECL [` {vec 0:real^3 }`;` {v': real^3 }`]
2221  AFFINE_HULL_SUBSET_AFF_GE);
2222 ANTS_TAC;
2223 UNDISCH_TAC` ~((v':real^3) = vec 0) `;
2224 REWRITE_TAC[DISJOINT];
2225 SET_TAC[];
2226
2227 REWRITE_TAC[AFFINE_HULL_SING];
2228 SET_TAC[];
2229
2230
2231 FIRST_X_ASSUM SUBST_ALL_TAC;
2232 ASM_REWRITE_TAC[];
2233 DOWN THEN DOWN THEN PHA;
2234 SIMP_TAC[INTER_IDEMPOT; INTER_COMM; AFF_GE_EQ_AFFINE_HULL; AFFINE_HULL_SING];
2235
2236
2237 MP_TAC (ISPECL [` {vec 0:real^3 }`;` {v': real^3 }`]
2238  AFFINE_HULL_SUBSET_AFF_GE);
2239 ANTS_TAC;
2240 UNDISCH_TAC` ~((v':real^3) = vec 0) `;
2241 REWRITE_TAC[DISJOINT];
2242 SET_TAC[];
2243 REWRITE_TAC[AFFINE_HULL_SING];
2244 SET_TAC[];
2245
2246
2247 DOWN;
2248 NHANH (SET_RULE` ~({v'} INTER {v, w} = {v'})
2249 ==> {v'} INTER {v} = {} /\ {v'} INTER {w} = {} /\ {v, w} INTER {v'} = {}`);
2250 SIMP_TAC[UNION_IDEMPOT; INTER_COMM]]);;
2251
2252
2253
2254
2255
2256
2257
2258
2259 let FACE_MAP_ADD_SET2_EQ = prove_by_refinement
2260 (` (x,y) IN darts_of_hyp ( E UNION {{a,b}}) V /\
2261 ~( y = a) /\ ~ ( y = b ) /\
2262 FAN (vec 0, V, E) /\
2263 FAN (vec 0, V, E UNION {{a,b}} )
2264 ==> (face_map (hypermap ( HYP (vec 0, V, (E UNION {{a,b}}))))) (x,y) =
2265 (face_map (hypermap (HYP (vec 0, V, E)))) (x,y) `,
2266 [NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2267 SIMP_TAC[];
2268 STRIP_TAC;
2269
2270 SUBGOAL_THEN` (x,y) IN darts_of_hyp ( E UNION {{a,b:real^3}}) V ` MP_TAC;
2271 ASM_REWRITE_TAC[];
2272 REWRITE_TAC[darts_of_hyp; IN_UNION];
2273 DISCH_TAC;
2274 SUBGOAL_THEN` (x,y) IN darts_of_hyp E (V:real^3 -> bool) ` MP_TAC;
2275 REWRITE_TAC[darts_of_hyp; IN_UNION];
2276 DOWN THEN STRIP_TAC;
2277 DISJ1_TAC;
2278 DOWN;
2279 REWRITE_TAC[ord_pairs; IN_ELIM_THM; IN_UNION];
2280 STRIP_TAC;
2281 EXISTS_TAC` a': real^3 `;
2282 EXISTS_TAC` b': real^3 `;
2283 ASM_REWRITE_TAC[];
2284
2285
2286 DOWN THEN DOWN;
2287 REWRITE_TAC[IN_SING; PAIR_EQ; Collect_geom.PAIR_EQ_EXPAND];
2288 REPEAT STRIP_TAC;
2289 UNDISCH_TAC` ~( y = b:real^3 ) `;
2290 ASM_REWRITE_TAC[];
2291
2292 UNDISCH_TAC` ~( y = a:real^3) `;
2293 ASM_REWRITE_TAC[];
2294 DOWN;
2295 REWRITE_TAC[self_pairs; IN_ELIM_THM];
2296 STRIP_TAC;
2297 DISJ2_TAC;
2298 EXISTS_TAC` v:real^3 `;
2299 ASM_REWRITE_TAC[];
2300 DOWN THEN DOWN;
2301 SIMP_TAC[EE; IN_UNION];
2302 SET_TAC[];
2303
2304
2305 ASM_SIMP_TAC[ff_of_hyp];
2306 SUBGOAL_THEN` (EE y (E UNION {{a, b}})) = (EE (y:real^3) E)` SUBST1_TAC;
2307 REWRITE_TAC[EE; EXTENSION; IN_ELIM_THM; IN_UNION];
2308 GEN_TAC;
2309 MATCH_MP_TAC (TAUT` (a ==> b) ==> ( b \/ a <=> b )`);
2310 REWRITE_TAC[IN_SING; Collect_geom.PAIR_EQ_EXPAND];
2311 ASM_REWRITE_TAC[];
2312
2313 PHA]);;
2314
2315
2316 (* ========================================================== *)
2317 (* ========================================================== *)
2318
2319
2320
2321
2322
2323 let LOCAL_FACE_MAP_RHO_NODE1 = prove_by_refinement
2324 (` local_fan (V,E,FF) /\
2325 (x,y) IN FF 
2326 ==> face_map ( hypermap (HYP (vec 0,V,E))) (x,y) =
2327 (rho_node1 FF x, rho_node1 FF y ) `,
2328 [NHANH Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
2329 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2330 SIMP_TAC[];
2331 NHANH Local_lemmas.LOFA_DARTS_FF_UNION_SWITCH_FF;
2332 STRIP_TAC;
2333 SUBGOAL_THEN` x,y IN darts_of_hyp E (V:real^3 -> bool) ` MP_TAC;
2334 ASM_REWRITE_TAC[IN_UNION];
2335
2336 SIMP_TAC[ff_of_hyp];
2337
2338 ASSUME_TAC2 (SPECL [` x:real^3 `;` y:real^3 `] (
2339 GENL [`v: real^3 `;` w:real^3 `] Local_lemmas.DETER_RHO_NODE));
2340 ASM_REWRITE_TAC[PAIR_EQ];
2341 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_IMP_IN_V;
2342 DOWN THEN STRIP_TAC;
2343 ASSUME_TAC2 (SPECL [`x:real^3 `;` y:real^3 `] (
2344 GENL [`vv: real^ 3 `;` v: real^3 `] Local_lemmas.LOFA_IMP_EE_TWO_ELMS));
2345 ASM_REWRITE_TAC[ivs_azim_cycle; SET_RULE` ~( x INSERT S = {} )`];
2346 ABBREV_TAC` tt = (@x'. x' IN {rho_node1 FF y, x} /\
2347            azim_cycle {rho_node1 FF y, x} (vec 0) y x' = x)` ;
2348 SUBGOAL_THEN`tt IN  {rho_node1 FF y, x} /\
2349 azim_cycle {rho_node1 FF y, x} (vec 0) y tt = x` MP_TAC;
2350 EXPAND_TAC "tt";
2351 REWRITE_TAC[MESON[EXISTS_THM]` (@x'. x' IN {rho_node1 FF y, x} /\
2352        azim_cycle {rho_node1 FF y, x} (vec 0) y x' = x) IN
2353  {rho_node1 FF y, x} /\
2354  azim_cycle {rho_node1 FF y, x} (vec 0) y
2355  (@x'. x' IN {rho_node1 FF y, x} /\
2356        azim_cycle {rho_node1 FF y, x} (vec 0) y x' = x) =
2357  x
2358
2359 <=> ? x'. x' IN {rho_node1 FF y, x} /\
2360        azim_cycle {rho_node1 FF y, x} (vec 0) y x' = x `];
2361 EXISTS_TAC` rho_node1 FF y `;
2362 REWRITE_TAC[IN_INSERT; Local_lemmas.AZIM_CYCLE_TWO_POINT_SET; IN_INSERT; NOT_IN_EMPTY];
2363
2364 REWRITE_TAC[IN_INSERT; Local_lemmas.AZIM_CYCLE_TWO_POINT_SET; IN_INSERT; NOT_IN_EMPTY];
2365
2366 STRIP_TAC;
2367 ASM_REWRITE_TAC[];
2368
2369 DOWN;
2370 ASM_REWRITE_TAC[INSERT_COMM; Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
2371 ASSUME_TAC2 (SPEC `y:real^3 ` (GEN `v:real^3 ` Local_lemmas.LOFA_CARD_EE_V_1));
2372 DOWN;
2373 ASM_SIMP_TAC[Geomdetail.CARD2]]);;
2374
2375
2376
2377
2378
2379
2380 let IN_DARTS_EXTENSION = prove(
2381 ` {x:A,y} IN E ==> x,y IN darts_of_hyp (E UNION S) V `,
2382 REWRITE_TAC[darts_of_hyp; IN_UNION; ord_pairs; IN_ELIM_THM; PAIR_EQ] THEN 
2383 STRIP_TAC THEN DISJ1_TAC THEN EXISTS_TAC` x:A` THEN EXISTS_TAC` y:A ` THEN
2384 ASM_REWRITE_TAC[]);;
2385
2386
2387
2388
2389
2390
2391 let LOCAL_RHO_NODE_PAIR_E = prove(
2392 `! v. local_fan (V,E,FF) /\ v IN V 
2393 ==> {v, rho_node1 FF v} IN E `,
2394 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2 THEN 
2395 REPEAT STRIP_TAC THEN DOWN THEN FIRST_X_ASSUM NHANH THEN 
2396 ASM_MESON_TAC[Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2]);;
2397
2398
2399
2400
2401
2402 let LOFA_HYP_UNION_CARD_GT2 = prove_by_refinement
2403 (`(local_fan (V,E,FF) /\
2404      v IN V /\
2405      w IN V /\
2406      ~(v = w) /\
2407      (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
2408      (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
2409      HS = hypermap ( HYP (vec 0,V,E UNION {{v, w}})) /\
2410      fv = face HS (v, rho_node1 FF v)
2411      ==> 2 < CARD fv `,
2412 [NHANH PROVE_SLICING_FAN;
2413 NHANH Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE;
2414 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
2415 STRIP_TAC;
2416 SUBGOAL_THEN` ~(rho_node1 FF v = w) ` ASSUME_TAC;
2417 USE_FIRST ` !x. x IN V ==> x,rho_node1 FF x IN FF ` (ASSUME_TAC2 o (SPEC`v: real^3 `));
2418 DOWN;
2419 USE_FIRST` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E ` NHANH;
2420 REWRITE_TAC[wedge_in_fan_gt];
2421 ASSUME_TAC2 Local_lemmas.LOFA_CARD_EE_V_1;
2422 ASM_REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2423
2424
2425
2426 MP_TAC (ISPECL [` {v:real^3} `; ` {vec 0, v:real^3} `;` {rho_node1 FF v} `]
2427  (GEN_ALL Local_lemmas.AFF_GE_MONO_TRANS));
2428 ANTS_TAC;
2429 SIMP_TAC[SUBSET; IN_SING; IN_INSERT];
2430
2431 SUBGOAL_THEN` FAN (vec 0,V,E UNION {{v:real^3, w}}) ` MP_TAC;
2432 FIRST_X_ASSUM ACCEPT_TAC;
2433 REWRITE_TAC[FAN; fan1; fan2];
2434 STRIP_TAC;
2435 SUBGOAL_THEN ` ~( v:real^3 = vec 0) ` MP_TAC;
2436 ASM_MESON_TAC[];
2437 SIMP_TAC[SET_RULE` ~( a = b) ==> {b,a} DIFF {a} = {b} `; SET_RULE` {a} UNION {b} = {b,a}`];
2438 REPEAT STRIP_TAC;
2439
2440 MP_TAC (SPECL [`vec 0: real^3 `;` v: real^3 `;` rho_node1 FF v `; 
2441 ` (azim_cycle  (EE v E) (vec 0) v (rho_node1 FF v)) ` ] 
2442 (GEN_ALL AFF_GE_WEDGE_DISJOINTION));
2443 ABBREV_TAC` tv = azim_cycle  (EE v E) (vec 0) v (rho_node1 FF v) `;
2444 STRIP_TAC;
2445 UNDISCH_TAC` aff_gt {vec 0} {v, w} SUBSET wedge  (vec 0) v (rho_node1 FF v) tv `;
2446 UNDISCH_TAC` aff_ge {vec 0, v} {rho_node1 FF v} INTER
2447       wedge  (vec 0) v (rho_node1 FF v) tv =
2448       {} `;
2449 MP_TAC (ISPECL [` {vec 0: real^ 3} `; ` {v, w:real^3} `] AFF_GT_SUBSET_AFF_GE);
2450 ASM_REWRITE_TAC[];
2451
2452 MATCH_MP_TAC (
2453 SET_RULE` ge12 SUBSET ge21 /\ ~( gt = {} ) ==>
2454 gt SUBSET ge12 ==> ge21 INTER we = {} ==> ~( gt SUBSET we ) `);
2455 UNDISCH_TAC` aff_ge {vec 0} {v, rho_node1 FF v} SUBSET
2456       aff_ge {vec 0, v} {rho_node1 FF v}`;
2457 ASM_SIMP_TAC[];
2458 STRIP_TAC;
2459 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3}` MP_TAC;
2460 REWRITE_TAC[SET_RULE` DISJOINT {a} {x,y} <=> ~( x = a) /\ ~( y = a) `];
2461 ASM_REWRITE_TAC[];
2462 UNDISCH_TAC` ~( vec 0:real^3 IN V ) `;
2463 UNDISCH_TAC` w:real^3 IN V `;
2464 MESON_TAC[];
2465
2466 SIMP_TAC[Planarity.AFF_GT_1_2; EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY];
2467 REPEAT STRIP_TAC;
2468 FIRST_ASSUM (MP_TAC o (SPEC` &1 / &2 % v + &1 / &2 % (w:real^3) `));
2469 REWRITE_TAC[];
2470 EXISTS_TAC` &0 `;
2471 EXISTS_TAC` &1 / &2 `;
2472 EXISTS_TAC` &1 / &2 `;
2473 REWRITE_TAC[REAL_ARITH` &0 < &1 / &2 /\
2474  &0 < &1 / &2 /\
2475  &0 + &1 / &2 + &1 / &2 = &1 `];
2476 REWRITE_TAC[VECTOR_ARITH` &0 % v + x = x `];
2477
2478
2479
2480 ASM_CASES_TAC` rho_node1 FF ( rho_node1 FF v) = v `;
2481 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_V;
2482 FIRST_ASSUM (ASSUME_TAC2 o (SPEC `v:real^3 `));
2483 REPLICATE_TAC 3 DOWN;
2484 NHANH (GEN_ALL Local_lemmas.ORD2_ORBIT_MAP);
2485 SIMP_TAC[];
2486 REPEAT STRIP_TAC;
2487 UNDISCH_TAC` w IN (V:real^3 -> bool) `;
2488 EXPAND_TAC "V";
2489 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
2490 ASM_REWRITE_TAC[];
2491 ASSUME_TAC2 (SPEC_ALL LOCAL_RHO_NODE_PAIR_E);
2492
2493 DOWN;
2494 NHANH (ISPEC ` {{v, w:real^3}} ` (GEN `S: (A -> bool) -> bool` IN_DARTS_EXTENSION));
2495 DOWN THEN STRIP_TAC;
2496 ASSUME_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
2497 NHANH (ONCE_REWRITE_RULE[TAUT` a /\ b ==> c <=> a ==> b ==> c `] FACE_MAP_ADD_SET2_EQ);
2498 STRIP_TAC;
2499 DOWN;
2500 ANTS_TAC;
2501 USE_FIRST` !v. v IN V
2502           ==> ~(rho_node1 FF v = v) /\
2503               v,rho_node1 FF v IN ord_pairs E /\
2504               ~collinear {vec 0, v, rho_node1 FF v} ` (ASSUME_TAC2 o SPEC_ALL);
2505 ASM_REWRITE_TAC[];
2506 USE_FIRST` !x. x IN V ==> x,rho_node1 FF x IN FF ` (ASSUME_TAC2 o (SPEC` v:real^3 `));
2507
2508 ASSUME_TAC2 (
2509 SPECL [` v:real^3 `;` rho_node1 FF v `] (
2510 GENL [`x:real^3`;` y:real^3 `] LOCAL_FACE_MAP_RHO_NODE1));
2511
2512
2513 SWITCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v, w:real^3}})) `;
2514 SWITCH_TAC` fv = face HS (v,rho_node1 FF (v:real^3))`;
2515 ASM_REWRITE_TAC[];
2516
2517 ASSUME_TAC2 Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2518 ASSUME_TAC2 (SPEC ` rho_node1 FF v` LOCAL_RHO_NODE_PAIR_E);
2519 DOWN;
2520 NHANH (ISPEC ` {{v, w:real^3}} ` (GEN `S: (A -> bool) -> bool` IN_DARTS_EXTENSION));
2521 REPEAT STRIP_TAC;
2522
2523 SUBGOAL_THEN` v, rho_node1 FF v IN fv /\
2524 rho_node1 FF v,rho_node1 FF (rho_node1 FF v) IN fv /\
2525 face_map HS (rho_node1 FF v,rho_node1 FF (rho_node1 FF v)) IN fv ` MP_TAC;
2526
2527 SUBGOAL_THEN` v,rho_node1 FF v IN fv /\
2528  rho_node1 FF v,rho_node1 FF (rho_node1 FF v) IN fv ` MP_TAC;
2529 EXPAND_TAC "fv";
2530 REWRITE_TAC[face; orbit_map; IN_ELIM_THM];
2531 CONJ_TAC;
2532 EXISTS_TAC `0`;
2533 REWRITE_TAC[ARITH_RULE` 0 >= 0`; POWER; I_THM];
2534
2535 EXISTS_TAC` 1 `;
2536 ASM_REWRITE_TAC[POWER_TO_ITER; ITER12; ARITH_RULE` 1 >= 0 `];
2537 SIMP_TAC[];
2538
2539 EXPAND_TAC "fv";
2540 SIMP_TAC[face; Wrgcvdr_cizmrrh.IN_ORBIT_MAP_IMP_F_Y];
2541 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
2542 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2543 ASM_SIMP_TAC[];
2544 STRIP_TAC;
2545 UNDISCH_TAC` rho_node1 FF v,rho_node1 FF (rho_node1 FF v) IN
2546       darts_of_hyp (E UNION {{v, w}}) V `;
2547 SIMP_TAC[ff_of_hyp];
2548 ABBREV_TAC` rh1 = rho_node1 FF v `;
2549 ABBREV_TAC` rr2 = ivs_azim_cycle  (EE (rho_node1 FF rh1) (E UNION {{v, w}})) (vec 0)
2550      (rho_node1 FF rh1)
2551      rh1 `;
2552
2553 REPEAT STRIP_TAC;
2554 SUBGOAL_THEN` ~((v:real^3, rh1 :real^3) = rh1,rho_node1 FF rh1) /\
2555 ~( rh1,rho_node1 FF rh1 = rho_node1 FF rh1, rr2 ) /\
2556 ~( v, rh1 = rho_node1 FF rh1, rr2 ) ` MP_TAC;
2557 ASM_REWRITE_TAC[PAIR_EQ];
2558
2559 USE_FIRST` !v. v IN V
2560           ==> ~(rho_node1 FF v = v) /\
2561               v,rho_node1 FF v IN ord_pairs E /\
2562               ~collinear {vec 0, v, rho_node1 FF v} ` (MP_TAC o SPEC_ALL);
2563 ANTS_TAC;
2564 FIRST_ASSUM ACCEPT_TAC;
2565
2566 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` rh1: real^3 `));
2567 ASM_SIMP_TAC[];
2568 STRIP_TAC;
2569 MP_TAC (ISPECL [` HS: (real^3#real^3)hypermap `; ` (v:real^3, rh1: real^3) `] Hypermap.FACE_FINITE);
2570 STRIP_TAC;
2571 SUBGOAL_THEN` CARD {(v,rh1), (rh1,rho_node1 FF rh1), (rho_node1 FF rh1,rr2)} <= CARD (fv:real^3 # real^3 -> bool) ` MP_TAC;
2572 MATCH_MP_TAC CARD_SUBSET;
2573 DOWN;
2574 ASM_SIMP_TAC[INSERT_SUBSET; EMPTY_SUBSET];
2575
2576 SUBGOAL_THEN` CARD {(v,rh1), (rh1,rho_node1 FF rh1), (rho_node1 FF rh1,rr2)} = 3 ` SUBST1_TAC;
2577 ASM_REWRITE_TAC[Geomdetail.CARD3];
2578 ARITH_TAC]);;
2579
2580
2581 (* = *)
2582
2583
2584 let LOCAL_FAN_SIMPLE_HYP = prove_by_refinement
2585 (` local_fan (V,E,FF) ==> simple_hypermap (hypermap (HYP (vec 0, V,E))) `,
2586 [REWRITE_TAC[local_fan];
2587 LET_TAC;
2588 STRIP_TAC;
2589 ASM_CASES_TAC` CARD (FF:real^3 # real^3 -> bool) = 0 `;
2590 DOWN;
2591 ASM_REWRITE_TAC[];
2592 REWRITE_TAC[MATCH_MP  (ISPEC` face H (x:A)` CARD_EQ_0) (SPEC_ALL Hypermap.FACE_FINITE)];
2593 REWRITE_TAC[EXTENSION; NOT_IN_EMPTY];
2594 MESON_TAC[Hypermap.face_refl];
2595 DOWN THEN DOWN THEN PHA;
2596 REWRITE_TAC[Lvducxu.DIH2K_IMP_SIMPLE_HYPERMAP2]]);;
2597 (* RITE_TAC[Lvducxu.DIH2K_IMP_SIMPLE_HYPERMAP2];; *)
2598
2599
2600
2601
2602
2603
2604 let EE_UNION = prove(` EE v ( E UNION S) = EE v E UNION EE v S `,
2605 REWRITE_TAC[EE; IN_UNION; EXTENSION; IN_ELIM_THM]);;
2606
2607
2608
2609
2610
2611
2612
2613 let EE_SING_SING = prove(` EE v {{v,w}} = {w} `,
2614 REWRITE_TAC[EE; EXTENSION; IN_ELIM_THM; IN_SING; IN_INSERT] THEN MESON_TAC[]);;
2615
2616
2617
2618
2619
2620
2621
2622 let CROSS_PAIR_NOT_IN_FF = prove_by_refinement
2623 (` local_fan (V,E,FF) /\
2624        v IN V /\
2625        w IN V /\
2626        ~(v = w) /\
2627        (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)
2628 ==> ~((v,w) IN FF) `,
2629 [STRIP_TAC; 
2630 FIRST_ASSUM NHANH;
2631 REWRITE_TAC[wedge_in_fan_gt];
2632 ASSUME_TAC2 Local_lemmas.LOFA_CARD_EE_V_1;
2633 ASM_REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2634 MP_TAC (SPECL [` vec 0: real^3 `;` v:real^3 `;`w:real^3 `;
2635 ` azim_cycle  (EE v E) (vec 0) v w`] (GEN_ALL AFF_GE_WEDGE_DISJOINTION));
2636
2637 SUBGOAL_THEN` &1 / &2 % v + &1 / &2 % (w:real^3) IN aff_ge {vec 0, v} {w} /\
2638 &1 / &2 % v + &1 / &2 % (w:real^3) IN aff_gt {vec 0} {v, w} ` MP_TAC;
2639 SUBGOAL_THEN` DISJOINT {vec 0, v:real^3} {w} /\
2640 DISJOINT {vec 0} {v, w:real^3} ` MP_TAC;
2641 REWRITE_TAC[DISJOINT];
2642 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
2643 REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_INSERT];
2644 ASM_MESON_TAC[];
2645
2646 SIMP_TAC[Fan.AFF_GE_2_1; Planarity.AFF_GT_1_2; IN_ELIM_THM];
2647 STRIP_TAC;
2648 CONJ_TAC;
2649 EXISTS_TAC` &0 `;
2650 EXISTS_TAC` &1 / &2 `;
2651 EXISTS_TAC` &1 / &2 `;
2652 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
2653 REAL_ARITH_TAC;
2654
2655 EXISTS_TAC` &0 `;
2656 EXISTS_TAC` &1 / &2 `;
2657 EXISTS_TAC` &1 / &2 `;
2658 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
2659 REAL_ARITH_TAC;
2660 SET_TAC[]]);;
2661
2662
2663 (*  =  *)
2664
2665
2666 let AZ_REFL11 = 
2667 REWRITE_RULE[] (SPECL [`v:real^3`;` v:real^3`] (CONJUNCT1 AZIM_DEGENERATE));;
2668
2669
2670
2671
2672 let AZIM_POS_IMP_CYCLIC_SET = prove_by_refinement
2673 (` &0 < azim v0 v1 w1 w2 ==> cyclic_set {w1, w2} v0 v1 `,
2674 [REWRITE_TAC[cyclic_set];
2675 STRIP_TAC;
2676 CONJ_TAC;
2677 STRIP_TAC;
2678 FIRST_X_ASSUM SUBST_ALL_TAC;
2679 DOWN;
2680 REWRITE_TAC[AZ_REFL11];
2681 REAL_ARITH_TAC;
2682
2683 REWRITE_TAC[Geomdetail.FINITE6];
2684 ASM_CASES_TAC` v0 = v1:real^3 `;
2685 FIRST_X_ASSUM SUBST_ALL_TAC;
2686 DOWN;
2687 REWRITE_TAC[AZ_REFL11; REAL_ARITH` ~( a < a ) `];
2688
2689 ASM_CASES_TAC` w1 IN affine hull {v0, v1:real^3}`;
2690 DOWN;
2691 NHANH (REWRITE_RULE[CONTRAPOS_THM; aff] Fan.th3c);
2692 STRIP_TAC;
2693 UNDISCH_TAC` &0 < azim v0 v1 w1 w2 `;
2694 ASM_SIMP_TAC[AZIM_DEGENERATE; REAL_ARITH` ~( a < a ) `];
2695
2696
2697 ASM_CASES_TAC` w2 IN affine hull {v0, v1:real^3}`;
2698 DOWN;
2699 NHANH (REWRITE_RULE[CONTRAPOS_THM; aff] Fan.th3c);
2700 STRIP_TAC;
2701 UNDISCH_TAC` &0 < azim v0 v1 w1 w2 `;
2702 ASM_SIMP_TAC[AZIM_DEGENERATE; REAL_ARITH` ~( a < a ) `];
2703
2704 REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY; IN_INSERT; IN_INTER];
2705 CONJ_TAC;
2706 REWRITE_TAC[SET_RULE` ( {w1, w2} p /\ {w1, w2} q /\ L ==> p = q ) <=>
2707 ( p = w1 /\ q = w2 /\ L ==> p = q ) /\
2708 (p = w2 /\ q = w1 /\ L ==> p = q )`];
2709
2710 MATCH_MP_TAC (
2711 MESON[]` ( ! h. w1 = w2 + h % (v0 - v1) ==> w1 = w2 ) /\
2712 (! h. w2 = w1 + h % (v0 - v1) ==> w1 = w2 + ( -- h) % ( v0 - v1 )) 
2713 ==> 
2714 !p q h.
2715      (p = w1 /\ q = w2 /\ p = q + h % (v0 - v1) ==> p = q) /\
2716      (p = w2 /\ q = w1 /\ p = q + h % (v0 - v1) ==> p = q)`);
2717 CONJ_TAC;
2718 REPEAT STRIP_TAC;
2719 SUBGOAL_THEN` w1 IN aff_ge {v0, v1} {w2:real^3} ` MP_TAC;
2720
2721 DOWN;
2722 ASSUME_TAC2 (ISPECL [` v0:real^3 `;` v1:real^3 `; `w2:real^3 `] COLLINEAR_3_AFFINE_HULL);
2723 UNDISCH_TAC` ~(w2 IN affine hull {v0, v1: real^3})`;
2724 FIRST_X_ASSUM (SUBST1_TAC o SYM);
2725 NHANH Fan.th3a;
2726 NHANH Collect_geom.simp_def_ge;
2727 SIMP_TAC[IN_ELIM_THM];
2728 REPEAT STRIP_TAC;
2729 EXISTS_TAC` h:real` ;
2730 EXISTS_TAC` -- h:real` ;
2731 EXISTS_TAC` &1 `;
2732 REWRITE_TAC[REAL_ARITH` a + -- a + b = b /\ &0 <= &1 `];
2733 VECTOR_ARITH_TAC;
2734 ASSUME_TAC2 (ISPECL [` v1:real^3 `;` v0: real^3 `; ` w2:real ^3 `] (GSYM COLLINEAR_3_AFFINE_HULL));
2735 UNDISCH_TAC ` ~(w2 IN affine hull {v0, v1:real^3})`;
2736 DOWN;
2737 ASM_SIMP_TAC[INSERT_COMM];
2738 SIMP_TAC[ GSYM Local_lemmas.AZIM_EQ_0_GE_ALT2];
2739 FIRST_X_ASSUM (SUBST_ALL_TAC o SYM);
2740 REPEAT STRIP_TAC;
2741 UNDISCH_TAC` &0 < azim v0 v1 w1 w2 `;
2742 DOWN;
2743 ASM_SIMP_TAC[Local_lemmas.AZIM_EQ_0_SYM2; REAL_ARITH` ~( a < a ) `];
2744 GEN_TAC;
2745 VECTOR_ARITH_TAC;
2746 GEN_TAC;
2747 REWRITE_TAC[DE_MORGAN_THM];
2748
2749 ASM_MESON_TAC[]]);;
2750
2751
2752
2753
2754
2755
2756
2757 let AZIM_POS_IMP_SUM_2PI = prove(
2758 ` &0 < azim a b c d ==> azim a b c d + azim a b d c = &2 * pi `,
2759 NHANH AZIM_POS_IMP_CYCLIC_SET THEN NHANH Trigonometry2.YVREJIS THEN 
2760 MESON_TAC[REAL_ARITH` a < b ==> ~( b = a ) `]);;
2761
2762 (* = *)
2763
2764
2765
2766
2767 let FACE_MAP_AT_TURNING_DART = prove_by_refinement
2768 (` (local_fan (V,E,FF) /\
2769      v IN V /\
2770      w IN V /\
2771      ~(v = w) /\
2772      (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
2773      (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
2774 (x,v) IN FF
2775 ==> face_map (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (x,v)
2776 =  (v, w)`,
2777 [NHANH PROVE_SLICING_FAN;
2778 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2779 SIMP_TAC[];
2780 STRIP_TAC;
2781 ASSUME_TAC2 (SPECL [`x:real^3 `;` v:real^3 `] (
2782 GENL [`x:real^3 `;` y:real^3 `] Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2));
2783
2784 DOWN THEN NHANH (ISPEC `{{v, w:real^3}} ` (GEN` S: (A -> bool) -> bool ` IN_DARTS_EXTENSION));
2785 SIMP_TAC[ff_of_hyp; PAIR_EQ];
2786 STRIP_TAC;
2787 ASSUME_TAC2 (SET_RULE` {x,v:real^3} IN E ==> {x,v} IN E UNION {{v,w}} `);
2788 DOWN;
2789 PAT_ONCE_REWRITE_TAC`\x. x IN Y ==> L ` [INSERT_COMM];
2790 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
2791 PHA;
2792 NHANH Wrgcvdr_cizmrrh.IVS_AZIM_EQ_INVERSE_SIGMA_FAN;
2793 SIMP_TAC[];
2794 NHANH (GSYM Wrgcvdr_cizmrrh.FAN_IMP_EE_EQ_SET_OF_EDGE);
2795 STRIP_TAC;
2796 MATCH_MP_TAC (REWRITE_RULE[TAUT` a ==> b ==> c <=> a /\ b ==> c `] Wrgcvdr_cizmrrh.SIG_AND_INVERSE1_SIG);
2797 ASM_REWRITE_TAC[IN_UNION; IN_SING];
2798 MATCH_MP_TAC Fan.UNIQUE_SIGMA_FAN;
2799 ASM_REWRITE_TAC[];
2800 ASSUME_TAC2 (SPECL [` x:real^3 `;` v:real^3 `] 
2801 (GENL [` v:real^3 `;` w:real^3 `] Local_lemmas.DETER_RHO_NODE));
2802
2803 SUBGOAL_THEN` x:real^3 IN V /\ v IN V ` MP_TAC;
2804 MATCH_MP_TAC Local_lemmas.LOCAL_FAN_IMP_IN_V;
2805 ASM_REWRITE_TAC[];
2806 STRIP_TAC;
2807 ASSUME_TAC2 (SPEC` x:real^3 ` (GEN `vv:real^3 ` Local_lemmas.LOFA_IMP_EE_TWO_ELMS));
2808 ASM_REWRITE_TAC[EE_UNION; EE_SING_SING; IN_UNION; IN_SING; IN_INSERT];
2809
2810
2811 SUBGOAL_THEN` ~( x = w:real^3 ) ` MP_TAC;
2812 STRIP_TAC;
2813 FIRST_X_ASSUM SUBST_ALL_TAC;
2814 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
2815 DOWN THEN STRIP_TAC;
2816
2817
2818
2819 UNDISCH_TAC` w:real^3 IN V `;
2820 PHA;
2821 FIRST_ASSUM NHANH;
2822 STRIP_TAC;
2823 DOWN THEN PHA;
2824
2825 MATCH_MP_TAC CROSS_PAIR_NOT_IN_FF;
2826 ASM_REWRITE_TAC[];
2827 ONCE_REWRITE_TAC[INSERT_COMM];
2828 FIRST_ASSUM ACCEPT_TAC;
2829
2830 SIMP_TAC[];
2831 STRIP_TAC;
2832 CONJ_TAC;
2833 DOWN THEN SET_TAC[];
2834
2835 REPEAT STRIP_TAC;
2836 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
2837 DOWN THEN STRIP_TAC;
2838 UNDISCH_TAC` v:real^3 IN V `;
2839 FIRST_ASSUM NHANH;
2840 USE_FIRST` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E`
2841 NHANH;
2842
2843 STRIP_TAC;
2844 DOWN;
2845 ASSUME_TAC2 Local_lemmas.LOFA_CARD_EE_V_1;
2846 DOWN THEN SIMP_TAC[wedge_in_fan_gt];
2847 REWRITE_TAC[ARITH_RULE` 2 > 1 `];
2848 ASSUME_TAC2 (SPECL [` x:real^3 `]
2849 (GENL [` vv:real^3 `] Local_lemmas.LOFA_IMP_EE_TWO_ELMS));
2850 ASM_REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
2851
2852
2853 SUBGOAL_THEN` &1 / &2 % v + &1 / &2 % w IN aff_gt {vec 0} {v, w:real^3}` ASSUME_TAC;
2854 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3} ` MP_TAC;
2855 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
2856 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3`));
2857 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3`));
2858 DOWN THEN DOWN THEN PHA;
2859 REWRITE_TAC[DISJOINT; EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_INSERT];
2860 MESON_TAC[];
2861
2862 SIMP_TAC[Planarity.AFF_GT_1_2; IN_ELIM_THM];
2863 STRIP_TAC;
2864 EXISTS_TAC` &0 `;
2865 EXISTS_TAC` &1 / &2 `;
2866 EXISTS_TAC` &1 / &2 `;
2867 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
2868 REAL_ARITH_TAC;
2869 ABBREV_TAC` vw: real^3 = &1 / &2 % v + &1 / &2 % w `;
2870
2871
2872 REWRITE_TAC[SUBSET];
2873 REPEAT STRIP_TAC;
2874 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` vw: real^3 `));
2875 DOWN;
2876 REWRITE_TAC[wedge; IN_ELIM_THM]; 
2877
2878
2879 SUBGOAL_THEN` vw IN aff_gt {vec 0, v} {w:real^3} ` MP_TAC;
2880 SUBGOAL_THEN` DISJOINT {vec 0, v} {w:real^3} ` MP_TAC;
2881 ASM_REWRITE_TAC[DISJOINT; EXTENSION; IN_INSERT; IN_INTER; NOT_IN_EMPTY];
2882
2883 UNDISCH_TAC` ~( v = w:real^3 ) `;
2884 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
2885 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
2886 DOWN;
2887 MESON_TAC[];
2888
2889 SIMP_TAC[AFF_GT_2_1; IN_ELIM_THM];
2890 STRIP_TAC;
2891 EXISTS_TAC` &0 `;
2892 EXISTS_TAC` &1 / &2 `;
2893 EXISTS_TAC` &1 / &2 `;
2894 EXPAND_TAC "vw";
2895 REWRITE_TAC[VECTOR_MUL_LZERO; VECTOR_ADD_LID];
2896 REAL_ARITH_TAC;
2897
2898 REPEAT STRIP_TAC;
2899 SUBGOAL_THEN` ~ collinear {vec 0, v, rho_node1 FF v} /\
2900 ~ collinear {vec 0, v, vw} /\
2901 ~ collinear {vec 0, v, w} ` MP_TAC;
2902 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE;
2903 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
2904 ASM_REWRITE_TAC[];
2905
2906 USE_FIRST ` !z t. z IN {v:real^3, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}` MATCH_MP_TAC;
2907 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
2908 NHANH AZIM_EQ_ALT;
2909 ASM_REWRITE_TAC[];
2910 STRIP_TAC;
2911
2912 UNDISCH_TAC` azim (vec 0) v (rho_node1 FF v) vw < azim (vec 0) v (rho_node1 FF v) x `;
2913 NHANH REAL_LT_IMP_LE;
2914 ASM_REWRITE_TAC[];
2915 STRIP_TAC;
2916 SUBGOAL_THEN` azim (vec 0) v (rho_node1 FF v) x = 
2917 azim (vec 0) v (rho_node1 FF v) w + azim (vec 0) v w x ` MP_TAC;
2918 MATCH_MP_TAC Fan.sum4_azim_fan;
2919 ASM_REWRITE_TAC[];
2920
2921 ASSUME_TAC2 (SPEC` x:real^3 ` (GEN` v:real^3 ` Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
2922 DOWN;
2923 ASM_SIMP_TAC[INSERT_COMM];
2924
2925
2926 STRIP_TAC;
2927 UNDISCH_TAC` &0 < azim (vec 0) v (rho_node1 FF v) vw `;
2928 UNDISCH_TAC` azim (vec 0) v (rho_node1 FF v) w < azim (vec 0) v (rho_node1 FF v) x `;
2929 PHA;
2930 ASM_REWRITE_TAC[];
2931 NHANH (REAL_ARITH` a < b /\ &0 < a ==> &0 < b `);
2932 FIRST_ASSUM (SUBST1_TAC o SYM);
2933 NHANH AZIM_POS_IMP_SUM_2PI;
2934 SIMP_TAC[REAL_ARITH` a + b = c <=> b = c - a `];
2935 STRIP_TAC;
2936 UNDISCH_TAC` azim (vec 0) v (rho_node1 FF v) x =
2937       azim (vec 0) v (rho_node1 FF v) w + azim (vec 0) v w x`;
2938 SIMP_TAC[REAL_ARITH` a = b + c <=> c = a - b `];
2939 STRIP_TAC;
2940 UNDISCH_TAC` azim (vec 0) v x (rho_node1 FF v) =
2941       &2 * pi - azim (vec 0) v (rho_node1 FF v) x `;
2942 SIMP_TAC[REAL_ARITH` a = b - c <=> c = b + -- a `];
2943 STRIP_TAC;
2944 MATCH_MP_TAC (REAL_ARITH` &0 <= a ==> ( x + -- a ) - y <= x - y `);
2945 REWRITE_TAC[AZIM_RANGE];
2946
2947 ASM_REWRITE_TAC[REAL_LE_REFL];
2948
2949 DOWN;
2950 ASM_REWRITE_TAC[]]);;
2951
2952
2953 (* = *)
2954
2955
2956 let WEDGE_IN_FAN_LOFA_DETER = prove_by_refinement
2957 (`local_fan (V,E,FF) /\ v IN V /\ rho_node1 FF v = w
2958 ==> wedge_in_fan_gt (w, rho_node1 FF w) E = wedge  (vec 0) w (rho_node1 FF w) v`,
2959 [REWRITE_TAC[wedge_in_fan_gt];
2960 NHANH Local_lemmas.LOFA_IMP_EE_TWO_ELMS;
2961 STRIP_TAC;
2962 ASSUME_TAC2 Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
2963 DOWN;
2964 ASM_REWRITE_TAC[];
2965 STRIP_TAC;
2966 ASSUME_TAC2 (SPEC` w:real^3 ` (GEN` v: real^3 ` Local_lemmas.LOFA_CARD_EE_V_1));
2967 DOWN;
2968 ASM_SIMP_TAC[ARITH_RULE` 2 > 1 `];
2969 REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET]]);;
2970
2971
2972
2973
2974
2975
2976
2977 let FACE_MAP_SLICING_HYP_TRANS_POINT = prove_by_refinement
2978 ( `(local_fan (V,E,FF) /\
2979       v IN V /\
2980       w IN V /\
2981       ~(v = w) /\
2982       (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
2983       (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) 
2984      ==> face_map (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (v,w) = w, rho_node1 FF w `,
2985 [NHANH PROVE_SLICING_FAN;
2986 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
2987 SIMP_TAC[];
2988 STRIP_TAC;
2989 REPLICATE_TAC 4 (DOWN THEN REMOVE_TAC);
2990 REWRITE_TAC[ff_of_hyp];
2991 SUBGOAL_THEN` v,w IN darts_of_hyp (E UNION {{v, w:real^3}}) V ` MP_TAC;
2992 MATCH_MP_TAC (ONCE_REWRITE_RULE[UNION_COMM] IN_DARTS_EXTENSION);
2993 REWRITE_TAC[IN_SING];
2994 SIMP_TAC[PAIR_EQ];
2995 STRIP_TAC;
2996 SUBGOAL_THEN` {v,w:real^3} IN E UNION {{v, w}} ` MP_TAC;
2997 REWRITE_TAC[IN_UNION; IN_SING];
2998 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
2999 PHA;
3000 NHANH (ONCE_REWRITE_RULE[INSERT_COMM] Wrgcvdr_cizmrrh.IVS_AZIM_EQ_INVERSE_SIGMA_FAN);
3001 SIMP_TAC[];
3002 STRIP_TAC;
3003 MATCH_MP_TAC (REWRITE_RULE[TAUT` a ==> b ==> c <=> a /\ b ==> c `] Wrgcvdr_cizmrrh.SIG_AND_INVERSE1_SIG);
3004 ASSUME_TAC2 (SPEC `w:real^3 ` LOCAL_RHO_NODE_PAIR_E);
3005
3006 ASM_REWRITE_TAC[IN_UNION];
3007
3008 ASSUME_TAC2 Local_lemmas.LOFA_IMAGE_RHO_NODE_IDE;
3009 DOWN;
3010 REWRITE_TAC[IMAGE];
3011 STRIP_TAC;
3012 UNDISCH_TAC` w:real^3 IN V `;
3013 EXPAND_TAC "V";
3014 REWRITE_TAC[IN_ELIM_THM];
3015 STRIP_TAC;
3016 MP_TAC (SPECL [`x:real^3 `;` w:real^3 `]
3017 (GENL [`vv:real^3 `;` v:real^3 `] Local_lemmas.LOFA_IMP_EE_TWO_ELMS));
3018 ANTS_TAC;
3019 ASM_REWRITE_TAC[];
3020
3021 STRIP_TAC;
3022 SWITCH_TAC` w = rho_node1 FF x`;
3023 SUBGOAL_THEN` EE w ( E UNION {{v,w:real^3}}) = {v, x, rho_node1 FF w}` MP_TAC;
3024 ASM_SIMP_TAC[EE_UNION];
3025 ONCE_REWRITE_TAC[INSERT_COMM];
3026 REWRITE_TAC[EE_SING_SING];
3027 ASM_REWRITE_TAC[SET_RULE` S UNION {x} = x INSERT S`; INSERT_COMM];
3028
3029 STRIP_TAC;
3030 ASM_REWRITE_TAC[];
3031
3032
3033 SUBGOAL_THEN` rho_node1 FF w IN set_of_edge w V (E UNION {{v,w}})` MP_TAC;
3034 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}}) `;
3035 NHANH (ISPEC `w:real^3 ` 
3036 (GEN`v:real^N`  (GSYM Wrgcvdr_cizmrrh.FAN_IMP_EE_EQ_SET_OF_EDGE)));
3037 ASM_SIMP_TAC[IN_INSERT];
3038 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
3039 PHA;
3040 NHANH (GSYM Wrgcvdr_cizmrrh.AZIM_CYCLE_EQ_SIGMA_FAN);
3041 ASM_SIMP_TAC[];
3042 STRIP_TAC;
3043
3044 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_IMP_NOT_SEMI_IDE;
3045 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` x:real^3 `));
3046 SUBGOAL_THEN` ~( {v, x, rho_node1 FF w} SUBSET {rho_node1 FF w}) /\
3047 FINITE {v, x, rho_node1 FF w}` MP_TAC;
3048 DOWN;
3049 ASM_REWRITE_TAC[Geomdetail.FINITE6];
3050 CONV_TAC SET_RULE;
3051 NHANH (SPEC` vec 0: real^3` (GEN` v:real^3 ` Wrgcvdr_cizmrrh.AZIM_CYCLE_PROPERTIES));
3052 ABBREV_TAC` W = {v, x, rho_node1 FF w} `;
3053 ABBREV_TAC` az = azim_cycle W (vec 0) w (rho_node1 FF w) `;
3054 STRIP_TAC;
3055 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
3056 DOWN THEN STRIP_TAC;
3057 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`w: real^3 `));
3058 DOWN;
3059 USE_FIRST` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E` NHANH;
3060 ASSUME_TAC2 (SPEC` x:real^3` (GEN` v:real^3 ` WEDGE_IN_FAN_LOFA_DETER));
3061 ASM_REWRITE_TAC[SUBSET];
3062 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3}` MP_TAC;
3063 REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_INSERT];
3064 ASSUME_TAC2 (SPEC` x:real^3 ` (GEN` v:real^3 ` Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V));
3065 GEN_TAC;
3066 DOWN;
3067 ASM_REWRITE_TAC[];
3068 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
3069 UNDISCH_TAC` v:real^3 IN V `;
3070 FIRST_ASSUM NHANH;
3071 MESON_TAC[];
3072
3073 REPEAT STRIP_TAC;
3074 SUBGOAL_THEN` &1 / &2 % v + &1 / &2 % (w:real^3) IN aff_gt { vec 0} {v, w}` MP_TAC;
3075 ASSUME_TAC2 (ISPEC` vec 0:real^3 ` Planarity.AFF_GT_1_2);
3076 FIRST_X_ASSUM SUBST1_TAC;
3077 REWRITE_TAC[IN_ELIM_THM];
3078 EXISTS_TAC` &0 `;
3079 EXISTS_TAC` &1 / &2 `;
3080 EXISTS_TAC` &1 / &2 `;
3081 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID];
3082 REAL_ARITH_TAC;
3083
3084 FIRST_X_ASSUM NHANH;
3085 REWRITE_TAC[wedge; IN_ELIM_THM];
3086 STRIP_TAC;
3087 SUBGOAL_THEN` ~ collinear {vec 0, w, rho_node1 FF w} /\
3088 ~ collinear {vec 0, v, w}` MP_TAC;
3089
3090 ASSUME_TAC2 (SPEC` w:real^3` (GEN` v:real^3 ` Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
3091 ASM_REWRITE_TAC[];
3092 USE_FIRST` !z t. z IN {v:real^3, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}` MATCH_MP_TAC;
3093 ASM_REWRITE_TAC[IN_DIFF; IN_SING; IN_INSERT; NOT_IN_EMPTY];
3094 EXPAND_TAC "w";
3095 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
3096 ASM_REWRITE_TAC[];
3097
3098 STRIP_TAC;
3099
3100 MP_TAC (SPECL [` vec 0: real^3 `;` w:real^3 `;` rho_node1 FF w `;
3101 ` &1 / &2 % v + &1 / &2 % (w:real^3) `; `v:real^3 ` ] AZIM_EQ_ALT);
3102 ANTS_TAC;
3103 DOWN;
3104 ASM_REWRITE_TAC[INSERT_COMM];
3105 ABBREV_TAC` vw = &1 / &2 % v + &1 / &2 % (w:real^3) `;
3106 DOWN THEN DOWN;
3107 ONCE_REWRITE_TAC[SET_RULE` {a,b,c} = {a,c,b} `];
3108 NHANH COLL_AFF_GT_2_1;
3109 REPEAT STRIP_TAC;
3110
3111 SUBGOAL_THEN` vw IN aff_gt {vec 0, w} {v:real^3} ` MP_TAC;
3112 ASM_REWRITE_TAC[IN_ELIM_THM];
3113 EXPAND_TAC "vw";
3114 EXISTS_TAC` &0 `;
3115 EXISTS_TAC` &1 / &2 `;
3116 EXISTS_TAC` &1 / &2 `;
3117 REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID; VECTOR_ADD_SYM];
3118 REAL_ARITH_TAC;
3119
3120 FIRST_X_ASSUM (SUBST1_TAC o SYM);
3121
3122
3123 STRIP_TAC;
3124
3125
3126
3127
3128 UNDISCH_TAC` (W:real^3 -> bool) (az:real^3)`;
3129 EXPAND_TAC "W";
3130 REWRITE_TAC[SET_RULE` (x INSERT s) y <=> y = x \/ y IN s`; IN_INSERT; NOT_IN_EMPTY];
3131 STRIP_TAC;
3132
3133 USE_FIRST` !q. ~(q = rho_node1 FF w) /\ W q
3134           ==> azim (vec 0) w (rho_node1 FF w) az <
3135               azim (vec 0) w (rho_node1 FF w) q \/
3136               azim (vec 0) w (rho_node1 FF w) az =
3137               azim (vec 0) w (rho_node1 FF w) q /\
3138               norm (projection (w - vec 0) (az - vec 0)) <=
3139               norm (projection (w - vec 0) (q - vec 0)) ` (MP_TAC o (SPEC` v:real^3 `));
3140
3141 ANTS_TAC;
3142 CONJ_TAC;
3143 STRIP_TAC;
3144 MP_TAC (SPECL [`w:real^3 `;` v:real^3 `]
3145 (GENL [` v:real^3 `;` w:real^3 `] CROSS_PAIR_NOT_IN_FF));
3146 ANTS_TAC;
3147 ASM_REWRITE_TAC[];
3148 CONJ_TAC;
3149 EXPAND_TAC "w";
3150 MATCH_MP_TAC Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
3151 ASM_REWRITE_TAC[];
3152
3153
3154 FIRST_X_ASSUM (SUBST1_TAC o SYM);
3155 ASM_REWRITE_TAC[INSERT_COMM];
3156
3157
3158 ASM_REWRITE_TAC[];
3159
3160 EXPAND_TAC "W";
3161 REWRITE_TAC[SET_RULE` (x INSERT S) y <=> y = x \/ y IN S`; IN_INSERT];
3162
3163 ASM_REWRITE_TAC[];
3164 UNDISCH_TAC` azim (vec 0) w (rho_node1 FF w) vw < azim (vec 0) w (rho_node1 FF w) x `;
3165 ASM_SIMP_TAC[REAL_ARITH` a < b ==> ~( b < a ) /\ ~( b =  a)`];
3166
3167
3168 DOWN;
3169 ASM_SIMP_TAC[]]);;
3170
3171
3172 (* = *)
3173
3174
3175 let FACE_MAP_AT_TURNING_DART1 = prove(
3176 ` (local_fan (V,E,FF) /\
3177         v IN V /\
3178         w IN V /\
3179         ~(v = w) /\
3180         (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
3181         (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
3182        x,w IN FF
3183        ==> face_map (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (x,w) = w, v`,
3184 STRIP_TAC THEN ONCE_REWRITE_TAC[INSERT_COMM] THEN 
3185 MATCH_MP_TAC FACE_MAP_AT_TURNING_DART THEN DOWN_TAC THEN SIMP_TAC[INSERT_COMM]);;
3186
3187
3188
3189
3190
3191
3192
3193 let LOCAL_FAN_ORBIT_MAP_VITERFF = prove(
3194 `local_fan (V,E,FF) /\  v IN V ==> (!n. ITER n (rho_node1 FF) v, ITER (n + 1) (rho_node1 FF) v IN FF)`,
3195 NHANH Local_lemmas.LOCAL_FAN_ORBIT_MAP_VITER THEN 
3196 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2 THEN 
3197 REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM ADD1; ITER] THEN 
3198 ASM_MESON_TAC[]);;
3199
3200
3201
3202
3203
3204
3205
3206 let DETERMINE_FV = prove_by_refinement
3207 (`(local_fan (V,E,FF) /\
3208      v IN V /\
3209      w IN V /\
3210      ~(v = w) /\
3211      (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
3212      (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
3213      HS = hypermap ( HYP (vec 0,V,E UNION {{v, w}})) /\
3214      fv = face HS (v, rho_node1 FF v)
3215 ==> fv = (w,v) INSERT 
3216 { (ITER n (rho_node1 FF) v, ITER (n + 1) (rho_node1 FF) v) | n | 
3217 ! m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w)} `,
3218 [NHANH FACE_MAP_SLICING_HYP_TRANS_POINT;
3219
3220 NHANH (
3221 REWRITE_RULE[RIGHT_FORALL_IMP_THM ] (
3222 GEN`x: real^3 `
3223 (ONCE_REWRITE_RULE[TAUT` a /\ b ==> c <=> a ==> b ==> c`] FACE_MAP_AT_TURNING_DART)));
3224 STRIP_TAC;
3225 DOWN THEN DOWN THEN PHA;
3226 ONCE_REWRITE_TAC[EQ_SYM_EQ];
3227 STRIP_TAC;
3228 REWRITE_TAC[EXTENSION; IN_INSERT];
3229 GEN_TAC;
3230 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_V;
3231 DOWN;
3232 NHANH Local_lemmas.LOOP_SET_DETER_FIRTS_ELMS;
3233 STRIP_TAC;
3234 EQ_TAC;
3235 SUBGOAL_THEN` {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m < n + 1
3236                                                                   ==> ~
3237                                                                   (ITER m
3238                                                                    (rho_node1
3239                                                                    FF)
3240                                                                    v =
3241                                                                    w)}
3242 SUBSET fv ` ASSUME_TAC;
3243 REWRITE_TAC[SUBSET; IN_ELIM_THM];
3244 REPEAT STRIP_TAC;
3245
3246 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3`));
3247 UNDISCH_TAC` w:real^3 IN V `;
3248 EXPAND_TAC "V";
3249 REWRITE_TAC[IN_ELIM_THM];
3250 STRIP_TAC;
3251
3252
3253
3254
3255
3256 SUBGOAL_THEN` ! j. j < n + 1 ==> ITER j (face_map HS) (v,rho_node1 FF v) =
3257 ITER j (rho_node1 FF) v,ITER (j + 1) (rho_node1 FF) v ` ASSUME_TAC;
3258 INDUCT_TAC;
3259 REWRITE_TAC[ITER; GSYM ADD1];
3260
3261 NHANH (ARITH_RULE` SUC a < b + 1 ==> a < b + 1 `);
3262 FIRST_X_ASSUM NHANH;
3263 SIMP_TAC[ITER];
3264 STRIP_TAC;
3265
3266 ABBREV_TAC` xi = ITER j (rho_node1 FF) v `;
3267 ABBREV_TAC` yi = ITER (j + 1) (rho_node1 FF) v`;
3268
3269 SUBGOAL_THEN` xi,yi IN darts_of_hyp (E UNION {{v:real^3, w}}) V /\
3270      ~(yi = v) /\
3271      ~(yi = w) /\
3272      FAN (vec 0,V,E) /\
3273      FAN (vec 0,V,E UNION {{v, w}}) ` MP_TAC;
3274 CONJ_TAC;
3275 UNDISCH_TAC` !v. v IN V ==> orbit_map (rho_node1 FF) v = V `;
3276 DISCH_THEN (ASSUME_TAC2 o SPEC_ALL);
3277 MP_TAC (ISPECL [`rho_node1 FF `; `j:num `; `v:real^3` ] Local_lemmas.lemma_in_orbit_iter);
3278 ASM_REWRITE_TAC[];
3279 STRIP_TAC;
3280 ASSUME_TAC2 (SPEC` xi:real^3 ` LOCAL_RHO_NODE_PAIR_E);
3281 EXPAND_TAC "yi";
3282 REWRITE_TAC[ITER; GSYM ADD1];
3283 ASM_REWRITE_TAC[];
3284 DOWN;
3285 REWRITE_TAC[IN_DARTS_EXTENSION];
3286
3287 UNDISCH_TAC` SUC j < n + 1 `;
3288 FIRST_ASSUM NHANH;
3289 SWITCH_TAC` w = ITER n' (rho_node1 FF) v `;
3290 ASM_SIMP_TAC[ADD1];
3291 ASSUME_TAC2 (Local_lemmas.LOFA_IMP_DIS_ELMS23);
3292 FIRST_X_ASSUM (MP_TAC o (SPECL [` 0 `;` j + 1 `]));
3293 ANTS_TAC;
3294 ARITH_TAC;
3295 STRIP_TAC THEN STRIP_TAC;
3296 ASM_CASES_TAC` n' < j + 1 `;
3297 ASSUME_TAC2 (ARITH_RULE` j + 1 < n + 1 /\ n' < j + 1 ==> n' < n + 1 `);
3298 DOWN;
3299 FIRST_X_ASSUM NHANH;
3300 FIRST_X_ASSUM NHANH;
3301 ASM_REWRITE_TAC[];
3302 ASSUME_TAC2 (ARITH_RULE` n' < CARD (V:real^3 -> bool) /\ ~( n' < j + 1) ==> j + 1 < CARD V `);
3303 DOWN;
3304 FIRST_X_ASSUM NHANH;
3305 ASM_SIMP_TAC[ITER];
3306 STRIP_TAC;
3307 ASSUME_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
3308 ASM_REWRITE_TAC[];
3309 MATCH_MP_TAC PROVE_SLICING_FAN;
3310 ASM_REWRITE_TAC[];
3311 EXPAND_TAC "V";
3312 REWRITE_TAC[IN_ELIM_THM];
3313 EXISTS_TAC`n':num`;
3314 ASM_REWRITE_TAC[];
3315
3316
3317
3318
3319 NHANH FACE_MAP_ADD_SET2_EQ;
3320 ASM_SIMP_TAC[];
3321 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
3322 FIRST_X_ASSUM (MP_TAC o (SPEC` j:num `));
3323 ASM_REWRITE_TAC[];
3324 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
3325 DOWN THEN STRIP_TAC;
3326 FIRST_ASSUM NHANH;
3327 STRIP_TAC THEN STRIP_TAC;
3328 ASSUME_TAC2 (SPECL [` xi:real^3 `;` rho_node1 FF xi `] (GENL [`x:real^3 `;` y:real^3 `] LOCAL_FACE_MAP_RHO_NODE1));
3329 DOWN;
3330 EXPAND_TAC "xi";
3331 REWRITE_TAC[GSYM ITER; ADD1];
3332 ASM_REWRITE_TAC[];
3333
3334
3335
3336
3337
3338 FIRST_ASSUM (MP_TAC o (SPEC` n:num`));
3339 ANTS_TAC;
3340 ARITH_TAC;
3341 ASM_REWRITE_TAC[];
3342 DISCH_THEN (SUBST1_TAC o SYM);
3343 EXPAND_TAC "fv";
3344 REWRITE_TAC[face; orbit_map; Wrgcvdr_cizmrrh.POWER_TO_ITER; IN_ELIM_THM];
3345
3346
3347 EXISTS_TAC`n:num`;
3348 REWRITE_TAC[ARITH_RULE` a >= 0 `];
3349
3350
3351
3352
3353
3354
3355 STRIP_TAC;
3356 UNDISCH_TAC` w:real^3 IN V `;
3357 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
3358 EXPAND_TAC "V";
3359 REWRITE_TAC[IN_ELIM_THM];
3360 STRIP_TAC;
3361 ABBREV_TAC` SS = {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
3362                                                                     n + 1
3363                                                                     ==> ~
3364                                                                     (ITER m
3365                                                                     (rho_node1
3366                                                                     FF)
3367                                                                     v =
3368                                                                     w)} `;
3369 SUBGOAL_THEN` ITER (n - 1) (rho_node1 FF) v, (w:real^3) IN SS ` MP_TAC;
3370 EXPAND_TAC "SS";
3371 REWRITE_TAC[IN_ELIM_THM];
3372 EXISTS_TAC` n - 1 `;
3373 REWRITE_TAC[PAIR_EQ];
3374 ASM_CASES_TAC` n = 0 `;
3375 FIRST_X_ASSUM SUBST_ALL_TAC;
3376 DOWN THEN DOWN;
3377 ASM_REWRITE_TAC[ITER];
3378 DOWN;
3379 ASM_SIMP_TAC[ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `];
3380
3381 STRIP_TAC;
3382 GEN_TAC;
3383 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3384 STRIP_TAC;
3385 FIRST_X_ASSUM (MP_TAC o (SPECL [`m:num `;` n:num`]));
3386 PHA;
3387 ANTS_TAC;
3388 ASM_REWRITE_TAC[];
3389 SIMP_TAC[];
3390 ASM_CASES_TAC` n = 0`;
3391 FIRST_X_ASSUM SUBST_ALL_TAC;
3392 DOWN THEN DOWN;
3393 ASM_REWRITE_TAC[ITER];
3394 ABBREV_TAC` lp = ITER (n - 1) (rho_node1 FF) v `;
3395 SUBGOAL_THEN` lp IN (V:real^3 -> bool) ` MP_TAC;
3396 EXPAND_TAC "V";
3397 EXPAND_TAC "lp";
3398 REWRITE_TAC[IN_ELIM_THM];
3399 EXISTS_TAC` n - 1 `;
3400 REWRITE_TAC[];
3401 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
3402 ARITH_TAC;
3403 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
3404 DOWN THEN STRIP_TAC;
3405 FIRST_ASSUM NHANH;
3406 EXPAND_TAC "lp";
3407 REWRITE_TAC[GSYM ITER; ADD1];
3408 SWITCH_TAC` w = ITER n (rho_node1 FF) v`;
3409 ASM_SIMP_TAC[ARITH_RULE` ~(n = 0) ==> n - 1 + 1 = n `];
3410 REPEAT STRIP_TAC;
3411 MP_TAC (SPEC` lp:real^3` (GEN `x:real^3` FACE_MAP_AT_TURNING_DART1));
3412 ANTS_TAC;
3413 ASM_REWRITE_TAC[];
3414 EXPAND_TAC "w";
3415 EXPAND_TAC "V";
3416 REWRITE_TAC[IN_ELIM_THM];
3417 EXISTS_TAC `n:num`;
3418 ASM_REWRITE_TAC[];
3419 DISCH_THEN (SUBST1_TAC o SYM);
3420 EXPAND_TAC "fv";
3421 REWRITE_TAC[face];
3422 EXPAND_TAC "HS";
3423 MATCH_MP_TAC Wrgcvdr_cizmrrh.IN_ORBIT_MAP_IMP_F_Y;
3424 MATCH_MP_TAC Hypermap.lemma_in_subset;
3425 EXISTS_TAC` SS:real^3 # real^3 -> bool`;
3426 ASM_REWRITE_TAC[GSYM face];
3427 DOWN THEN DOWN THEN PHA;
3428 REWRITE_TAC[Hypermap.lemma_in_subset];
3429
3430
3431
3432 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3 `));
3433 SUBGOAL_THEN` w:real^3 IN V ` MP_TAC;
3434 FIRST_X_ASSUM ACCEPT_TAC;
3435 EXPAND_TAC "V";
3436 REWRITE_TAC[IN_ELIM_THM];
3437 STRIP_TAC;
3438 STRIP_TAC;
3439 SUBGOAL_THEN` ! j. j < n ==> ITER j (face_map HS ) (v, rho_node1 FF v) =
3440 ITER j (rho_node1 FF) v, ITER (j + 1) (rho_node1 FF) v` MP_TAC;
3441 INDUCT_TAC;
3442 REWRITE_TAC[ITER; GSYM ADD1];
3443 NHANH (ARITH_RULE` SUC j < n ==> j < n `);
3444 FIRST_X_ASSUM NHANH;
3445 SIMP_TAC[ITER];
3446 ABBREV_TAC` vi = ITER j (rho_node1 FF) v `;
3447 ABBREV_TAC` vj = ITER (j + 1) (rho_node1 FF) v`;
3448 STRIP_TAC;
3449
3450
3451
3452 SUBGOAL_THEN` face_map (hypermap (HYP (vec 0,V,E UNION {{v, w:real^3}}))) (vi, vj) =
3453          face_map (hypermap (HYP (vec 0,V,E))) (vi, vj:real^3)` MP_TAC;
3454 MATCH_MP_TAC FACE_MAP_ADD_SET2_EQ;
3455 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
3456 FIRST_X_ASSUM (MP_TAC o (SPEC` j: num`));
3457 ASM_REWRITE_TAC[];
3458 UNDISCH_TAC` local_fan (V,E,FF) `;
3459 PHA;
3460 NHANH Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2;
3461 SIMP_TAC[IN_DARTS_EXTENSION];
3462 STRIP_TAC;
3463 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3464 FIRST_ASSUM (MP_TAC o (SPECL [`j + 1 `;` n: num `]));
3465 PHA;
3466 ANTS_TAC;
3467 ASM_REWRITE_TAC[GSYM ADD1];
3468 ASM_SIMP_TAC[];
3469 STRIP_TAC;
3470 FIRST_ASSUM (MP_TAC o (SPECL [` 0`;` j + 1 `]));
3471 ANTS_TAC;
3472 ARITH_TAC;
3473 ANTS_TAC;
3474 MATCH_MP_TAC LT_TRANS;
3475 EXISTS_TAC` n:num`;
3476 ASM_REWRITE_TAC[GSYM ADD1];
3477 ASM_SIMP_TAC[ITER];
3478 STRIP_TAC;
3479 ASSUME_TAC2 Wrgcvdr_cizmrrh.LOCAL_FAN_IMP_FAN;
3480 ASM_REWRITE_TAC[];
3481 MATCH_MP_TAC PROVE_SLICING_FAN;
3482 SWITCH_TAC` w = ITER n (rho_node1 FF) v `;
3483 ASM_REWRITE_TAC[];
3484
3485
3486 ASM_SIMP_TAC[];
3487 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
3488 STRIP_TAC;
3489 FIRST_X_ASSUM (MP_TAC o (SPEC` j:num `));
3490 UNDISCH_TAC` local_fan (V,E,FF) `;
3491 PHA;
3492 NHANH LOCAL_FACE_MAP_RHO_NODE1;
3493 ASM_SIMP_TAC[GSYM ADD1];
3494 EXPAND_TAC "vj";
3495 REWRITE_TAC[GSYM ADD1; ITER];
3496
3497
3498
3499
3500 SUBGOAL_THEN` face_map (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (w,v) =
3501            v,rho_node1 FF v` MP_TAC;
3502 ONCE_REWRITE_TAC[INSERT_COMM];
3503 MATCH_MP_TAC FACE_MAP_SLICING_HYP_TRANS_POINT;
3504 SWITCH_TAC` w = ITER n (rho_node1 FF) v `;
3505 ONCE_REWRITE_TAC[INSERT_COMM];
3506 ASM_REWRITE_TAC[];
3507 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t:real^3}`;
3508 SIMP_TAC[INSERT_COMM];
3509
3510
3511
3512
3513 SWITCH_TAC` w = ITER n (rho_node1 FF) v `;
3514 ASM_REWRITE_TAC[];
3515 REPEAT STRIP_TAC;
3516 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
3517 FIRST_ASSUM (MP_TAC o (SPEC `n - 1 `));
3518 ASM_CASES_TAC` n = 0 `;
3519 FIRST_X_ASSUM SUBST_ALL_TAC;
3520 REPLICATE_TAC 4 DOWN;
3521 ASM_REWRITE_TAC[ITER];
3522 ASSUME_TAC2 (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
3523 FIRST_ASSUM SUBST1_TAC;
3524 ASM_REWRITE_TAC[];
3525 ABBREV_TAC` xx = ITER (n - 1) (rho_node1 FF) v `;
3526 STRIP_TAC;
3527 MP_TAC (SPEC` xx:real^3 ` (GEN`x:real^3 ` FACE_MAP_AT_TURNING_DART1));
3528 ANTS_TAC;
3529 ASM_REWRITE_TAC[];
3530
3531
3532 ASM_REWRITE_TAC[];
3533 STRIP_TAC;
3534 SUBGOAL_THEN` ITER (n + 1) (face_map HS) (v, rho_node1 FF v) = (v, rho_node1 FF v ) ` MP_TAC;
3535 SUBGOAL_THEN` ITER (n - 1) (face_map HS) (v,rho_node1 FF v) =
3536               ITER (n - 1) (rho_node1 FF) v,ITER (n - 1 + 1) (rho_node1 FF) v` MP_TAC;
3537 FIRST_ASSUM MATCH_MP_TAC;
3538 MATCH_MP_TAC (ARITH_RULE` ~( n = 0) ==> n - 1 < n `);
3539 FIRST_X_ASSUM ACCEPT_TAC;
3540 ASM_REWRITE_TAC[GSYM ADD1];
3541 STRIP_TAC;
3542 EXPAND_TAC "n";
3543 REWRITE_TAC[GSYM ADD1; ITER];
3544 ASM_REWRITE_TAC[];
3545
3546
3547
3548 MP_TAC (ARITH_RULE` 0 < n + 1 `);
3549 PHA;
3550 NHANH Lvducxu.ITER_CYCLIC_ORBIT;
3551 ASM_REWRITE_TAC[GSYM face];
3552
3553 STRIP_TAC;
3554 UNDISCH_TAC` x:real^3 # real^3 IN fv `;
3555 ASM_REWRITE_TAC[IN_ELIM_THM];
3556 STRIP_TAC;
3557
3558 ASM_CASES_TAC` n' = n:num `;
3559 DISJ1_TAC;
3560 FIRST_X_ASSUM SUBST_ALL_TAC;
3561
3562 ASM_REWRITE_TAC[];
3563 EXPAND_TAC "n";
3564 REWRITE_TAC[GSYM ADD1; ITER];
3565 ASSUME_TAC2 (ARITH_RULE`~( n = 0) ==> n - 1 < n `);
3566 DOWN;
3567 FIRST_X_ASSUM NHANH;
3568 ASM_SIMP_TAC[];
3569
3570
3571 DISJ2_TAC;
3572 EXISTS_TAC` n':num`;
3573 ASSUME_TAC2 (ARITH_RULE` n' < n + 1 /\ ~(n' = n) ==> n' < n `);
3574 DOWN;
3575 FIRST_ASSUM NHANH;
3576 ASM_SIMP_TAC[];
3577 REPEAT STRIP_TAC;
3578
3579 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3580 FIRST_X_ASSUM (MP_TAC o SPECL[`m:num `;` n:num `]);
3581 ANTS_TAC;
3582 UNDISCH_TAC` n' < n + 1 `;
3583 UNDISCH_TAC` m< n' + 1 `;
3584 UNDISCH_TAC` ~( n' = n:num) `;
3585 ARITH_TAC;
3586 ANTS_TAC;
3587 FIRST_X_ASSUM ACCEPT_TAC;
3588 ASM_REWRITE_TAC[]]);;
3589
3590
3591
3592
3593
3594
3595 let TWO_EQ_SYSTEM_THM = prove_by_refinement (
3596 ` FAN (vec 0,V,E) /\ graph E /\ UNIONS E SUBSET V ==>
3597  dart_of_fan (V,E),
3598  res (e_fan_pair (V,E)) (dart1_of_fan (V,E)),
3599  res (n_fan_pair (V,E)) (dart1_of_fan (V,E)),
3600  res (f_fan_pair (V,E)) (dart1_of_fan (V,E)) =
3601  darts_of_hyp E V,
3602  ee_of_hyp (vec 0,V,E),
3603  nn_of_hyp (vec 0,V,E),
3604  ff_of_hyp (vec 0,V,E)`,
3605 [REWRITE_TAC[PAIR_EQ];
3606 STRIP_TAC;
3607 SUBGOAL_THEN` dart_of_fan (V,E) = darts_of_hyp E V  ` MP_TAC;
3608 REWRITE_TAC[dart_of_fan; darts_of_hyp; ord_pairs; self_pairs];
3609 DOWN;
3610 NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] (GEN `v: A` Wrgcvdr_cizmrrh.UNI_E_IMP_EE_EQ_SET_OF_EDGE));
3611 SIMP_TAC[EXTENSION; IN_UNION];
3612 MESON_TAC[];
3613 SIMP_TAC[];
3614
3615 STRIP_TAC;
3616 REWRITE_TAC[res; FUN_EQ_THM; ee_of_hyp2];
3617 CONJ_TAC;
3618 GEN_TAC;
3619 REWRITE_TAC[dart1_of_fan; darts_of_hyp; IN_UNION; ord_pairs];
3620 ASM_CASES_TAC` x IN {a,b | {a, b:real^3} IN E}`;
3621 ASM_REWRITE_TAC[];
3622 PAT_ONCE_REWRITE_TAC`\p. P p = PP `[GSYM PAIR];
3623 PURE_ONCE_REWRITE_TAC[e_fan_pair];
3624 REWRITE_TAC[];
3625
3626
3627 ASM_REWRITE_TAC[self_pairs; IN_ELIM_THM];
3628 MESON_TAC[PAIR_EQ; FST; SND];
3629
3630
3631
3632 CONJ_TAC;
3633 REWRITE_TAC[nn_of_hyp3; dart1_of_fan];
3634 GEN_TAC;
3635 ASM_CASES_TAC` x IN {v,w | {v:real^3, w} IN E}`;
3636 ASM_REWRITE_TAC[darts_of_hyp; ord_pairs; self_pairs; IN_UNION; EE];
3637 DOWN;
3638 REWRITE_TAC[IN_ELIM_THM];
3639 STRIP_TAC;
3640 ASM_REWRITE_TAC[n_fan_pair];
3641 DOWN_TAC;
3642 REWRITE_TAC[graph];
3643 STRIP_TAC;
3644 FIRST_X_ASSUM (MP_TAC o (SPEC` {v, w:real^3}`));
3645 ANTS_TAC;
3646 DOWN_TAC;
3647 SIMP_TAC[IN];
3648
3649 REWRITE_TAC[SET2_HAS_SIZE2];
3650 STRIP_TAC;
3651 SUBGOAL_THEN` ~( {w | {v, w:real^3} IN E} = {} ) ` MP_TAC;
3652 UNDISCH_TAC` {v:real^3,w} IN E `;
3653 SET_TAC[];
3654
3655
3656
3657
3658 SIMP_TAC[];
3659 NHANH (MESON[PAIR_EQ]` (?v'. v' IN V /\ {w | {v', w} IN E} = {} /\ v,w = v',v')
3660 ==> {w | {v, w} IN E} = {} `);
3661 SIMP_TAC[PAIR_EQ];
3662 STRIP_TAC;
3663 UNDISCH_TAC` {v, w:real^3} IN E `;
3664 UNDISCH_TAC` FAN (vec 0, V:real^3 -> bool, E) `;
3665 PHA;
3666 NHANH Wrgcvdr_cizmrrh.ITER_AZIM_CYCLE_EQ_ITER_SIGMA;
3667 STRIP_TAC;
3668 FIRST_X_ASSUM (MP_TAC o (SPEC` w:real^3 `));
3669 ANTS_TAC;
3670 REWRITE_TAC[EE; IN_ELIM_THM];
3671 FIRST_ASSUM ACCEPT_TAC;
3672 DISCH_THEN (MP_TAC o (SPEC` 1 `));
3673 SIMP_TAC[ITER12; EE];
3674
3675
3676
3677
3678 ASM_REWRITE_TAC[darts_of_hyp; IN_UNION; TAUT`~( a \/ b) \/ b <=> ~ a \/ b`];
3679 ASM_REWRITE_TAC[ord_pairs];
3680 (* ------------------ *)
3681 GEN_TAC;
3682 REWRITE_TAC[dart1_of_fan; f_fan_pair; Wrgcvdr_cizmrrh.ff_of_hyp3; f_fan_pair];
3683 ASM_CASES_TAC` (x:real^3#real^3) IN {v,w | {v, w} IN E}`;
3684 ASM_REWRITE_TAC[darts_of_hyp; IN_UNION; TAUT` ~(a \/ b) \/ b <=> ~ a \/ b `; ord_pairs];
3685
3686 DOWN_TAC;
3687 REWRITE_TAC[graph; IN_ELIM_THM];
3688 STRIP_TAC;
3689 SUBGOAL_THEN` ~ ( x IN self_pairs E (V:real^3 -> bool))` MP_TAC;
3690 REWRITE_TAC[self_pairs; IN_ELIM_THM];
3691 DOWN THEN DOWN THEN PHA;
3692 REWRITE_TAC[IN];
3693 FIRST_X_ASSUM NHANH;
3694 SIMP_TAC[SET2_HAS_SIZE2; PAIR_EQ];
3695 MESON_TAC[];
3696
3697
3698 ASM_SIMP_TAC[f_fan_pair; PAIR_EQ];
3699 STRIP_TAC;
3700 UNDISCH_TAC` {v, w:real^3} IN E `;
3701 UNDISCH_TAC` FAN (vec 0, V:real^3 -> bool, E) `;
3702 ONCE_REWRITE_TAC[INSERT_COMM];
3703 PHA;
3704 NHANH Fan_misc.INVERSE_SIGMA_FAN_EQ_INVERSE1_SIGMA_FAN;
3705 NHANH Wrgcvdr_cizmrrh.IVS_AZIM_EQ_INVERSE_SIGMA_FAN;
3706 STRIP_TAC;
3707 FIRST_X_ASSUM (ASSUME_TAC o SYM);
3708 ASM_REWRITE_TAC[];
3709
3710 ASM_REWRITE_TAC[darts_of_hyp; IN_UNION; TAUT` ~( a \/ b) \/ b <=> ~ a \/ b `];
3711 ASM_REWRITE_TAC[ord_pairs]]);;
3712
3713
3714
3715
3716
3717 let LOFA_FST_IDENTIFY = prove(
3718 ` local_fan (V,E,FF) /\ x IN FF /\ y IN FF /\ FST x = FST y ==> x = y `,
3719 NHANH Local_lemmas.LOFA_IMP_BIJ_FF_V THEN REWRITE_TAC[BIJ; INJ] THEN
3720 MESON_TAC[]);;
3721
3722
3723
3724 let CARD_IS_LEAST_CYCLE = prove_by_refinement (
3725 ` local_fan (V,E,FF) /\ v IN V /\
3726 ITER n (rho_node1 FF) v = v /\ ~( n = 0)
3727 ==> CARD V <= n`,
3728 [STRIP_TAC;
3729 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3730 ASM_CASES_TAC` n < CARD (V:real^3 -> bool) `;
3731 FIRST_X_ASSUM (MP_TAC o (SPECL [`0`;` n:num`]));
3732 PHA;
3733 ANTS_TAC;
3734 ASM_REWRITE_TAC[];
3735 ASM_ARITH_TAC;
3736 ASM_REWRITE_TAC[ITER];
3737 DOWN;
3738 ARITH_TAC]);;
3739
3740
3741 (* = *)
3742 (* = *)
3743
3744
3745 let HAFL_CIRCLE_FORM_LOCAL_FAN = prove_by_refinement
3746 (`(local_fan (V,E,FF) /\
3747      v IN V /\
3748      w IN V /\
3749      ~(v = w) /\
3750      (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
3751      (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
3752      HS = hypermap ( HYP (vec 0,V,E UNION {{v, w}})) /\
3753      fv = face HS (v, rho_node1 FF v)
3754      ==> local_fan (v_prime V fv, e_prime  (E UNION {{v, w}}) fv,  fv) `,
3755 [NHANH PROVE_SLICING_FAN;
3756 STRIP_TAC;
3757 SUBGOAL_THEN` (v,rho_node1 FF v) IN darts_of_hyp (E UNION {{v,w}}) V` ASSUME_TAC;
3758 REWRITE_TAC[darts_of_hyp];
3759 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
3760 DOWN THEN STRIP_TAC;
3761 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
3762 DOWN;
3763 UNDISCH_TAC` local_fan (V,E,FF) `;
3764 PHA;
3765 NHANH Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2;
3766 REWRITE_TAC[IN_ELIM_THM; IN_UNION; ord_pairs];
3767 STRIP_TAC;
3768 DISJ1_TAC;
3769 EXISTS_TAC` v:real^3 `;
3770 EXISTS_TAC` rho_node1 FF v `;
3771 ASM_REWRITE_TAC[];
3772
3773 MP_TAC LOFA_HYP_UNION_CARD_GT2;
3774 ANTS_TAC;
3775 ASM_REWRITE_TAC[];
3776 STRIP_TAC;
3777
3778
3779
3780 SUBGOAL_THEN` simple_hypermap (hypermap (HYP (vec 0, v_prime V fv, e_prime  (E UNION {{v, w}} ) fv)))` MP_TAC;
3781 REWRITE_TAC[simple_hypermap];
3782 SUBGOAL_THEN` FAN (vec 0:real^3,v_prime  (V:real^3 -> bool) fv,e_prime  (E UNION {{v,w}} ) fv) ` MP_TAC;
3783 MATCH_MP_TAC Wrgcvdr_cizmrrh.IMP_FAN_V_PRIME_E_PRIME;
3784 ASM_REWRITE_TAC[];
3785 EXISTS_TAC` (v, rho_node1 FF v) `;
3786 ASM_REWRITE_TAC[];
3787 UNDISCH_TAC `FAN (vec 0, V:real^3 -> bool, E UNION {{v, w}})`;
3788 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
3789 ASM_SIMP_TAC[];
3790
3791
3792 SWITCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v, w: real^3}})) `;
3793 SWITCH_TAC` fv = face HS (v,rho_node1 FF v) `;
3794
3795 STRIP_TAC;
3796 SUBGOAL_THEN` 1 < CARD (fv:real^3 # real^3 -> bool) ` MP_TAC;
3797 ASM_ARITH_TAC;
3798 SUBGOAL_THEN` fv = face  (hypermap (HYP (vec 0,V,(E UNION {{v,w:real^3}})))) (v,rho_node1 FF v)` MP_TAC;
3799 ASM_REWRITE_TAC[];
3800
3801 SUBGOAL_THEN` FAN (vec 0, V, E UNION {{v,w:real^3}}) ` MP_TAC;
3802 FIRST_X_ASSUM ACCEPT_TAC;
3803 PHA;
3804 NHANH Lvducxu.DARTS_E_PRIME_GT1_SWITCH;
3805 STRIP_TAC;
3806 UNDISCH_TAC` FAN (vec 0,v_prime V fv,e_prime  (E UNION {{v:real^3, w}}) fv) `;
3807 NHANH Wrgcvdr_cizmrrh.ELMS_OF_HYPERMAP_HYP;
3808 SIMP_TAC[];
3809 STRIP_TAC;
3810 SWITCH_TAC` fv =
3811       face  (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (v,rho_node1 FF v)`;
3812 ASM_REWRITE_TAC[];
3813
3814
3815 REWRITE_TAC[IN_UNION];
3816 GEN_TAC THEN STRIP_TAC;
3817 DOWN;
3818 ASSUME_TAC2 LOCAL_FAN_SIMPLE_HYP;
3819
3820 MP_TAC DETERMINE_FV;
3821 ANTS_TAC;
3822 ASM_REWRITE_TAC[];
3823 STRIP_TAC;
3824 ASM_REWRITE_TAC[];
3825 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
3826 FIRST_X_ASSUM (ASSUME_TAC o SYM);
3827 ASM_REWRITE_TAC[];
3828
3829 MP_TAC (SPECL [`E UNION {{v,w:real^3 }} `; ` fv: real^3 # real^3 -> bool `;` v, rho_node1 FF v`;` vec 0: real^3 `] (
3830 GENL [`E:(real^3 -> bool) -> bool `;` FF: real^3 # real^3 -> bool`; `x:real^3 # real^3`;`v:real^3`] Lvducxu.LOCALIZE_PRESERVE_FACE));
3831 ANTS_TAC;
3832 ASM_REWRITE_TAC[];
3833 UNDISCH_TAC` v,rho_node1 FF v IN darts_of_hyp (E UNION {{v, w}}) V`;
3834 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
3835 NHANH Lvducxu.FAN_DART_DARTS;
3836 ASM_SIMP_TAC[];
3837 STRIP_TAC;
3838 DISCH_TAC;
3839 SUBGOAL_THEN` x IN face
3840       (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v, w}}) fv)))
3841       (v,rho_node1 FF v) ` MP_TAC;
3842 UNDISCH_TAC` fv =
3843       face
3844       (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v, w}}) fv)))
3845       (v,rho_node1 FF v) `;
3846 DISCH_THEN (SUBST1_TAC o SYM);
3847 EXPAND_TAC "fv";
3848 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
3849 ASM_REWRITE_TAC[];
3850
3851 NHANH Hypermap.lemma_face_identity;
3852 ONCE_REWRITE_TAC[EQ_SYM_EQ];
3853 ASM_SIMP_TAC[];
3854 STRIP_TAC;
3855 REWRITE_TAC[EXTENSION; IN_INSERT; NOT_IN_EMPTY];
3856 GEN_TAC;
3857 SWITCH_TAC` fv =
3858       face
3859       (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v, w}}) fv)))
3860       (v,rho_node1 FF v) `;
3861 ASM_REWRITE_TAC[];
3862 EQ_TAC;
3863 DOWN THEN DOWN;
3864 SIMP_TAC[IN_INTER; Wrgcvdr_cizmrrh.X_IN_HYP_ORBITS];
3865 MESON_TAC[Wrgcvdr_cizmrrh.X_IN_HYP_ORBITS];
3866 UNDISCH_TAC` x = w,v \/
3867       (?n. (!m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w)) /\
3868            x = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v)`;
3869 STRIP_TAC;
3870 REWRITE_TAC[IN_INTER];
3871 UNDISCH_TAC` FAN (vec 0,v_prime V fv,e_prime  (E UNION {{v, w:real^3}}) fv) `;
3872 PHA;
3873 NGOAC;
3874 NHANH Wrgcvdr_cizmrrh.IN_NODE_IMP_FIRST_EQ;
3875 STRIP_TAC;
3876 DOWN;
3877 USE_FIRST` (w,v) INSERT
3878       {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
3879                                                                     n + 1
3880                                                                     ==> ~
3881                                                                     (ITER m
3882                                                                     (rho_node1
3883                                                                     FF)
3884                                                                     v =
3885                                                                     w)} =
3886       fv ` (SUBST1_TAC o SYM);
3887 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
3888 STRIP_TAC;
3889 ASM_REWRITE_TAC[];
3890 UNDISCH_TAC` FST (x':real^3 # real^3) = FST (x:real^3 # real^3)`;
3891 ASM_REWRITE_TAC[];
3892 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num`));
3893 ANTS_TAC;
3894 ARITH_TAC;
3895 SIMP_TAC[];
3896
3897
3898 REWRITE_TAC[IN_INTER];
3899 UNDISCH_TAC` FAN (vec 0,v_prime V fv,e_prime  (E UNION {{v, w:real^3}}) fv) `;
3900 PHA;
3901 NGOAC;
3902 NHANH Wrgcvdr_cizmrrh.IN_NODE_IMP_FIRST_EQ;
3903 STRIP_TAC;
3904 DOWN;
3905 USE_FIRST` (w,v) INSERT
3906       {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
3907                                                                     n + 1
3908                                                                     ==> ~
3909                                                                     (ITER m
3910                                                                     (rho_node1
3911                                                                     FF)
3912                                                                     v =
3913                                                                     w)} =
3914       fv ` (SUBST1_TAC o SYM);
3915 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
3916 STRIP_TAC;
3917 UNDISCH_TAC` FST (x':real^3 # real^3) = FST (x:real^3 # real^3)`;
3918 ASM_REWRITE_TAC[];
3919 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num`));
3920 ANTS_TAC;
3921 ARITH_TAC;
3922 SIMP_TAC[];
3923
3924 UNDISCH_TAC` FST (x':real^3 # real^3) = FST (x:real^3 # real^3)`;
3925 ASM_REWRITE_TAC[];
3926 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_V;
3927 DOWN;
3928 NHANH Local_lemmas.LOOP_SET_DETER_FIRTS_ELMS;
3929 STRIP_TAC;
3930 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v: real^3 `));
3931 UNDISCH_TAC` w:real^3 IN V `;
3932 EXPAND_TAC "V";
3933 REWRITE_TAC[IN_ELIM_THM];
3934 STRIP_TAC;
3935 ASM_CASES_TAC` ~( n  < CARD (V:real^3 -> bool))`;
3936 ASSUME_TAC2 (ARITH_RULE` ~( n  < CARD (V:real^3 -> bool)) /\ n'' < CARD V ==> n'' < n + 1 `);
3937 USE_FIRST` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w) ` (ASSUME_TAC2 o (SPEC`n'': num `));
3938 DOWN;
3939 ASM_REWRITE_TAC[];
3940
3941
3942 ASM_CASES_TAC` ~( n' < CARD (V:real^3 -> bool)) `;
3943 ASSUME_TAC2 (ARITH_RULE` ~( n'  < CARD (V:real^3 -> bool)) /\ n'' < CARD V ==> n'' < n' + 1 `);
3944 USE_FIRST` !m. m < n' + 1 ==> ~(ITER m (rho_node1 FF) v = w) ` (ASSUME_TAC2 o (SPEC`n'': num `));
3945 DOWN;
3946 ASM_REWRITE_TAC[];
3947 DOWN THEN DOWN;
3948 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
3949 PHA;
3950 ASM_CASES_TAC` n < n':num `;
3951 STRIP_TAC;
3952 FIRST_X_ASSUM (MP_TAC o (SPECL[` n:num`;` n':num`]));
3953 DISCH_THEN ASSUME_TAC2;
3954 DOWN;
3955 ASM_REWRITE_TAC[];
3956 ASM_CASES_TAC` n' < n:num `;
3957 STRIP_TAC;
3958 FIRST_X_ASSUM (MP_TAC o (SPECL[` n':num `;` n:num`]));
3959 DISCH_THEN ASSUME_TAC2;
3960 DOWN THEN ASM_REWRITE_TAC[];
3961 ASSUME_TAC2 (ARITH_RULE` ~( n < n':num) /\ ~(n' < n) ==> n' = n `);
3962 ASM_REWRITE_TAC[];
3963
3964 (* ================================== *)
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977 MP_TAC DETERMINE_FV;
3978 ANTS_TAC;
3979 ASM_REWRITE_TAC[];
3980 DISCH_THEN (ASSUME_TAC o SYM);
3981
3982 (* ================================== *)
3983
3984
3985
3986
3987 UNDISCH_TAC` x IN {v,w | w,v IN (fv:real^3 # real^3 -> bool)} `;
3988 EXPAND_TAC "fv";
3989 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
3990 ASM_REWRITE_TAC[];
3991 STRIP_TAC;
3992
3993
3994
3995
3996
3997
3998
3999 SUBGOAL_THEN `x IN dart (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v, w}}) fv))) ` MP_TAC;
4000 ASM_REWRITE_TAC[IN_UNION; IN_ELIM_THM];
4001 DISJ2_TAC;
4002 EXISTS_TAC` v:real^3`;
4003 EXISTS_TAC` w:real^3 `;
4004 DOWN THEN DOWN;
4005 SIMP_TAC[PAIR_EQ];
4006 EXPAND_TAC "fv";
4007 REWRITE_TAC[IN_INSERT];
4008
4009
4010
4011
4012 NHANH Hypermap.lemma_node_subset;
4013 ASM_REWRITE_TAC[];
4014 STRIP_TAC;
4015 REWRITE_TAC[EXTENSION; IN_INTER];
4016 GEN_TAC;
4017 EQ_TAC;
4018 STRIP_TAC;
4019 MP_TAC (
4020 ISPECL [`vec 0: real^3 `; ` v_prime  (V:real^3 -> bool) (fv:real^3#real^3->bool) `;
4021 `e_prime  (E UNION {{v:real^3, w}}) (fv: real^3#real^3->bool) `;` x': real^3#real^3`;
4022 `(v':real^3, w':real^3) `] (GEN_ALL Wrgcvdr_cizmrrh.IN_NODE_IMP_FIRST_EQ));
4023 ANTS_TAC;
4024 ASM_REWRITE_TAC[];
4025 REPLICATE_TAC 3 DOWN;
4026 REWRITE_TAC[SUBSET];
4027 STRIP_TAC;
4028 FIRST_ASSUM NHANH;
4029 REWRITE_TAC[IN_UNION];
4030 STRIP_TAC;
4031 UNDISCH_TAC` w':real^3, v':real^3 = w:real^3, v:real^3 `;
4032 SIMP_TAC[PAIR_EQ];
4033 REPEAT STRIP_TAC;
4034 UNDISCH_TAC` x':real^3#real^3 IN fv `;
4035 UNDISCH_TAC` face  (hypermap (HYP (vec 0,V,E UNION {{v, w}}))) (v,rho_node1 FF v) =
4036       fv`;
4037 STRIP_TAC;
4038 EXPAND_TAC "fv";
4039 NHANH Hypermap.lemma_face_identity;
4040 ASM_REWRITE_TAC[];
4041 UNDISCH_TAC` x' IN
4042       face
4043       (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v, w}}) fv)))
4044       (v,w) `;
4045 NHANH Hypermap.lemma_face_identity;
4046 ASM_REWRITE_TAC[];
4047 REPEAT STRIP_TAC;
4048 SUBGOAL_THEN` fv =
4049 face  (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v, w}}) fv))) x'` MP_TAC;
4050 MATCH_MP_TAC Lvducxu.LOCALIZE_PRESERVE_FACE;
4051 ASM_REWRITE_TAC[];
4052 SUBGOAL_THEN` v, rho_node1 FF v IN dart HS ` MP_TAC;
4053 EXPAND_TAC "HS";
4054 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
4055 NHANH Lvducxu.FAN_DART_DARTS;
4056 SIMP_TAC[];
4057 STRIP_TAC;
4058 MATCH_MP_TAC IN_DARTS_EXTENSION;
4059 MATCH_MP_TAC LOCAL_RHO_NODE_PAIR_E;
4060 ASM_REWRITE_TAC[];
4061 NHANH_PAT`\x. x ==> y ` Hypermap.lemma_face_subset;
4062 ASM_REWRITE_TAC[SUBSET];
4063 DOWN THEN DOWN;
4064 MESON_TAC[];
4065 STRIP_TAC;
4066 SUBGOAL_THEN ` (v:real^3, w:real^3) IN 
4067 face
4068       (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v, w}}) fv)))
4069       (v,w)` MP_TAC;
4070 REWRITE_TAC[Hypermap.face_refl];
4071
4072 DOWN THEN DOWN;
4073 DISCH_THEN (ASSUME_TAC o SYM);
4074 DISCH_THEN (ASSUME_TAC o SYM);
4075 ASM_REWRITE_TAC[];
4076 UNDISCH_TAC` (w,v) INSERT
4077       {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
4078                                                                     n + 1
4079                                                                     ==> ~
4080                                                                     (ITER m
4081                                                                     (rho_node1
4082                                                                     FF)
4083                                                                     v =
4084                                                                     w)} =
4085       fv`;
4086 DISCH_TAC;
4087 EXPAND_TAC "fv";
4088 ASM_REWRITE_TAC[IN_INSERT; PAIR_EQ];
4089
4090 REWRITE_TAC[IN_ELIM_THM];
4091 STRIP_TAC;
4092 SUBGOAL_THEN` ~((v:real^3,w:real^3) IN FF) ` MP_TAC;
4093 MATCH_MP_TAC CROSS_PAIR_NOT_IN_FF;
4094 ASM_REWRITE_TAC[];
4095 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
4096 DOWN THEN DOWN;
4097 MESON_TAC[];
4098 (* ======================= *)
4099
4100
4101 STRIP_TAC THEN STRIP_TAC;
4102 UNDISCH_TAC` x' IN {(v:real^3 ,w:real^3) | w,v IN fv}`;
4103 EXPAND_TAC "fv";
4104 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
4105 STRIP_TAC;
4106 DOWN THEN DOWN;
4107 UNDISCH_TAC` w',v' = (w:real^3,v:real^3) `;
4108 ASM_SIMP_TAC[PAIR_EQ];
4109
4110 UNDISCH_TAC` w'',v'' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v`;
4111 UNDISCH_TAC` FST (x':real^3#real^3) = v'`;
4112 ASM_SIMP_TAC[PAIR_EQ];
4113 UNDISCH_TAC` w',v' = w:real^3, v:real^3 `;
4114 SIMP_TAC[PAIR_EQ];
4115
4116 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4117 REPEAT STRIP_TAC;
4118 ASSUME_TAC (ARITH_RULE` ~( n + 1 = 0) `);
4119 MP_TAC (SPEC` n + 1 ` (GEN `n:num ` CARD_IS_LEAST_CYCLE));
4120 ANTS_TAC;
4121 DOWN THEN DOWN;
4122 ASM_REWRITE_TAC[];
4123 SIMP_TAC[EQ_SYM_EQ];
4124 MESON_TAC[];
4125
4126
4127 STRIP_TAC;
4128 UNDISCH_TAC` w:real^3 IN V `;
4129 EXPAND_TAC "V";
4130 REWRITE_TAC[IN_ELIM_THM];
4131 STRIP_TAC;
4132
4133 ASSUME_TAC2 (ARITH_RULE` CARD (V:real^3 -> bool) <= n + 1 /\ n' < CARD V 
4134 ==> n' < n + 1 `);
4135 ASM_MESON_TAC[];
4136
4137 SIMP_TAC[IN_INSERT; NOT_IN_EMPTY; Wrgcvdr_cizmrrh.X_IN_HYP_ORBITS];
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150 (* =============================== *)
4151
4152 REWRITE_TAC[EXTENSION; IN_INSERT; NOT_IN_EMPTY; IN_INTER];
4153 GEN_TAC;
4154 EQ_TAC;
4155 ONCE_REWRITE_TAC[CONJ_SYM];
4156 STRIP_TAC;
4157 DOWN;
4158 UNDISCH_TAC` FAN (vec 0,v_prime V fv,e_prime  (E UNION {{v:real^3, w}}) fv)`;
4159 PHA;
4160 NHANH Wrgcvdr_cizmrrh.IN_NODE_IMP_FIRST_EQ;
4161
4162
4163
4164
4165 SUBGOAL_THEN` x IN dart
4166       (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v:real^3, w}}) fv)))` MP_TAC;
4167 ASM_REWRITE_TAC[IN_UNION];
4168 DISJ2_TAC;
4169 REWRITE_TAC[IN_ELIM_THM];
4170 EXISTS_TAC` ITER (n + 1) (rho_node1 FF) v `;
4171 EXISTS_TAC` ITER n (rho_node1 FF) v `;
4172 UNDISCH_TAC` w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4173 SIMP_TAC[PAIR_EQ];
4174 EXPAND_TAC "fv";
4175 STRIP_TAC;
4176 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4177 DISJ2_TAC;
4178 EXISTS_TAC`n:num`;
4179 ASM_REWRITE_TAC[];
4180 NHANH Hypermap.lemma_node_subset;
4181 REWRITE_TAC[SUBSET];
4182 STRIP_TAC;
4183 FIRST_ASSUM NHANH;
4184 ASM_REWRITE_TAC[IN_UNION];
4185 STRIP_TAC;
4186
4187
4188 SUBGOAL_THEN` (v,rho_node1 FF v) IN dart (hypermap (HYP (vec 0,V,E UNION {{v, w}})))` MP_TAC;
4189 ASM_REWRITE_TAC[];
4190 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}}) `;
4191 NHANH Lvducxu.FAN_DART_DARTS;
4192 ASM_SIMP_TAC[];
4193
4194 STRIP_TAC;
4195 UNDISCH_TAC` face HS (v,rho_node1 FF v) = fv `;
4196 DISCH_THEN (MP_TAC o SYM);
4197 DOWN;
4198 UNDISCH_TAC` FAN (vec 0,V,E UNION {{v, w:real^3}})`;
4199 PHA;
4200 ASM_REWRITE_TAC[];
4201 EXPAND_TAC "HS";
4202 NHANH Lvducxu.LOCALIZE_PRESERVE_FACE;
4203 ASM_REWRITE_TAC[];
4204
4205 STRIP_TAC;
4206 UNDISCH_TAC` x':real^3#real^3 IN fv `;
4207 FIRST_ASSUM (SUBST1_TAC);
4208 NHANH Hypermap.lemma_face_identity;
4209
4210 FIRST_X_ASSUM (ASSUME_TAC o SYM);
4211 ASM_REWRITE_TAC[];
4212 UNDISCH_TAC ` x' IN
4213       face
4214       (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v, w}}) fv)))
4215       x`;
4216 NHANH Hypermap.lemma_face_identity;
4217 STRIP_TAC;
4218 STRIP_TAC;
4219 MP_TAC (ISPECL [` (hypermap (HYP (vec 0,v_prime V fv,e_prime  (E UNION {{v, w:real^3}}) fv))) `;` x:real^3# real^3 `] Hypermap.face_refl);
4220 ASM_REWRITE_TAC[];
4221 FIRST_ASSUM (SUBST1_TAC o SYM);
4222 UNDISCH_TAC` (w,v) INSERT
4223       {ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v | n | !m. m <
4224                                                                     n + 1
4225                                                                     ==> ~
4226                                                                     (ITER m
4227                                                                     (rho_node1
4228                                                                     FF)
4229                                                                     v =
4230                                                                     w)} =
4231       fv `;
4232 STRIP_TAC;
4233 FIRST_ASSUM (SUBST1_TAC o SYM);
4234 REWRITE_TAC[IN_INSERT];
4235 STRIP_TAC;
4236 UNDISCH_TAC`w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4237 DOWN;
4238 SIMP_TAC[PAIR_EQ];
4239 STRIP_TAC THEN STRIP_TAC;
4240 DOWN;
4241 ASM_REWRITE_TAC[GSYM ADD1; ITER];
4242 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
4243 DOWN THEN STRIP_TAC;
4244 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v: real^3`));
4245 STRIP_TAC;
4246
4247 ASSUME_TAC2 CROSS_PAIR_NOT_IN_FF;
4248 DOWN;
4249 UNDISCH_TAC` v,rho_node1 FF v IN FF `;
4250 ASM_REWRITE_TAC[];
4251 REPLICATE_TAC 3 DOWN;
4252 MESON_TAC[];
4253
4254 (* ============================ *)
4255 (* ============================ *)
4256
4257
4258
4259
4260 DOWN;
4261 REWRITE_TAC[IN_ELIM_THM];
4262 STRIP_TAC;
4263 DOWN;
4264 UNDISCH_TAC` w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4265 REWRITE_TAC[PAIR_EQ; GSYM ADD1; ITER];
4266 STRIP_TAC;
4267
4268 (* 33 [`v' = rho_node1 FF (ITER n (rho_node1 FF) v)`]
4269
4270 `v' = ITER n' (rho_node1 FF) v /\
4271  w' = rho_node1 FF (ITER n' (rho_node1 FF) v)
4272  ==> x' = v',w'`
4273
4274 *)
4275
4276
4277 IMP_TAC;
4278 DISCH_THEN (SUBST1_TAC o SYM);
4279 ASM_REWRITE_TAC[];
4280
4281
4282 (* *)
4283
4284
4285 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_IMP_NOT_SEMI_IDE;
4286 FIRST_X_ASSUM (MP_TAC o (SPEC` ITER n (rho_node1 FF) v `));
4287 ANTS_TAC;
4288 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_VITER;
4289 FIRST_X_ASSUM MATCH_MP_TAC;
4290 FIRST_X_ASSUM ACCEPT_TAC;
4291 MESON_TAC[];
4292
4293
4294
4295
4296
4297
4298
4299
4300 (* =============== *)
4301 (* =============== *)
4302
4303 DOWN THEN DOWN;
4304 REWRITE_TAC[IN_ELIM_THM];
4305 EXPAND_TAC "fv";
4306 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
4307 STRIP_TAC;
4308 DOWN THEN DOWN;
4309 UNDISCH_TAC` w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4310
4311 SIMP_TAC[PAIR_EQ];
4312 REPEAT STRIP_TAC;
4313 MP_TAC (SPEC` n + 1 ` (GEN `n:num ` CARD_IS_LEAST_CYCLE));
4314 ANTS_TAC;
4315 FIRST_X_ASSUM (SUBST1_TAC o SYM);
4316 ASM_REWRITE_TAC[ARITH_RULE` ~( n + 1 = 0) `];
4317 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4318 UNDISCH_TAC` (w:real^3) IN V `;
4319 EXPAND_TAC "V";
4320 REWRITE_TAC[IN_ELIM_THM];
4321 ASM_REWRITE_TAC[];
4322 UNDISCH_TAC` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w) `;
4323 MESON_TAC[ARITH_RULE` a < b /\ b <= c ==> a < (c:num) `];
4324
4325
4326
4327
4328
4329 (* OK *)
4330
4331 ASM_CASES_TAC` CARD (V:real^3 -> bool) <= n + 1 `;
4332 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4333 UNDISCH_TAC` w:real^3 IN V `;
4334 EXPAND_TAC "V";
4335 REWRITE_TAC[IN_ELIM_THM];
4336 UNDISCH_TAC` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w)`;
4337 UNDISCH_TAC` CARD (V:real^3 -> bool) <= n + 1 `;
4338 MESON_TAC[ARITH_RULE` a < b /\ b <= n + 1 ==> a < n + 1 `];
4339
4340
4341 (* ???? *)
4342 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
4343 FIRST_X_ASSUM (MP_TAC o (SPECL[` 0`; `n + 1 `]));
4344 ANTS_TAC;
4345 ARITH_TAC;
4346 ANTS_TAC;
4347 DOWN THEN ARITH_TAC;
4348 DOWN THEN DOWN;
4349 REWRITE_TAC[ITER];
4350 MESON_TAC[];
4351
4352 (* ok *)
4353
4354
4355 ASM_CASES_TAC` CARD (V:real^3 -> bool) <= n' + 1 `;
4356 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4357 UNDISCH_TAC` w:real^3 IN V `;
4358 EXPAND_TAC "V";
4359 REWRITE_TAC[IN_ELIM_THM];
4360 UNDISCH_TAC` !m. m < n' + 1 ==> ~(ITER m (rho_node1 FF) v = w)`;
4361 UNDISCH_TAC` CARD (V:real^3 -> bool) <= n' + 1 `;
4362 MESON_TAC[ARITH_RULE` a < b /\ b <= n + 1 ==> a < n + 1 `];
4363
4364 (*   * *)
4365 ASM_CASES_TAC` CARD (V:real^3 -> bool) <= n + 1 `;
4366 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4367 UNDISCH_TAC` w:real^3 IN V `;
4368 EXPAND_TAC "V";
4369 REWRITE_TAC[IN_ELIM_THM];
4370 UNDISCH_TAC` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w)`;
4371 UNDISCH_TAC` CARD (V:real^3 -> bool) <= n + 1 `;
4372 MESON_TAC[ARITH_RULE` a < b /\ b <= n + 1 ==> a < n + 1 `];
4373
4374
4375
4376
4377
4378
4379
4380
4381 DOWN THEN DOWN;
4382 REWRITE_TAC[ARITH_RULE` ~( a <= n + 1 ) <=> n + 1 < a `];
4383 DOWN THEN DOWN;
4384 UNDISCH_TAC` w',v' = ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v `;
4385 SIMP_TAC[PAIR_EQ];
4386
4387 REPEAT STRIP_TAC;
4388 ASM_CASES_TAC` n + 1 < n' + 1 \/ n' + 1 < n + 1 `;
4389 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
4390 REPLICATE_TAC 5 DOWN;
4391 MESON_TAC[];
4392
4393 DOWN;
4394 REWRITE_TAC[DE_MORGAN_THM; ARITH_RULE` ~( a < b) /\ ~( b < a:num) <=> a = b `; ARITH_RULE` a + 1 = b + 1 <=> a = b `];
4395 SIMP_TAC[];
4396
4397
4398
4399 SIMP_TAC[Wrgcvdr_cizmrrh.X_IN_HYP_ORBITS];
4400
4401
4402
4403
4404
4405 DOWN;
4406 PHA;
4407 MATCH_MP_TAC (prove(`!x. FAN (vec 0,V,E) /\
4408      x IN darts_of_hyp E V /\
4409      FF = face  (hypermap (HYP (vec 0,V,E))) x
4410      ==>  2 < CARD FF /\
4411           simple_hypermap (hypermap (HYP (vec 0,v_prime V FF,e_prime E FF)))
4412           ==> local_fan (v_prime V FF,e_prime E FF,FF)`,
4413 NHANH Lvducxu.LVDUCXU THEN SIMP_TAC[]));
4414 EXISTS_TAC` v, rho_node1 FF v `;
4415 ASM_REWRITE_TAC[]]);;
4416
4417
4418
4419
4420 let HAFL_CIRCLE_FORM_LOCAL_FAN2 = prove_by_refinement
4421 (` (local_fan (V,E,FF) /\
4422       v IN V /\
4423       w IN V /\
4424       ~(v = w) /\
4425       (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
4426       (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
4427      HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
4428      fv = face HS (v,rho_node1 FF v) /\
4429  fw = face HS (w,rho_node1 FF w)
4430      ==> local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) /\
4431 local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) `,
4432 [STRIP_TAC;
4433 CONJ_TAC;
4434 MATCH_MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN;
4435 ASM_REWRITE_TAC[];
4436 MATCH_MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN;
4437 ASM_REWRITE_TAC[INSERT_COMM];
4438 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t:real^3} `;
4439 DISCH_THEN NHANH;
4440 SIMP_TAC[INSERT_COMM]]);;
4441
4442
4443
4444
4445
4446 let LOCAL_FAN_RHO_NODE_IVS = prove_by_refinement (
4447 ` local_fan (V,E,FF) /\ v IN V 
4448 ==> rho_node1 FF (ivs_rho_node1 FF v ) = v `,
4449 [NHANH Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
4450 STRIP_TAC;
4451 DOWN;
4452 FIRST_X_ASSUM NHANH;
4453 STRIP_TAC;
4454 FIRST_X_ASSUM (SUBST1_TAC o SYM);
4455 REWRITE_TAC[GSYM ITER];
4456 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_FINITE_V;
4457 DOWN THEN DOWN THEN PHA;
4458 REWRITE_TAC[SET_RULE` a IN X <=> {a} SUBSET X `];
4459 NHANH CARD_SUBSET;
4460 STRIP_TAC;
4461 DOWN;
4462 SUBST1_TAC (ISPEC`v:real^3` Trigonometry2.CARD_SING);
4463 NHANH (ARITH_RULE` 1 <= a ==> SUC (a - 1) = a`);
4464 SIMP_TAC[];
4465 STRIP_TAC;
4466 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
4467 FIRST_X_ASSUM MATCH_MP_TAC;
4468 DOWN_TAC;
4469 SIMP_TAC[INSERT_SUBSET]]);;
4470
4471
4472
4473
4474
4475 let LOCAL_FAN_IVS_IN_V = prove(` local_fan (V,E,FF) /\ v IN V
4476 ==> ivs_rho_node1 FF v IN V `,
4477 NHANH Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V THEN
4478 NHANH Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1 THEN
4479 MESON_TAC[]);;
4480
4481
4482
4483
4484
4485 let LF_AZIM_CYCLE_EQ_IVS_ND = prove(` local_fan (V,E,FF) /\ v IN V 
4486 ==> azim_cycle (EE v E) (vec 0) v (rho_node1 FF v) = ivs_rho_node1 FF v `,
4487 NHANH LOCAL_FAN_RHO_NODE_IVS THEN
4488 NHANH LOCAL_FAN_IVS_IN_V THEN 
4489 ABBREV_TAC` vv = ivs_rho_node1 FF v ` THEN 
4490 STRIP_TAC THEN ASSUME_TAC2 Local_lemmas.LOFA_IMP_EE_TWO_ELMS THEN
4491 ASM_REWRITE_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET]);;
4492
4493
4494
4495
4496
4497
4498 let AZIM_IN_FAN_RHOND_IVS_RHOND = prove(` local_fan (V,E,FF) /\ v IN V
4499 ==> azim_in_fan (v, rho_node1 FF v) E = azim (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `, STRIP_TAC THEN 
4500 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2 THEN DOWN THEN STRIP_TAC
4501 THEN FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3`)) THEN 
4502 DOWN THEN UNDISCH_TAC` local_fan (V,E,FF)` THEN 
4503 PHA THEN NHANH Local_lemmas.LOFA_DETERMINE_AZIM_IN_FA THEN
4504 SIMP_TAC[] THEN STRIP_TAC THEN 
4505 ASSUME_TAC2 LF_AZIM_CYCLE_EQ_IVS_ND THEN ASM_REWRITE_TAC[]);;
4506
4507
4508
4509
4510
4511
4512 let LOFA_IMP_EE_TWO_ELMS_INS_ND = prove(` local_fan (V,E,FF) /\ v IN V
4513 ==> EE v E = {rho_node1 FF v, ivs_rho_node1 FF v} `,
4514 NHANH LOCAL_FAN_IVS_IN_V THEN NHANH LOCAL_FAN_RHO_NODE_IVS THEN 
4515 STRIP_TAC THEN ABBREV_TAC `vv = ivs_rho_node1 FF v ` THEN 
4516 ASSUME_TAC2 Local_lemmas.LOFA_IMP_EE_TWO_ELMS THEN
4517 FIRST_X_ASSUM ACCEPT_TAC);;
4518
4519
4520
4521
4522 let WEDGE_IN_FAN_RHOND_IVS_RHOND = prove(` local_fan (V,E,FF) /\ v IN V
4523      ==> wedge_in_fan_ge (v,rho_node1 FF v) E =
4524          wedge_ge (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `,
4525 NHANH Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2 THEN STRIP_TAC THEN 
4526 DOWN THEN FIRST_X_ASSUM NHANH THEN STRIP_TAC THEN 
4527 DOWN THEN UNDISCH_TAC `local_fan (V,E,FF) ` THEN PHA THEN 
4528 NHANH Local_lemmas.DETERMINE_WEDGE_IN_FAN THEN SIMP_TAC[] THEN 
4529 STRIP_TAC THEN ASSUME_TAC2 LOFA_IMP_EE_TWO_ELMS_INS_ND THEN
4530 ASM_SIMP_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET]);;
4531
4532
4533
4534
4535
4536 let FST_LST_IN_WEDGE_GE = prove(` w1 IN wedge_ge v0 v1 w1 w2 /\
4537 w2 IN wedge_ge v0 v1 w1 w2`,
4538 REWRITE_TAC[wedge_ge; IN_ELIM_THM; AZIM_REFL; Local_lemmas.AZIM_RANGE] THEN
4539 REWRITE_TAC[REAL_LE_REFL]);;
4540
4541
4542
4543
4544 let IVS_RHO_NODE_DIFF_ID = prove(`!v. local_fan (V,E,FF) /\ v IN V
4545                 ==> ~(ivs_rho_node1 FF v = v)`,
4546 NHANH LOCAL_FAN_IVS_IN_V THEN NHANH Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE THEN 
4547 REPEAT STRIP_TAC THEN FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` ivs_rho_node1 FF v `)) THEN 
4548 ASSUME_TAC2 LOCAL_FAN_RHO_NODE_IVS THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN 
4549 DOWN THEN ASM_REWRITE_TAC[]);;
4550
4551
4552
4553
4554
4555 let POINT_PRESENTED_IN_RHOND1 = prove(
4556 ` local_fan (V,E,FF) /\ v IN V /\ w IN V ==> ? n. n < CARD V /\
4557 ITER n (rho_node1 FF) v = w /\ (! m. m < n ==> ~( ITER m (rho_node1 FF) v = w )) `,
4558 STRIP_TAC THEN ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V THEN 
4559 UNDISCH_TAC ` w:real^3 IN V ` THEN EXPAND_TAC "V" THEN 
4560 REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN 
4561 EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN 
4562 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23 THEN GEN_TAC THEN
4563 STRIP_TAC THEN FIRST_X_ASSUM (MP_TAC o (SPECL [`m:num `;` n:num`])) THEN PHA
4564 THEN PHA THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; SIMP_TAC[]]);;
4565
4566
4567
4568
4569
4570
4571
4572 let POINTS_IN_HAFL_CIRCLE = prove_by_refinement 
4573 (` (local_fan (V,E,FF) /\
4574         v IN V /\
4575         w IN V /\
4576         ~(v = w) /\
4577         (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
4578         (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
4579        HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
4580        fv = face HS (v,rho_node1 FF v)
4581 ==> v_prime V fv = {ITER n (rho_node1 FF) v| n | ! m . m < n ==> ~(ITER m (rho_node1 FF ) v = w)} `,
4582 [NHANH DETERMINE_FV;
4583 REWRITE_TAC[v_prime];
4584 STRIP_TAC;
4585 REWRITE_TAC[EXTENSION];
4586 GEN_TAC;
4587 EQ_TAC;
4588 REWRITE_TAC[IN_ELIM_THM];
4589 FIRST_X_ASSUM (ASSUME_TAC o SYM);
4590 EXPAND_TAC "fv";
4591 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4592 STRIP_TAC;
4593
4594 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
4595
4596 DOWN THEN STRIP_TAC;
4597 EXISTS_TAC `n:num`;
4598 REPLICATE_TAC 4 DOWN THEN PHA;
4599 REWRITE_TAC[PAIR_EQ];
4600 ASM_SIMP_TAC[];
4601
4602
4603 DOWN;
4604 REWRITE_TAC[PAIR_EQ];
4605 STRIP_TAC;
4606 EXISTS_TAC` n:num `;
4607
4608 ASM_REWRITE_TAC[];
4609 GEN_TAC;
4610 NHANH (ARITH_RULE` a < (b:num) ==> a < b + 1 `);
4611 FIRST_X_ASSUM NHANH;
4612 SIMP_TAC[];
4613
4614
4615 REWRITE_TAC[IN_ELIM_THM];
4616 STRIP_TAC;
4617 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4618 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num `));
4619 ASM_SIMP_TAC[];
4620 STRIP_TAC;
4621 UNDISCH_TAC` fv = face HS (v,rho_node1 FF v) `;
4622 DISCH_THEN (ASSUME_TAC o SYM);
4623 UNDISCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v, w:real^3}}))`;
4624 DISCH_THEN (ASSUME_TAC o SYM);
4625 ASM_REWRITE_TAC[];
4626 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4627 ASM_CASES_TAC` x = (w:real^3) `;
4628 EXISTS_TAC `v:real^3 `;
4629 DISJ1_TAC;
4630 FIRST_X_ASSUM (ASSUME_TAC o SYM);
4631 ASM_REWRITE_TAC[];
4632
4633
4634 EXISTS_TAC` ITER (n + 1) (rho_node1 FF) v`;
4635 DISJ2_TAC;
4636 EXISTS_TAC` n:num`;
4637 REWRITE_TAC[];
4638 GEN_TAC;
4639 ASM_CASES_TAC` m = n:num `;
4640 UNDISCH_TAC` x = ITER n (rho_node1 FF) v `;
4641 ASM_REWRITE_TAC[];
4642 DISCH_THEN (SUBST1_TAC o SYM);
4643 ASM_REWRITE_TAC[];
4644 DOWN THEN PHA;
4645 REWRITE_TAC[ARITH_RULE` ~(m = n) /\ m < n + 1 <=> m < n `];
4646 FIRST_X_ASSUM NHANH;
4647 SIMP_TAC[]]);;
4648
4649
4650
4651 let COVEX_OF_LOFA_HALF_CIRCLE = prove_by_refinement
4652 (`convex_local_fan (V,E,FF) /\
4653   (local_fan (V,E,FF) /\
4654       v IN V /\
4655       w IN V /\
4656       ~(v = w) /\
4657       (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
4658       (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
4659      HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
4660      fv = face HS (v,rho_node1 FF v) 
4661      ==> convex_local_fan (v_prime V fv,e_prime  (E UNION {{v, w}}) fv,fv) `,
4662 [NHANH HAFL_CIRCLE_FORM_LOCAL_FAN;
4663 REWRITE_TAC[convex_local_fan];
4664 NHANH DETERMINE_FV;
4665 ONCE_REWRITE_TAC[EQ_SYM_EQ];
4666 SIMP_TAC[];
4667 STRIP_TAC;
4668
4669 EXPAND_TAC "fv";
4670 REWRITE_TAC[IN_ELIM_THM; IN_INSERT];
4671 ASM_REWRITE_TAC[];
4672 GEN_TAC;
4673 STRIP_TAC;
4674
4675 SUBGOAL_THEN ` (w:real^3,v:real^3) IN fv ` MP_TAC;
4676 EXPAND_TAC "fv";
4677 REWRITE_TAC[IN_INSERT];
4678 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w:real^3}}) fv,fv)`;
4679 PHA;
4680 NHANH Local_lemmas.LOFA_DETERMINE_AZIM_IN_FA;
4681 ASM_SIMP_TAC[];
4682 STRIP_TAC;
4683
4684 SUBGOAL_THEN ` e_prime  (E UNION {{v, w}}) fv = {{v,w:real^3} | v,w IN fv }` MP_TAC;
4685 REWRITE_TAC[EXTENSION];
4686 GEN_TAC;
4687 REWRITE_TAC[e_prime; IN_ELIM_THM];
4688 EQ_TAC;
4689 MESON_TAC[];
4690
4691
4692 STRIP_TAC;
4693 EXISTS_TAC` v':real^3`;
4694 EXISTS_TAC` w': real^3 `;
4695 ASM_REWRITE_TAC[];
4696 UNDISCH_TAC` v':real^3, w': real^3 IN fv `;
4697 EXPAND_TAC "fv";
4698 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4699
4700
4701 STRIP_TAC;
4702 DOWN;
4703 SIMP_TAC[PAIR_EQ; INSERT_COMM; IN_UNION; IN_INSERT];
4704 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
4705 FIRST_X_ASSUM (ASSUME_TAC o (SPEC`n: num`));
4706 DOWN;
4707 UNDISCH_TAC` local_fan (V,E,FF) `;
4708 PHA;
4709 NHANH Local_lemmas.LOCAL_FAN_IN_FF_IN_ORD_PAIRS2;
4710 DOWN;
4711 SIMP_TAC[PAIR_EQ; IN_UNION];
4712 STRIP_TAC;
4713 ASM_REWRITE_TAC[];
4714
4715
4716
4717
4718
4719 SUBGOAL_THEN` EE w {{v, w} | v,w IN fv} = {v:real^3, ivs_rho_node1 FF w}` MP_TAC;
4720 REWRITE_TAC[EE; EXTENSION];
4721 GEN_TAC;
4722 EQ_TAC;
4723 REWRITE_TAC[IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY];
4724 EXPAND_TAC "fv";
4725 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4726 STRIP_TAC;
4727 DOWN THEN DOWN THEN PHA;
4728 REWRITE_TAC[PAIR_EQ];
4729 SET_TAC[];
4730
4731 DOWN THEN REWRITE_TAC[Geomdetail.PAIR_EQ_EXPAND];
4732 DOWN;
4733 REWRITE_TAC[PAIR_EQ];
4734 FIRST_ASSUM (MP_TAC o (SPEC` n: num `));
4735 ANTS_TAC;
4736 ARITH_TAC;
4737 SIMP_TAC[];
4738 REPEAT STRIP_TAC;
4739 DISJ2_TAC;
4740
4741 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4742 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num `));
4743 UNDISCH_TAC ` local_fan (V,E,FF) `;
4744 PHA;
4745 NHANH Local_lemmas.IVS_RHO_IDD;
4746 REWRITE_TAC[GSYM ITER; ADD1];
4747 SIMP_TAC[];
4748
4749
4750 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; IN_ELIM_THM];
4751 STRIP_TAC;
4752 EXISTS_TAC` w:real^3 `;
4753 EXISTS_TAC` v:real^3 `;
4754 EXPAND_TAC "fv";
4755 REWRITE_TAC[IN_INSERT];
4756 FIRST_X_ASSUM SUBST1_TAC;
4757 REWRITE_TAC[];
4758 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
4759 UNDISCH_TAC` w:real^3 IN V `;
4760 EXPAND_TAC "V";
4761 REWRITE_TAC[IN_ELIM_THM];
4762 STRIP_TAC;
4763
4764
4765
4766 ASM_CASES_TAC` n = 0 `;
4767 FIRST_X_ASSUM SUBST_ALL_TAC;
4768 DOWN THEN REWRITE_TAC[ITER];
4769 ASM_REWRITE_TAC[];
4770
4771
4772 EXISTS_TAC` ITER (n - 1) (rho_node1 FF) v `;
4773 EXISTS_TAC` ITER (n - 1 + 1) (rho_node1 FF) v `;
4774 EXPAND_TAC "fv";
4775 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4776 CONJ_TAC;
4777 DISJ2_TAC;
4778 EXISTS_TAC `n - 1 `;
4779 DOWN;
4780 REWRITE_TAC[];
4781 NHANH (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
4782 SIMP_TAC[];
4783 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
4784 ASM_REWRITE_TAC[];
4785 DOWN;
4786 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
4787 PHA THEN MESON_TAC[];
4788
4789
4790 MATCH_MP_TAC (SET_RULE` a = d /\ b = c ==> {a,b} = {c,d} `);
4791 ASM_REWRITE_TAC[];
4792 DOWN;
4793 NHANH (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
4794 SIMP_TAC[];
4795
4796
4797 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
4798 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4799 FIRST_X_ASSUM (MP_TAC o (SPEC` n:num `));
4800 FIRST_X_ASSUM NHANH;
4801 REWRITE_TAC[ITER_ADD];
4802
4803
4804 ASM_CASES_TAC` n = 0 `;
4805 FIRST_X_ASSUM SUBST_ALL_TAC;
4806 DOWN;
4807 ASM_REWRITE_TAC[ITER];
4808
4809
4810 ASSUME_TAC2 (SPEC` CARD (V:real^3 -> bool)` (ARITH_RULE`!m. n < m /\ ~( n = 0)
4811  ==> m - 1 + n = m + n - 1 `));
4812 ASM_REWRITE_TAC[];
4813 REWRITE_TAC[GSYM ITER_ADD];
4814
4815 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4816 FIRST_X_ASSUM (ASSUME_TAC o (SPEC` n - 1 `));
4817 REPEAT STRIP_TAC;
4818 UNDISCH_TAC` ITER (n - 1) (rho_node1 FF) v IN V `;
4819 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
4820 FIRST_X_ASSUM NHANH;
4821 ASM_SIMP_TAC[];
4822
4823 SIMP_TAC[Local_lemmas.AZIM_CYCLE_TWO_POINT_SET];
4824
4825
4826
4827
4828 STRIP_TAC;
4829 ASSUME_TAC2 (SPEC` w:real^3 ` (GEN`v: real^3 ` WEDGE_IN_FAN_RHOND_IVS_RHOND));
4830 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
4831 DOWN THEN STRIP_TAC;
4832 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3`));
4833 DOWN;
4834 UNDISCH_TAC` !x. (x:real^3#real^3) IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E`;
4835 STRIP_TAC;
4836 FIRST_ASSUM NHANH;
4837 ASM_REWRITE_TAC[];
4838 ASSUME_TAC2 (SPEC` w:real^3` (GEN `v:real^3` AZIM_IN_FAN_RHOND_IVS_RHOND));
4839 ASM_REWRITE_TAC[];
4840
4841 REWRITE_TAC[wedge_ge; SUBSET];
4842 STRIP_TAC;
4843 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
4844 DOWN;
4845 REWRITE_TAC[IN_ELIM_THM];
4846 STRIP_TAC;
4847
4848 MP_TAC (SPECL [` vec 0: real^3 `;` w:real^3 `;` rho_node1 FF w `;`  ivs_rho_node1 FF w`;
4849  ` v:real^3 `; ` ivs_rho_node1 FF w `] 
4850 (GEN_ALL Local_lemmas.IN_WEDGE_IMP_AZIM_LE));
4851 ANTS_TAC;
4852 ASM_REWRITE_TAC[FST_LST_IN_WEDGE_GE];
4853 UNDISCH_TAC` !z t. z IN {v:real^3, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}`;
4854 DISCH_THEN (ASSUME_TAC o (SPEC` w:real^3 `));
4855 FIRST_ASSUM (MP_TAC o (SPEC` v:real^3 `));
4856 ANTS_TAC;
4857 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
4858
4859
4860 FIRST_ASSUM (MP_TAC o (SPEC` ivs_rho_node1 FF w `));
4861 ANTS_TAC;
4862 REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
4863 ASSUME_TAC2 (SPEC` w:real^3` (GEN `v:real^3 ` LOCAL_FAN_IVS_IN_V));
4864 ASSUME_TAC2 (SPEC` w: real^3 ` IVS_RHO_NODE_DIFF_ID);
4865 ASM_REWRITE_TAC[];
4866
4867
4868 FIRST_ASSUM (MP_TAC o (SPEC`rho_node1 FF w `));
4869 ANTS_TAC;
4870 REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
4871 ASSUME_TAC2 (SPEC` w:real^3 ` (GEN`v: real^3 ` Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V));
4872 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE;
4873 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
4874 ASM_REWRITE_TAC[];
4875
4876 SIMP_TAC[];
4877
4878
4879 STRIP_TAC;
4880 CONJ_TAC;
4881 UNDISCH_TAC` azim (vec 0) w (rho_node1 FF w) (ivs_rho_node1 FF w) <= pi `;
4882 DOWN;
4883 PHA THEN REWRITE_TAC[REAL_LE_TRANS];
4884
4885 SUBGOAL_THEN `(w:real^3) IN v_prime V (fv: real^3#real^3 -> bool)` MP_TAC;
4886 MP_TAC POINTS_IN_HAFL_CIRCLE;
4887 ANTS_TAC;
4888 ASM_REWRITE_TAC[];
4889 SIMP_TAC[IN_ELIM_THM];
4890 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
4891 DOWN THEN STRIP_TAC;
4892 STRIP_TAC;
4893 EXISTS_TAC` n: num `;
4894 ASM_REWRITE_TAC[];
4895 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v:real^3, w}}) fv,fv) `;
4896 PHA;
4897 NHANH WEDGE_IN_FAN_RHOND_IVS_RHOND;
4898 STRIP_TAC;
4899 UNDISCH_TAC` (w:real^3,v:real^3) IN fv`;
4900 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v:real^3, w}}) fv,fv)`;
4901 PHA;
4902 NHANH Local_lemmas.DETER_RHO_NODE;
4903 STRIP_TAC;
4904 UNDISCH_TAC` wedge_in_fan_ge  (w,rho_node1 fv w) (e_prime  (E UNION {{v, w}}) fv) =
4905       wedge_ge  (vec 0) w (rho_node1 fv w) (ivs_rho_node1 fv w) `;
4906 ASM_SIMP_TAC[];
4907 STRIP_TAC;
4908
4909 SUBGOAL_THEN` ivs_rho_node1 FF w, w IN fv ` MP_TAC;
4910 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
4911 DOWN THEN STRIP_TAC;
4912 EXPAND_TAC "fv";
4913 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
4914 DISJ2_TAC;
4915 EXISTS_TAC` n - 1 `;
4916 ASM_CASES_TAC` n = 0 `;
4917 FIRST_X_ASSUM SUBST_ALL_TAC;
4918 DOWN THEN DOWN;
4919 ASM_REWRITE_TAC[ITER];
4920 ASSUME_TAC2 (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
4921 ASM_REWRITE_TAC[PAIR_EQ];
4922 EXPAND_TAC "w";
4923 EXPAND_TAC "n";
4924 REWRITE_TAC[GSYM ADD1; ITER];
4925 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
4926 FIRST_X_ASSUM (MP_TAC o (SPEC` n - 1 `));
4927 UNDISCH_TAC` local_fan (V,E,FF) `;
4928 PHA;
4929 NHANH Local_lemmas.IVS_RHO_IDD;
4930 SIMP_TAC[ADD1; ARITH_RULE` (a + 1) - 1 = a `];
4931 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w}}) fv,fv) `;
4932 PHA;
4933 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
4934 SIMP_TAC[] THEN STRIP_TAC;
4935
4936 MP_TAC (REWRITE_RULE[] (
4937 SPECL [` w:real^3 `;` CARD (V:real^3 -> bool) `;` \i. ITER i (rho_node1 FF) w `;` \i. azim (vec 0) w (ITER 1 (rho_node1 FF) w)
4938                 (ITER i (rho_node1 FF) w) `] 
4939 (GENL [` v0:real^3 `;` k: num `;` vv: num -> real^3 `;` bta: num -> real`] Local_lemmas.MONO_AZIM_AS_BTA_I)));
4940 ANTS_TAC;
4941 ASM_REWRITE_TAC[convex_local_fan];
4942
4943
4944 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z:real^3} ==> ~collinear {vec 0, z, t} `;
4945 DISCH_THEN (MP_TAC o (SPEC` w:real^3 `));
4946 REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
4947
4948 MP_TAC POINTS_IN_HAFL_CIRCLE;
4949 ANTS_TAC;
4950 ASM_REWRITE_TAC[];
4951 SIMP_TAC[];
4952 REWRITE_TAC[IN_ELIM_THM];
4953 REPEAT STRIP_TAC;
4954 MP_TAC (SPECL [` w:real^3 `;` v:real^3 `] (GENL [` v:real^3`;` w:real^3 `]
4955  POINT_PRESENTED_IN_RHOND1));
4956 ANTS_TAC;
4957 ASM_REWRITE_TAC[];
4958 STRIP_TAC;
4959
4960 ASM_CASES_TAC` CARD (V:real^3 -> bool) < n + n' `;
4961 DOWN;
4962 UNDISCH_TAC` n' < CARD (V:real^3 -> bool) `;
4963 PHA;
4964 NHANH (ARITH_RULE` (c:num) < a /\ a < b + c ==> a - c < b `);
4965 UNDISCH_TAC` !m. m < n ==> ~(ITER m (rho_node1 FF) v = w) `;
4966 STRIP_TAC;
4967 FIRST_ASSUM NHANH;
4968 EXPAND_TAC "v";
4969 SIMP_TAC[ITER_ADD];
4970 NHANH ( ARITH_RULE` b < CARD (V:real^3 -> bool) ==>  CARD V - b + b = CARD V`);
4971 STRIP_TAC;
4972 DOWN;
4973 ASM_REWRITE_TAC[];
4974 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
4975 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
4976 ASM_REWRITE_TAC[];
4977
4978
4979 ASM_CASES_TAC` n + n' = CARD (V:real^3 -> bool) `;
4980 ASM_REWRITE_TAC[];
4981 EXPAND_TAC "v";
4982 REWRITE_TAC[ITER_ADD];
4983 ASM_REWRITE_TAC[];
4984 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
4985 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
4986 ASM_REWRITE_TAC[wedge_ge; IN_ELIM_THM; Local_lemmas.AZIM_SPEC_DEGENERATE];
4987 REWRITE_TAC[REAL_LE_REFL; Local_lemmas.AZIM_RANGE];
4988
4989 ASM_CASES_TAC` n = 0 `;
4990 FIRST_X_ASSUM SUBST_ALL_TAC;
4991 UNDISCH_TAC` x' = ITER 0 (rho_node1 FF) v `;
4992 REWRITE_TAC[ITER];
4993 SIMP_TAC[wedge_ge; IN_ELIM_THM; AZIM_REFL; REAL_LE_REFL; Local_lemmas.AZIM_RANGE];
4994
4995
4996
4997 FIRST_ASSUM (MP_TAC o (SPECL[` n':num `;` n + (n':num) `]));
4998 ANTS_TAC;
4999 REPLICATE_TAC 3 DOWN THEN PHA;
5000 ARITH_TAC;
5001
5002 ASM_REWRITE_TAC[GSYM ITER_ADD];
5003 UNDISCH_TAC` x' = ITER n (rho_node1 FF) v `;
5004 DISCH_THEN (ASSUME_TAC o SYM);
5005 ASM_REWRITE_TAC[Wrgcvdr_cizmrrh.ITER1];
5006
5007
5008 REWRITE_TAC[wedge_ge; IN_ELIM_THM; Local_lemmas.AZIM_RANGE];
5009 STRIP_TAC;
5010 ASM_CASES_TAC` n + n' = CARD (V:real^3 -> bool) - 1`;
5011 EXPAND_TAC "x'";
5012 EXPAND_TAC "v";
5013 REWRITE_TAC[ITER_ADD];
5014 ASM_REWRITE_TAC[];
5015 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
5016 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w: real^3 `));
5017 FIRST_X_ASSUM SUBST1_TAC;
5018 REWRITE_TAC[REAL_LE_REFL];
5019
5020
5021 FIRST_ASSUM (MP_TAC o (SPECL [` n + n':num `;` CARD (V:real^3 -> bool) - 1 `]));
5022 ANTS_TAC;
5023 DOWN;
5024 UNDISCH_TAC` ~(CARD (V:real^3 -> bool) < n + n')`;
5025 UNDISCH_TAC` ~(n + n' = CARD (V:real^3 -> bool))`;
5026 ARITH_TAC;
5027 REWRITE_TAC[Wrgcvdr_cizmrrh.ITER1];
5028
5029 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
5030 FIRST_ASSUM (ASSUME_TAC2 o (SPEC`w:real^3 `));
5031 ASM_REWRITE_TAC[GSYM ITER_ADD];
5032 STRIP_TAC;
5033
5034 SUBGOAL_THEN` ~ (collinear {vec 0, w, v:real^3}) /\
5035 ~( collinear {vec 0, w, x'}) /\ ~( collinear {vec 0, w, rho_node1 FF w})` MP_TAC;
5036 CONJ_TAC;
5037 FIRST_ASSUM MATCH_MP_TAC;
5038 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
5039
5040 CONJ_TAC;
5041 FIRST_ASSUM MATCH_MP_TAC;
5042 REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
5043 EXPAND_TAC "x'";
5044 EXPAND_TAC "v";
5045 REWRITE_TAC[ITER_ADD];
5046 ASSUME_TAC2 (SPEC` w:real^3 ` (GEN` v:real^3 `
5047  Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V));
5048 FIRST_X_ASSUM (MP_TAC o (SPEC` n + n': num `));
5049 SIMP_TAC[];
5050 STRIP_TAC;
5051 MP_TAC (SPEC` w:real^3` (GEN` v:real^3 ` Local_lemmas.LOFA_IMP_DIS_ELMS23));
5052 ANTS_TAC;
5053 ASM_REWRITE_TAC[];
5054 DISCH_THEN (MP_TAC o (SPECL [`0 `;` n + n': num `]));
5055 ANTS_TAC;
5056 UNDISCH_TAC` ~( n = 0) `;
5057 UNDISCH_TAC` ~(CARD (V:real^3 -> bool) < n + n')`;
5058 UNDISCH_TAC` ~(n + n' = CARD (V:real^3 -> bool))`;
5059 ARITH_TAC;
5060 SIMP_TAC[ITER];
5061 ASSUME_TAC2 (SPEC` w:real^3` (GEN` v:real^3 ` Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2));
5062 FIRST_X_ASSUM ACCEPT_TAC;
5063
5064
5065
5066 UNDISCH_TAC` azim (vec 0) w (rho_node1 FF w) v <= azim (vec 0) w (rho_node1 FF w) x' `;
5067 PHA;
5068 NHANH Fan.sum4_azim_fan;
5069
5070 STRIP_TAC;
5071 SUBGOAL_THEN` ~ collinear {vec 0, w, v:real^3} /\
5072 ~ collinear {vec 0, w, ivs_rho_node1 FF w} /\
5073 ~ collinear {vec 0, w, rho_node1 FF w} ` MP_TAC;
5074 ASM_REWRITE_TAC[];
5075 ASSUME_TAC2 (SPEC` w:real^3 ` Local_lemmas.LOFA_IMP_NOT_COLL_IVS);
5076 FIRST_X_ASSUM ACCEPT_TAC;
5077 SUBGOAL_THEN` azim (vec 0) w (rho_node1 FF w) v <= azim (vec 0) w (rho_node1 FF w) (ivs_rho_node1 FF w)` MP_TAC;
5078 MATCH_MP_TAC REAL_LE_TRANS;
5079 EXISTS_TAC` azim (vec 0) w (rho_node1 FF w) x' `;
5080 ASM_REWRITE_TAC[];
5081
5082 PHA;
5083 NHANH Fan.sum4_azim_fan;
5084 STRIP_TAC;
5085 UNDISCH_TAC` azim (vec 0) w (rho_node1 FF w) x' <=
5086       azim (vec 0) w (rho_node1 FF w) (ivs_rho_node1 FF w) `;
5087 ASM_REWRITE_TAC[];
5088 REAL_ARITH_TAC;
5089
5090
5091 ASM_CASES_TAC` n = 0 `;
5092 FIRST_X_ASSUM SUBST_ALL_TAC;
5093 MP_TAC POINTS_IN_HAFL_CIRCLE;
5094 ANTS_TAC;
5095 ASM_REWRITE_TAC[];
5096 STRIP_TAC;
5097 SUBGOAL_THEN` (v:real^3) IN v_prime V (fv:real^3 #real^3 -> bool) ` MP_TAC;
5098 ASM_REWRITE_TAC[IN_ELIM_THM];
5099 EXISTS_TAC `0`;
5100 REWRITE_TAC[ITER; LT];
5101 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v:real^3, w}}) fv,fv)`;
5102 PHA;
5103 NHANH AZIM_IN_FAN_RHOND_IVS_RHOND;
5104 DOWN THEN DOWN;
5105 REWRITE_TAC[ITER; ADD; Lvducxu.ITER12];
5106 DISCH_THEN (ASSUME_TAC o SYM);
5107 DISCH_THEN (ASSUME_TAC o SYM);
5108 STRIP_TAC;
5109
5110 SUBGOAL_THEN` v,rho_node1 FF v IN fv ` MP_TAC;
5111 EXPAND_TAC "fv";
5112 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5113 DISJ2_TAC;
5114 EXISTS_TAC` 0 `;
5115 ASM_REWRITE_TAC[];
5116 EXPAND_TAC "x";
5117 REWRITE_TAC[ITER; ADD; Lvducxu.ITER12];
5118 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w:real^3}}) fv,fv) `;
5119 PHA;
5120 NHANH Local_lemmas.DETER_RHO_NODE;
5121 STRIP_TAC;
5122 SUBGOAL_THEN` (w:real^3, v:real^3) IN fv ` MP_TAC;
5123 EXPAND_TAC "fv";
5124 REWRITE_TAC[IN_INSERT];
5125 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v:real^3, w}}) fv,fv) `;
5126 PHA;
5127 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5128 STRIP_TAC;
5129 UNDISCH_TAC` azim_in_fan (v,rho_node1 fv v) (e_prime  (E UNION {{v, w}}) fv) =
5130       azim (vec 0) v (rho_node1 fv v) (ivs_rho_node1 fv v) `;
5131 ASM_SIMP_TAC[];
5132 STRIP_TAC;
5133
5134 UNDISCH_TAC` !x. (x:real^3#real^3) IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E `;
5135 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
5136 DOWN THEN STRIP_TAC;
5137 STRIP_TAC;
5138 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
5139 DOWN;
5140 FIRST_ASSUM NHANH;
5141 ASSUME_TAC2 AZIM_IN_FAN_RHOND_IVS_RHOND;
5142 ASSUME_TAC2 WEDGE_IN_FAN_RHOND_IVS_RHOND;
5143 ASM_REWRITE_TAC[SUBSET];
5144 STRIP_TAC;
5145 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
5146 DOWN;
5147 REWRITE_TAC[wedge_ge; IN_ELIM_THM];
5148 STRIP_TAC;
5149 CONJ_TAC;
5150 MATCH_MP_TAC REAL_LE_TRANS;
5151 EXISTS_TAC` azim (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
5152 ASM_REWRITE_TAC[];
5153
5154 GEN_TAC;
5155 STRIP_TAC;
5156 UNDISCH_TAC` v IN v_prime V (fv:real^3#real^3 -> bool) `;
5157 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w:real^3}}) fv,fv) `;
5158 PHA;
5159 NHANH WEDGE_IN_FAN_RHOND_IVS_RHOND;
5160 ASM_SIMP_TAC[];
5161 STRIP_TAC;
5162 SUBGOAL_THEN` (x':real^3) IN {ITER n (rho_node1 FF) v | n | !m. m < n
5163                                          ==> ~(ITER m (rho_node1 FF) v = w)}` MP_TAC;
5164 ASM_REWRITE_TAC[];
5165 REWRITE_TAC[IN_ELIM_THM];
5166 STRIP_TAC;
5167 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
5168 DOWN THEN STRIP_TAC;
5169 ASM_CASES_TAC` n'' < (n':num) `;
5170 DOWN;
5171 UNDISCH_TAC` !m. m < n' ==> ~(ITER m (rho_node1 FF) v = w)`;
5172 DISCH_THEN NHANH;
5173 ASM_REWRITE_TAC[];
5174 ASM_CASES_TAC` n'' = (n': num) `;
5175 FIRST_X_ASSUM SUBST_ALL_TAC;
5176 ASM_REWRITE_TAC[FST_LST_IN_WEDGE_GE];
5177
5178 MP_TAC (
5179 SPEC` CARD (V:real^3 -> bool) ` (
5180 GEN `k: num ` (
5181 REWRITE_RULE[] (
5182 SPECL [`v:real^3 `; `\i. ITER i (rho_node1 FF) v `; `\i. azim (vec 0) v (rho_node1 FF v) ( ITER i (rho_node1 FF) v) `] 
5183 (GENL [` v0:real^3`; ` vv: num -> real^3 `;` bta: num -> real`] Local_lemmas.MONO_AZIM_AS_BTA_I)))));
5184 ANTS_TAC;
5185 ASM_REWRITE_TAC[convex_local_fan; Lvducxu.ITER12];
5186 GEN_TAC THEN STRIP_TAC;
5187 FIRST_X_ASSUM MATCH_MP_TAC;
5188 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
5189
5190 DISCH_THEN (MP_TAC o (SPECL [` n':num `;` n'': num `]));
5191 ANTS_TAC;
5192 ASM_REWRITE_TAC[];
5193 DOWN THEN DOWN THEN ARITH_TAC;
5194 ASM_SIMP_TAC[wedge_ge; IN_ELIM_THM; Local_lemmas.AZIM_RANGE];
5195
5196
5197 DOWN THEN DOWN;
5198 DISCH_THEN (ASSUME_TAC o SYM);
5199 STRIP_TAC;
5200 MP_TAC POINTS_IN_HAFL_CIRCLE;
5201 ANTS_TAC;
5202 ASM_REWRITE_TAC[];
5203 DISCH_THEN (ASSUME_TAC o SYM);
5204 SUBGOAL_THEN` ITER n (rho_node1 FF) v IN {ITER n (rho_node1 FF) v | n | !m. m < n
5205                                          ==> ~(ITER m (rho_node1 FF) v = w)} ` MP_TAC;
5206 REWRITE_TAC[IN_ELIM_THM];
5207 EXISTS_TAC` n: num `;
5208 REWRITE_TAC[];
5209 NHANH (ARITH_RULE` m < n:num ==> m < n + 1 `);
5210 FIRST_ASSUM NHANH;
5211 SIMP_TAC[];
5212 ASM_REWRITE_TAC[];
5213 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v:real^3, w}}) fv,fv) `;
5214 PHA;
5215 NHANH AZIM_IN_FAN_RHOND_IVS_RHOND;
5216 STRIP_TAC;
5217 SUBGOAL_THEN` (x:real^3 # real^3) IN fv ` MP_TAC;
5218 EXPAND_TAC "fv";
5219 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5220 DISJ2_TAC;
5221 EXISTS_TAC` n:num `;
5222 ASM_REWRITE_TAC[];
5223
5224 EXPAND_TAC "x";
5225 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w:real^3}}) fv,fv) `;
5226 PHA;
5227 NHANH Local_lemmas.DETER_RHO_NODE;
5228 ASM_REWRITE_TAC[];
5229 STRIP_TAC;
5230
5231 SUBGOAL_THEN` (ivs_rho_node1 FF (ITER n (rho_node1 FF) v)), ITER n (rho_node1 FF) v IN fv ` MP_TAC;
5232 EXPAND_TAC "fv";
5233 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5234 DISJ2_TAC;
5235 EXISTS_TAC` n - 1 `;
5236 ASSUME_TAC2 (ARITH_RULE` ~( n = 0) ==> n - 1 + 1 = n `);
5237 ASM_REWRITE_TAC[];
5238 NHANH (ARITH_RULE` m < n ==> m < n + 1 `);
5239 FIRST_ASSUM NHANH;
5240 SIMP_TAC[];
5241 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
5242 REWRITE_TAC[PAIR_EQ];
5243 EXPAND_TAC "n";
5244 ONCE_REWRITE_TAC[ADD_SYM];
5245 REWRITE_TAC[GSYM ITER_ADD; Lvducxu.ITER12];
5246 FIRST_ASSUM (ASSUME_TAC o (SPEC` n - 1 `));
5247 ASSUME_TAC2 (
5248 SPEC` ITER (n - 1) (rho_node1 FF) v ` (GEN`v: real^3 ` Local_lemmas.IVS_RHO_IDD));
5249 ONCE_REWRITE_TAC[ADD_SYM];
5250 ASM_REWRITE_TAC[];
5251
5252 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w:real^3}}) fv,fv) `;
5253 PHA;
5254 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5255 STRIP_TAC;
5256 UNDISCH_TAC` azim_in_fan
5257       (ITER n (rho_node1 FF) v,rho_node1 fv (ITER n (rho_node1 FF) v))
5258       (e_prime  (E UNION {{v, w}}) fv) =
5259       azim (vec 0) (ITER n (rho_node1 FF) v)
5260       (rho_node1 fv (ITER n (rho_node1 FF) v))
5261       (ivs_rho_node1 fv (ITER n (rho_node1 FF) v)) `;
5262 ASM_REWRITE_TAC[];
5263 SIMP_TAC[];
5264
5265 STRIP_TAC;
5266 ASSUME_TAC2 LOCAL_FAN_ORBIT_MAP_VITERFF;
5267 FIRST_ASSUM (MP_TAC o (SPEC` n:num `));
5268 UNDISCH_TAC` !x. (x:real^3#real^3) IN FF ==> azim_in_fan x E <= pi /\ V SUBSET wedge_in_fan_ge x E`;
5269 STRIP_TAC;
5270 FIRST_ASSUM NHANH;
5271 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
5272 STRIP_TAC;
5273 FIRST_ASSUM (MP_TAC o (SPEC` n:num `));
5274 UNDISCH_TAC` local_fan (V,E,FF) `;
5275 PHA;
5276 NHANH AZIM_IN_FAN_RHOND_IVS_RHOND;
5277 REWRITE_TAC[GSYM ITER; ADD1];
5278 STRIP_TAC;
5279 FIRST_X_ASSUM (ASSUME_TAC o SYM);
5280 UNDISCH_TAC` azim_in_fan (ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v) E <= pi `;
5281 ASM_REWRITE_TAC[];
5282 SIMP_TAC[];
5283 STRIP_TAC;
5284 MP_TAC POINTS_IN_HAFL_CIRCLE;
5285 ANTS_TAC;
5286 ASM_REWRITE_TAC[];
5287 DISCH_THEN (ASSUME_TAC o SYM);
5288 SUBGOAL_THEN ` ITER n (rho_node1 FF) v IN v_prime V (fv:real^3#real^3 -> bool) ` MP_TAC;
5289 FIRST_X_ASSUM (SUBST1_TAC o SYM);
5290 REWRITE_TAC[IN_ELIM_THM];
5291 EXISTS_TAC` n:num `;
5292 ASM_REWRITE_TAC[];
5293 UNDISCH_TAC` !m. m < n + 1 ==> ~(ITER m (rho_node1 FF) v = w) `;
5294 MESON_TAC[ARITH_RULE` m < n ==> m < n + 1 `];
5295 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v:real^3, w}}) fv,fv) `;
5296 PHA;
5297 NHANH WEDGE_IN_FAN_RHOND_IVS_RHOND;
5298 ASM_SIMP_TAC[];
5299 STRIP_TAC;
5300 ASSUME_TAC2 (SPEC` ITER n (rho_node1 FF) v ` (GEN`v:real^3 ` WEDGE_IN_FAN_RHOND_IVS_RHOND));
5301 FIRST_X_ASSUM (MP_TAC o SYM);
5302
5303
5304 ASM_REWRITE_TAC[GSYM ITER; ADD1];
5305 SIMP_TAC[];
5306 STRIP_TAC;
5307 MATCH_MP_TAC SUBSET_TRANS;
5308 EXISTS_TAC` V:real^3 -> bool` ;
5309 ASM_REWRITE_TAC[];
5310 UNDISCH_TAC` V SUBSET
5311       wedge_in_fan_ge  (ITER n (rho_node1 FF) v,ITER (n + 1) (rho_node1 FF) v)
5312       E `;
5313 ASM_REWRITE_TAC[];
5314 SIMP_TAC[];
5315
5316 UNDISCH_TAC` {ITER n (rho_node1 FF) v | n | !m. m < n
5317                                          ==> ~(ITER m (rho_node1 FF) v = w)} =
5318       v_prime V (fv:real^3#real^3 -> bool) `;
5319 DISCH_THEN (SUBST1_TAC o SYM);
5320 REWRITE_TAC[SUBSET; IN_ELIM_THM];
5321 REPEAT STRIP_TAC;
5322 ASM_REWRITE_TAC[]]);;
5323
5324
5325
5326
5327
5328 let COVEX_OF_LOFA_HALF_CIRCLE2 = prove(
5329 ` convex_local_fan (V,E,FF) /\
5330      (local_fan (V,E,FF) /\
5331       v IN V /\
5332       w IN V /\
5333       ~(v = w) /\
5334       (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5335       (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5336      HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5337      fv = face HS (v,rho_node1 FF v) /\
5338 fw = face HS (w, rho_node1 FF w)
5339      ==> convex_local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) /\
5340 convex_local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw)`,
5341 STRIP_TAC THEN CONJ_TAC THENL [MATCH_MP_TAC COVEX_OF_LOFA_HALF_CIRCLE THEN 
5342 ASM_REWRITE_TAC[]; MATCH_MP_TAC COVEX_OF_LOFA_HALF_CIRCLE THEN DOWN_TAC THEN
5343 SIMP_TAC[INSERT_COMM]]);;
5344
5345
5346 (* ======================================================================== *)
5347
5348
5349 let CARD_V_TWO_HAFL_CIRCLE = prove_by_refinement
5350 (` local_fan (V,E,FF) /\ v IN V /\ w IN V /\
5351 ~ (v = w) /\
5352 ITER n (rho_node1 FF) v = w /\
5353 ITER n' (rho_node1 FF) w = v /\
5354 n < CARD V /\ n' < CARD V 
5355 ==> n + n' = CARD V `,
5356 [STRIP_TAC;
5357 MP_TAC (SPEC` w:real^3 ` (GEN` v: real^3 ` Local_lemmas.LOFA_IMP_DIS_ELMS23));
5358 ANTS_TAC;
5359 ASM_REWRITE_TAC[];
5360 STRIP_TAC;
5361 UNDISCH_TAC` ITER n (rho_node1 FF) v = w `;
5362 EXPAND_TAC "v";
5363 REWRITE_TAC[ITER_ADD];
5364 ASM_CASES_TAC` n + n': num = 0 `;
5365 DOWN;
5366 REWRITE_TAC[ADD_EQ_0];
5367 STRIP_TAC;
5368 FIRST_X_ASSUM SUBST_ALL_TAC;
5369 DOWN_TAC;
5370 REWRITE_TAC[ITER];
5371 MESON_TAC[];
5372 STRIP_TAC;
5373 ASSUME_TAC2 (SPECL [` w:real^3 `;` n + n':num` ] (GENL [` v:real^3 `;` n: num `]
5374  CARD_IS_LEAST_CYCLE));
5375 ASM_CASES_TAC` CARD (V:real^3 -> bool) = n + n' `;
5376 ASM_REWRITE_TAC[];
5377 FIRST_X_ASSUM (MP_TAC o (SPECL [` 0`;` (n + n') - CARD (V:real^3 -> bool) `]));
5378 ANTS_TAC;
5379 DOWN THEN DOWN;
5380 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
5381 UNDISCH_TAC` n' < CARD (V:real^3 -> bool) `;
5382 PHA THEN ARITH_TAC;
5383 ASM_REWRITE_TAC[ITER];
5384 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
5385 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ORBIT_MAP_VITER;
5386 FIRST_X_ASSUM (ASSUME_TAC2 o (SPECL [` w:real^3 `;` (n + n') - CARD (V:real^3 -> bool) `]));
5387 DOWN;
5388 FIRST_X_ASSUM NHANH;
5389 REWRITE_TAC[ITER_ADD];
5390 ASSUME_TAC2 (ARITH_RULE` CARD (V:real^3 -> bool) <= n + n' ==> CARD V + (n + n') - CARD V = n + n'`);
5391 ASM_REWRITE_TAC[];
5392 MESON_TAC[]]);;
5393
5394
5395
5396
5397
5398
5399 let DIFFERENCE_IMP_LT_CARDV = prove_by_refinement
5400 (` local_fan (V,E,FF) /\ v IN V /\ w IN V /\
5401 (! n. n < m ==> ~(ITER n (rho_node1 FF) v = w))
5402 ==> m < CARD V `,
5403 [STRIP_TAC;
5404 ASM_CASES_TAC` m < CARD (V:real^3 -> bool) `;
5405 FIRST_ASSUM ACCEPT_TAC;
5406 ASSUME_TAC2 Local_lemmas.LOFA_IMP_LT_CARD_SET_V;
5407 UNDISCH_TAC` (w:real^3) IN V `;
5408 EXPAND_TAC "V";
5409 REWRITE_TAC[IN_ELIM_THM];
5410 STRIP_TAC;
5411 ASM_REWRITE_TAC[];
5412 DOWN;
5413 REWRITE_TAC[];
5414 ONCE_REWRITE_TAC[EQ_SYM_EQ];
5415 FIRST_X_ASSUM MATCH_MP_TAC;
5416 DOWN;
5417 UNDISCH_TAC` ~(m < CARD (V:real^3 -> bool)) `;
5418 ARITH_TAC]);;
5419
5420
5421
5422
5423
5424 let LT_CARD_MONO_LOFA = prove(`local_fan (V,E,FF) /\ v IN V 
5425 ==> (! i j. i < CARD V /\ j < CARD V /\
5426 ITER i (rho_node1 FF) v = ITER j (rho_node1 FF) v 
5427 ==> i = j )`,
5428 NHANH Local_lemmas.LOFA_IMP_DIS_ELMS23 THEN REPEAT STRIP_TAC THEN 
5429 ASM_CASES_TAC` i = (j:num) ` THENL [FIRST_X_ASSUM ACCEPT_TAC; DOWN] THEN 
5430 REWRITE_TAC[ARITH_RULE` ~( a = (b:num)) <=> a < b \/ b < a `] THEN 
5431 DOWN_TAC THEN PHA THEN MESON_TAC[]);;
5432
5433
5434
5435
5436
5437 let CONDS_IN_V_PRIME_NUM = prove_by_refinement
5438 (` (local_fan (V,E,FF) /\
5439         v IN V /\
5440         w IN V /\
5441         ~(v = w) /\
5442         (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5443         (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5444        HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5445        fv = face HS (v,rho_node1 FF v)
5446 ==> n < CARD V /\ 
5447 ITER n (rho_node1 FF) v = w
5448 ==> ! i. i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fv <=> i < n + 1 `,
5449 [NHANH POINTS_IN_HAFL_CIRCLE;
5450 STRIP_TAC THEN STRIP_TAC;
5451 GEN_TAC;
5452 EQ_TAC;
5453 ASM_REWRITE_TAC[IN_ELIM_THM];
5454 STRIP_TAC;
5455 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
5456 ASSUME_TAC2 (SPECL [` n': num `] (GENL [` m:num `] DIFFERENCE_IMP_LT_CARDV));
5457 ASSUME_TAC2 LT_CARD_MONO_LOFA;
5458 FIRST_X_ASSUM (MP_TAC o (SPECL [`i:num `;` n': num `]));
5459 PHA;
5460 ANTS_TAC;
5461 ASM_REWRITE_TAC[];
5462 DISCH_THEN (SUBST_ALL_TAC o SYM);
5463 ASM_CASES_TAC` i < n + 1 `;
5464 FIRST_X_ASSUM ACCEPT_TAC;
5465 ASSUME_TAC2 (ARITH_RULE` ~(i < n + 1) ==> n < i `);
5466 DOWN;
5467 FIRST_X_ASSUM NHANH;
5468 ASM_REWRITE_TAC[];
5469
5470 STRIP_TAC;
5471 CONJ_TAC;
5472 REPLICATE_TAC 3 DOWN THEN PHA;
5473 ARITH_TAC;
5474 ASM_REWRITE_TAC[IN_ELIM_THM];
5475 EXISTS_TAC`i: num `;
5476 REWRITE_TAC[];
5477 REPEAT STRIP_TAC;
5478 ASSUME_TAC2 (ARITH_RULE`  i < n + 1 /\ m < i ==> m < n `);
5479 MP_TAC Local_lemmas.LOFA_IMP_DIS_ELMS23;
5480 ANTS_TAC;
5481 ASM_REWRITE_TAC[];
5482 ASM_MESON_TAC[]]);;
5483
5484
5485
5486 let LOFA_IMP_ITER_RHO_NODE_ID2 = MESON[
5487 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID]`
5488 local_fan (V,E,FF) /\ v IN V ==> ITER (CARD V) (rho_node1 FF) v = v`;;
5489
5490
5491
5492
5493
5494 let CONDS_IN_V_PRIME_NUM2 = prove_by_refinement
5495 (`(local_fan (V,E,FF) /\
5496         v IN V /\
5497         w IN V /\
5498         ~(v = w) /\
5499         (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5500         (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5501        HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5502        fw = face HS (w,rho_node1 FF w)
5503        ==> n < CARD V /\ ITER n (rho_node1 FF) v = w
5504        ==> (!i. i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fw <=>
5505                i = 0 \/ n <= i /\ i < CARD V )`,
5506 [STRIP_TAC;
5507 ASSUME_TAC2 (SPECL [` w:real^3 `;` v:real^3 `] (GENL [`v:real^3 `;` w:real^3 `] POINT_PRESENTED_IN_RHOND1));
5508 DOWN THEN STRIP_TAC;
5509
5510
5511 MP_TAC (SPECL [` w:real^3 `;` v:real^3 `; ` fw: real^3#real^3 -> bool`;` n': num `]  (GENL [` v: real^3`;` w:real^3 `;` fv: real^3#real^3 -> bool`; `n:num `] CONDS_IN_V_PRIME_NUM));
5512 ANTS_TAC;
5513 DOWN_TAC;
5514 SIMP_TAC[INSERT_COMM];
5515 ANTS_TAC;
5516 ASM_REWRITE_TAC[];
5517 STRIP_TAC;
5518 STRIP_TAC;
5519 GEN_TAC;
5520 UNDISCH_TAC` !i. i < CARD (V:real^3 -> bool) /\ ITER i (rho_node1 FF) w IN v_prime V (fw:real^3 # real^3 -> bool) <=>
5521           i < n' + 1 `;
5522 EXPAND_TAC "w";
5523 REWRITE_TAC[ITER_ADD];
5524 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
5525 ASM_CASES_TAC` i = 0 `;
5526 UNDISCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v:real^3, w}}))`;
5527 DISCH_THEN (ASSUME_TAC o SYM);
5528 UNDISCH_TAC` fw = face HS (w,rho_node1 FF w) `;
5529 DISCH_THEN (ASSUME_TAC o SYM);
5530 ASM_REWRITE_TAC[ITER];
5531
5532 STRIP_TAC;
5533 ASSUME_TAC2 Local_lemmas.LOFA_IMP_ITER_RHO_NODE_ID;
5534 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
5535 EXPAND_TAC "v";
5536 UNDISCH_TAC` n + n' = CARD (V:real^3 -> bool) `;
5537 DISCH_THEN (ASSUME_TAC o SYM);
5538 FIRST_ASSUM SUBST1_TAC;
5539 ONCE_REWRITE_TAC[ADD_SYM];
5540
5541 CONJ_TAC;
5542 DOWN;
5543 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
5544 ARITH_TAC;
5545
5546
5547 UNDISCH_TAC` n' < CARD (V:real^3 -> bool) `;
5548 UNDISCH_TAC` !i. i < CARD V /\ ITER (i + n) (rho_node1 FF) v IN v_prime V
5549  (fw:real^3#real^3 -> bool) <=>  i < n' + 1 `;
5550 MP_TAC (ARITH_RULE` n' < n' + 1 `);
5551 MESON_TAC[];
5552
5553
5554
5555 ASM_CASES_TAC` i < CARD (V:real^3 -> bool) `;
5556 UNDISCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v:real^3, w}}))`;
5557 DISCH_THEN (ASSUME_TAC o SYM);
5558 UNDISCH_TAC` fw = face HS (w,rho_node1 FF w) `;
5559 DISCH_THEN (ASSUME_TAC o SYM);
5560 ASM_REWRITE_TAC[];
5561
5562 STRIP_TAC;
5563
5564 MP_TAC (SPECL [`w:real^3 `;` v:real^3 `;` fw: real^3 #real^3 -> bool`]
5565  ( GENL [`v:real^3 `;` w:real^3 `;` fv: real^3 #real^3 -> bool` ] POINTS_IN_HAFL_CIRCLE));
5566 ANTS_TAC;
5567 DOWN_TAC;
5568 SIMP_TAC[INSERT_COMM];
5569 DISCH_THEN (ASSUME_TAC o SYM);
5570
5571
5572
5573
5574 ASM_REWRITE_TAC[];
5575 ASM_CASES_TAC` n <= (i:num) `;
5576 ASM_REWRITE_TAC[];
5577 ASSUME_TAC2 (ARITH_RULE` n <= (i:num) ==> i = (i - n) + n `);
5578 ABBREV_TAC` nn = i - (n:num) `;
5579
5580 SUBGOAL_THEN` nn + n < n + (n':num) ` MP_TAC;
5581 ASM_REWRITE_TAC[];
5582 DOWN;
5583 FIRST_X_ASSUM (SUBST1_TAC o SYM);
5584 ASM_REWRITE_TAC[];
5585
5586 NHANH (ARITH_RULE` a + b < b + (c:num) ==> a < c + 1 `);
5587 UNDISCH_TAC` !i. i < CARD V /\ ITER (i + n) (rho_node1 FF) v IN v_prime V 
5588 (fw:real^3 #real^3 -> bool) <=> i < n' + 1`;
5589 DISCH_THEN (fun x -> REWRITE_TAC[GSYM x]);
5590 ASM_REWRITE_TAC[];
5591 SIMP_TAC[];
5592
5593 ASM_REWRITE_TAC[];
5594 ASSUME_TAC2 (ARITH_RULE` ~(i = 0) ==> ~( i + n' < n' + 1 ) `);
5595 DOWN;
5596 UNDISCH_TAC` !i. i < CARD V /\ ITER (i + n) (rho_node1 FF) v IN v_prime V 
5597 (fw:real^3 #real^3 -> bool) <=> i < n' + 1`;
5598 DISCH_THEN (fun x -> REWRITE_TAC[GSYM x]);
5599 SUBGOAL_THEN` i + n' < n + (n':num) ` MP_TAC;
5600 DOWN THEN ARITH_TAC;
5601 ASM_SIMP_TAC[];
5602
5603 ASM_SIMP_TAC[ARITH_RULE` (a + b) + (c:num) = a + c + b `];
5604 REWRITE_TAC[GSYM ITER_ADD];
5605 ASSUME_TAC2 LOFA_IMP_ITER_RHO_NODE_ID2;
5606 ASM_SIMP_TAC[];
5607 ASM_REWRITE_TAC[]]);;
5608
5609
5610
5611
5612
5613 let DETERMINE_FV2 = prove_by_refinement
5614 (`(local_fan (V,E,FF) /\
5615       v IN V /\
5616       w IN V /\
5617       ~(v = w) /\
5618       (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5619       (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5620      HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5621      fv = face HS (v,rho_node1 FF v)
5622      ==> n < CARD V /\ ITER n (rho_node1 FF) v = w 
5623 ==> fv =
5624          (w,v) INSERT
5625          {ITER m (rho_node1 FF) v,ITER (m + 1) (rho_node1 FF) v | m | 
5626          m < n} `,
5627 [NHANH DETERMINE_FV;
5628 SIMP_TAC[];
5629 REPEAT STRIP_TAC;
5630 MATCH_MP_TAC (SET_RULE` X = Y ==> a INSERT X = a INSERT Y `);
5631 REWRITE_TAC[EXTENSION; IN_ELIM_THM];
5632 GEN_TAC;
5633 EQ_TAC;
5634 STRIP_TAC;
5635 EXISTS_TAC` n':num`;
5636 ASM_REWRITE_TAC[];
5637 ASM_CASES_TAC` n' < (n:num) `;
5638 FIRST_ASSUM ACCEPT_TAC;
5639 ASSUME_TAC2 (ARITH_RULE` ~(n' < (n:num)) ==> n < n' + 1 `);
5640 DOWN;
5641 FIRST_X_ASSUM NHANH;
5642 ASM_REWRITE_TAC[];
5643
5644 STRIP_TAC;
5645 EXISTS_TAC` m:num`;
5646 ASM_REWRITE_TAC[];
5647 GEN_TAC;
5648 STRIP_TAC;
5649
5650 ASSUME_TAC2 Local_lemmas.LOFA_IMP_DIS_ELMS23;
5651 FIRST_X_ASSUM (MP_TAC o (SPECL [`m': num `;` n:num`]));
5652 PHA;
5653 ANTS_TAC;
5654 ASM_REWRITE_TAC[];
5655 DOWN;
5656 UNDISCH_TAC` m < n:num`;
5657 ARITH_TAC;
5658 ASM_SIMP_TAC[]]);;
5659
5660
5661
5662
5663
5664
5665
5666 let INTERIOR_ANGLE_LEM_SLICING_FAN = prove_by_refinement
5667 (`convex_local_fan (V,E,FF) /\
5668 (local_fan (V,E,FF) /\
5669         v IN V /\
5670         w IN V /\
5671         ~(v = w) /\
5672         (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5673         (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5674        HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5675        fv = face HS (v,rho_node1 FF v) /\
5676        fw = face HS (w,rho_node1 FF w)
5677 ==> interior_angle1 (vec 0) fv v + interior_angle1 (vec 0) fw v = interior_angle1 (vec 0) FF v `,
5678
5679
5680 [REWRITE_TAC[convex_local_fan]  THEN 
5681 STRIP_TAC THEN ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1 THEN 
5682 DOWN THEN STRIP_TAC THEN MP_TAC DETERMINE_FV2 THEN PHA THEN 
5683 ANTS_TAC THENL [ASM_REWRITE_TAC[]; DISCH_THEN (ASSUME_TAC o SYM)] THEN 
5684 ASSUME_TAC2 (SPECL [` w:real^3 `;` v:real^3 `] (GENL [` v:real^3 `;` w:real^3 `] POINT_PRESENTED_IN_RHOND1)) THEN DOWN THEN STRIP_TAC THEN 
5685
5686 MP_TAC (SPECL [` w:real^3`;` v:real^3 `;`n': num`;` fw: real^3 #real^3 -> bool`]
5687 (GENL [` v:real^3`;` w:real^3 `;`n: num`;` fv: real^3 #real^3 -> bool`] DETERMINE_FV2)) THEN 
5688 PHA THEN 
5689 ANTS_TAC THENL [ASM_REWRITE_TAC[INSERT_COMM] THEN 
5690 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z:real^3, t} ` THEN 
5691 DISCH_THEN NHANH THEN 
5692 SIMP_TAC[INSERT_COMM];
5693
5694 DISCH_THEN (ASSUME_TAC o SYM)] THEN 
5695 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1] THEN 
5696 MP_TAC2 HAFL_CIRCLE_FORM_LOCAL_FAN2 THEN 
5697 STRIP_TAC;
5698 SUBGOAL_THEN ` v, rho_node1 FF v IN fv /\ (w,v) IN fv ` MP_TAC;
5699
5700 EXPAND_TAC "fv" THEN 
5701 REWRITE_TAC[IN_INSERT; IN_ELIM_THM] THEN 
5702 DISJ2_TAC THEN 
5703 EXISTS_TAC` 0` THEN 
5704 REWRITE_TAC[ITER; GSYM ADD1] THEN 
5705
5706 ASM_CASES_TAC` 0 < n ` THENL [FIRST_X_ASSUM ACCEPT_TAC; DOWN] THEN 
5707 REWRITE_TAC[ARITH_RULE` ~( 0 < n) <=> n = 0 `] THEN 
5708 DISCH_THEN SUBST_ALL_TAC THEN 
5709 UNDISCH_TAC` ITER 0 (rho_node1 FF) v = w ` THEN 
5710 ASM_REWRITE_TAC[ITER];
5711 STRIP_TAC;
5712 DOWN;
5713 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w}}) fv,fv) `;
5714 PHA;
5715 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5716 STRIP_TAC;
5717 UNDISCH_TAC` v,rho_node1 FF v IN fv `;
5718 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w}}) fv,fv) `;
5719 PHA;
5720 NHANH Local_lemmas.DETER_RHO_NODE;
5721 STRIP_TAC;
5722 UNDISCH_TAC` fw = face HS (w,rho_node1 FF w) `;
5723 DISCH_THEN (ASSUME_TAC o SYM);
5724 UNDISCH_TAC` fv = face HS (v,rho_node1 FF v) `;
5725 DISCH_THEN (ASSUME_TAC o SYM);
5726 ASM_REWRITE_TAC[];
5727
5728
5729
5730
5731 SUBGOAL_THEN` (v,w) IN fw /\ ivs_rho_node1 FF v, v IN fw ` MP_TAC;
5732 UNDISCH_TAC`(v,w) INSERT
5733       {ITER m (rho_node1 FF) w,ITER (m + 1) (rho_node1 FF) w | m < n'} =
5734       fw `; 
5735 STRIP_TAC;
5736 ASM_REWRITE_TAC[];
5737 EXPAND_TAC "fw";
5738 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5739 DISJ2_TAC;
5740 EXISTS_TAC` n' - 1 `;
5741 ASM_CASES_TAC` n' = 0`;
5742 FIRST_X_ASSUM SUBST_ALL_TAC;
5743 UNDISCH_TAC` ITER 0 (rho_node1 FF) w = v `;
5744 ASM_REWRITE_TAC[ITER];
5745 ASSUME_TAC2 (ARITH_RULE` ~(n' = 0) ==> n' - 1 < n' /\ n' - 1 + 1 = n' `);
5746 ASM_REWRITE_TAC[PAIR_EQ]; 
5747 UNDISCH_TAC` ITER n (rho_node1 FF) v = w`;
5748 STRIP_TAC;
5749 EXPAND_TAC "w";
5750 REWRITE_TAC[ITER_ADD];
5751 ASSUME_TAC2 (ARITH_RULE` ~( n' = 0) ==> n' - 1 + n = (n + n') - 1`);
5752 ASM_REWRITE_TAC[];
5753 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
5754 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3 `));
5755 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
5756 ASM_REWRITE_TAC[];
5757
5758
5759 STRIP_TAC;
5760 DOWN;
5761 UNDISCH_TAC` local_fan (v_prime V fw,e_prime  (E UNION {{w, v}}) fw,fw) `;
5762 PHA;
5763 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5764 STRIP_TAC;
5765 UNDISCH_TAC` (v:real^3,w:real^3) IN fw`;
5766 UNDISCH_TAC` local_fan (v_prime V fw,e_prime  (E UNION {{w, v}}) fw,fw) `;
5767 PHA;
5768 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5769 NHANH Local_lemmas.DETER_RHO_NODE;
5770 STRIP_TAC;
5771 ASM_REWRITE_TAC[];
5772
5773 ASSUME_TAC2 WEDGE_IN_FAN_RHOND_IVS_RHOND;
5774 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
5775 DOWN THEN STRIP_TAC;
5776 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`v:real^3 `));
5777 DOWN;
5778 UNDISCH_TAC` !x. x IN FF ==> azim_in_fan (x:real^3#real^3) E <= pi /\ V SUBSET wedge_in_fan_ge x E`;
5779 DISCH_THEN NHANH;
5780 ASM_REWRITE_TAC[SUBSET];
5781 STRIP_TAC;
5782 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
5783 DOWN;
5784 REWRITE_TAC[wedge_ge; IN_ELIM_THM];
5785 STRIP_TAC;
5786 SUBGOAL_THEN` ~ collinear {vec 0, v, w} /\ ~ collinear {vec 0, v, ivs_rho_node1 FF v} /\ ~ collinear {vec 0, v, rho_node1 FF v} ` MP_TAC;
5787 CONJ_TAC;
5788 FIRST_X_ASSUM MATCH_MP_TAC;
5789 ASM_REWRITE_TAC[IN_INSERT; IN_DIFF; NOT_IN_EMPTY];
5790 ASSUME_TAC2 (SPEC` v:real^3 ` Local_lemmas.LOFA_IMP_NOT_COLL_IVS);
5791 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
5792 ASM_REWRITE_TAC[];
5793 DOWN THEN PHA;
5794 NHANH Fan.sum4_azim_fan;
5795 SIMP_TAC[]]);;
5796
5797
5798
5799 let INTERIOR_ANGLE_LEM_SLICING_FAN2 = prove_by_refinement
5800 (`convex_local_fan (V,E,FF) /\
5801 (local_fan (V,E,FF) /\
5802         v IN V /\
5803         w IN V /\
5804         ~(v = w) /\
5805         (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5806         (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5807        HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5808        fv = face HS (v,rho_node1 FF v) /\
5809        fw = face HS (w,rho_node1 FF w)
5810 ==> interior_angle1 (vec 0) fv v + interior_angle1 (vec 0) fw v = interior_angle1 (vec 0) FF v /\
5811 interior_angle1 (vec 0) fw w + interior_angle1 (vec 0) fv w = interior_angle1 (vec 0) FF w`,
5812 [NHANH INTERIOR_ANGLE_LEM_SLICING_FAN;
5813 STRIP_TAC;
5814 CONJ_TAC;
5815 FIRST_X_ASSUM ACCEPT_TAC;
5816 MATCH_MP_TAC (GENL [`w:real^3`] INTERIOR_ANGLE_LEM_SLICING_FAN);
5817 EXISTS_TAC` v:real^3 `;
5818 ASM_REWRITE_TAC[INSERT_COMM];
5819 FIRST_X_ASSUM NHANH;
5820 FIRST_X_ASSUM NHANH;
5821 SIMP_TAC[INSERT_COMM]]);;
5822
5823
5824
5825
5826 let INTERIOR_AGL_EQ = prove_by_refinement
5827 (`(local_fan (V,E,FF) /\
5828         v IN V /\
5829         w IN V /\
5830         ~(v = w) /\
5831         (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5832         (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5833        HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5834        fv = face HS (v,rho_node1 FF v)
5835        ==> n < CARD V /\ ITER n (rho_node1 FF) v = w
5836 ==> ! i. 0 < i /\ i < n 
5837          ==> interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)
5838            = interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v) `,
5839 [REPEAT STRIP_TAC;
5840 MP_TAC DETERMINE_FV2;
5841 PHA;
5842 ANTS_TAC;
5843 ASM_REWRITE_TAC[];
5844 DISCH_THEN (ASSUME_TAC o SYM);
5845 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1];
5846 SUBGOAL_THEN` ITER i (rho_node1 FF) v, rho_node1 FF (ITER i (rho_node1 FF) v) IN fv ` MP_TAC;
5847 EXPAND_TAC "fv";
5848 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5849 DISJ2_TAC;
5850 EXISTS_TAC` i:num`;
5851 ASM_REWRITE_TAC[ITER; GSYM ADD1];
5852 MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN;
5853 ANTS_TAC;
5854 ASM_REWRITE_TAC[];
5855 PHA;
5856 NHANH Local_lemmas.DETER_RHO_NODE;
5857 SIMP_TAC[];
5858 STRIP_TAC;
5859
5860 SUBGOAL_THEN` ivs_rho_node1 FF (ITER i (rho_node1 FF) v), ITER i (rho_node1 FF) v IN fv ` MP_TAC;
5861 EXPAND_TAC "fv";
5862 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
5863 DISJ2_TAC;
5864 EXISTS_TAC` i - 1 `;
5865 ABBREV_TAC ` i' = i - 1 `;
5866 ASSUME_TAC2 (ARITH_RULE` 0 < i ==> i = i - 1 + 1 `);
5867 DOWN;
5868 ASM_REWRITE_TAC[];
5869 SIMP_TAC[GSYM ADD1; ITER; PAIR_EQ];
5870 STRIP_TAC;
5871 CONJ_TAC;
5872 UNDISCH_TAC` i < (n:num) `;
5873 DOWN;
5874 ARITH_TAC;
5875 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
5876 FIRST_X_ASSUM (MP_TAC o (SPEC` i': num`));
5877 UNDISCH_TAC` local_fan (V,E,FF)`;
5878 PHA;
5879 NHANH Local_lemmas.IVS_RHO_IDD;
5880 SIMP_TAC[];
5881 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w}}) fv,fv) `;
5882 PHA;
5883 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
5884 SIMP_TAC[]]);;
5885
5886
5887
5888
5889
5890 let SUM_INTERIOR_AGL_LEMMA = prove_by_refinement
5891 (`convex_local_fan (V,E,FF) /\
5892      (local_fan (V,E,FF) /\
5893       v IN V /\
5894       w IN V /\
5895       ~(v = w) /\
5896       (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
5897       (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
5898      HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
5899      fv = face HS (v,rho_node1 FF v) /\
5900 fw = face HS (w, rho_node1 FF w)
5901 ==> ! ff. sum {i | i < CARD V } (\i. (ff i) * (interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v))) = 
5902 sum { i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fv} (\i. ff i * interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)) +
5903 sum { i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fw} (\i. ff i * interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)) `,
5904 [STRIP_TAC;
5905 GEN_TAC;
5906 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
5907 DOWN THEN STRIP_TAC;
5908 MP_TAC POINTS_IN_HAFL_CIRCLE;
5909 ANTS_TAC;
5910 ASM_REWRITE_TAC[];
5911 ASSUME_TAC2 (SPECL [`w:real^3 `;` v:real^3` ] (GENL [` v:real^3 `;` w:real^3 `]
5912  POINT_PRESENTED_IN_RHOND1));
5913 DOWN THEN STRIP_TAC;
5914 STRIP_TAC;
5915
5916 MP_TAC (SPECL [` w:real^3 `;` v:real^3`;` fw:real^3#real^3 -> bool` ] (GENL 
5917 [` v:real^3 `;` w:real^3 `; `fv:real^3#real^3 -> bool`] POINTS_IN_HAFL_CIRCLE));
5918 ANTS_TAC;
5919 ASM_REWRITE_TAC[INSERT_COMM];
5920 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t:real^3}`;
5921 DISCH_THEN NHANH;
5922 SIMP_TAC[INSERT_COMM];
5923 STRIP_TAC;
5924
5925 MP_TAC CONDS_IN_V_PRIME_NUM;
5926 ANTS_TAC;
5927 ASM_REWRITE_TAC[];
5928 ANTS_TAC;
5929 ASM_REWRITE_TAC[];
5930 SIMP_TAC[];
5931
5932 STRIP_TAC;
5933
5934 MP_TAC CONDS_IN_V_PRIME_NUM2;
5935 PHA;
5936 ANTS_TAC;
5937 ASM_REWRITE_TAC[];
5938 SIMP_TAC[];
5939
5940 STRIP_TAC;
5941
5942 SUBGOAL_THEN` {i | i < n + 1} = {i | 0 < i /\ i < n} UNION {0, n} ` MP_TAC;
5943 REWRITE_TAC[EXTENSION];
5944 REWRITE_TAC[IN_UNION; IN_INSERT; NOT_IN_EMPTY; IN_ELIM_THM];
5945 GEN_TAC;
5946 ARITH_TAC;
5947 SIMP_TAC[];
5948 STRIP_TAC;
5949
5950 SUBGOAL_THEN` {i | i = 0 \/ n <= i /\ i < CARD V} = {i | n < i /\ i < CARD (V:real^3 -> bool) }
5951 UNION {0, n} ` MP_TAC;
5952 REWRITE_TAC[EXTENSION; IN_UNION; IN_INSERT; NOT_IN_EMPTY; IN_ELIM_THM];
5953 GEN_TAC;
5954 SIMP_TAC[ARITH_RULE` (n:num) <= x <=> n < x \/ x = n `];
5955 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
5956 MESON_TAC[];
5957
5958 SIMP_TAC[];
5959 STRIP_TAC;
5960 MP_TAC (SPEC` n + 1 ` FINITE_NUMSEG_LT);
5961 ASM_REWRITE_TAC[];
5962 UNDISCH_TAC` fv = face HS (v,rho_node1 FF v) `;
5963 UNDISCH_TAC` fw = face HS (w,rho_node1 FF w) `;
5964 DISCH_THEN (ASSUME_TAC o SYM);
5965 DISCH_THEN (ASSUME_TAC o SYM);
5966 ASM_REWRITE_TAC[FINITE_UNION];
5967 SUBGOAL_THEN` {i | n < i /\ i < CARD (V:real^3 -> bool)} =
5968 {i | n < i } INTER {i | i < CARD V} ` MP_TAC;
5969 SET_TAC[];
5970 STRIP_TAC;
5971 SUBGOAL_THEN` FINITE {i | n < i /\ i < CARD (V:real^3 -> bool)}` MP_TAC;
5972 ASM_REWRITE_TAC[];
5973
5974 MATCH_MP_TAC FINITE_INTER;
5975 DISJ2_TAC;
5976 REWRITE_TAC[FINITE_NUMSEG_LT];
5977 DISCH_TAC;
5978 STRIP_TAC;
5979 SUBGOAL_THEN` DISJOINT {m | 0 < m /\ m < n } {0, n} ` ASSUME_TAC;
5980 REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_INSERT; IN_ELIM_THM];
5981 GEN_TAC;
5982 ARITH_TAC;
5983
5984 SUBGOAL_THEN` DISJOINT {i | n < i /\ i < CARD (V:real^3 -> bool)} {0, n}` ASSUME_TAC;
5985 REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_INSERT; IN_ELIM_THM];
5986 GEN_TAC;
5987 ARITH_TAC;
5988
5989 MP_TAC (ISPECL [` (\i. ff i * interior_angle1 (vec 0) fv (ITER i (rho_node1 FF)
5990  v))  `; `{i | 0 < i /\ i < n} `; ` {0, n} `] SUM_UNION);
5991 ANTS_TAC;
5992 ASM_REWRITE_TAC[];
5993 SIMP_TAC[];
5994
5995 MP_TAC (ISPECL [` (\i. ff i * interior_angle1 (vec 0) fw (ITER i (rho_node1 FF)
5996  v))  `; `{i | n < i /\ i < CARD (V:real^3 -> bool)}`; ` {0, n} `] SUM_UNION);
5997 ANTS_TAC;
5998 ASM_REWRITE_TAC[];
5999 SIMP_TAC[];
6000 STRIP_TAC THEN STRIP_TAC;
6001
6002
6003 SUBGOAL_THEN` sum {i | n < i /\ i < CARD (V:real^3 -> bool)}
6004  (\i. ff i * interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)) =
6005 sum {i | n < i /\ i < CARD V}
6006  (\i. ff i * interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v)) ` MP_TAC;
6007 MATCH_MP_TAC SUM_EQ;
6008 GEN_TAC;
6009 REWRITE_TAC[IN_ELIM_THM];
6010 STRIP_TAC;
6011 REWRITE_TAC[REAL_EQ_MUL_LCANCEL];
6012 DISJ2_TAC;
6013
6014 REWRITE_TAC[Local_lemmas.interior_angle1; GSYM ivs_rho_node1];
6015
6016 MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN2;
6017 ANTS_TAC;
6018 ASM_REWRITE_TAC[];
6019 STRIP_TAC;
6020
6021 MP_TAC (SPECL [` w:real^3 `;` v:real^3 `;` n':num`; `fw:real^3#real^3 -> bool`]
6022 (GENL [` v:real^3`;` w:real^3 `;` n:num`;` fv:real^3#real^3 -> bool`] DETERMINE_FV2));
6023 PHA;
6024 ANTS_TAC;
6025 ASM_REWRITE_TAC[];
6026 DOWN_TAC;
6027 SIMP_TAC[INSERT_COMM];
6028
6029 DISCH_THEN (ASSUME_TAC o SYM);
6030 SUBGOAL_THEN` ITER x (rho_node1 FF) v, rho_node1 FF (ITER x (rho_node1 FF) v) IN fw ` MP_TAC;
6031 EXPAND_TAC "fw";
6032 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
6033 DISJ2_TAC;
6034 EXISTS_TAC`(x:num) - n `;
6035 EXPAND_TAC "w";
6036 REWRITE_TAC[ITER_ADD];
6037 ASSUME_TAC2 (ARITH_RULE` n < (x:num) ==> x - n + n = x `);
6038 ASM_REWRITE_TAC[ARITH_RULE`(x - n + 1) + n = (x - n + n ) + 1 `; GSYM ITER; ADD1];
6039 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
6040 DOWN;
6041 UNDISCH_TAC` x < CARD (V:real^3 -> bool) `;
6042 UNDISCH_TAC` n < x:num `;
6043 ARITH_TAC;
6044 UNDISCH_TAC` local_fan (v_prime V fw,e_prime  (E UNION {{w, v}}) fw,fw) `;
6045 PHA;
6046 NHANH Local_lemmas.DETER_RHO_NODE;
6047 SIMP_TAC[];
6048
6049 STRIP_TAC;
6050 SUBGOAL_THEN` ivs_rho_node1 FF (ITER x (rho_node1 FF) v), ITER x (rho_node1 FF) v IN fw ` MP_TAC;
6051 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
6052 FIRST_X_ASSUM (MP_TAC o (SPEC` x:num`));
6053 ASSUME_TAC2 Local_lemmas.ITER_CARD_MINUS1_EQ_IVS_RN1;
6054 FIRST_X_ASSUM NHANH;
6055 STRIP_TAC;
6056 FIRST_ASSUM (SUBST1_TAC o SYM);
6057 REWRITE_TAC[ITER_ADD];
6058 ASSUME_TAC2 (ARITH_RULE` n < x /\ x < CARD (V:real^3 -> bool) ==> CARD V - 1 + x = x - 1 + CARD V `);
6059 ASM_REWRITE_TAC[];
6060 REWRITE_TAC[GSYM ITER_ADD];
6061 ASSUME_TAC2 LOFA_IMP_ITER_RHO_NODE_ID2;
6062 ASM_REWRITE_TAC[];
6063 EXPAND_TAC "fw";
6064 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
6065 DISJ2_TAC;
6066 EXISTS_TAC` x - ( n + 1) `;
6067 EXPAND_TAC "w";
6068 REWRITE_TAC[ITER_ADD];
6069 ASSUME_TAC2 (ARITH_RULE` n < x ==> x - (n + 1) + n = x - 1 /\ (x - (n + 1) + 1) + n = x`);
6070 ASM_REWRITE_TAC[];
6071 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
6072 DOWN;
6073 UNDISCH_TAC` n < (x:num) `;
6074 UNDISCH_TAC` x < CARD (V:real^3 -> bool) `;
6075 ARITH_TAC;
6076
6077
6078
6079
6080
6081
6082
6083 UNDISCH_TAC` local_fan (v_prime V fw,e_prime  (E UNION {{w, v}}) fw,fw) `;
6084 PHA;
6085 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
6086 SIMP_TAC[];
6087
6088
6089 ASM_REWRITE_TAC[];
6090 UNDISCH_TAC` HS = hypermap (HYP (vec 0,V,E UNION {{v, w:real^3}}))`;
6091 DISCH_THEN (ASSUME_TAC o SYM);
6092 UNDISCH_TAC` {i | n < i /\ i < CARD V} = {i | n < i} INTER {i | i < CARD (V:real^3 -> bool)} `;
6093 DISCH_THEN (ASSUME_TAC o SYM);
6094 ASM_SIMP_TAC[];
6095
6096
6097 SUBGOAL_THEN` sum {i | 0 < i /\ i < n}
6098       (\i. ff i * interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)) =
6099 sum {i | 0 < i /\ i < n}
6100       (\i. ff i * interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v))` MP_TAC;
6101 MATCH_MP_TAC SUM_EQ;
6102 GEN_TAC;
6103 REWRITE_TAC[IN_ELIM_THM];
6104 STRIP_TAC;
6105 REWRITE_TAC[REAL_EQ_MUL_LCANCEL];
6106 DISJ2_TAC;
6107 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1];
6108 MP_TAC HAFL_CIRCLE_FORM_LOCAL_FAN2;
6109 ANTS_TAC;
6110 ASM_REWRITE_TAC[];
6111 STRIP_TAC;
6112
6113 MP_TAC DETERMINE_FV2;
6114 PHA;
6115 ANTS_TAC;
6116 ASM_REWRITE_TAC[];
6117 DISCH_THEN (ASSUME_TAC o SYM);
6118 SUBGOAL_THEN` ITER x (rho_node1 FF) v, rho_node1 FF (ITER x (rho_node1 FF) v) IN fv ` MP_TAC;
6119 EXPAND_TAC "fv";
6120 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
6121 DISJ2_TAC;
6122 EXISTS_TAC`x:num `;
6123 REWRITE_TAC[GSYM ITER; ADD1];
6124 ASM_REWRITE_TAC[];
6125 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w}}) fv,fv) `;
6126 PHA;
6127 NHANH Local_lemmas.DETER_RHO_NODE;
6128 SIMP_TAC[];
6129 STRIP_TAC;
6130 SUBGOAL_THEN` ivs_rho_node1 FF (ITER x (rho_node1 FF) v), ITER x (rho_node1 FF) v IN fv ` MP_TAC;
6131 EXPAND_TAC "fv";
6132 REWRITE_TAC[IN_INSERT; IN_ELIM_THM];
6133 DISJ2_TAC;
6134 EXISTS_TAC` x - 1 `;
6135 ASSUME_TAC2 (ARITH_RULE` 0 < x ==> x - 1 + 1 = x `);
6136 EXPAND_TAC "x";
6137 REWRITE_TAC[ITER; GSYM ADD1];
6138 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_ITER_RHO_NODE_IN_V;
6139 FIRST_X_ASSUM (ASSUME_TAC o (SPEC ` x - 1 `));
6140 ASSUME_TAC2 (SPEC` ITER (x - 1) (rho_node1 FF) v ` (GEN`v: real^3 ` Local_lemmas.IVS_RHO_IDD));
6141 FIRST_X_ASSUM SUBST1_TAC;
6142 ASM_REWRITE_TAC[ADD1];
6143 UNDISCH_TAC` x < (n:num) `;
6144 UNDISCH_TAC` 0 < x `;
6145 ARITH_TAC;
6146 UNDISCH_TAC` local_fan (v_prime V fv,e_prime  (E UNION {{v, w}}) fv,fv) `;
6147 PHA;
6148 NHANH Local_lemmas.IVS_RHO_NODE1_DETE;
6149 SIMP_TAC[];
6150
6151
6152 SIMP_TAC[];
6153 REPEAT STRIP_TAC THEN
6154 ASM_CASES_TAC` 0 = n ` THEN 
6155 UNDISCH_TAC` ITER n (rho_node1 FF) v = w ` THEN 
6156 FIRST_X_ASSUM (SUBST_ALL_TAC o SYM) THEN 
6157 ASM_REWRITE_TAC[ITER];
6158
6159 DOWN THEN NHANH (REWRITE_RULE[RIGHT_FORALL_IMP_THM] Collect_geom.SUM_DIS2) THEN
6160 STRIP_TAC THEN ASM_REWRITE_TAC[];
6161 SIMP_TAC[ITER];
6162 STRIP_TAC;
6163 SUBGOAL_THEN` interior_angle1 (vec 0) fv v + interior_angle1 (vec 0) fw v = interior_angle1 (vec 0) FF v /\
6164 interior_angle1 (vec 0) fv w + interior_angle1 (vec 0) fw w = interior_angle1 (vec 0) FF w ` MP_TAC;
6165 REWRITE_TAC[interior_angle1; GSYM ivs_rho_node1];
6166
6167 MP_TAC INTERIOR_ANGLE_LEM_SLICING_FAN2;
6168 ANTS_TAC;
6169 ASM_REWRITE_TAC[];
6170 SIMP_TAC[REAL_ADD_SYM; interior_angle1; GSYM ivs_rho_node1];
6171
6172
6173 REWRITE_TAC[REAL_ARITH` (a + b) + c = a + b + c `];
6174 REWRITE_TAC[REAL_ARITH` a + b + c + aa + bb + cc = a + aa + (b + bb) + (c + cc)`];
6175 SIMP_TAC[GSYM REAL_ADD_LDISTRIB];
6176 STRIP_TAC;
6177 SUBGOAL_THEN` ff 0 * interior_angle1 (vec 0) FF v +
6178  ff n * interior_angle1 (vec 0) FF w = sum {0, n}
6179  (\i. ff i * interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v))` MP_TAC;
6180 ASM_REWRITE_TAC[ITER];
6181 SIMP_TAC[];
6182 STRIP_TAC;
6183
6184 UNDISCH_TAC` DISJOINT {i | n < i /\ i < CARD (V:real^3 -> bool)} {0, n} `;
6185 UNDISCH_TAC` FINITE {0, n} `;
6186 UNDISCH_TAC` FINITE {i | n < i /\ i < CARD (V:real^3 -> bool)}`;
6187 PHA;
6188 NHANH (MESON[SUM_UNION]` FINITE s /\ FINITE t /\ DISJOINT s t
6189 ==> ! f. sum (s UNION t) f = sum s f + sum t f `);
6190 STRIP_TAC;
6191
6192
6193
6194 SUBGOAL_THEN` !i. n < i /\ i < CARD (V:real^3 -> bool) ==>
6195   interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v) =
6196  interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v) ` MP_TAC;
6197 MP_TAC (SPECL [` w:real^3 `;` v:real^3 `;`n':num `;` fw:real^3#real^3 -> bool`]
6198 (GENL [` v:real^3 `;` w:real^3 `;` n: num `; `fv:real^3 # real^3 -> bool`] INTERIOR_AGL_EQ));
6199 PHA;
6200 ANTS_TAC;
6201 ASM_REWRITE_TAC[INSERT_COMM];
6202 UNDISCH_TAC` !z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t:real^3} `;
6203 DISCH_THEN NHANH;
6204 SIMP_TAC[INSERT_COMM];
6205 ASSUME_TAC2 CARD_V_TWO_HAFL_CIRCLE;
6206 STRIP_TAC;
6207 ONCE_REWRITE_TAC[ARITH_RULE` n < i /\ i < m <=> 0 < i - n /\ i - n < m - n `];
6208 ASSUME_TAC2 (ARITH_RULE` n + n' = CARD (V:real^3 -> bool) ==> CARD V - n = n'`);
6209 FIRST_X_ASSUM SUBST1_TAC;
6210 FIRST_X_ASSUM NHANH;
6211 EXPAND_TAC "w";
6212 REWRITE_TAC[ITER_ADD];
6213 NHANH (ARITH_RULE` 0 < i - n ==> i - n + n = i `);
6214 MESON_TAC[];
6215
6216 STRIP_TAC;
6217 SUBGOAL_THEN` sum {i | n < i /\ i < CARD (V:real^3 -> bool)}
6218  (\i. ff i * interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)) =
6219 sum {i | n < i /\ i < CARD V}
6220  (\i. ff i * interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v))` MP_TAC;
6221 MATCH_MP_TAC SUM_EQ;
6222 REWRITE_TAC[IN_ELIM_THM];
6223 FIRST_X_ASSUM NHANH;
6224 SIMP_TAC[];
6225 DISCH_THEN SUBST1_TAC;
6226 DOWN THEN DOWN;
6227 DISCH_THEN (ASSUME_TAC o GSYM);
6228 UNDISCH_TAC` !f. sum {0, n} f = f 0 + f n `;
6229 DISCH_THEN (ASSUME_TAC o GSYM);
6230 ASM_REWRITE_TAC[];
6231 STRIP_TAC;
6232 UNDISCH_TAC` FINITE {0, n} `;
6233 UNDISCH_TAC` FINITE {i | n < i /\ i < CARD (V:real^3 -> bool)} `;
6234 PHA;
6235 REWRITE_TAC[GSYM FINITE_UNION];
6236 STRIP_TAC;
6237 SUBGOAL_THEN` DISJOINT {x | 0 < x /\ x < n} ({i | n < i /\ i < CARD (V:real^3 -> bool)} UNION {0, n}) ` MP_TAC;
6238 REWRITE_TAC[DISJOINT; EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_ELIM_THM; IN_UNION; IN_INSERT];
6239 GEN_TAC;
6240 ARITH_TAC;
6241 DOWN;
6242 UNDISCH_TAC` FINITE {m | 0 < m /\ m < n} `;
6243 PHA;
6244 NHANH (MESON[SUM_UNION]`  FINITE s /\ FINITE t /\ DISJOINT s t
6245          ==> ! f. sum (s UNION t) f = sum s f + sum t f`);
6246 STRIP_TAC;
6247 FIRST_X_ASSUM (ASSUME_TAC o GSYM);
6248 ASM_SIMP_TAC[];
6249
6250 MATCH_MP_TAC (MESON[]` s = ss ==> sum s f = sum ss f `);
6251 REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_UNION; IN_INSERT; NOT_IN_EMPTY];
6252 GEN_TAC;
6253 UNDISCH_TAC` n < CARD (V:real^3 -> bool) `;
6254 ARITH_TAC]);;
6255
6256
6257
6258 let THE_SLICING_INTO_2_LEMMA = prove(` convex_local_fan (V,E,FF) /\
6259        (local_fan (V,E,FF) /\
6260         v IN V /\
6261         w IN V /\
6262         ~(v = w) /\
6263         (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t}) /\
6264         (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)) /\
6265        HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
6266        fv = face HS (v,rho_node1 FF v) /\
6267        fw = face HS (w,rho_node1 FF w)
6268  ==> convex_local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) /\
6269            convex_local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) /\
6270  (!ff. sum {i | i < CARD V}
6271                (\i. ff i *
6272                     interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v)) =
6273                sum
6274                {i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fv}
6275                (\i. ff i *
6276                     interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)) +
6277                sum
6278                {i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fw}
6279                (\i. ff i *
6280                     interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)))`,
6281 NHANH COVEX_OF_LOFA_HALF_CIRCLE2 THEN 
6282 NHANH SUM_INTERIOR_AGL_LEMMA THEN SIMP_TAC[]);;
6283
6284
6285
6286
6287 let WEDGE_IN_FAN_LOFA_DETER2 = prove(`local_fan (V,E,FF) /\ v IN V 
6288      ==> wedge_in_fan_gt (v,rho_node1 FF v) E =
6289          wedge (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v)`,
6290 NHANH LOCAL_FAN_IVS_IN_V THEN 
6291 NHANH LOCAL_FAN_RHO_NODE_IVS THEN 
6292 ABBREV_TAC` vv = ivs_rho_node1 FF v` THEN 
6293 MESON_TAC[WEDGE_IN_FAN_LOFA_DETER]);;
6294
6295
6296
6297
6298 let AZIM_COND_FOR_COPLANAR = prove_by_refinement
6299 (`azim v0 v1 w1 w2 = &0 \/ azim v0 v1 w1 w2 = pi
6300          <=> coplanar {v0, v1, w1, w2} `,
6301 [EQ_TAC;
6302 REWRITE_TAC[AZIM_EQ_0_PI_IMP_COPLANAR];
6303 ASM_CASES_TAC` collinear {v0, v1, w1:real^3} `;
6304 STRIP_TAC;
6305 DISJ1_TAC;
6306 UNDISCH_TAC` collinear {v0, v1, w1:real^3}`;
6307 REWRITE_TAC[AZIM_DEGENERATE];
6308 STRIP_TAC;
6309 ASM_CASES_TAC` collinear {v0, v1, w2:real^3}`;
6310 DISJ1_TAC;
6311 DOWN;
6312 REWRITE_TAC[AZIM_DEGENERATE];
6313 DOWN_TAC;
6314 MESON_TAC[AZIM_EQ_0_PI_EQ_COPLANAR]]);;
6315
6316
6317
6318 let AFF_SUB_PLANE = prove(`plane P /\ S SUBSET P ==> aff S SUBSET P `,
6319 REWRITE_TAC[plane; aff] THEN 
6320 MESON_TAC[AFFINE_AFFINE_HULL; HULL_MINIMAL]);;
6321
6322
6323
6324
6325 let PROVE_THE_SLICE_ASSUMPTION = prove_by_refinement
6326 (`! v w. convex_local_fan (V,E,FF) /\
6327         v IN V /\
6328         w IN V /\
6329         ~(v = w) /\
6330         (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E)
6331 ==> (!z t. z IN {v, w} /\ t IN V DIFF {z} ==> ~collinear {vec 0, z, t})`,
6332 [REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY];
6333 MATCH_MP_TAC (MESON[]`(!v w. P v w ==> P w v) /\
6334      (!v w. P v w ==> (!z t. z = v /\ Q z t ==> R z t))
6335      ==> (!v w. P v w ==> (!z t. (z = v \/ z = w) /\ Q z t ==> R z t))`);
6336 SIMP_TAC[INSERT_COMM; IN_DIFF; IN_SING];
6337 REPEAT STRIP_TAC;
6338 MP_TAC (SPEC` t:real^3 ` (GEN`w:real^3 ` CVLF_COLLINEAR_CIRCULAR_LUNAR));
6339 ANTS_TAC;
6340 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET; INSERT_COMM];
6341 UNDISCH_TAC` ~(t = z:real^3)`;
6342 ASM_SIMP_TAC[];
6343
6344 STRIP_TAC;
6345 ASSUME_TAC2 Local_lemmas.KCHMAMG;
6346 DOWN THEN STRIP_TAC;
6347 SUBGOAL_THEN` interior_angle1 (vec 0) FF v = pi` MP_TAC;
6348 FIRST_X_ASSUM MATCH_MP_TAC;
6349 FIRST_ASSUM ACCEPT_TAC;
6350 SUBGOAL_THEN` convex_local_fan (V,E,FF) ` MP_TAC;
6351 ASM_REWRITE_TAC[];
6352
6353 REWRITE_TAC[convex_local_fan];
6354 STRIP_TAC;
6355 ASSUME_TAC2 WEDGE_IN_FAN_LOFA_DETER2;
6356
6357 SUBGOAL_THEN` aff {vec 0, v, w:real^3} SUBSET A` MP_TAC;
6358 MATCH_MP_TAC AFF_SUB_PLANE;
6359 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
6360 UNDISCH_TAC` (V:real^3 -> bool) SUBSET A `;
6361 REWRITE_TAC[SUBSET];
6362 STRIP_TAC;
6363 CONJ_TAC;
6364 FIRST_X_ASSUM MATCH_MP_TAC;
6365 FIRST_ASSUM ACCEPT_TAC;
6366 FIRST_X_ASSUM MATCH_MP_TAC;
6367 FIRST_ASSUM ACCEPT_TAC;
6368
6369 MP_TAC (ISPECL[`{vec 0: real^3}`;` {v,w:real^3}`] (GEN_ALL Local_lemmas.AFF_GT_SUB_AFF_UNION));
6370 REWRITE_TAC[SET_RULE` {a} UNION S = a INSERT S `];
6371 PHA;
6372 NHANH (SUBSET_TRANS);
6373 STRIP_TAC;
6374 DOWN;
6375 REWRITE_TAC[SUBSET];
6376 SUBGOAL_THEN` DISJOINT {vec 0} {v,w:real^3} ` MP_TAC;
6377 ASM_REWRITE_TAC[SET_RULE` DISJOINT {a} S <=> ~( a IN S) `; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM];
6378 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
6379 UNDISCH_TAC` v:real^3 IN V `;
6380 UNDISCH_TAC` w:real^3 IN V `;
6381 FIRST_X_ASSUM NHANH;
6382 SIMP_TAC[];
6383 NHANH Planarity.exists_in_aff_gt_disjoint;
6384 STRIP_TAC;
6385 DISCH_THEN (ASSUME_TAC2 o (SPEC` y:real^3 `));
6386
6387 SUBGOAL_THEN` coplanar {vec 0, v, rho_node1 FF v, y} ` MP_TAC;
6388 UNDISCH_TAC` plane  (A:real^3 -> bool) `;
6389 REWRITE_TAC[coplanar; plane];
6390 STRIP_TAC;
6391 EXISTS_TAC` u:real^3 `;
6392 EXISTS_TAC` v':real^3 `;
6393 EXISTS_TAC` w':real^3 `;
6394 FIRST_X_ASSUM (SUBST1_TAC o SYM);
6395 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
6396 ASSUME_TAC2 Local_lemmas.LOFA_IN_V_SO_DO_RHO_NODE_V;
6397 DOWN;
6398 UNDISCH_TAC` v:real^3 IN V `;
6399 UNDISCH_TAC` (V:real^3 -> bool) SUBSET A `;
6400 REWRITE_TAC[SUBSET];
6401 DISCH_THEN NHANH;
6402 SIMP_TAC[];
6403
6404 REWRITE_TAC[ GSYM AZIM_COND_FOR_COPLANAR];
6405 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
6406 DOWN THEN STRIP_TAC;
6407 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
6408 DOWN;
6409 UNDISCH_TAC` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E `;
6410 DISCH_THEN NHANH;
6411 ASM_REWRITE_TAC[SUBSET];
6412 STRIP_TAC;
6413 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`y: real^3 `));
6414 DOWN;
6415 REWRITE_TAC[wedge; IN_ELIM_THM; interior_angle1; GSYM ivs_rho_node1];
6416 REAL_ARITH_TAC;
6417
6418 MP_TAC (SPEC`t:real^3 ` (GEN` w:real^3 ` Local_lemmas.HKIRPEP));
6419 ANTS_TAC;
6420 ASM_REWRITE_TAC[];
6421 STRIP_TAC;
6422 ASSUME_TAC2 Local_lemmas.CVX_LO_IMP_LO;
6423 ASSUME_TAC2 WEDGE_IN_FAN_LOFA_DETER2;
6424
6425 SUBGOAL_THEN` i + j = CARD (V:real^3 -> bool) ` MP_TAC;
6426 MATCH_MP_TAC (GEN`w:real^3 ` CARD_V_TWO_HAFL_CIRCLE);
6427 EXISTS_TAC` t: real^3 `;
6428 SWITCH_TAC` t = ITER i (rho_node1 FF) v `;
6429 SWITCH_TAC` v = ITER j (rho_node1 FF) t `;
6430 ASM_REWRITE_TAC[];
6431 UNDISCH_TAC` ~(t = (z:real^3))`;
6432 ASM_REWRITE_TAC[EQ_SYM_EQ];
6433 ASSUME_TAC2 POINT_PRESENTED_IN_RHOND1;
6434 DOWN THEN STRIP_TAC;
6435 ASM_CASES_TAC` n = 0 `;
6436 FIRST_X_ASSUM SUBST_ALL_TAC;
6437 DOWN THEN DOWN;
6438 SWITCH_TAC` t = ITER i (rho_node1 FF) v `;
6439 SWITCH_TAC` v = ITER j (rho_node1 FF) t `;
6440 ASM_REWRITE_TAC[ITER];
6441 ASM_CASES_TAC` n < (i:num) `;
6442 SUBGOAL_THEN` w IN {ITER l (rho_node1 FF) v | 0 < l /\ l < i} ` MP_TAC;
6443 REWRITE_TAC[IN_ELIM_THM];
6444 EXISTS_TAC`n:num `;
6445 ASM_REWRITE_TAC[];
6446 DOWN THEN DOWN;
6447 ARITH_TAC;
6448 SWITCH_TAC` t = ITER i (rho_node1 FF) v `;
6449 SWITCH_TAC` v = ITER j (rho_node1 FF) t `;
6450 ASM_REWRITE_TAC[IN_INTER];
6451 STRIP_TAC;
6452 SUBGOAL_THEN` aff_gt {vec 0, v} {rho_node1 FF v} = aff_gt {vec 0, v} {w}` MP_TAC;
6453 MATCH_MP_TAC Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
6454 ASM_REWRITE_TAC[];
6455 MATCH_MP_TAC Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
6456 ASM_REWRITE_TAC[];
6457 MP_TAC (REWRITE_RULE[SING_SUBSET; IN_INSERT] (
6458 ISPECL [`{v:real^3}`;` {vec 0, v:real^3}`; `{w:real^3}`] (GEN_ALL Local_lemmas.AFF_GT_MONO_TRANS)));
6459 REWRITE_TAC[Packing3.SING_UNION_EQ_INSERT];
6460 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
6461 SUBGOAL_THEN` {vec 0, v} DIFF {v:real^3} = {vec 0}` MP_TAC;
6462 REWRITE_TAC[DIFF; EXTENSION; IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY];
6463 GEN_TAC;
6464 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3`));
6465 DOWN;
6466 MESON_TAC[];
6467 SIMP_TAC[];
6468 PHA THEN STRIP_TAC;
6469 SUBGOAL_THEN` DISJOINT {vec 0} {w, v:real^3}` MP_TAC;
6470 REWRITE_TAC[SET_RULE` DISJOINT {a} S <=> ~( a IN S)`; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM];
6471 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
6472 FIRST_ASSUM (ASSUME_TAC2 o (SPEC` w:real^3 `));
6473 DOWN THEN DOWN;
6474 SIMP_TAC[];
6475
6476 NHANH Planarity.exists_in_aff_gt_disjoint;
6477 STRIP_TAC;
6478
6479 SUBGOAL_THEN` y IN aff_gt {vec 0, v} {rho_node1 FF v}` MP_TAC;
6480 ASM_REWRITE_TAC[];
6481 UNDISCH_TAC` aff_gt {vec 0} {w, v} SUBSET aff_gt {vec 0, v} {w:real^3} `;
6482 REWRITE_TAC[SUBSET];
6483 DISCH_THEN MATCH_MP_TAC;
6484 FIRST_X_ASSUM ACCEPT_TAC;
6485 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
6486 STRIP_TAC;
6487 SUBGOAL_THEN` ~collinear {vec 0, v, y:real^3}` MP_TAC;
6488 MATCH_MP_TAC (GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO);
6489 EXISTS_TAC` rho_node1 FF v `;
6490 ASM_REWRITE_TAC[];
6491 UNDISCH_TAC` ~collinear {vec 0, v, rho_node1 FF v}`;
6492 PHA;
6493 NHANH AZIM_EQ_0_ALT;
6494 STRIP_TAC;
6495 FIRST_X_ASSUM (SUBST_ALL_TAC o SYM);
6496 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
6497 DOWN THEN STRIP_TAC;
6498 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
6499 DOWN;
6500
6501 UNDISCH_TAC` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E `;
6502 DISCH_THEN NHANH;
6503 REWRITE_TAC[SUBSET];
6504 ONCE_REWRITE_TAC[INSERT_COMM];
6505 STRIP_TAC;
6506 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC`y: real^3 `));
6507 DOWN;
6508 ASM_REWRITE_TAC[wedge; IN_ELIM_THM];
6509 REAL_ARITH_TAC;
6510
6511
6512 SWITCH_TAC` v = ITER j (rho_node1 FF) t `;
6513 SWITCH_TAC` t = ITER i (rho_node1 FF) v `;
6514 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_RHO_NODE_PROS2;
6515 DOWN THEN STRIP_TAC;
6516 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` v:real^3 `));
6517 DOWN;
6518 UNDISCH_TAC` !x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E `;
6519 STRIP_TAC;
6520 PHA;
6521 FIRST_ASSUM NHANH;
6522 ASM_REWRITE_TAC[];
6523 STRIP_TAC;
6524 ASSUME_TAC2 Local_lemmas.LOFA_IMP_V_DIFF;
6525 SUBGOAL_THEN` DISJOINT {vec 0} {v, w:real^3} ` MP_TAC;
6526 REWRITE_TAC[DISJOINT; INTER; EXTENSION; IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY];
6527 DOWN;
6528 UNDISCH_TAC` (v:real^3) IN V `;
6529 UNDISCH_TAC` (w:real^3) IN V `;
6530 MESON_TAC[];
6531 PHA;
6532 NHANH Planarity.exists_in_aff_gt_disjoint;
6533 STRIP_TAC;
6534
6535 ASM_CASES_TAC` n = (i:num) `;
6536 UNDISCH_TAC` collinear {t, v:real^3, vec 0} `;
6537 FIRST_X_ASSUM SUBST_ALL_TAC;
6538 ASM_REWRITE_TAC[];
6539 ONCE_REWRITE_TAC[GSYM COLLINEAR_AFFINE_HULL_COLLINEAR];
6540 REWRITE_TAC[GSYM aff];
6541
6542 SUBGOAL_THEN` {vec 0, v, (y:real^3)} SUBSET aff {t,v, vec 0} ` MP_TAC;
6543 MP_TAC (ISPECL [` {t, v:real^3, vec 0} `] (ISPECL [` affine` ] HULL_SUBSET));
6544 SIMP_TAC[GSYM aff; INSERT_SUBSET; EMPTY_SUBSET];
6545 SUBGOAL_THEN` t = (w:real^3) ` SUBST_ALL_TAC;
6546 EXPAND_TAC "t";
6547 EXPAND_TAC "w";
6548 REWRITE_TAC[];
6549 DOWN;
6550 MP_TAC (ISPECL [` {vec 0:real^3} `; `{v, w:real^3 }`] (GEN_ALL Local_lemmas.AFF_GT_SUB_AFF_UNION));
6551 REWRITE_TAC[SUBSET];
6552 DISCH_THEN NHANH;
6553 SIMP_TAC[SET_RULE` {a} UNION S = a INSERT S`; INSERT_COMM];
6554
6555 REPEAT STRIP_TAC;
6556 SUBGOAL_THEN` collinear {vec 0, v, y:real^3} ` MP_TAC;
6557 MATCH_MP_TAC COLLINEAR_SUBSET;
6558 EXISTS_TAC` aff {t, v:real^3, vec 0} `;
6559 ASM_REWRITE_TAC[];
6560
6561 STRIP_TAC;
6562 SUBGOAL_THEN` azim (vec 0) v (rho_node1 FF v) y = &0 ` MP_TAC;
6563 DOWN;
6564 REWRITE_TAC[AZIM_DEGENERATE];
6565 UNDISCH_TAC` y IN aff_gt {vec 0} {v, w:real^3} `;
6566 PHA;
6567 UNDISCH_TAC` aff_gt {vec 0} {v, w} SUBSET
6568       wedge  (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
6569 REWRITE_TAC[SUBSET];
6570 DISCH_THEN NHANH;
6571 ASM_REWRITE_TAC[wedge; IN_ELIM_THM];
6572
6573
6574 SUBGOAL_THEN` w IN {ITER l (rho_node1 FF) t | 0 < l /\ l < j} ` MP_TAC;
6575 REWRITE_TAC[IN_ELIM_THM];
6576 EXISTS_TAC` n - (i:num) `;
6577 EXPAND_TAC "t";
6578 REWRITE_TAC[ITER_ADD];
6579 UNDISCH_TAC` ~( n < (i:num)) `;
6580 NHANH (ARITH_RULE` ~( a < (b:num)) ==> a - b + b = a `);
6581 ASM_SIMP_TAC[];
6582 STRIP_TAC;
6583 CONJ_TAC;
6584 REPLICATE_TAC 3 DOWN;
6585 PHA;
6586 ARITH_TAC;
6587 ASSUME_TAC2 (ARITH_RULE`~(n < i ) ==> (n - i < (j:num) <=> n < i + j) `);
6588 ASM_REWRITE_TAC[];
6589
6590
6591
6592 ASM_REWRITE_TAC[IN_INTER];
6593 ASSUME_TAC2 Local_lemmas.LOFA_IMP_NOT_COLL_IVS;
6594 STRIP_TAC;
6595 UNDISCH_TAC` ~( n = (i:num)) `;
6596 PHA;
6597 DOWN THEN DOWN THEN PHA;
6598 NHANH Local_lemmas.COLL_IN_AFF_GT_AFF_GT_EQ;
6599 STRIP_TAC;
6600
6601 MP_TAC (
6602 REWRITE_RULE[INSERT_SUBSET; EMPTY_SUBSET; IN_INSERT] (
6603 ISPECL [`{vec 0: real^3}`;`{v, w:real^3}`; ` {v:real^3} `] (GEN_ALL Local_lemmas.AFF_GT_MONO)));
6604 SUBGOAL_THEN` {v,w} DIFF {v:real^3} = {w} ` SUBST1_TAC;
6605 UNDISCH_TAC` ~( v = w:real^3) `;
6606 SET_TAC[];
6607
6608 REWRITE_TAC[Packing3.SING_UNION_EQ_INSERT];
6609 STRIP_TAC;
6610 SUBGOAL_THEN` y IN aff_gt {vec 0, v} {ivs_rho_node1 FF v} ` MP_TAC;
6611 DOWN;
6612 ASM_REWRITE_TAC[SUBSET];
6613 DISCH_THEN MATCH_MP_TAC;
6614 ASM_REWRITE_TAC[];
6615
6616 SUBGOAL_THEN` ~ collinear {vec 0, v, rho_node1 FF v} /\
6617 ~ collinear {vec 0, v, y} /\
6618 ~ collinear {vec 0, v, ivs_rho_node1 FF v } ` MP_TAC;
6619 ASSUME_TAC2 Local_lemmas.LOCAL_FAN_CHARACTER_OF_RHO_NODE2;
6620 ASM_REWRITE_TAC[];
6621 MATCH_MP_TAC (GEN_ALL Local_lemmas.COLL_IN_AFF_GT_TOO);
6622 EXISTS_TAC` ivs_rho_node1 FF v `;
6623 ASM_REWRITE_TAC[];
6624 UNDISCH_TAC` aff_gt {vec 0} {v, w} SUBSET aff_gt {vec 0, v} {w:real^3} `;
6625 REWRITE_TAC[SUBSET];
6626 DISCH_THEN MATCH_MP_TAC;
6627 ASM_REWRITE_TAC[];
6628
6629 NHANH AZIM_EQ_ALT;
6630 STRIP_TAC;
6631 FIRST_X_ASSUM (SUBST1_TAC o SYM);
6632 UNDISCH_TAC` y IN aff_gt {vec 0} {v, w:real^3} `;
6633 UNDISCH_TAC` aff_gt {vec 0} {v, w} SUBSET
6634       wedge  (vec 0) v (rho_node1 FF v) (ivs_rho_node1 FF v) `;
6635 REWRITE_TAC[SUBSET];
6636 DISCH_THEN NHANH;
6637 REWRITE_TAC[IN_ELIM_THM; wedge];
6638 STRIP_TAC;
6639 DOWN;
6640 REAL_ARITH_TAC]);;
6641
6642
6643
6644
6645 let EJRCFJD = prove(` convex_local_fan (V,E,FF) /\
6646         v IN V /\
6647         w IN V /\
6648         ~(v = w) /\
6649        (!x. x IN FF ==> aff_gt {vec 0} {v, w} SUBSET wedge_in_fan_gt x E) /\
6650        HS = hypermap (HYP (vec 0,V,E UNION {{v, w}})) /\
6651        fv = face HS (v,rho_node1 FF v) /\
6652        fw = face HS (w,rho_node1 FF w)
6653  ==> convex_local_fan (v_prime V fv,e_prime (E UNION {{v, w}}) fv,fv) /\
6654            convex_local_fan (v_prime V fw,e_prime (E UNION {{w, v}}) fw,fw) /\
6655  (!ff. sum {i | i < CARD V}
6656                (\i. ff i *
6657                     interior_angle1 (vec 0) FF (ITER i (rho_node1 FF) v)) =
6658                sum
6659                {i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fv}
6660                (\i. ff i *
6661                     interior_angle1 (vec 0) fv (ITER i (rho_node1 FF) v)) +
6662                sum
6663                {i | i < CARD V /\ ITER i (rho_node1 FF) v IN v_prime V fw}
6664                (\i. ff i *
6665                     interior_angle1 (vec 0) fw (ITER i (rho_node1 FF) v)))`,
6666 STRIP_TAC THEN 
6667 ASSUME_TAC2 PROVE_THE_SLICE_ASSUMPTION THEN 
6668 MATCH_MP_TAC THE_SLICING_INTO_2_LEMMA THEN 
6669 ASSUME_TAC2 Local_lemmas.CVX_LO_IMP_LO THEN 
6670 ASM_REWRITE_TAC[] THEN
6671 REPEAT GEN_TAC THEN STRIP_TAC THEN 
6672 DOWN THEN 
6673 FIRST_X_ASSUM MATCH_MP_TAC THEN 
6674 FIRST_X_ASSUM ACCEPT_TAC);;
6675
6676
6677
6678
6679 let DIST_TRIANGLE_AS_ABS = prove(` abs ( dist (x,y) - dist (x,z:real^N)) <= dist (y,z) `,
6680 REWRITE_TAC[REAL_ABS_BOUNDS] THEN CONJ_TAC THENL [
6681 REWRITE_TAC[REAL_ARITH` -- a <= b - c <=> c <= b + a `; DIST_TRIANGLE];
6682 REWRITE_TAC[REAL_ARITH` a - b <= c <=> a <= b + c `] THEN 
6683 MESON_TAC[DIST_TRIANGLE; DIST_SYM]]);;
6684
6685
6686
6687
6688 let CON_ATREAL_REAL_CON2_REDO = prove_by_refinement
6689 (` (f:real -> real^N) continuous atreal r /\ g continuous atreal r
6690            ==> (\t. dist (f t,g t)) real_continuous atreal r`,
6691 [REWRITE_TAC[real_continuous_atreal; continuous_atreal];
6692 REPEAT STRIP_TAC;
6693 SUBGOAL_THEN` &0 < e / &2 ` ASSUME_TAC;
6694 DOWN;
6695 REAL_ARITH_TAC;
6696 ASM_REWRITE_TAC[];
6697 FIRST_X_ASSUM (MP_TAC o (SPEC` e / &2 `));
6698 ANTS_TAC;
6699 FIRST_X_ASSUM ACCEPT_TAC;
6700 FIRST_X_ASSUM (MP_TAC o (SPEC` e / &2 `));
6701 ANTS_TAC;
6702 FIRST_X_ASSUM ACCEPT_TAC;
6703 STRIP_TAC;
6704 STRIP_TAC;
6705 EXISTS_TAC` min d d'`;
6706 ASM_REWRITE_TAC[REAL_LT_MIN];
6707 GEN_TAC;
6708 FIRST_X_ASSUM NHANH;
6709 FIRST_X_ASSUM NHANH;
6710 STRIP_TAC;
6711 SUBST1_TAC (REAL_ARITH` dist ((f:real -> real^N) x',g x') - dist (f r,g r) =
6712  (dist (f x',g x') - dist (f x', g r)) + ( dist (f x', g r) - dist (f r,g r))`);
6713 MP_TAC (SPECL [` dist ((f:real -> real^N) x',g x') - dist (f x',g r)`; ` dist ((f:real -> real^N) x',g r) - dist (f r,g r) `] REAL_ABS_TRIANGLE);
6714
6715 SUBGOAL_THEN` abs (dist ((f:real -> real^N) x',g x') - dist (f x',g r)) +
6716  abs (dist (f x',g r) - dist (f r,g r)) < e ` MP_TAC;
6717 MATCH_MP_TAC REAL_LET_TRANS;
6718 EXISTS_TAC`dist (g x',(g:real -> real^N) r) + dist (f x',(f:real -> real^N) r)`;
6719 CONJ_TAC;
6720 MATCH_MP_TAC (REAL_ARITH` a <= b /\ d <= c ==> a + d <= b + c `);
6721 REWRITE_TAC[DIST_TRIANGLE_AS_ABS];
6722
6723
6724 REWRITE_TAC[DIST_SYM];
6725 ONCE_REWRITE_TAC[DIST_SYM];
6726 REWRITE_TAC[DIST_TRIANGLE_AS_ABS];
6727
6728 ASM_REAL_ARITH_TAC;
6729 REAL_ARITH_TAC]);;
6730
6731
6732
6733
6734
6735 let REAL_POS_LT_MUL = prove(
6736 ` &0 <= a /\ a < b /\ &0 <= x /\ x < y ==> a * x < b * y `,
6737 NHANH REAL_LET_TRANS THEN STRIP_TAC THEN 
6738 ASSUME_TAC2 (SPECL [` a:real`;` b:real`;` y:real `] REAL_LT_RMUL) THEN 
6739 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC` a * (y:real) ` THEN 
6740 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_LMUL THEN 
6741 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN 
6742 FIRST_X_ASSUM ACCEPT_TAC);;
6743
6744
6745
6746
6747
6748 let REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN = prove_by_refinement
6749 (` f real_continuous atreal r /\ g real_continuous atreal r
6750 ==> (\t. (f t) * (g t)) real_continuous atreal r `,
6751 [REWRITE_TAC[real_continuous_atreal];
6752 STRIP_TAC;
6753 GEN_TAC;
6754 STRIP_TAC;
6755 SUBGOAL_THEN` &0 < e / (&2 * ( abs (f (r:real)) + &1)) ` MP_TAC;
6756 MATCH_MP_TAC REAL_LT_DIV;
6757 ASM_REWRITE_TAC[];
6758 REAL_ARITH_TAC;
6759 STRIP_TAC;
6760 FIRST_X_ASSUM (MP_TAC o (SPEC` e / (&2 * (abs (f (r:real)) + &1))`));
6761 ANTS_TAC;
6762 FIRST_X_ASSUM ACCEPT_TAC;
6763 STRIP_TAC;
6764 ABBREV_TAC` dd = e / (&2 * (abs (f (r:real)) + &1)) `;
6765 SUBGOAL_THEN` &0 < e / (&2 * (abs (g (r:real)) + dd)) ` ASSUME_TAC;
6766 MATCH_MP_TAC REAL_LT_DIV;
6767 ASM_REWRITE_TAC[];
6768 UNDISCH_TAC` &0 < dd `;
6769 REAL_ARITH_TAC;
6770 UNDISCH_TAC` !e. &0 < e
6771           ==> (?d. &0 < d /\ (!x'. abs (x' - r) < d ==> abs (f x' - f (r:real)) < e))`;
6772 STRIP_TAC;
6773 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` e / (&2 * (abs (g (r:real)) + dd))`));
6774 DOWN THEN STRIP_TAC;
6775 EXISTS_TAC` min d d' `;
6776 ASM_REWRITE_TAC[REAL_LT_MIN];
6777 GEN_TAC;
6778 FIRST_X_ASSUM NHANH;
6779 FIRST_X_ASSUM NHANH;
6780 STRIP_TAC;
6781 SUBST1_TAC (REAL_ARITH` f (x':real) * g x' - f r * g r = (f x' - f r) * g x' + ( g x' - g r) * f r `);
6782 MATCH_MP_TAC REAL_LET_TRANS;
6783 EXISTS_TAC` abs ((f x' - f r) * g x') + abs ((g x' - g r) * f (r:real)) `;
6784 REWRITE_TAC[REAL_ABS_TRIANGLE; REAL_ABS_MUL];
6785 MP_TAC (SPECL[`abs (g x' - g (r:real)) `;` dd:real `; ` abs (f (r:real))`] REAL_LE_RMUL);
6786 ANTS_TAC;
6787 REWRITE_TAC[ REAL_ABS_POS];
6788 MATCH_MP_TAC REAL_LT_IMP_LE;
6789 FIRST_X_ASSUM ACCEPT_TAC;
6790 MP_TAC (SPECL [`(g:real -> real) x' `; `(g:real -> real) r`] REAL_SUB_ABS);
6791 REWRITE_TAC[REAL_ARITH` a - b <= c <=> a <= b + c `];
6792 STRIP_TAC;
6793 ASSUME_TAC2 (REAL_ARITH` abs (g x' - g (r:real)) < dd /\
6794 abs (g x') <= abs (g r) + abs (g x' - g r) ==> abs (g x') < abs (g r) + dd`);
6795 STRIP_TAC;
6796 MP_TAC (ISPECL [`abs (f x' - f (r:real)) `;` abs ( g (x':real)) `;
6797 ` e / (&2 * (abs (g (r:real)) + dd)) `;` abs (g (r:real)) + dd`] (GEN_ALL REAL_POS_LT_MUL));
6798 ANTS_TAC;
6799 ASM_REWRITE_TAC[REAL_ABS_POS];
6800 DOWN THEN PHA;
6801 NHANH (REAL_ARITH` a <= b /\ c < d ==> c + a < b + d `);
6802 STRIP_TAC;
6803 DOWN;
6804 SUBGOAL_THEN` e / (&2 * (abs (g r) + dd)) * (abs (g (r:real)) + dd) = e / &2 ` SUBST1_TAC;
6805 UNDISCH_TAC` &0 < dd `;
6806 CONV_TAC REAL_FIELD;
6807 EXPAND_TAC "dd";
6808 SUBST1_TAC (REAL_FIELD` e / (&2 * (abs (f (r:real)) + &1)) * abs (f r) = (e / &2) * (abs (f r) / ( abs (f r) + &1))`);
6809 SUBGOAL_THEN` abs (f r) / (abs (f (r:real)) + &1) < &1 ` MP_TAC;
6810 MATCH_MP_TAC Real_ext.REAL_PROP_LT_LCANCEL;
6811 EXISTS_TAC` abs (f (r:real)) + &1`;
6812 SUBGOAL_THEN` &0 < abs (f (r:real)) + &1 ` MP_TAC;
6813 REAL_ARITH_TAC;
6814 SIMP_TAC[REAL_FIELD` &0 < a ==> a * x / a = x `; REAL_MUL_RID];
6815 REAL_ARITH_TAC;
6816
6817 DISCH_TAC;
6818 MP_TAC (SPECL [` e / &2 `;` abs (f r) / (abs (f (r:real)) + &1)`; `&1 `] REAL_LT_LMUL);
6819 ANTS_TAC;
6820 ASM_REWRITE_TAC[REAL_ARITH` &0 < e / &2 <=> &0 < e `];
6821 ABBREV_TAC` dx = abs (f x' - f r) * abs (g x') + abs (g x' - g r) * abs (f (r:real))`;
6822 REAL_ARITH_TAC]);;
6823
6824
6825
6826
6827
6828 let REAL_CONTINUOUS_ATREAL_POW_2 = 
6829 REWRITE_RULE[CONJ_ACI; GSYM POW_2] (
6830 SPEC` f:real -> real ` (GEN`g:real -> real ` REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN));;
6831
6832
6833
6834
6835 let CONSTANCE_FUN_CONTINUOUS = prove(` ! c. (\t. c) real_continuous atreal r `,
6836 REWRITE_TAC[real_continuous_atreal] THEN 
6837 REPEAT STRIP_TAC THEN EXISTS_TAC ` e:real ` THEN 
6838 ASM_REWRITE_TAC[REAL_SUB_REFL; REAL_ABS_0]);;
6839
6840
6841 let REAL_CONS_IMP_SCALAR_MUL = prove(
6842 ` f real_continuous atreal r ==> ! c. (\t. c * f t) real_continuous atreal r `,
6843 STRIP_TAC THEN GEN_TAC THEN 
6844 MP_TAC (SPEC_ALL CONSTANCE_FUN_CONTINUOUS) THEN 
6845 DOWN THEN PHA THEN NHANH REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN THEN 
6846 SIMP_TAC[BETA_THM; REAL_MUL_SYM]);;
6847
6848
6849 let CONS_IMP_SO_IVS = prove(` f real_continuous atreal r ==> (\t. -- f t) real_continuous atreal r `,
6850 MP_TAC (SPEC` -- &1 ` CONSTANCE_FUN_CONTINUOUS) THEN 
6851 PHA THEN 
6852 NHANH REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN THEN 
6853 SIMP_TAC[BETA_THM; GSYM REAL_NEG_MINUS1]);;
6854
6855
6856
6857 let REAL_CONS_IMP_SUM_CONS = prove_by_refinement(
6858 ` f real_continuous atreal r /\ g real_continuous atreal r 
6859 ==> (\t. f t + g t) real_continuous atreal r `,
6860 [REWRITE_TAC[real_continuous_atreal] ;
6861 REPEAT STRIP_TAC ;
6862 ASSUME_TAC2 (REAL_ARITH` &0 < e ==> &0 < e / &2 `) ;
6863 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` e / &2 `)) ;
6864 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` e / &2 `)) ;
6865 DOWN THEN DOWN ;
6866 PHA THEN STRIP_TAC ;
6867 EXISTS_TAC` min d d' ` ;
6868 REWRITE_TAC[REAL_LT_MIN] ;
6869 ASM_REWRITE_TAC[] ;
6870 GEN_TAC ;
6871 FIRST_X_ASSUM NHANH ;
6872 FIRST_X_ASSUM NHANH ;
6873 STRIP_TAC ;
6874 MATCH_MP_TAC REAL_LET_TRANS ;
6875 EXISTS_TAC` abs (g x' - g r) + abs (f x' - f (r:real))` ;
6876 CONJ_TAC ;
6877 REAL_ARITH_TAC ;
6878 REPLICATE_TAC 3 DOWN THEN PHA ;
6879 REAL_ARITH_TAC]);;
6880
6881
6882
6883
6884 let REAL_CONS_IMP_SCALAR_MUL_ALT =
6885 REWRITE_RULE[RIGHT_IMP_FORALL_THM] REAL_CONS_IMP_SCALAR_MUL;;
6886
6887
6888 let UPS_X_CONTS_FUNC = prove_by_refinement
6889 (` (f:real -> real^N) continuous atreal r /\ 
6890 (g: real -> real^N) continuous atreal r /\
6891 (h: real -> real^N) continuous atreal r
6892   ==> (\r. ups_x (dist (f r,g r) pow 2) (dist (h r,f r) pow 2) (dist (g r, h r) pow 2)) real_continuous atreal r `,
6893 [REWRITE_TAC[ups_x];
6894 STRIP_TAC;
6895 ASSUME_TAC2 CON_ATREAL_REAL_CON2_REDO;
6896 ASSUME_TAC2 (SPECL [` g:real -> real^N `;` h:real -> real^N`;` r:real `] (GEN_ALL CON_ATREAL_REAL_CON2_REDO));
6897 ASSUME_TAC2 (SPECL [` h:real -> real^N `;` f:real -> real^N`;` r:real `] (GEN_ALL CON_ATREAL_REAL_CON2_REDO));
6898 REPLICATE_TAC 3 DOWN THEN PHA;
6899 NHANH_PAT `\x. x ==> y ` REAL_CONTINUOUS_ATREAL_POW_2;
6900 REWRITE_TAC[BETA_THM];
6901 NHANH_PAT `\x. x ==> y ` REAL_CONTINUOUS_ATREAL_POW_2;
6902 REWRITE_TAC[BETA_THM];
6903 STRIP_TAC;
6904 SUBGOAL_THEN`(\r. dist ((f:real -> real^N) r,g r) pow 2 * dist (g r,h r) pow 2) real_continuous atreal r ` ASSUME_TAC;
6905 MATCH_MP_TAC REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN;
6906 ASM_REWRITE_TAC[];
6907 SUBGOAL_THEN `(\r. dist ((f:real -> real^N) r,g r) pow 2 * dist (h r,f r) pow 2) real_continuous atreal r ` ASSUME_TAC;
6908 MATCH_MP_TAC REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN;
6909 ASM_REWRITE_TAC[];
6910 SUBGOAL_THEN`(\r. dist ((h:real -> real^N) r,f r) pow 2 * dist (g r,h r) pow 2) real_continuous atreal r ` ASSUME_TAC;
6911 MATCH_MP_TAC REAL_CONTINUOUS_ATREAL_IMP_MUL_FUN;
6912 ASM_REWRITE_TAC[];
6913
6914 REWRITE_TAC[REAL_ARITH` a - b = a + -- b `];
6915 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6916 CONJ_TAC;
6917 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6918 CONJ_TAC;
6919 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6920 CONJ_TAC;
6921 REWRITE_TAC[REAL_ARITH` -- a * b = -- ( a * b) `];
6922 MATCH_MP_TAC CONS_IMP_SO_IVS;
6923 ASM_REWRITE_TAC[GSYM REAL_POW_2];
6924 MATCH_MP_TAC CONS_IMP_SO_IVS;
6925 ASM_REWRITE_TAC[GSYM REAL_POW_2];
6926 MATCH_MP_TAC CONS_IMP_SO_IVS;
6927 ASM_REWRITE_TAC[GSYM REAL_POW_2];
6928 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6929 CONJ_TAC;
6930 MATCH_MP_TAC REAL_CONS_IMP_SCALAR_MUL_ALT;
6931 FIRST_X_ASSUM ACCEPT_TAC;
6932 MATCH_MP_TAC REAL_CONS_IMP_SUM_CONS;
6933 CONJ_TAC;
6934 MATCH_MP_TAC REAL_CONS_IMP_SCALAR_MUL_ALT;
6935 FIRST_X_ASSUM ACCEPT_TAC;
6936 MATCH_MP_TAC REAL_CONS_IMP_SCALAR_MUL_ALT;
6937 FIRST_X_ASSUM ACCEPT_TAC]);;
6938
6939
6940
6941
6942 let CONTS_FUN_CONTINUOUS_ATREAL = prove(
6943 `! v0. (\t. (v0: real^N)) continuous atreal r `,
6944 SIMP_TAC[continuous_atreal; DIST_REFL] THEN MESON_TAC[]);;
6945
6946
6947
6948
6949 let REAL_CONS_STILL_DIFF = prove(` f real_continuous atreal r /\ ~( f r = a) 
6950 ==> ?d. &0 < d /\ (! rr. abs (rr - r) < d ==> ~( f rr = a)) `,
6951 ONCE_REWRITE_TAC[REAL_ARITH` a = b <=> a - b = &0 `] THEN 
6952 REWRITE_TAC[real_continuous_atreal; REAL_ABS_NZ] THEN 
6953 STRIP_TAC THEN 
6954 FIRST_X_ASSUM (ASSUME_TAC2 o (SPEC` abs ((f:real -> real) r - a)`)) THEN 
6955 DOWN THEN STRIP_TAC THEN 
6956 EXISTS_TAC` d:real ` THEN 
6957 ASM_REWRITE_TAC[] THEN 
6958 GEN_TAC THEN FIRST_X_ASSUM NHANH THEN 
6959 REAL_ARITH_TAC);;
6960
6961
6962
6963
6964 let CONTINUOUS_PRESERVE_COLLINEAR = prove_by_refinement
6965 (` f continuous atreal r /\ 
6966 g continuous atreal r /\
6967 ~ collinear {v0:real^3, f r, g r}
6968   ==> ? e. &0 < e /\
6969          (! r'. abs ( r - r') < e
6970                ==> ~ collinear {v0, f r', g r'} ) `,
6971 [REWRITE_TAC[Collect_geom.COL_EQ_UPS_0];
6972 MP_TAC (ISPECL [` (f:real -> real^3) r `;` v0:real^3 `; 
6973 `(g:real -> real^3) r `] (GEN_ALL Collect_geom.TROI_OI_DAT_HOI));
6974 PHA;
6975 REWRITE_TAC[Collect_geom.UPS_X_SYM];
6976 STRIP_TAC;
6977 MP_TAC (ISPEC` v0:real^3` CONTS_FUN_CONTINUOUS_ATREAL);
6978 UNDISCH_TAC` (g:real -> real^3) continuous atreal r `;
6979 UNDISCH_TAC` (f:real -> real^3) continuous atreal r `;
6980 PHA;
6981 NHANH UPS_X_CONTS_FUNC;
6982 REWRITE_TAC[BETA_THM];
6983 STRIP_TAC;
6984 MP_TAC (ISPECL [` r:real `; `(\r. ups_x (dist ((f:real -> real^3) r,g r) pow 2) (dist (v0,f r) pow 2)
6985         (dist (v0,g r) pow 2)) `; ` &0 `] 
6986 (GEN_ALL REAL_CONS_STILL_DIFF));
6987 ANTS_TAC;
6988 ASM_REWRITE_TAC[];
6989 DOWN;
6990 REWRITE_TAC[DIST_SYM];
6991 SIMP_TAC[REAL_ARITH` abs ( a - b) = abs ( b - a) `]]);;
6992
6993
6994
6995
6996 let EACH_ELM_PRESERVED_IMP_ALL = prove_by_refinement
6997 (` (!x. x IN (E: A -> bool)
6998           ==> (?e. &0 < e /\
6999                    (!t. abs t < e
7000                         ==> P x t))) /\
7001      FINITE E
7002      ==> (?e. &0 < e /\
7003               (!t. abs t < e
7004                    ==> ! x. x IN E ==> P x t))`,
7005 [ABBREV_TAC` n = CARD (E: A -> bool) `;
7006 DOWN;
7007 SPEC_TAC (` E: A -> bool `,` E:A -> bool `);
7008 SPEC_TAC (`n:num `,` n:num `);
7009 INDUCT_TAC;
7010 NHANH CARD_EQ_0;
7011 STRIP_TAC THEN STRIP_TAC THEN STRIP_TAC;
7012 FIRST_X_ASSUM SUBST_ALL_TAC;
7013 ASM_REWRITE_TAC[IMAGE_CLAUSES; NOT_IN_EMPTY];
7014 EXISTS_TAC` &1 `;
7015 REAL_ARITH_TAC;
7016
7017 GEN_TAC;
7018 ASM_CASES_TAC` (E: A -> bool) = {} `;
7019 ASM_REWRITE_TAC[CARD_CLAUSES; ADD1];
7020 REWRITE_TAC[ARITH_RULE` ~( 0 = n + 1) `];
7021 DOWN;
7022 REWRITE_TAC[Local_lemmas.EMPTY_NOT_EXISTS_IN];
7023 REPEAT STRIP_TAC;
7024 UNDISCH_TAC` (x:A) IN E `;
7025 FIRST_ASSUM NHANH;
7026 STRIP_TAC;
7027 UNDISCH_TAC` !E. CARD (E: A -> bool) = n
7028           ==> (!x. x IN E ==> (?e. &0 < e /\ (!t. abs t < e ==> P x t))) /\
7029               FINITE E
7030           ==> (?e. &0 < e /\ (!t. abs t < e ==> (!x. x IN E ==> P x t))) `;
7031
7032 STRIP_TAC;
7033 FIRST_X_ASSUM (MP_TAC o (SPEC` E DELETE (x:A)`));
7034 PHA;
7035 ANTS_TAC;
7036 ASSUME_TAC2 (ISPECL [` x:A `;` E: A -> bool `] CARD_DELETE);
7037 ASM_REWRITE_TAC[ARITH_RULE` SUC n - 1 = n `; IN_DELETE; FINITE_DELETE];
7038 REPEAT STRIP_TAC;
7039 FIRST_X_ASSUM MATCH_MP_TAC;
7040 FIRST_X_ASSUM ACCEPT_TAC;
7041 STRIP_TAC;
7042 EXISTS_TAC` min e e' `;
7043 REWRITE_TAC[REAL_LT_MIN];
7044 ASM_REWRITE_TAC[];
7045 FIRST_X_ASSUM NHANH;
7046 FIRST_X_ASSUM NHANH;
7047 GEN_TAC;
7048 SET_TAC[]]);;
7049
7050
7051 let EACH_ELM_PRESERVED_IMP_ALLL = 
7052 prove_by_refinement (
7053 ` (! x. (x:real^3 -> bool) IN E ==> (? e. &0 < e /\ (! t. abs t < e ==> ~collinear ({vec 0} UNION (IMAGE (\v. (phii: real ^3 -> real -> real^3) v t) x))))) /\
7054 FINITE E
7055 ==> ?e. &0 < e /\
7056      (!t. abs t < e
7057           ==> (!e. e IN IMAGE (IMAGE (\v. phii v t)) E
7058                    ==> ~collinear ({vec 0} UNION e))) `,
7059 [ABBREV_TAC` n = CARD (E:(real^3 -> bool) -> bool) `;
7060 DOWN;
7061 SPEC_TAC (` E:(real^3 -> bool) -> bool `,` E:(real^3 -> bool) -> bool `);
7062 SPEC_TAC (`n:num `,` n:num `);
7063 INDUCT_TAC;
7064 NHANH CARD_EQ_0;
7065 STRIP_TAC THEN STRIP_TAC THEN STRIP_TAC;
7066 FIRST_X_ASSUM SUBST_ALL_TAC;
7067 ASM_REWRITE_TAC[IMAGE_CLAUSES; NOT_IN_EMPTY];
7068 EXISTS_TAC` &1 `;
7069 REAL_ARITH_TAC;
7070
7071 GEN_TAC;
7072 ASM_CASES_TAC` (E:(real^3 -> bool) -> bool) = {} `;
7073 ASM_REWRITE_TAC[CARD_CLAUSES; ADD1];
7074 REWRITE_TAC[ARITH_RULE` ~( 0 = n + 1) `];
7075 DOWN;
7076 REWRITE_TAC[Local_lemmas.EMPTY_NOT_EXISTS_IN];
7077 REPEAT STRIP_TAC;
7078 UNDISCH_TAC` (x:real^3 -> bool) IN E `;
7079 FIRST_ASSUM NHANH;
7080 STRIP_TAC;
7081 UNDISCH_TAC` !E. CARD (E: (real^3 -> bool) -> bool) = n
7082           ==> (!x. x IN E
7083                    ==> (?e. &0 < e /\
7084                             (!t. abs t < e
7085                                  ==> ~collinear
7086                                       ({vec 0} UNION IMAGE (\v. (phii:real^3 -> real -> real^3) v t ) x)))) /\
7087               FINITE E
7088           ==> (?e. &0 < e /\
7089                    (!t. abs t < e
7090                         ==> (!e. e IN IMAGE (IMAGE (\v. phii v t)) E
7091                                  ==> ~collinear ({vec 0} UNION e)))) `;
7092
7093 STRIP_TAC;
7094 FIRST_X_ASSUM (MP_TAC o (SPEC` E DELETE (x:real^3 -> bool)`));
7095 PHA;
7096 ANTS_TAC;
7097 ASSUME_TAC2 (ISPECL [` x:real ^3 -> bool `;` E: (real^3 -> bool) -> bool `] CARD_DELETE);
7098 ASM_REWRITE_TAC[ARITH_RULE` SUC n - 1 = n `; IN_DELETE; FINITE_DELETE];
7099 REPEAT STRIP_TAC;
7100 FIRST_X_ASSUM MATCH_MP_TAC;
7101 FIRST_X_ASSUM ACCEPT_TAC;
7102 STRIP_TAC;
7103 EXISTS_TAC` min e e' `;
7104 REWRITE_TAC[REAL_LT_MIN];
7105 ASM_REWRITE_TAC[];
7106 FIRST_X_ASSUM NHANH;
7107 FIRST_X_ASSUM NHANH;
7108 GEN_TAC;
7109 SET_TAC[]]);;
7110
7111
7112
7113 let ALL_TO_THE_NONPARALLEL_PART = prove_by_refinement
7114 (` deformation phii (V:real^3 -> bool) (a,b) /\ FAN (vec 0, V,E)
7115 ==> (?e. &0 < e /\
7116           (!t. --e < t /\ t < e
7117                ==> UNIONS (IMAGE (IMAGE (\v. phii v t)) E) SUBSET
7118                    IMAGE (\v. phii v t) V /\
7119                    graph (IMAGE (IMAGE (\v. phii v t)) E) /\
7120                    fan1
7121                    (vec 0,
7122                     IMAGE (\v. phii v t) V,
7123                     IMAGE (IMAGE (\v. phii v t)) E) /\
7124                    fan2
7125                    (vec 0,
7126                     IMAGE (\v. phii v t) V,
7127                     IMAGE (IMAGE (\v. phii v t)) E) /\
7128                    fan6
7129                    (vec 0,
7130                     IMAGE (\v. phii v t) V,
7131                     IMAGE (IMAGE (\v. phii v t)) E) ))`,
7132 [REWRITE_TAC[FAN];
7133 STRIP_TAC;
7134 MATCH_MP_TAC (GEN_ALL TOW_REAL_EXISTS_COMBINED);
7135 CONJ_TAC;
7136
7137 EXISTS_TAC` &1 `;
7138 REWRITE_TAC[REAL_ARITH` &0 < &1 `];
7139 GEN_TAC;
7140 STRIP_TAC;
7141 REWRITE_TAC[GSYM IMAGE_UNIONS];
7142 MATCH_MP_TAC IMAGE_SUBSET;
7143 ASM_REWRITE_TAC[];
7144
7145 MATCH_MP_TAC (GEN_ALL TOW_REAL_EXISTS_COMBINED);
7146 CONJ_TAC;
7147 DOWN_TAC;
7148 REWRITE_TAC[deformation; graph; fan1; fan2];
7149
7150 STRIP_TAC;
7151 MP_TAC (ISPECL [` &0 `;`phii:real^3 -> real -> real^3 `;`V:real^3 -> bool`]
7152  (GEN_ALL CONTINUOUS_ATREAL_INJ_PRESERVED));
7153 PHA;
7154 ANTS_TAC;
7155 ASM_SIMP_TAC[];
7156
7157 ASM_SIMP_TAC[REAL_SUB_RZERO];
7158 STRIP_TAC;
7159 EXISTS_TAC `d:real `;
7160 ASM_REWRITE_TAC[REAL_BOUNDS_LT; IMAGE; IN_ELIM_THM];
7161 FIRST_X_ASSUM NHANH;
7162 DOWN_TAC;
7163 REWRITE_TAC[HAS_SIZE_2_EXISTS; IN];
7164 REPEAT STRIP_TAC;
7165 SUBGOAL_THEN` (?xx y. ~(xx = y) /\ (!z. x (z:real^3) <=> z = xx \/ z = y))`
7166 MP_TAC;
7167 UNDISCH_TAC` (E:(real^3 -> bool) -> bool) x `;
7168 ASM_REWRITE_TAC[];
7169 STRIP_TAC;
7170 EXISTS_TAC` (phii: real^3 -> (real -> real^3)) xx t `;
7171 EXISTS_TAC` (phii: real^3 -> (real -> real^3)) y t `;
7172
7173 CONJ_TAC;
7174 FIRST_X_ASSUM MATCH_MP_TAC;
7175 ASM_REWRITE_TAC[];
7176 ASSUME_TAC2 (SET_RULE` UNIONS E SUBSET (V:real^3 -> bool) /\ 
7177 E x ==> (! z. x z ==> V z) `);
7178 DOWN THEN DOWN;
7179 MESON_TAC[];
7180 ASM_REWRITE_TAC[IN_ELIM_THM];
7181 MESON_TAC[];
7182
7183
7184 MATCH_MP_TAC (GEN_ALL TOW_REAL_EXISTS_COMBINED);
7185 CONJ_TAC;
7186 REWRITE_TAC[fan1];
7187 EXISTS_TAC` &1 `;
7188 REWRITE_TAC[REAL_ARITH` &0 < &1 `];
7189 REPEAT STRIP_TAC;
7190 MATCH_MP_TAC FINITE_IMAGE;
7191 DOWN_TAC;
7192 SIMP_TAC[fan1];
7193
7194 DOWN_TAC;
7195 SIMP_TAC[SET_RULE` s SUBSET {} <=> s = {} `; fan1; IMAGE_EQ_EMPTY];
7196 CONV_TAC TAUT;
7197
7198
7199 MATCH_MP_TAC (GEN_ALL TOW_REAL_EXISTS_COMBINED);
7200 CONJ_TAC;
7201 DOWN_TAC;
7202 REWRITE_TAC[fan2; deformation];
7203
7204 STRIP_TAC;
7205 MP_TAC (ISPECL [`&0`;` phii:real^3 -> real -> real^ 3 `;` vec 0:real^3 `;
7206 ` V:real^3 -> bool `] (GEN_ALL CONTINUOUS_ATREAL_DISTINCT_FINITE));
7207 ANTS_TAC;
7208 DOWN_TAC;
7209 SIMP_TAC[fan2; fan1];
7210 ANTS_TAC;
7211 DOWN_TAC;
7212 SIMP_TAC[fan2; fan1];
7213 STRIP_TAC;
7214 UNDISCH_TAC` ~( vec 0 IN (V:real^3 -> bool)) `;
7215 MESON_TAC[];
7216
7217
7218 REWRITE_TAC[REAL_SUB_RZERO; REAL_BOUNDS_LT; IN_IMAGE];
7219 MESON_TAC[];
7220
7221 REWRITE_TAC[fan6];
7222 UNDISCH_TAC` graph (E:(real^3 -> bool) -> bool) `;
7223 REWRITE_TAC[Fan.GRAPH];
7224 DOWN_TAC;
7225 REWRITE_TAC[fan1; fan2];
7226 STRIP_TAC;
7227
7228 ASSUME_TAC2 (ISPECL [` UNIONS (E:(real^3 -> bool) -> bool) `;` V:real^3 -> bool`] FINITE_SUBSET);
7229 DOWN;
7230 REWRITE_TAC[FINITE_UNIONS; REAL_BOUNDS_LT];
7231 STRIP_TAC;
7232 MATCH_MP_TAC EACH_ELM_PRESERVED_IMP_ALLL;
7233
7234 ASM_REWRITE_TAC[];
7235 GEN_TAC;
7236 STRIP_TAC;
7237 SUBGOAL_THEN` (x:real^3 -> bool) HAS_SIZE 2 ` MP_TAC;
7238 DOWN;
7239 ASM_REWRITE_TAC[];
7240 DOWN_TAC;
7241 REWRITE_TAC[fan6; deformation; HAS_SIZE_2_EXISTS2];
7242 STRIP_TAC;
7243 SUBGOAL_THEN` ~collinear ({vec 0: real^3} UNION x)` MP_TAC;
7244 FIRST_X_ASSUM MATCH_MP_TAC;
7245 FIRST_X_ASSUM ACCEPT_TAC;
7246 ASM_REWRITE_TAC[IMAGE_CLAUSES; Local_lemmas.INSERT_UNION2; UNION_EMPTY];
7247 ONCE_REWRITE_TAC[REAL_ARITH` abs t = abs (&0 - t) `];
7248 STRIP_TAC;
7249 MATCH_MP_TAC CONTINUOUS_PRESERVE_COLLINEAR;
7250 ASSUME_TAC2 (SET_RULE` UNIONS E SUBSET V /\ (x:real^3 -> bool) IN E ==> x SUBSET V `);
7251 DOWN;
7252 ASM_REWRITE_TAC[INSERT_SUBSET; EMPTY_SUBSET];
7253 UNDISCH_TAC` !v. (v:real^3) IN V ==> phii v (&0) = v`;
7254 DISCH_THEN NHANH;
7255 ASM_SIMP_TAC[ETA_AX]]);;
7256
7257
7258
7259
7260
7261
7262 (* ================================================================== *)
7263 (* ================================================================== *)
7264
7265
7266 end;;