Update from HH
[Flyspeck/.git] / text_formalization / fan / topology.hl
1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION                                              *)
3 (*                                                                            *)
4 (* Chapter: Fan                                              *)
5 (* Author: Hoang Le Truong                                        *)
6 (* Date: 2010-02-09                                                           *)
7 (* ========================================================================== *)
8
9
10
11 flyspeck_needs "general/sphere.hl";;
12 flyspeck_needs "fan/introduction.hl";;
13
14
15 module Topology  = struct
16
17
18 (*
19 # use "/home/truong/Desktop/googlecode/hol_light/hol.ml";;
20 needs "/home/truong/Desktop/googlecode/hol_light/Multivariate/flyspeck.ml";;
21 needs "/home/truong/Desktop/googlecode/flyspeck/text_formalization/general/sphere.hl";;
22 *)
23
24
25 open Sphere;;
26 open Fan_defs;;
27 open Fan;;
28
29
30
31 let CARD_SIGMA_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3).
32 FAN(x,V,E) ==> 
33 CARD( IMAGE (sigma_fan x V E v) (set_of_edge v V E))= CARD(set_of_edge v V E)
34 `,
35
36 REPEAT GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC CARD_IMAGE_INJ THEN STRIP_TAC
37 THENL[
38 REPEAT GEN_TAC THEN STRIP_TAC THEN
39 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;`x':real^3`]properties_of_set_of_edge_fan)
40   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
41 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;`y:real^3`]properties_of_set_of_edge_fan)
42   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
43 ASM_MESON_TAC[MONO_SIGMA_FAN];
44 POP_ASSUM MP_TAC THEN REWRITE_TAC[FAN;fan1] THEN MESON_TAC[remark_finite_fan1]]);;
45
46
47
48
49
50
51 let MONO_AZIM_SIGMA_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (w:real^3).
52 FAN(x,V,E) /\ ({v,u} IN E)
53 /\ ({v,w} IN E) /\ ~(sigma_fan x V E v w =u)
54 ==> (azim x v u w <= azim x v u (sigma_fan x V E v w))`,
55
56 REPEAT GEN_TAC THEN STRIP_TAC THEN REPEAT(POP_ASSUM MP_TAC) THEN DISCH_THEN (LABEL_TAC"1") 
57 THEN USE_THEN "1" MP_TAC THEN REWRITE_TAC[FAN;fan6] 
58 THEN REPEAT STRIP_TAC
59 THEN REPEAT(POP_ASSUM MP_TAC) THEN DISCH_THEN (LABEL_TAC"1") THEN 
60 DISCH_THEN (LABEL_TAC"a") THEN DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC THEN DISCH_THEN(LABEL_TAC "b")
61   THEN REPEAT STRIP_TAC THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (u:real^3)`;` (v:real^3)`]properties_of_graph) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
62 THEN DISJ_CASES_TAC(SET_RULE`({(w:real^3)}=set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) \/ ~({(w:real^3)}=set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`)
63 THENL(*1*)[
64 ASM_REWRITE_TAC[sigma_fan] THEN REAL_ARITH_TAC;(*1*)
65
66 DISJ_CASES_TAC(SET_RULE`((u:real^3)=(w:real^3))\/ ~(u=w)`)
67 THENL (*2*)[
68
69 ASM_REWRITE_TAC[AZIM_REFL] THEN MESON_TAC[azim];(*2*)
70
71 DISJ_CASES_TAC(SET_RULE`(azim (x:real^3) (v:real^3) (u:real^3) (w:real^3) <= azim (x:real^3) (v:real^3) (u:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)) ) \/ ~(azim (x:real^3) (v:real^3) (u:real^3) (w:real^3) <= azim (x:real^3) (v:real^3) (u:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)) )`)
72   THENL (*3*)[
73 ASM_REWRITE_TAC[];(*3*)
74
75 SUBGOAL_THEN`azim (x:real^3) (v:real^3) (u:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)) 
76 <= azim (x:real^3) (v:real^3) (u:real^3) (w:real^3) ` ASSUME_TAC
77 THENL(*4*)[
78 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;(*4*)
79
80 MP_TAC(ISPECL[`(v:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (u:real^3)`]properties_of_set_of_edge)
81   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
82 MP_TAC(ISPECL[`(v:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (w:real^3)`]properties_of_set_of_edge)
83   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
84   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`]SIGMA_FAN)
85 THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
86   THEN POP_ASSUM MP_TAC THEN DISCH_THEN (LABEL_TAC "c") THEN 
87  SUBGOAL_THEN `{(u:real^3),(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)),(w:real^3)}SUBSET set_of_edge v V E` ASSUME_TAC
88 THENL(*5*)[
89 ASM_TAC THEN SET_TAC[];(*5*)
90
91 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`]CYCLIC_SET_EDGE_FAN) 
92 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
93   THEN MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;`{(u:real^3), (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)),(w:real^3)}`;`set_of_edge(v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)` ]subset_cyclic_set_fan)
94                 THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
95   THEN MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;` (u:real^3)`;`(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))`;` (w:real^3)`]sum2_azim_fan) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
96 THEN  SUBGOAL_THEN `azim (x:real^3) (v:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)) (w:real^3)<= azim x v u w` ASSUME_TAC
97
98 THENL(*6*)[
99 MP_TAC(ISPECL[`x:real^3`; `v:real^3`; `u:real^3`; `sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)`]azim) THEN REPEAT(POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;(*6*)
100
101 POP_ASSUM MP_TAC THEN POP_ASSUM (fun th-> REWRITE_TAC[])THEN  ASM_REWRITE_TAC[] THEN
102 MP_TAC (ISPECL[`(v:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))`]properties_of_set_of_edge)
103 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
104  THEN REMOVE_THEN "b" (fun th->MP_TAC (ISPEC`{(v:real^3),(w:real^3)}`th) THEN ASSUME_TAC(th))
105   THEN POP_ASSUM (fun th->MP_TAC (ISPEC`{(v:real^3),(u:real^3)}`th) THEN ASSUME_TAC(th))
106   THEN POP_ASSUM (fun th->MP_TAC (ISPEC`{(v:real^3),(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))}`th) THEN ASSUME_TAC(th))
107   THEN REWRITE_TAC[SET_RULE`{a} UNION {b,c}={a,b,c}`]
108 THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[]
109   THEN 
110   DISJ_CASES_TAC(REAL_ARITH `(azim (x:real^3)  (v:real^3) (w:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))= &0) \/ ~(azim (x:real^3)  (v:real^3) (w:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)) = &0)`)
111 THENL(*7*)[
112 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`;`(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))`]UNIQUE_AZIM_0_POINT_FAN) 
113 THEN ASM_TAC THEN SET_TAC[];(*7*)
114
115 DISJ_CASES_TAC(REAL_ARITH `(azim (x:real^3)  (v:real^3) (w:real^3) (u:real^3)= &0) \/ ~(azim (x:real^3)  (v:real^3) (w:real^3) (u:real^3) = &0)`)
116
117 THENL(*8*)[ 
118 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`;`(u:real^3)`]UNIQUE_AZIM_0_POINT_FAN) 
119 THEN ASM_TAC THEN SET_TAC[];(*8*)
120
121 MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;`w:real^3`;`(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))`]AZIM_COMPL) 
122 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
123 THEN MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;` (w:real^3)`;` (u:real^3)`]AZIM_COMPL)
124   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[REAL_ARITH`&2 * pi - a<= &2 * pi - (b:real) <=> b<= (a:real)`]
125   THEN REMOVE_THEN "c" (fun th -> MP_TAC(ISPEC `u:real^3` th) ) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN STRIP_TAC
126   THEN SUBGOAL_THEN `azim (x:real^3) (v:real^3) (w:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)) = azim x v  w u` ASSUME_TAC
127
128 THENL(*9*)[
129 POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN  REAL_ARITH_TAC;(*9*)
130
131 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`;`(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))`;`u:real^3`]UNIQUE_AZIM_POINT_FAN) 
132   THEN ASM_REWRITE_TAC[]]]]]]]]]]);;
133
134
135
136
137
138
139
140
141
142
143 let MONO_POWER_SIGMA_FAN=prove(`!(i:num) (j:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
144 FAN(x,V,E) /\ ({v,u} IN E)/\(j<i)/\
145  (power_map_points sigma_fan x V E v u i)= (power_map_points sigma_fan x V E v u j)
146 ==> u=power_map_points sigma_fan x V E v u (i-j)`,
147 INDUCT_TAC THENL
148 [ARITH_TAC;
149
150 INDUCT_TAC THENL
151 [REWRITE_TAC[ARITH_RULE `SUC i- 0 =SUC (i:num)`;power_map_points] THEN ASM_TAC THEN SET_TAC[];
152
153 REWRITE_TAC[ARITH_RULE `SUC (i:num)-SUC (j:num)= i - j`; ARITH_RULE `SUC(j:num) < SUC (i) <=> j < i`;power_map_points]
154   THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC "a") THEN DISCH_TAC
155   THEN REPEAT GEN_TAC THEN STRIP_TAC THEN 
156    MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;` (u:real^3)`]properties_of_set_of_edge_fan)
157   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC 
158   THEN MP_TAC(ISPECL[`(i:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]image_power_map_points) THEN ASM_REWRITE_TAC[]
159   THEN DISCH_TAC
160   THEN MP_TAC(ISPECL[`(j:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]image_power_map_points) THEN ASM_REWRITE_TAC[]
161   THEN DISCH_TAC
162   THEN  MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`]properties_of_set_of_edge_fan)
163   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC 
164   THEN  MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (j:num)`]properties_of_set_of_edge_fan)
165   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC 
166   THEN MP_TAC(ISPECL[` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (j:num)`]MONO_SIGMA_FAN) THEN ASM_REWRITE_TAC[]
167   THEN DISCH_TAC
168   THEN REMOVE_THEN "a"(fun th-> MP_TAC(ISPECL[`(j:num) `;`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]th))
169   THEN ASM_REWRITE_TAC[]]]);;
170
171
172
173
174
175
176 let MONO_POWER_MAP_POINTS1_FAN=prove(`!(i:num)  (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) .
177 FAN(x,V,E) /\ (u IN set_of_edge v V E) /\ ~(set_of_edge v V E={u})
178 ==> ~(power_map_points (sigma_fan) x V E v u i=power_map_points (sigma_fan) x V E v u (SUC i))
179 `,
180 INDUCT_TAC THENL[
181 REWRITE_TAC[power_map_points] THEN REPEAT GEN_TAC THEN STRIP_TAC 
182 THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]SIGMA_FAN) THEN ASM_MESON_TAC[];
183 REPEAT GEN_TAC THEN POP_ASSUM  
184  (fun th-> MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]th))THEN REWRITE_TAC[power_map_points] 
185   THEN STRIP_TAC THEN STRIP_TAC THEN REPEAT(POP_ASSUM MP_TAC)
186 THEN DISCH_THEN (LABEL_TAC "a") THEN DISCH_THEN (LABEL_TAC "b") 
187 THEN USE_THEN "b" MP_TAC THEN REWRITE_TAC[FAN]
188 THEN STRIP_TAC
189 THEN  DISCH_TAC THEN DISCH_TAC 
190 THEN REMOVE_THEN "a" MP_TAC THEN MP_TAC(ARITH_RULE `SUC (i:num)< CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))==> i < CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`)
191 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[] 
192 THEN MATCH_MP_TAC MONO_NOT THEN DISCH_TAC
193   THEN MP_TAC(ISPECL[`(i:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]image_power_map_points) THEN ASM_REWRITE_TAC[]
194   THEN DISCH_TAC
195 THEN MP_TAC(ISPECL[`SUC (i:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]image_power_map_points) THEN ASM_REWRITE_TAC[]
196   THEN DISCH_TAC
197   THEN MP_TAC(ISPECL[` (v:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))`] properties_of_set_of_edge) 
198   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
199 THEN MP_TAC(ISPECL[` (v:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (SUC (i:num)))`] properties_of_set_of_edge) 
200   THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
201   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`;`sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))`]MONO_SIGMA_FAN) 
202 THEN ASM_MESON_TAC[]]);;
203
204
205
206
207
208
209
210
211 let MONO_AZIM_POWER_SIGMA_FAN=prove(`!  (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num).
212 FAN(x,V,E) /\ ({v,u} IN E) /\ ~(power_map_points (sigma_fan) x V E v u (SUC i) = u)
213 ==> azim x v u (power_map_points (sigma_fan) x V E v u i)<= azim x v u (power_map_points (sigma_fan) x V E v u (SUC i))
214 `,
215 REPEAT GEN_TAC THEN STRIP_TAC THEN REPEAT(POP_ASSUM MP_TAC) THEN DISCH_THEN (LABEL_TAC"1") 
216 THEN USE_THEN "1" MP_TAC THEN REWRITE_TAC[FAN;fan6; power_map_points] 
217 THEN REPEAT STRIP_TAC
218 THEN REPEAT(POP_ASSUM MP_TAC) THEN DISCH_THEN (LABEL_TAC"1") THEN REPEAT STRIP_TAC 
219   THEN MP_TAC (ISPECL[`(v:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (u:real^3)`]properties_of_set_of_edge)
220 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
221 THEN MP_TAC(ISPECL[`(i:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]image_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
222 THEN MP_TAC (ISPECL[`(v:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`power_map_points (sigma_fan)(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`]properties_of_set_of_edge)
223 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
224 THEN
225 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`;`power_map_points (sigma_fan)(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`]MONO_AZIM_SIGMA_FAN) THEN ASM_REWRITE_TAC[]);;
226
227
228
229
230
231
232
233
234
235
236
237 (* Proof of Lemma [VBTIKLP] *)
238
239 (*let lemma62=prove(`!x:real^3  (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 w:real^3 w1:real^3. 
240 a IN a_node_fan x V E (x,v,w,w1)==>(?n. a=(x,v,(power_map_points sigma_fan x V E v w n),(power_map_points sigma_fan x V E v w (SUC n))))`,
241 REWRITE_TAC[a_node_fan; IN_ELIM_THM; ] THEN REWRITE_TAC[node_fan] THEN REWRITE_TAC[power_n_fan]);;*)
242
243 (* local definitions *)
244
245 let complement_set= new_definition`complement_set {x:real^3, v:real^3} = {y:real^3| ~(y IN aff {x,v})} `;;
246
247 let subset_aff=prove(`!x:real^3 v:real^3. (aff{x, v} SUBSET (UNIV:real^3->bool))`, REPEAT GEN_TAC THEN SET_TAC[]);;
248
249
250 let union_aff=prove(`!x v:real^3. (UNIV:real^3->bool) = aff{x, v} UNION  complement_set {x, v}  `,
251 REPEAT GEN_TAC  THEN REWRITE_TAC[complement_set] THEN SET_TAC[]);;
252
253 (*---------------------------------------------------------------*)
254 (* the properties of if_azims_fan                                *)
255 (*---------------------------------------------------------------*)
256
257
258
259
260 (* azim pf powers of node map  *)
261
262 let if_azims_fan= new_definition`
263 if_azims_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)
264     = if i = CARD(set_of_edge v V E) 
265         then &2 * pi 
266          else azim x v u (power_map_points sigma_fan x V E v u i)`;;
267
268 let if_azims_works_fan=prove(
269 `!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num).
270 ( &0 <= if_azims_fan x V E v u i) /\  if_azims_fan x V E v u i <= &2 * pi`,
271 REPEAT GEN_TAC THEN REWRITE_TAC[REAL_ARITH `(a:real) <= (b:real) <=> (b >= a)`; if_azims_fan; azim;COND_ELIM_THM] 
272   THEN MP_TAC(ISPECL [`x:real^3`; `v:real^3`; `u:real^3`;
273 `power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`]azim)
274   THEN STRIP_TAC 
275   THEN ASSUME_TAC(PI_WORKS) THEN ASM_REWRITE_TAC[]
276   THEN REPEAT (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);;
277
278
279
280
281 let set_of_orbits_points_fan = new_definition `set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) = {power_map_points sigma_fan x V E v u i| 0<=i }`;;
282
283 let number_of_orbits_fan = new_definition `number_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) = CARD(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))`;;
284
285
286
287 let addition_sigma_fan = prove(`!(m:num) (n:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3). 
288 power_map_points sigma_fan x V E v u (m + n) = (power_map_points sigma_fan x V E v (power_map_points sigma_fan x V E v u  n) m)  `,
289 INDUCT_TAC 
290 THENL [
291 REWRITE_TAC[power_map_points; ARITH_RULE`0 + n:num =n`];
292 REWRITE_TAC[ARITH_RULE` SUC (m:num) + n= SUC(m+n)`; power_map_points] THEN REPEAT GEN_TAC
293   THEN POP_ASSUM(ASSUME_TAC o GSYM o (ISPECL[`(n:num) `;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]))
294                    THEN ASM_TAC THEN SET_TAC[]]);;
295
296
297
298
299
300
301 let fix_point_sigma_fan=prove(`! (q:num) (i:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
302 (power_map_points (sigma_fan) x V E v u i=u) 
303 ==>power_map_points sigma_fan x V E v u (q * i)=u
304 `,
305 INDUCT_TAC THENL[
306 ASM_REWRITE_TAC[ARITH_RULE`0 * i:num = 0`;power_map_points];
307 REWRITE_TAC[ARITH_RULE`SUC q * i:num= q * i + i`] THEN REPEAT GEN_TAC THEN
308  POP_ASSUM(MP_TAC  o (ISPECL[`(i:num) `;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]))
309   THEN DISCH_THEN(LABEL_TAC "a") THEN DISCH_TAC THEN REMOVE_THEN "a" MP_TAC THEN ASM_REWRITE_TAC[addition_sigma_fan]]);;
310
311 let i_IN_ORBITS_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num).
312  power_map_points (sigma_fan) x V E v u i IN set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`,
313 REWRITE_TAC[set_of_orbits_points_fan; IN_ELIM_THM] THEN REPEAT GEN_TAC THEN EXISTS_TAC`i:num` THEN REWRITE_TAC[power_map_points] THEN SIMP_TAC[] THEN ARITH_TAC);;
314
315 let u_IN_ORBITS_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) .
316  u IN set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`,
317 REWRITE_TAC[set_of_orbits_points_fan; IN_ELIM_THM] THEN REPEAT GEN_TAC THEN EXISTS_TAC`0` THEN REWRITE_TAC[power_map_points] THEN SIMP_TAC[] THEN ARITH_TAC);;
318
319
320 let IN_ORBITS_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (w:real^3).
321  w IN set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)
322 ==> sigma_fan x V E v w IN set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`,
323
324 REPEAT GEN_TAC THEN REWRITE_TAC[set_of_orbits_points_fan; IN_ELIM_THM] THEN STRIP_TAC THEN EXISTS_TAC`SUC i` THEN ASM_REWRITE_TAC[power_map_points] THEN ARITH_TAC);;
325
326
327 let ORBITS_SUBSET_EDGE_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) .
328 FAN(x,V,E) /\ ({v,u} IN E)
329 ==> set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) 
330 SUBSET set_of_edge v V E`,
331 REPEAT GEN_TAC THEN STRIP_TAC
332   THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;` (u:real^3)`]properties_of_set_of_edge_fan)
333 THEN  ASM_REWRITE_TAC[set_of_orbits_points_fan;SUBSET; IN_ELIM_THM] THEN DISCH_TAC THEN GEN_TAC THEN STRIP_TAC
334 THEN MP_TAC(ISPECL[`(i:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]image_power_map_points) THEN ASM_REWRITE_TAC[]);;
335
336
337 let CARD_ORBITS_EDGE_FAN_LE=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) .
338 FAN(x,V,E) /\ ({v,u} IN E)
339 ==> CARD(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) )
340 <=CARD( set_of_edge v V E)`,
341 REPEAT GEN_TAC THEN STRIP_TAC
342   THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;` (u:real^3)`]ORBITS_SUBSET_EDGE_FAN)
343   THEN ASM_REWRITE_TAC[] THEN REPEAT (POP_ASSUM MP_TAC)
344 THEN REWRITE_TAC[FAN;fan1] THEN REPEAT STRIP_TAC
345   THEN MP_TAC(ISPECL[`(v:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`] remark_finite_fan1)
346 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC THEN MP_TAC(ISPECL[`set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`;`set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)`]CARD_SUBSET)
347   THEN ASM_REWRITE_TAC[]);;
348
349
350
351
352 let FINITE_ORBITS_SIGMA_FAN=prove( `!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) .
353 FAN(x,V,E) /\ ({v,u} IN E)
354 ==> FINITE(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)) `,
355
356 REPEAT GEN_TAC THEN DISCH_TAC THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;` (u:real^3)`] ORBITS_SUBSET_EDGE_FAN)THEN ASM_REWRITE_TAC[] 
357   THEN POP_ASSUM MP_TAC THEN REWRITE_TAC[FAN;fan1] THEN STRIP_TAC
358   THEN MP_TAC(ISPECL[`(v:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`] remark_finite_fan1)
359   THEN ASM_REWRITE_TAC[] THEN MESON_TAC[FINITE_SUBSET]);;
360
361
362
363 let ORBITS_SIGMA_FAN=prove(`!(i:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) .
364 FAN(x,V,E) /\ ({v,u} IN E)/\
365 (power_map_points (sigma_fan) x V E v u i=u) /\ ~(i=0)
366 ==> set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) =
367 {power_map_points sigma_fan x V E v u j| j < i }
368 `,
369 REPEAT STRIP_TAC THEN REWRITE_TAC[set_of_orbits_points_fan; EXTENSION; IN_ELIM_THM]
370 THEN GEN_TAC THEN EQ_TAC
371 THENL [
372 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
373 FIND_ASSUM (MP_TAC o (SPEC `i':num`) o MATCH_MP DIVMOD_EXIST) `~(i:num = 0)`
374  THEN REPEAT STRIP_TAC
375   THEN EXISTS_TAC`r:num` THEN ASM_REWRITE_TAC[ARITH_RULE`q * (i:num) + r = r+ q * i`;addition_sigma_fan]
376   THEN MP_TAC  (SPECL [`(q:num)`;` (i:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3) `;`(u:real^3)`]fix_point_sigma_fan) THEN ASM_REWRITE_TAC[]
377   THEN DISCH_TAC THEN ASM_REWRITE_TAC[];
378
379 STRIP_TAC THEN EXISTS_TAC `j:num` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC]);;
380
381 (***********lemmas in hypermap.ml***************)
382
383
384 let IMAGE_SEG = prove(`!(n:num) (f:num->A). IMAGE f {i:num | i < n:num}  = {f (i:num) | i < n}`,
385    REPEAT STRIP_TAC
386    THEN REWRITE_TAC[IMAGE; IN_ELIM_THM] THEN ASM_SET_TAC[]);;
387
388 let FINITE_SERIES = prove(`!(n:num) (f:num->A). FINITE {f(i) | i < n}`,
389    REPEAT GEN_TAC
390    THEN ONCE_REWRITE_TAC[SYM(SPECL[`n:num`; `f:num->A`] IMAGE_SEG)]
391    THEN MATCH_MP_TAC FINITE_IMAGE
392    THEN REWRITE_TAC[FINITE_NUMSEG_LT]);;
393
394 let CARD_FINITE_SERIES_LE  = prove(`!(n:num) (f:num->A). CARD {f(i) | i < n} <= n`,
395    REPEAT GEN_TAC
396    THEN ONCE_REWRITE_TAC[SYM(SPECL[`n:num`; `f:num->A`] IMAGE_SEG)]
397    THEN MP_TAC(ISPEC `f:num ->A` (MATCH_MP CARD_IMAGE_LE (SPEC `n:num` FINITE_NUMSEG_LT)))
398    THEN REWRITE_TAC[CARD_NUMSEG_LT]);;
399
400 let LEMMA_INJ = prove(`!(n:num) (f:num->A).(!i:num j:num. i < n /\ j < i ==> ~(f i = f j)) ==> (!i:num j:num. i < n /\ j < n /\ f i = f j ==> i = j)`,
401    REPEAT GEN_TAC
402    THEN DISCH_TAC THEN MATCH_MP_TAC WLOG_LT
403    THEN STRIP_TAC THENL[ARITH_TAC; ALL_TAC]
404    THEN STRIP_TAC THENL[MESON_TAC[]; ALL_TAC]
405    THEN ASM_MESON_TAC[]);;
406
407 let CARD_FINITE_SERIES_EQ  = prove(`!(n:num) (f:num->A). (!i:num j:num. i < n /\  j < i ==> ~(f i = f j)) ==> CARD {f(i) | i < n} = n`,
408    REPEAT GEN_TAC
409    THEN DISCH_THEN (LABEL_TAC "F1" o MATCH_MP LEMMA_INJ)
410    THEN ONCE_REWRITE_TAC[GSYM IMAGE_SEG]
411    THEN GEN_REWRITE_TAC(RAND_CONV o ONCE_DEPTH_CONV) [GSYM (SPEC `n:num` CARD_NUMSEG_LT)]
412    THEN MATCH_MP_TAC CARD_IMAGE_INJ
413    THEN REWRITE_TAC[FINITE_NUMSEG_LT]
414    THEN REWRITE_TAC[IN_ELIM_THM]
415    THEN ASM_REWRITE_TAC[]);;
416
417
418
419 (**************************************)
420
421
422 let CARD_ORBITS_SIGMA_FAN_LE=prove(`!(i:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) .
423 FAN(x,V,E) /\ ({v,u} IN E)/\
424 (power_map_points (sigma_fan) x V E v u i=u) /\ ~(i=0)
425 ==> CARD(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))<=i`,
426
427 REPEAT GEN_TAC THEN STRIP_TAC THEN MP_TAC(ISPECL[`(i:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]ORBITS_SIGMA_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[]
428 THEN MP_TAC(ISPECL[`i:num`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`]CARD_FINITE_SERIES_LE) THEN ASM_TAC THEN SET_TAC[]);;
429
430
431
432
433 let exists_inverse_in_orbits_sigma_fan=prove(`
434 !(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (y:real^3).
435  FAN(x,V,E) /\({v,u} IN E)/\ ~(y IN set_of_orbits_points_fan x V E v u) 
436 ==>
437 (?(w:real^3). (w IN (set_of_orbits_points_fan x V E v u)) /\ ~(w=y) /\
438 (!(w1:real^3). (w1 IN (set_of_orbits_points_fan x V E v u))/\ ~(w1=y) ==> azim1 x v y w <=  azim1 x v y w1))
439 `,
440
441 (let lemma = prove
442    (`!X:real->bool. 
443           FINITE X /\ ~(X = {}) 
444           ==> ?a. a IN X /\ !x. x IN X ==> a <= x`,
445     MESON_TAC[INF_FINITE]) in
446
447 MP_TAC(lemma) THEN DISCH_THEN(LABEL_TAC "a") THEN REPEAT GEN_TAC
448 THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC "ba") 
449 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` (u:real^3)`]properties_of_set_of_edge_fan)
450 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
451 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;` (u:real^3)`]FINITE_ORBITS_SIGMA_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
452 THEN
453 SUBGOAL_THEN `FINITE ((set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) (v:real^3) (u:real^3) DELETE  (y:real^3))` ASSUME_TAC
454 THENL[(*1*)
455
456 ASM_MESON_TAC[FINITE_DELETE_IMP];(*1*)
457 DISJ_CASES_TAC(SET_RULE`(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) DELETE  (y:real^3)={})\/
458  ~(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) DELETE  (y:real^3)={})`)
459 THENL(*2*)[
460 MP_TAC (ISPECL[`y:real^3`;`set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`]DELETE_NON_ELEMENT) 
461   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
462   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;` (u:real^3)`]u_IN_ORBITS_FAN)
463   THEN ASM_TAC THEN SET_TAC[];(*2*)
464 SUBGOAL_THEN`~(IMAGE ( azim1 x v y) (set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) DELETE  (y:real^3))={})` ASSUME_TAC
465 THENL(*3*)[
466 REWRITE_TAC[IMAGE_EQ_EMPTY] THEN ASM_MESON_TAC[];(*3*)
467
468 SUBGOAL_THEN` FINITE (IMAGE (azim1 x v y) (set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) DELETE  (y:real^3)))` ASSUME_TAC
469 THENL(*4*)[
470 ASM_MESON_TAC[FINITE_IMAGE];(*4*)
471
472 REMOVE_THEN "a" (fun th ->MP_TAC(ISPEC `(IMAGE (azim1 x v y) (set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) DELETE  (y:real^3)))` th))
473  THEN ASM_REWRITE_TAC[IMAGE;DELETE;IN_ELIM_THM]THEN STRIP_TAC
474 THEN EXISTS_TAC`x':real^3`
475   THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]]]]));;
476
477
478
479
480
481
482
483
484
485
486 let key_lemma_cyclic_fan=prove(`!(i:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
487 FAN(x,V,E) /\ (0 < i) /\(i< CARD(set_of_edge v V E)) /\ ({v,u} IN E)
488 ==> ~(power_map_points (sigma_fan) x V E v u i=u)
489 `,
490 INDUCT_TAC
491 THENL(*1*)[ARITH_TAC;(*1*)
492 REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[power_map_points] THEN
493 MP_TAC(ISPECL[` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]ORBITS_SUBSET_EDGE_FAN) 
494   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
495   THEN DISJ_CASES_TAC(SET_RULE`(sigma_fan x V E v (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))= u)\/ ~(sigma_fan x V E v (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))= u)`)
496 THENL(*2*)[
497 ASM_REWRITE_TAC[] THEN MP_TAC(ISPECL[`SUC (i:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]CARD_ORBITS_SIGMA_FAN_LE)
498  THEN ASM_REWRITE_TAC[power_map_points; ARITH_RULE`~(SUC i = 0)`] THEN STRIP_TAC
499   THEN SUBGOAL_THEN `CARD(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)) <CARD(set_of_edge v V E)` ASSUME_TAC
500 THENL(*3*)[
501 REPEAT (POP_ASSUM MP_TAC) THEN ARITH_TAC;(*3*)
502
503 SUBGOAL_THEN `set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) PSUBSET set_of_edge v V E` ASSUME_TAC
504 THENL(*4*)[
505 ASM_REWRITE_TAC[PSUBSET] THEN DISJ_CASES_TAC(SET_RULE`(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) = set_of_edge v V E)\/ ~(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) = set_of_edge v V E)`)
506 THENL(*5*)[
507 SUBGOAL_THEN`CARD(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)) =CARD( set_of_edge v V E)`ASSUME_TAC
508 THENL(*6*)[
509 POP_ASSUM(fun th->REWRITE_TAC[th]);(*6*)
510 POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN ARITH_TAC](*6*);(*5*)
511
512 POP_ASSUM(fun th->REWRITE_TAC[th])](*5*);(*4*)
513
514
515 POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[PSUBSET_MEMBER] THEN STRIP_TAC
516   THEN MP_TAC(ISPECL[` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`;`y:real^3`]
517 exists_inverse_in_orbits_sigma_fan)
518   THEN ASM_REWRITE_TAC[] THEN DISJ_CASES_TAC(SET_RULE`(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)={(u:real^3)})\/ ~(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)={(u:real^3)})`)
519 THENL(*5*)[
520 POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"a") 
521   THEN DISCH_THEN(LABEL_TAC "b") THEN DISCH_TAC THEN REMOVE_THEN "a" MP_TAC THEN ASM_REWRITE_TAC[IN_SING] THEN DISCH_TAC
522   THEN REMOVE_THEN "b" MP_TAC THEN ASM_REWRITE_TAC[u_IN_ORBITS_FAN];(*5*)
523
524 ASM_REWRITE_TAC[] THEN STRIP_TAC
525 THEN POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[] THEN
526 DISJ_CASES_TAC(SET_RULE`(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)={(w:real^3)})\/ ~(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)={(w:real^3)})`)
527 THENL(*6*)[
528
529 POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"a") 
530   THEN DISCH_THEN(LABEL_TAC "b") THEN DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC THEN REMOVE_THEN "a" MP_TAC THEN ASM_REWRITE_TAC[IN_SING] THEN DISCH_TAC
531   THEN REMOVE_THEN "b" MP_TAC THEN ASM_REWRITE_TAC[];(*6*)
532
533 MP_TAC(ISPECL[` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;`u:real^3`;` (w:real^3)`]IN_ORBITS_FAN)
534   THEN ASM_REWRITE_TAC[]
535   THEN STRIP_TAC THEN STRIP_TAC
536 THEN POP_ASSUM(fun th->MP_TAC(ISPEC `sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)` th))
537   THEN ASM_REWRITE_TAC[]  
538   THEN DISJ_CASES_TAC(SET_RULE`sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)=(y:real^3) \/ ~(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)=(y:real^3))`)
539 THENL(*7*)[
540 POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"a") THEN DISCH_TAC THEN REMOVE_THEN "a" MP_TAC
541   THEN ASM_REWRITE_TAC[];(*7*)
542
543 ASM_REWRITE_TAC[azim1;REAL_ARITH` (a:real) - b <= a - c <=> c<=b`] THEN STRIP_TAC
544 THEN
545 SUBGOAL_THEN `sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) IN set_of_edge v V E` ASSUME_TAC
546 THENL(*8*)[
547  ASM_TAC THEN SET_TAC[];(*8*)
548
549 SUBGOAL_THEN `(w:real^3) IN set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)` ASSUME_TAC
550 THENL(*9*)[
551  ASM_TAC THEN SET_TAC[];(*9*)
552
553 SUBGOAL_THEN `{(y:real^3),sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3),(w:real^3)} SUBSET set_of_edge v V E` ASSUME_TAC
554
555 THENL(*10*)[
556  ASM_TAC THEN SET_TAC[];(*10*)
557
558 FIND_ASSUM(MP_TAC)`FAN((x:real^3),V,E)` THEN REWRITE_TAC[FAN;fan6] THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN (LABEL_TAC "b") THEN STRIP_TAC THEN
559 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (u:real^3)`;` (v:real^3)`]properties_of_graph) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
560 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`]CYCLIC_SET_EDGE_FAN)
561 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
562   THEN MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;`{(y:real^3),sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3),(w:real^3)}`;`set_of_edge(v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)` ]subset_cyclic_set_fan)
563                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
564 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`y:real^3`;`sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)`;`w:real^3`]sum2_azim_fan) THEN ASM_REWRITE_TAC[]
565   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`y:real^3`;`sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)`]azim) 
566 THEN STRIP_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `azim (x:real^3) (v:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)) (w:real^3) <= azim (x:real^3) (v:real^3) (y:real^3) (w:real^3)`
567 ASSUME_TAC
568 THENL(*11*)[
569 REPEAT(POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;(*11*)
570
571 POP_ASSUM MP_TAC THEN POP_ASSUM(fun th ->REWRITE_TAC[]) THEN ASM_REWRITE_TAC[]  THEN
572 MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` (y:real^3)`]properties_of_set_of_edge_fan)
573 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
574   THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` (w:real^3)`]properties_of_set_of_edge_fan)
575 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
576   THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))`]properties_of_set_of_edge_fan)
577 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
578 THEN
579 DISJ_CASES_TAC(REAL_ARITH `(azim (x:real^3)  (v:real^3) (w:real^3) (y:real^3)= &0) \/ ~(azim (x:real^3)  (v:real^3) (w:real^3) (y:real^3) = &0)`)
580 THENL(*12*)[
581 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`;`(y:real^3)`]UNIQUE_AZIM_0_POINT_FAN)
582 THEN ASM_REWRITE_TAC[];(*12*)
583
584 DISJ_CASES_TAC(REAL_ARITH `(azim (x:real^3)  (v:real^3) (w:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))= &0) \/ ~(azim (x:real^3)  (v:real^3) (w:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)) = &0)`)
585 THENL(*13*)[
586 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`; ` (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))` ]UNIQUE_AZIM_0_POINT_FAN)
587   THEN ASM_REWRITE_TAC[]
588   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`] SIGMA_FAN)
589   THEN ASM_REWRITE_TAC[] THEN  ASM_TAC THEN SET_TAC[];(*13*)
590
591  REMOVE_THEN "b" (fun th->MP_TAC (ISPEC`{(v:real^3),(w:real^3)}`th) THEN ASSUME_TAC(th))
592   THEN POP_ASSUM (fun th->MP_TAC (ISPEC`{(v:real^3),(y:real^3)}`th) THEN ASSUME_TAC(th))
593   THEN POP_ASSUM (fun th->MP_TAC (ISPEC`{(v:real^3),(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))}`th) THEN ASSUME_TAC(th))
594   THEN REWRITE_TAC[SET_RULE`{(a:real^3)} UNION {b,c}={a,b,c}`] THEN ASM_REWRITE_TAC[] 
595   THEN DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC THEN
596 MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;`(w:real^3)`;`(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))`]AZIM_COMPL) 
597 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
598 THEN MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;` (w:real^3)`;` (y:real^3)`]AZIM_COMPL) THEN 
599 ASM_REWRITE_TAC[] THEN  DISCH_TAC 
600 THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_ARITH`(a - (b:real) <= (a:real)- (c:real))<=> c <= b`]
601    THEN STRIP_TAC
602  THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`; `(w:real^3)`] SIGMA_FAN)
603    THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN POP_ASSUM(fun th-> MP_TAC(ISPEC`(y:real^3)`th))
604    THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
605    THEN SUBGOAL_THEN`azim (x:real^3) (v:real^3) (w:real^3) (y:real^3) = azim x v w (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))` ASSUME_TAC
606 THENL(*14*)[
607 POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC  THEN REAL_ARITH_TAC;(*14*)
608
609 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;`(w:real^3)`;` (y:real^3)`; ` (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3))` ]UNIQUE_AZIM_POINT_FAN)
610   THEN ASM_REWRITE_TAC[]
611
612 ]]]]]]]]]]]];
613 ASM_REWRITE_TAC[]]]);;
614
615
616
617
618
619 let cyclic_power_sigma_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) (j:num).
620 FAN(x,V,E) /\ (i< CARD(set_of_edge v V E))  /\ (j<i) /\ ({v,u} IN E)
621 ==> ~(power_map_points (sigma_fan) x V E v u i= power_map_points (sigma_fan) x V E v u j)
622 `,
623
624 REPEAT GEN_TAC THEN STRIP_TAC THEN STRIP_TAC THEN 
625 MP_TAC(ISPECL[`(i:num)`;` (j:num)`;` (x:real^3)`;` (V:real^3->bool)`;
626 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]MONO_POWER_SIGMA_FAN)
627   THEN ASM_REWRITE_TAC[] THEN MP_TAC(ARITH_RULE` j < i ==> 0 < (i:num)-(j:num)`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
628   THEN MP_TAC(ARITH_RULE` (j:num) <(i:num)==> i-j <= i`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
629   THEN MP_TAC(ARITH_RULE` (i :num )-(j:num) <= i /\ i< CARD(set_of_edge (v:real^3)(V:real^3->bool) (E:(real^3->bool)->bool))==> i-j <CARD(set_of_edge (v:real^3)(V:real^3->bool) (E:(real^3->bool)->bool))`)  THEN ASM_REWRITE_TAC[]
630   THEN DISCH_TAC
631   THEN MP_TAC(ISPECL[`(i:num)-(j:num)`;` (x:real^3)`;` (V:real^3->bool)`;
632 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]key_lemma_cyclic_fan)
633   THEN ASM_REWRITE_TAC[] THEN MESON_TAC[]);;
634
635
636
637
638
639 let CARD_SET_OF_ORBITS_POINTS_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
640 FAN(x,V,E) /\ ({v,u} IN E)
641 ==> CARD(set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))= CARD(set_of_edge v V E)`,
642
643 REPEAT GEN_TAC THEN STRIP_TAC THEN 
644 SUBGOAL_THEN`{power_map_points (sigma_fan) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) |i|   (i< CARD(set_of_edge v V E))}
645 SUBSET  set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)
646 `ASSUME_TAC
647 THENL[ REWRITE_TAC[set_of_orbits_points_fan;SUBSET;IN_ELIM_THM]
648  THEN GEN_TAC THEN STRIP_TAC THEN EXISTS_TAC`i:num` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC;
649
650 SUBGOAL_THEN`CARD {power_map_points (sigma_fan) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) |i|   (i< CARD(set_of_edge v V E))}
651 <= CARD  (set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))`
652 ASSUME_TAC
653 THENL[
654 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;
655 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] FINITE_ORBITS_SIGMA_FAN) THEN ASM_REWRITE_TAC[]
656   THEN DISCH_TAC
657   THEN MP_TAC(ISPECL[`{power_map_points (sigma_fan) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) |i|   (i< CARD(set_of_edge v V E))}`;`set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`]CARD_SUBSET) THEN ASM_REWRITE_TAC[];
658
659 MP_TAC(SPECL[`(x:real^3)`;` (V:real^3->bool)`;
660 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]cyclic_power_sigma_fan) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
661   THEN MP_TAC(ISPECL[`CARD(set_of_edge  (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`;`power_map_points (sigma_fan) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`]CARD_FINITE_SERIES_EQ)
662                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
663   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;
664 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]CARD_ORBITS_EDGE_FAN_LE)
665   THEN ASM_REWRITE_TAC[] THEN REPEAT (POP_ASSUM MP_TAC) THEN ARITH_TAC]]);;
666
667
668 let ORBITS_EQ_SET_EDGE_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
669 FAN(x,V,E) /\ ({v,u} IN E)
670 ==>
671 set_of_edge v V E
672 = set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`,
673
674 REWRITE_TAC[SET_RULE`(set_of_edge v V E
675 = set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))<=>  (set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)= set_of_edge v V E) `] THEN
676 REPEAT STRIP_TAC THEN  MATCH_MP_TAC CARD_SUBSET_EQ THEN 
677 STRIP_TAC THENL[REPEAT (POP_ASSUM MP_TAC) THEN REWRITE_TAC[FAN;fan1] THEN MESON_TAC[remark_finite_fan1];
678 ASM_MESON_TAC[ORBITS_SUBSET_EDGE_FAN;CARD_SET_OF_ORBITS_POINTS_FAN]]);;
679
680
681 let SIMP_ORBITS_POINTS_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
682 FAN(x,V,E) /\ ({v,u} IN E)
683 ==>
684 {power_map_points (sigma_fan) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) |i|   (i< CARD(set_of_edge v V E))}
685 = set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)
686 `,
687
688 REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN`{power_map_points (sigma_fan) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) |i|   (i< CARD(set_of_edge v V E))}
689 SUBSET  set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)
690 `ASSUME_TAC
691 THENL[
692  REWRITE_TAC[set_of_orbits_points_fan;SUBSET;IN_ELIM_THM]
693  THEN GEN_TAC THEN STRIP_TAC THEN EXISTS_TAC`i:num` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC;
694
695 POP_ASSUM MP_TAC THEN MP_TAC(SPECL[`(x:real^3)`;` (V:real^3->bool)`;
696 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]cyclic_power_sigma_fan) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
697   THEN MP_TAC(ISPECL[`CARD(set_of_edge  (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`;`power_map_points (sigma_fan) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`]CARD_FINITE_SERIES_EQ)
698                 THEN ASM_REWRITE_TAC[] THEN DISCH_THEN(LABEL_TAC"a")
699   THEN MP_TAC(SPECL[`(x:real^3)`;` (V:real^3->bool)`;
700 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]CARD_SET_OF_ORBITS_POINTS_FAN) THEN ASM_REWRITE_TAC[SET_RULE`a=b<=> b=a`] THEN DISCH_TAC THEN REMOVE_THEN "a" MP_TAC THEN ASM_REWRITE_TAC[] 
701   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;
702 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] FINITE_ORBITS_SIGMA_FAN) THEN ASM_REWRITE_TAC[]
703   THEN MESON_TAC[CARD_SUBSET_EQ]]);;
704
705
706 let ORDER_POWER_SIGMA_FAN=prove(`!(i:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) .
707 FAN(x,V,E) /\ (i=CARD(set_of_edge v V E)) /\ ({v,u} IN E)
708 ==> power_map_points (sigma_fan) x V E v u i= u
709 `,
710 REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `power_map_points (sigma_fan) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) IN  set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)` ASSUME_TAC
711 THENL[
712  REWRITE_TAC[ set_of_orbits_points_fan; IN_ELIM_THM] THEN EXISTS_TAC`i:num` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC;
713
714 POP_ASSUM MP_TAC THEN  MP_TAC(SPECL[`(x:real^3)`;` (V:real^3->bool)`;
715 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]SIMP_ORBITS_POINTS_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
716   THEN POP_ASSUM(fun th->REWRITE_TAC[SYM(th);]) THEN REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC
717                 THEN ASM_REWRITE_TAC[] THEN
718 MP_TAC(ISPECL[`CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`;`i':num`;`(x:real^3)`;` (V:real^3->bool)`;
719 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]MONO_POWER_SIGMA_FAN) THEN ASM_REWRITE_TAC[]
720   THEN DISJ_CASES_TAC(ARITH_RULE`(0<(i':num))\/  i'=0`)
721 THENL[
722 DISCH_TAC THEN
723 MP_TAC(ARITH_RULE`0 < (i':num)/\ i'< CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) ==> (CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))- (i':num) < CARD (set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
724   THEN MP_TAC(ARITH_RULE`(i':num)< CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))==> 0< CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))-i'`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
725                 THEN 
726 MP_TAC(ISPECL[`CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))-(i':num)`; `(x:real^3)`;` (V:real^3->bool)`;
727 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]key_lemma_cyclic_fan)
728   THEN ASM_REWRITE_TAC[] THEN ASM_SET_TAC[];
729
730 ASM_REWRITE_TAC[power_map_points]]]);;
731
732
733
734
735 let SUM_IF_AZIMS_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num).
736 FAN(x,V,E) /\ ({v,u} IN E)
737 /\(0<i)
738 /\   (i< CARD(set_of_edge v V E)) 
739 ==>
740  if_azims_fan x V E v u (SUC i)= if_azims_fan x V E v u i + azim x v ((power_map_points sigma_fan x V E v u i)) (power_map_points sigma_fan x V E v u (SUC i))`,
741 REPEAT GEN_TAC THEN STRIP_TAC 
742 THEN REPEAT (POP_ASSUM MP_TAC) THEN DISCH_THEN (LABEL_TAC"a") THEN USE_THEN "a" MP_TAC 
743   THEN REWRITE_TAC[FAN;fan6] THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN (LABEL_TAC "b") 
744   THEN REPEAT STRIP_TAC
745 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` (u:real^3)`]properties_of_set_of_edge_fan)
746 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
747 THEN
748 MP_TAC(ISPECL[`(i:num)`; `(x:real^3)`;` (V:real^3->bool)`;
749 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] image_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
750 THEN
751 MP_TAC(ISPECL[`SUC(i:num)`; `(x:real^3)`;` (V:real^3->bool)`;
752 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] image_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
753 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`]properties_of_set_of_edge_fan)
754 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
755 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (SUC(i:num))`]properties_of_set_of_edge_fan)
756 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
757    THEN SUBGOAL_THEN `~((i:num)=CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))` ASSUME_TAC
758 THENL(*1*)[
759 REPEAT(POP_ASSUM MP_TAC) THEN ARITH_TAC;(*1*)
760
761 DISJ_CASES_TAC(ARITH_RULE ` SUC (i:num)= CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) \/ ~(SUC i=CARD(set_of_edge v V E))`)
762 THENL(*2*)[
763
764 MP_TAC(ISPECL[`SUC (i:num)`; `(x:real^3)`;` (V:real^3->bool)`;
765 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]ORDER_POWER_SIGMA_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
766 REWRITE_TAC[if_azims_fan] THEN ASM_REWRITE_TAC[] THEN POP_ASSUM (fun th-> REWRITE_TAC[SYM(th)] THEN ASSUME_TAC(th))
767   THEN  REMOVE_THEN "b" (fun th->MP_TAC (ISPEC`{(v:real^3),(u:real^3)}`th) THEN ASSUME_TAC(th))
768   THEN POP_ASSUM (fun th->MP_TAC (ISPEC`{(v:real^3),(power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))}`th) THEN ASSUME_TAC(th))
769   THEN REWRITE_TAC[SET_RULE`{(a:real^3)} UNION {b,c}={a,b,c}`] THEN ASM_REWRITE_TAC[] 
770    THEN DISCH_TAC THEN DISCH_TAC THEN
771 DISJ_CASES_TAC(REAL_ARITH `(azim (x:real^3)  (v:real^3) (u:real^3) (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))= &0) \/ ~(azim (x:real^3)  (v:real^3) (u:real^3) (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) = &0)`)
772 THENL(*3*)[
773
774 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`; ` (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))` ]UNIQUE_AZIM_0_POINT_FAN)
775   THEN ASM_REWRITE_TAC[]
776   THEN  MP_TAC(ISPECL[`i:num`;`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] key_lemma_cyclic_fan)
777   THEN ASM_REWRITE_TAC[] THEN ASM_SET_TAC[];(*3*)
778
779  MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;` (u:real^3)`;` (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))`]AZIM_COMPL) THEN 
780 ASM_REWRITE_TAC[] THEN  DISCH_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC];(*2*)
781
782 ASM_REWRITE_TAC[if_azims_fan] THEN MP_TAC(ARITH_RULE`i:num < CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) /\ ~(SUC(i) = CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))==> SUC(i)<CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
783   THEN ASSUME_TAC(ARITH_RULE`0<SUC(i:num)`)
784   THEN MP_TAC(ISPECL[`SUC(i:num)`;`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] key_lemma_cyclic_fan)
785   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
786   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`;`i:num`]MONO_AZIM_POWER_SIGMA_FAN)
787   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
788   THEN SUBGOAL_THEN `{(u:real^3),power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num),power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (SUC(i:num))} SUBSET set_of_edge v V E` ASSUME_TAC
789 THENL(*3*)[
790 ASM_SET_TAC[];(*3*)
791
792 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (u:real^3)`;` (v:real^3)`]properties_of_graph) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
793 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`]CYCLIC_SET_EDGE_FAN)
794 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
795   THEN MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;`{(u:real^3),power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num),power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (SUC(i:num))}`;`set_of_edge(v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)` ]subset_cyclic_set_fan)
796                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
797 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (SUC(i:num))`]sum2_azim_fan) THEN ASM_REWRITE_TAC[]]]]);;
798
799 let azim_i_fan=new_definition`
800 azim_i_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)
801 = azim x v (power_map_points sigma_fan x V E v u i) (power_map_points sigma_fan x V E v u (SUC i))`;;
802
803
804
805
806 let SUM_EQ_IF_AZIMS_FAN=prove(`!(i:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
807 FAN(x,V,E) /\ ({v,u} IN E)
808 /\ ~(set_of_edge v V E ={u})
809 /\ ~(1=CARD(set_of_edge v V E ))
810 /\   (i< CARD(set_of_edge v V E)) 
811 ==> 
812 sum (0..i) (azim_i_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))
813 = if_azims_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (SUC i)`,
814
815
816 INDUCT_TAC
817 THENL[
818 REPEAT STRIP_TAC THEN
819 ASM_REWRITE_TAC[SUM_CLAUSES_NUMSEG;azim_i_fan;power_map_points;if_azims_fan; ARITH_RULE`SUC 0=1`];
820
821 POP_ASSUM MP_TAC THEN DISCH_THEN (LABEL_TAC "a") 
822 THEN REPEAT STRIP_TAC
823 THEN
824 ASSUME_TAC(ARITH_RULE`0<= SUC (i:num)`)THEN ASSUME_TAC(ARITH_RULE`0< SUC (i:num)`) THEN
825 MP_TAC(ARITH_RULE`SUC (i:num)<CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))==> i< CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`) THEN
826 ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
827 ASM_REWRITE_TAC[SUM_CLAUSES_NUMSEG]
828    THEN REMOVE_THEN"a"(fun th-> MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]th))
829   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
830   THEN ASM_REWRITE_TAC[]
831   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool) `;`(v:real^3) `;`(u:real^3)`;` (SUC(i:num))`]SUM_IF_AZIMS_FAN)
832   THEN ASM_REWRITE_TAC[azim_i_fan] THEN REAL_ARITH_TAC]);;
833
834
835
836
837
838 let SUM_AZIMS_EQ_2PI_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
839 FAN(x,V,E) /\ ({v,u} IN E)
840 /\ ~(set_of_edge v V E ={u})
841 /\ (1<CARD(set_of_edge v V E ))
842 ==> 
843 sum (0..(CARD(set_of_edge v V E )-1)) (azim_i_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))
844 = &2 *pi`,
845 REPEAT STRIP_TAC THEN 
846 MP_TAC(ARITH_RULE`(1<CARD(set_of_edge v V E )) ==> CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))-1 < CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`)
847   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
848 THEN 
849 MP_TAC(ARITH_RULE`(1<CARD(set_of_edge v V E )) ==> ~(1=CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))`)
850   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
851 THEN 
852 MP_TAC(ARITH_RULE`(1<CARD(set_of_edge v V E )) ==> SUC(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))-1)= CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`)
853   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
854 MP_TAC(ISPECL[`CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))-1`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]SUM_EQ_IF_AZIMS_FAN)
855   THEN ASM_REWRITE_TAC[if_azims_fan]);;
856
857
858 let AZIM_LE_POWER_SIGMA_FAN=prove(`!(i:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (j:num).
859 FAN(x,V,E) /\ ({v,u} IN E)
860 /\ ~(set_of_edge v V E ={u})
861 /\ (j<i)
862 /\   (i< CARD(set_of_edge v V E)) 
863 ==>
864  azim x v u (power_map_points sigma_fan x V E v u j) < azim x v u (power_map_points sigma_fan x V E v u i)`,
865 INDUCT_TAC
866 THENL(*1*)[
867 ARITH_TAC;(*1*)
868   
869 REPEAT GEN_TAC THEN STRIP_TAC THEN REPEAT (POP_ASSUM MP_TAC) THEN DISCH_THEN(LABEL_TAC"1") THEN DISCH_THEN (LABEL_TAC"a") THEN USE_THEN "a" MP_TAC 
870   THEN REWRITE_TAC[FAN;fan6] THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN (LABEL_TAC "b") 
871   THEN REPEAT STRIP_TAC
872 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` (u:real^3)`]properties_of_set_of_edge_fan)
873 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
874 THEN
875 MP_TAC(ISPECL[`(i:num)`; `(x:real^3)`;` (V:real^3->bool)`;
876 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] image_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
877 THEN
878 MP_TAC(ISPECL[`SUC(i:num)`; `(x:real^3)`;` (V:real^3->bool)`;
879 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] image_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
880 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`]properties_of_set_of_edge_fan)
881 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
882 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (SUC(i:num))`]properties_of_set_of_edge_fan)
883 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
884
885
886 THEN ASSUME_TAC(ARITH_RULE`i< SUC(i:num)`) THEN ASSUME_TAC(ARITH_RULE`0< SUC(i:num)`) 
887   THEN MP_TAC(ARITH_RULE`SUC(i)< CARD(set_of_edge(v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))==> i< CARD(set_of_edge(v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))`)
888   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
889     THEN  MP_TAC(ISPECL[`SUC(i:num)`;`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] key_lemma_cyclic_fan)
890   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
891    THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`;`i:num`]MONO_AZIM_POWER_SIGMA_FAN)
892   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
893
894 THEN DISJ_CASES_TAC(ARITH_RULE `(j:num)< (i:num) \/ (i <= j)`)
895 THENL[
896 REMOVE_THEN "1" (fun th-> MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`; `(j:num)`] th)) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
897   THEN REPEAT (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
898
899 MP_TAC(ARITH_RULE`(j:num) < SUC(i:num) ==> j <= i`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
900   THEN MP_TAC(ARITH_RULE` (j:num) <= (i:num) /\ i<= j==> j=i`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
901   THEN  ASM_REWRITE_TAC[]
902   THEN SUBGOAL_THEN`~(azim x v u (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) ((i:num))) = azim x v u (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (SUC(i:num))))` ASSUME_TAC
903 THENL[
904 STRIP_TAC THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;`u:real^3`;` power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`;` power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (SUC(i:num))`]UNIQUE_AZIM_POINT_FAN)
905 THEN  ASM_REWRITE_TAC[]
906   THEN MP_TAC(ISPECL[`(i:num)`;`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`]MONO_POWER_MAP_POINTS1_FAN)
907   THEN ASM_REWRITE_TAC[];
908
909 REPEAT(POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC]]]);;
910
911
912
913
914 let SUM_AZIM_POWER_SIGMA_FAN=prove(`!(i:num) (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (j:num).
915 FAN(x,V,E) /\ ({v,u} IN E)
916 /\ ~(set_of_edge v V E ={u})
917 /\ (j<i)
918 /\   (i< CARD(set_of_edge v V E)) 
919 ==>
920  azim x v u (power_map_points sigma_fan x V E v u i)=  azim x v u (power_map_points sigma_fan x V E v u j) + azim x v (power_map_points sigma_fan x V E v u j) (power_map_points sigma_fan x V E v u i)`,
921
922 REPEAT GEN_TAC THEN STRIP_TAC THEN REPEAT (POP_ASSUM MP_TAC) THEN DISCH_THEN (LABEL_TAC"a") THEN USE_THEN "a" MP_TAC 
923   THEN REWRITE_TAC[FAN;fan6] THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN (LABEL_TAC "b") 
924   THEN REPEAT STRIP_TAC
925 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` (u:real^3)`]properties_of_set_of_edge_fan)
926 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
927 THEN
928 MP_TAC(ISPECL[`(i:num)`; `(x:real^3)`;` (V:real^3->bool)`;
929 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] image_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
930 THEN
931 MP_TAC(ISPECL[`(j:num)`; `(x:real^3)`;` (V:real^3->bool)`;
932 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] image_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
933 THEN
934  MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`]properties_of_set_of_edge_fan)
935 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
936 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) ((j:num))`]properties_of_set_of_edge_fan)
937 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
938
939   THEN SUBGOAL_THEN `{(u:real^3),power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (j:num),power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) ((i:num))} SUBSET set_of_edge v V E` ASSUME_TAC
940 THENL[ASM_SET_TAC[];
941
942 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (u:real^3)`;` (v:real^3)`]properties_of_graph) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
943 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`]CYCLIC_SET_EDGE_FAN)
944 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
945   THEN MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;`{(u:real^3),power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (j:num),power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) ((i:num))}`;`set_of_edge(v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)` ]subset_cyclic_set_fan)
946                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
947 THEN
948 MP_TAC(ISPECL[`(i:num)`;` (x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`;` (j:num)`]
949 AZIM_LE_POWER_SIGMA_FAN)
950   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
951
952 MP_TAC(REAL_ARITH`(azim x v u (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) ((j:num))) < azim x v u (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) ((i:num))))==>(azim x v u (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) ((j:num))) <= azim x v u (power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) ((i:num))))`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
953 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (j:num)`;`power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) ((i:num))`]sum2_azim_fan) THEN ASM_REWRITE_TAC[]]);;
954
955
956
957
958
959
960 let SUM1_IFAZIMS_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) (j:num).
961 FAN(x,V,E) /\ ({v,u} IN E)
962 /\ ~(set_of_edge v V E ={u})
963 /\ (j<i)
964 /\   (i< CARD(set_of_edge v V E)) 
965 ==>
966  if_azims_fan x V E v u i= if_azims_fan x V E v u j + azim x v ((power_map_points sigma_fan x V E v u j)) (power_map_points sigma_fan x V E v u i)`,
967
968 REPEAT GEN_TAC THEN STRIP_TAC THEN MP_TAC(ARITH_RULE`(i:num) < CARD(set_of_edge(v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))==> ~(i=CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
969   THEN MP_TAC(ARITH_RULE`(j:num) < i /\(i:num) < CARD(set_of_edge(v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))==> ~(j=CARD(set_of_edge(v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
970   THEN 
971 ASM_REWRITE_TAC[if_azims_fan]
972 THEN
973 ASM_MESON_TAC[SUM_AZIM_POWER_SIGMA_FAN]);;
974
975
976
977
978
979 let ULEKUUB=prove(`(!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) (j:num).
980 FAN(x,V,E) /\ ({v,u} IN E)
981 /\ ~(set_of_edge v V E ={u})
982 /\ (j<i)
983 /\   (i< CARD(set_of_edge v V E)) 
984 ==>
985  if_azims_fan x V E v u i= if_azims_fan x V E v u j + azim x v ((power_map_points sigma_fan x V E v u j)) (power_map_points sigma_fan x V E v u i))
986 /\
987
988 (!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
989 FAN(x,V,E) /\ ({v,u} IN E)
990 /\ ~(set_of_edge v V E ={u})
991 /\ (1<CARD(set_of_edge v V E ))
992 ==> 
993 sum (0..(CARD(set_of_edge v V E )-1)) (azim_i_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))
994 = &2 *pi)
995 `,
996 MESON_TAC[SUM1_IFAZIMS_FAN; SUM_AZIMS_EQ_2PI_FAN]);;
997
998
999
1000
1001
1002 (* g`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3).
1003 FAN(x,V,E)/\ {v,u} IN E
1004 ==> azim_cycle (set_of_edge v V E) x v u=sigma_fan x V E v u`;;*)
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016 (* deprecated, 2011-08-01, thales
1017 let lemma_disjiont_exists_fan2=prove(`!x:real^3  (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 n:num. 
1018  ~(v=x) /\ ~(u=x) /\ (~(collinear {x, v, u})) /\ {v,u} IN E /\ (v IN V) /\ (u IN V) /\ fan (x,V,E)
1019  ==> if_azims_fan x V E v u (0) = &0`,
1020 REPEAT GEN_TAC THEN REWRITE_TAC[fan;fan1] THEN STRIP_TAC 
1021   THEN MP_TAC(ISPECL [`v:real^3`; `(V:real^3->bool)`; `(E:(real^3->bool)->bool)`]remark_finite_fan1)
1022   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1023   THEN SUBGOAL_THEN `(u:real^3) IN set_of_edge (v:real^3) (V:real^3->bool)(E:(real^3->bool)->bool)` ASSUME_TAC
1024   THENL[
1025     REWRITE_TAC[set_of_edge; IN_ELIM_THM] THEN ASM_REWRITE_TAC[];
1026     SUBGOAL_THEN ` ~( 0 = CARD (set_of_edge (v:real^3) (V:real^3->bool)(E:((real^3)->bool)->bool))) ` ASSUME_TAC
1027       THENL[
1028         STRIP_TAC 
1029           THEN MP_TAC(ISPEC `set_of_edge (v:real^3) (V:real^3->bool) (E:((real^3)->bool)->bool)`CARD_EQ_0)
1030           THEN ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]; 
1031         SUBGOAL_THEN `azim (x:real^3) (v:real^3) (u:real^3) (u:real^3)= &0` ASSUME_TAC
1032         THENL[ 
1033           ASM_MESON_TAC[ azim_is_zero_fan];
1034           REWRITE_TAC[if_azims_fan; power_map_points;azim;] THEN ASM_REWRITE_TAC[]]]]);; 
1035
1036
1037
1038
1039
1040
1041 let lemma_disjiont_exists_fan3=prove(
1042 `!x:real^3  (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 y:real^3 n:num. 
1043  ~(v=x) /\ ~(u=x) /\ (~(collinear {x, v, u})) /\ {v,u} IN E /\ (v IN V) /\ (u IN V) /\ fan (x,V,E)
1044  ==> (if_azims_fan x V E v u 0 <= azim x v u y)`,
1045 REPEAT GEN_TAC THEN STRIP_TAC 
1046   THEN MP_TAC(ISPECL[`x:real^3`; `v:real^3`; `u:real^3`; `y:real^3`] azim) 
1047   THEN STRIP_TAC 
1048   THEN MP_TAC(ISPECL[`x:real^3` ; `(V:real^3->bool)`; `(E:(real^3->bool)->bool)` ;`v:real^3` ;`u:real^3`; `n:num`]lemma_disjiont_exists_fan2)
1049   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[azim]);;
1050
1051 *)
1052
1053 let wedge2_fan=new_definition`wedge2_fan (x:real^3)  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) =
1054 {y:real^3 | ( if_azims_fan x V E v u i = azim x v u y)/\ ( y IN complement_set {x, v})}`;;
1055
1056 (*wedge2_fan=aff_gt*)
1057
1058
1059 let affine_hull_2_fan= prove(`(!x:real^3 v:real^3. aff {x , v} = {y:real^3| ?t1:real t2:real. (t1 + t2 = &1 )/\ (y = t1 % x + t2 % v )})`,
1060 REWRITE_TAC[aff;AFFINE_HULL_2] THEN ASM_SET_TAC[]);;
1061
1062 let AFF_GT_1_1 = prove
1063  (`!x v.                                                                     
1064         DISJOINT {x} {v}                                            
1065         ==> aff_gt {x} {v} =                                       
1066              {y | ?t1 t2.                                                     
1067                      &0 < t2 /\
1068                      t1 + t2 = &1 /\                      
1069                      y = t1 % x + t2 % v}`, 
1070   AFF_TAC);;                                                         
1071
1072 let th = prove
1073  (`!x:real^3 v:real^3 u:real^3 w:real^3.
1074         ~collinear {x,v,u} /\ ~collinear{x,v,w}
1075         ==> {y:real^3 | ~collinear {x,v,y} /\ azim x v u w = azim x v u y} = 
1076             aff_gt {x , v} {w}`,
1077   GEOM_ORIGIN_TAC `x:real^3` THEN
1078   GEOM_BASIS_MULTIPLE_TAC 3 `v:real^3` THEN                         
1079   X_GEN_TAC `v:real` THEN ASM_CASES_TAC `v = &0` THENL
1080    [ASM_REWRITE_TAC[VECTOR_MUL_LZERO; INSERT_AC; COLLINEAR_2]; ALL_TAC] THEN
1081   ASM_REWRITE_TAC[VECTOR_MUL_LZERO; REAL_LE_LT] THEN DISCH_TAC THEN
1082   MAP_EVERY X_GEN_TAC [`u:real^3`; `w:real^3`] THEN
1083   ASM_CASES_TAC `w:real^3 = vec 0` THENL
1084    [ASM_REWRITE_TAC[INSERT_AC; COLLINEAR_2]; ALL_TAC] THEN
1085   ASM_CASES_TAC `w:real^3 = v % basis 3` THENL
1086    [ASM_REWRITE_TAC[INSERT_AC; COLLINEAR_2]; ALL_TAC] THEN
1087   ASM_SIMP_TAC[AZIM_SPECIAL_SCALE; COLLINEAR_SPECIAL_SCALE] THEN
1088   ASM_CASES_TAC `w:real^3 = basis 3` THENL
1089    [ASM_REWRITE_TAC[INSERT_AC; COLLINEAR_2]; ALL_TAC] THEN
1090   ASM_SIMP_TAC[AFF_GT_SPECIAL_SCALE; IN_SING; FINITE_INSERT; FINITE_EMPTY] THEN
1091   POP_ASSUM_LIST(K ALL_TAC) THEN REWRITE_TAC[COLLINEAR_BASIS_3; AZIM_ARG] THEN
1092   DISCH_TAC THEN MATCH_MP_TAC EQ_TRANS THEN 
1093   EXISTS_TAC `{y:real^3 | (dropout 3 y:real^2) IN 
1094                           aff_gt {vec 0} {dropout 3 (w:real^3)}}` THEN
1095   CONJ_TAC THENL
1096    [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `y:real^3` THEN
1097     POP_ASSUM MP_TAC THEN
1098     MAP_EVERY SPEC_TAC
1099      [`(dropout 3:real^3->real^2) u`,`u:real^2`;
1100       `(dropout 3:real^3->real^2) v`,`v:real^2`;
1101       `(dropout 3:real^3->real^2) w`,`w:real^2`;
1102       `(dropout 3:real^3->real^2) y`,`y:real^2`] THEN
1103     SIMP_TAC[AFF_GT_1_1; SET_RULE `DISJOINT {x} {y} <=> ~(x = y)`] THEN
1104     REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID; IN_ELIM_THM] THEN
1105     REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN 
1106     ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> a /\ c /\ b`] THEN
1107     REWRITE_TAC[REAL_ARITH `t1 + t2 = &1 <=> t1 = &1 - t2`] THEN
1108     REWRITE_TAC[RIGHT_EXISTS_AND_THM; EXISTS_REFL] THEN
1109     ASM_CASES_TAC `y:real^2 = vec 0` THEN ASM_REWRITE_TAC[] THENL
1110      [ASM_MESON_TAC[VECTOR_MUL_EQ_0; REAL_LT_IMP_NZ]; ALL_TAC] THEN
1111     RULE_ASSUM_TAC(REWRITE_RULE[COMPLEX_VEC_0]) THEN
1112     GEN_REWRITE_TAC LAND_CONV [EQ_SYM_EQ] THEN
1113     ASM_SIMP_TAC[ARG_EQ; COMPLEX_CMUL; COMPLEX_FIELD 
1114      `~(w = Cx(&0)) /\ ~(z = Cx(&0)) ==> ~(w / z = Cx(&0))`] THEN
1115     ASM_SIMP_TAC[COMPLEX_FIELD
1116      `~(u = Cx(&0)) ==> (w / u = x * y / u <=> w = x * y)`];
1117     SUBGOAL_THEN `~(w:real^3 = vec 0) /\ ~(w = basis 3)` ASSUME_TAC THENL
1118      [ASM_MESON_TAC[DROPOUT_BASIS_3; DROPOUT_0]; ALL_TAC] THEN
1119     ASM_SIMP_TAC[AFF_GT_1_1; AFF_GT_2_1; DISJOINT_INSERT; IN_INSERT;
1120                  DISJOINT_EMPTY; NOT_IN_EMPTY] THEN
1121     REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `y:real^3` THEN
1122     REWRITE_TAC[VECTOR_MUL_RZERO; VECTOR_ADD_LID] THEN
1123     ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
1124     GEN_REWRITE_TAC (RAND_CONV o BINDER_CONV) [SWAP_EXISTS_THM] THEN
1125     ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> a /\ c /\ b`] THEN
1126     REWRITE_TAC[REAL_ARITH `t1 + t2 = &1 <=> t1 = &1 - t2`] THEN
1127     REWRITE_TAC[RIGHT_EXISTS_AND_THM; EXISTS_REFL] THEN      
1128     SIMP_TAC[CART_EQ; DIMINDEX_3; FORALL_3; VECTOR_ADD_COMPONENT;
1129              VECTOR_MUL_COMPONENT; BASIS_COMPONENT; ARITH; DIMINDEX_2;
1130              DROPOUT_BASIS_3; FORALL_2; dropout; LAMBDA_BETA] THEN
1131     ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
1132     REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_LID; RIGHT_EXISTS_AND_THM] THEN
1133     REWRITE_TAC[REAL_ARITH `y = t * &1 + s <=> t = y - s`; EXISTS_REFL]]);;
1134
1135
1136
1137 let th1=prove(`(!x:real^3 v:real^3 u:real^3 w:real^3 t1:real t2:real t3:real. (t3 > &0) /\ (t1 + t2 + t3 = &1)
1138 /\ DISJOINT {x,v} {w} /\ ~collinear {x,v,u}/\ ~collinear {x,v,w}
1139  ==> azim x v u w =
1140  azim x v u (t1 % x + t2 % v + t3 % w))`,
1141 REPEAT GEN_TAC THEN STRIP_TAC THEN ASSUME_TAC(AFF_GT_2_1) 
1142 THEN POP_ASSUM(MP_TAC o ISPECL [`x:real^3`;`v:real^3`;`w:real^3`]) 
1143   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
1144 THEN ABBREV_TAC `(y:real^3)= (t1:real)  % (x:real^3) + (t2:real) % (v:real^3) + (t3:real) % (w:real^3)`
1145       THEN SUBGOAL_THEN `(y:real^3) IN aff_gt {(x:real^3),(v:real^3)} {w:real^3}` ASSUME_TAC
1146 THENL[
1147 ASM_REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `t1:real` 
1148 THEN EXISTS_TAC `t2:real` THEN EXISTS_TAC `t3:real`
1149 THEN EXPAND_TAC "y" THEN ASM_MESON_TAC[REAL_ARITH`(a:real)> &0 <=> &0 < a ` ];
1150                                                 
1151  POP_ASSUM MP_TAC THEN
1152 ASSUME_TAC(th) THEN POP_ASSUM(MP_TAC o ISPECL [`x:real^3`;`v:real^3`;`u:real^3`;`w:real^3`]) 
1153   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM (fun th-> REWRITE_TAC[SYM(th)]) 
1154 THEN REWRITE_TAC[IN_ELIM_THM] THEN ASM_SET_TAC[]]);;
1155
1156   let th2= prove(`!x:real^3 v:real^3 w:real^3. ~(x=v)==>  (w IN complement_set {x,v}==> ~ collinear {x,v,w})`,   
1157 REPEAT GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[CONTRAPOS_THM; COLLINEAR_3;COLLINEAR_LEMMA; complement_set; IN_ELIM_THM;affine_hull_2_fan] THEN STRIP_TAC
1158 THENL[
1159 ASM_MESON_TAC[VECTOR_ARITH`(x-v= vec 0)<=> (x=v)`];
1160  EXISTS_TAC `&0` THEN EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_ARITH`&0+ &1 = &1`; VECTOR_ARITH`&0 % x= vec 0`; VECTOR_ARITH`w=vec 0 + &1 % v <=> w - v = vec 0`] THEN ASM_SET_TAC[];
1161 EXISTS_TAC `c:real` THEN EXISTS_TAC `&1 - (c:real)` THEN REWRITE_TAC[REAL_ARITH`c+ &1 - c = &1`; VECTOR_ARITH`w=c % x  + (&1 - c) % v <=> w - v = c % (x-v)`] THEN ASM_SET_TAC[]]);;
1162
1163
1164
1165
1166
1167 let COMPLEMENT_SET_FAN=prove(`!x:real^3 v:real^3 u:real^3 y:real^3 w:real^3 t1:real t2:real t3:real. 
1168 ~( w IN aff {x, v}) /\ ~(t3 = &0) /\ (t1 + t2 + t3 = &1)
1169 ==> t1 % x + t2 % v + t3 % w IN
1170  complement_set {x, v}`,
1171  REPEAT GEN_TAC THEN ASSUME_TAC(affine_hull_2_fan) THEN STRIP_TAC THEN 
1172 REWRITE_TAC[complement_set; IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN 
1173 REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN REPEAT(POP_ASSUM MP_TAC) THEN DISCH_TAC THEN ASM_REWRITE_TAC[]
1174   THEN REWRITE_TAC[IN_ELIM_THM] THEN REPEAT DISCH_TAC THEN
1175   SUBGOAL_THEN  ` (t3:real) % w =((t1':real)- (t1:real)) % (x:real^3) + ((t2':real)- (t2:real)) % (v:real^3) ` ASSUME_TAC
1176  THENL
1177   [POP_ASSUM MP_TAC THEN VECTOR_ARITH_TAC;
1178    REPEAT(POP_ASSUM MP_TAC) THEN DISCH_THEN(LABEL_TAC "b") THEN DISCH_THEN(LABEL_TAC "c") THEN DISCH_THEN(LABEL_TAC "d")
1179      THEN REPEAT STRIP_TAC THEN USE_THEN "c" MP_TAC THEN REWRITE_TAC[CONTRAPOS_THM] THEN
1180      EXISTS_TAC `((t1':real) - (t1:real))/(t3:real)` THEN EXISTS_TAC `((t2':real) - (t2:real))/(t3:real)`
1181      THEN SUBGOAL_THEN  `((t1':real) - (t1:real))/(t3:real)+ ((t2':real) - (t2:real))/(t3:real) = &1` ASSUME_TAC  THENL
1182         [REWRITE_TAC[real_div] THEN REWRITE_TAC[REAL_ARITH `a*b+c*b=(a+c)*b`] THEN
1183         SUBGOAL_THEN `(t1':real) - (t1:real) + (t2':real) - (t2:real) - (t3:real) = &0` ASSUME_TAC THENL
1184            [REPEAT (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
1185             SUBGOAL_THEN `(t1':real) - (t1:real) + (t2':real) - (t2:real) = (t3:real)` ASSUME_TAC THENL
1186               [POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
1187                ASM_MESON_TAC[REAL_MUL_RINV]]]; 
1188        ASM_REWRITE_TAC[] THEN REWRITE_TAC[real_div] THEN
1189        REWRITE_TAC[VECTOR_ARITH ` (((t1':real) - (t1:real)) * inv (t3:real)) % (x:real^3) + (((t2':real) - (t2:real)) * inv t3) % (v:real^3) = inv t3 % ((t1' - t1) % x + (t2' - t2) % v)`] THEN 
1190        SUBGOAL_THEN `(t3:real) % (w:real^3) = t3 %( inv t3 % (((t1':real) - (t1:real)) % (x:real^3) + ((t2':real) - (t2:real)) % (v:real^3)))` ASSUME_TAC  THENL
1191                   [REWRITE_TAC[VECTOR_ARITH ` (t3:real) % (inv t3 % (((t1':real) - (t1:real)) % (x:real^3) + ((t2':real) - (t2:real)) % (v:real^3)))= (t3 * inv t3) % ((t1' - t1) % x + (t2' - t2)  % v) `] THEN
1192                    SUBGOAL_THEN `((t3:real) * inv (t3:real) = &1) ` ASSUME_TAC THENL
1193                                   [ASM_MESON_TAC[REAL_MUL_RINV]; 
1194                                     ASM_REWRITE_TAC[]  THEN VECTOR_ARITH_TAC];
1195                  ASM_MESON_TAC[VECTOR_MUL_LCANCEL_IMP]]]]);;
1196
1197
1198 let aff_gt_subset_wedge_fan2=prove(`!x:real^3  (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 i:num.  
1199  ~(i= CARD (set_of_edge v V E))
1200 /\  ~collinear {x,v,u} /\ ~collinear {x,v, power_map_points sigma_fan x V E v u i}
1201 ==> 
1202  aff_gt {x , v} {power_map_points sigma_fan x V E v u i}  SUBSET wedge2_fan x V E v u i `,
1203
1204 REWRITE_TAC[SUBSET] THEN REPEAT GEN_TAC THEN 
1205 ASSUME_TAC(affine_hull_2_fan)
1206 THEN STRIP_TAC THEN ASSUME_TAC(th3) 
1207 THEN  POP_ASSUM (MP_TAC o ISPECL [`x:real^3`;`v:real^3`;`(power_map_points sigma_fan (x:real^3)  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))`]) 
1208 THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
1209 THEN ASSUME_TAC(AFF_GT_2_1) 
1210   THEN  POP_ASSUM (MP_TAC o ISPECL [`x:real^3`;`v:real^3`;`(power_map_points sigma_fan (x:real^3)  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))`]) 
1211 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[] 
1212 THEN GEN_TAC THEN REWRITE_TAC[wedge2_fan; IN_ELIM_THM; LEFT_IMP_EXISTS_THM] THEN 
1213 REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN SUBGOAL_THEN `~((t3:real) = &0)` ASSUME_TAC
1214 THENL
1215    [REPEAT (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
1216 ASSUME_TAC(th1) 
1217 THEN POP_ASSUM( MP_TAC o ISPECL[`x:real^3`;` v:real^3`;` u:real^3`;` power_map_points sigma_fan x V E v u i` ;`t1:real` ;`t2:real` ;`t3:real`])
1218   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
1219 SUBGOAL_THEN `t1 % x + t2 % v + t3 % power_map_points sigma_fan x V E v u i IN
1220  complement_set {x, v}` ASSUME_TAC
1221 THENL
1222       [ASM_MESON_TAC[COMPLEMENT_SET_FAN];
1223 ASM_REWRITE_TAC[] THEN REWRITE_TAC[if_azims_fan;]
1224 THEN ASM_MESON_TAC[REAL_ARITH`((t3:real)> &0) <=> (&0 < t3)`]]]);;
1225
1226
1227
1228 let wedge_fan2_subset_aff_gt=prove(`!x:real^3  (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 i:num. 
1229  ~collinear {x,v,u} /\ ~collinear {x, v, power_map_points sigma_fan x V E v u i}
1230 /\  ~(i= CARD (set_of_edge v V E)) 
1231 ==>
1232 wedge2_fan x V E v u i SUBSET aff_gt {x , v} {power_map_points sigma_fan x V E v u i}`,
1233 REPEAT GEN_TAC THEN 
1234 ASSUME_TAC(affine_hull_2_fan) THEN
1235 STRIP_TAC THEN ASSUME_TAC(th3) 
1236 THEN  POP_ASSUM (MP_TAC o ISPECL [`x:real^3`;`v:real^3`;`(power_map_points sigma_fan (x:real^3)  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))`]) 
1237 THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
1238 THEN ASSUME_TAC(AFF_GT_2_1) 
1239   THEN  POP_ASSUM (MP_TAC o ISPECL [`x:real^3`;`v:real^3`;`(power_map_points sigma_fan (x:real^3)  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))`])
1240 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[]
1241  THEN REWRITE_TAC[SUBSET] THEN GEN_TAC 
1242   THEN REWRITE_TAC[wedge2_fan;IN_ELIM_THM] THEN REWRITE_TAC[if_azims_fan; azim] THEN ASM_REWRITE_TAC[]
1243 THEN STRIP_TAC
1244   THEN ASSUME_TAC(th2) THEN POP_ASSUM(MP_TAC o ISPECL[`x:real^3`; `v:real^3`;`x':real^3`]) 
1245 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1246   THEN ASSUME_TAC(th)
1247 THEN POP_ASSUM (MP_TAC o SPECL [`x:real^3`;`v:real^3`;`u:real^3`;`(power_map_points sigma_fan x  (V:real^3->bool) (E:(real^3->bool)->bool) v u (i:num)):real^3`;]) THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[EXTENSION] THEN DISCH_TAC 
1248   THEN POP_ASSUM (MP_TAC o ISPEC `x':real^3`)THEN  
1249  REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[]);;
1250
1251
1252
1253 let wedge_fan2_equal_aff_gt=prove(
1254 ` !x:real^3  (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 i:num.
1255  ~collinear {x,v,u} /\ ~collinear {x, v, power_map_points sigma_fan x V E v u i}
1256 /\  ~(i= CARD (set_of_edge v V E)) 
1257 ==>
1258  wedge2_fan x V E v u i = aff_gt {x , v} {power_map_points sigma_fan x V E v u i}    `,
1259 REPEAT GEN_TAC THEN STRIP_TAC THEN
1260 SUBGOAL_THEN `wedge2_fan x V E v u i SUBSET aff_gt {x , v} {power_map_points sigma_fan x V E v u i}` ASSUME_TAC
1261 THENL
1262   [ ASM_MESON_TAC[ wedge_fan2_subset_aff_gt;aff_gt_subset_wedge_fan2];
1263    SUBGOAL_THEN `
1264       aff_gt {(x:real^3), (v:real^3)} {power_map_points sigma_fan (x:real^3)  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)}  SUBSET wedge2_fan (x:real^3) V E (v:real^3) (u:real^3) (i:num)` ASSUME_TAC
1265 THENL[ASM_MESON_TAC[aff_gt_subset_wedge_fan2];
1266       ASM_SET_TAC[]]]);;
1267
1268
1269 let wedge_fan2_equal_aff_gt_fan=prove(` !x:real^3  (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 i:num.
1270 FAN(x,V,E)/\ ({v,u} IN E)
1271 /\  ~(i= CARD (set_of_edge v V E)) 
1272 ==>
1273  wedge2_fan x V E v u i = aff_gt {x , v} {power_map_points sigma_fan x V E v u i}    `,
1274
1275  REPEAT GEN_TAC THEN STRIP_TAC THEN REPEAT (POP_ASSUM MP_TAC) THEN DISCH_THEN (LABEL_TAC"a") THEN USE_THEN "a" MP_TAC 
1276   THEN REWRITE_TAC[FAN;fan6] THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN (LABEL_TAC "b") 
1277   THEN REPEAT STRIP_TAC
1278 THEN MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` (u:real^3)`]properties_of_set_of_edge_fan)
1279 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC
1280 THEN
1281 MP_TAC(ISPECL[`(i:num)`; `(x:real^3)`;` (V:real^3->bool)`;
1282 ` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`] image_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1283 THEN
1284  MP_TAC (ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`(v:real^3)`;` power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`]properties_of_set_of_edge_fan)
1285 THEN  ASM_REWRITE_TAC[] THEN DISCH_TAC THEN USE_THEN "b" (fun th-> MP_TAC(ISPEC`{(v:real^3),(u:real^3)}`th))  THEN REMOVE_THEN "b" (fun th-> MP_TAC(ISPEC`{(v:real^3),(power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))}`th)) THEN ASM_REWRITE_TAC[SET_RULE`{a} UNION {b,c}={a,b,c}`] THEN DISCH_TAC THEN DISCH_TAC THEN ASM_MESON_TAC[wedge_fan2_equal_aff_gt]);;
1286
1287
1288
1289
1290
1291
1292 (*****wedge3_fan=w_dart_fan*******)
1293
1294 let wedge3_fan=new_definition`wedge3_fan (x:real^3)  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) =
1295 {y:real^3 | ( if_azims_fan x V E v u (i) < azim x v u y)/\
1296 (azim x v u y < if_azims_fan x V E v u (SUC i)) /\( y IN complement_set {x, v})}`;;
1297
1298
1299
1300
1301
1302
1303
1304
1305 let w_dart_eq_wedge3_fan=prove(` !x:real^3  (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 i:num.
1306  FAN(x,V,E) /\ ({v,u} IN E)
1307 /\  (i< CARD (set_of_edge v V E))  
1308 /\ CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))> 1
1309 ==>
1310 w_dart_fan x V E (x,v,power_map_points sigma_fan x V E v u i, power_map_points sigma_fan x V E v u (SUC i))
1311 = wedge3_fan x V E v u i`,
1312
1313 REPEAT GEN_TAC THEN STRIP_TAC 
1314   THEN REPEAT (POP_ASSUM MP_TAC) THEN DISCH_THEN(LABEL_TAC "a") THEN USE_THEN "a" MP_TAC THEN REWRITE_TAC[FAN;fan6] THEN
1315 STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"1") THEN REPEAT STRIP_TAC
1316 THEN MP_TAC(ISPECL[`x:real^3 `;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` u:real^3`;` v:real^3`]th4) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1317 THEN
1318 ASM_REWRITE_TAC[w_dart_fan;wedge;wedge3_fan;complement_set; IN_ELIM_THM;collinear_fan]
1319   THEN DISJ_CASES_TAC(ARITH_RULE`i=0 \/ 0< (i:num)`)
1320 THENL[
1321
1322 MP_TAC(ARITH_RULE`CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))  >  1 ==> ~(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))= 0)/\ ~(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))=1)`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
1323 ASM_REWRITE_TAC[power_map_points;if_azims_fan;ARITH_RULE`SUC 0 =1`;AZIM_REFL;]  THEN ASM_REWRITE_TAC[] THEN ASM_SET_TAC[];
1324
1325 MP_TAC(ARITH_RULE`(i:num)<CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))==> ~(i=CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
1326  MP_TAC(ISPECL[`x:real^3 `;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` v:real^3`;` u:real^3`;`i:num`]SUM_IF_AZIMS_FAN)
1327    THEN ASM_REWRITE_TAC[] THEN DISCH_THEN(LABEL_TAC "bc") THEN ASM_REWRITE_TAC[if_azims_fan;EXTENSION;IN_ELIM_THM] THEN GEN_TAC THEN EQ_TAC
1328 THENL[
1329
1330 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN MP_TAC(REAL_ARITH`azim (x:real^3) (v:real^3) ( power_map_points sigma_fan (x:real^3)
1331  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) (x':real^3) < azim (x:real^3) (v:real^3) 
1332 ( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) 
1333 (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1334  (power_map_points sigma_fan (x:real^3) (V:real^3->bool) 
1335 (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) )
1336 ==> azim (x:real^3) (v:real^3) (u:real^3) ( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)
1337  (v:real^3) (u:real^3) (i:num)) + azim (x:real^3) (v:real^3) ( power_map_points sigma_fan (x:real^3) (V:real^3->bool)
1338  (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) (x':real^3)< azim (x:real^3) (v:real^3) (u:real^3) 
1339 ( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))
1340  + azim (x:real^3) (v:real^3) ( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1341  (u:real^3) (i:num)) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)  
1342 ( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) )`)
1343   THEN ASM_REWRITE_TAC[] 
1344 THEN REMOVE_THEN "bc" MP_TAC THEN  GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o REDEPTH_CONV) [if_azims_fan;power_map_points]
1345  THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
1346 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)]) THEN DISCH_TAC
1347   THEN ASSUME_TAC (ISPECL[`x:real^3 `;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` v:real^3`;` u:real^3`;`SUC i:num`]if_azims_works_fan)
1348   THEN MP_TAC(REAL_ARITH`azim (x:real^3) (v:real^3) (u:real^3) ( power_map_points sigma_fan (x:real^3)
1349  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) + azim (x:real^3) (v:real^3) 
1350 ( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) 
1351 (x':real^3)< if_azims_fan  (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)
1352  (v:real^3) (u:real^3) (SUC(i:num)) /\ if_azims_fan  (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)
1353  (v:real^3) (u:real^3) (SUC(i:num)) <= &2 *pi ==>  azim (x:real^3) (v:real^3) (u:real^3) 
1354 ( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))
1355  + azim (x:real^3) (v:real^3) ( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1356  (u:real^3) (i:num)) (x':real^3)< &2 * pi`)
1357   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`x':real^3`]collinear_fan) THEN ASM_REWRITE_TAC[]
1358   THEN DISCH_TAC
1359   THEN MP_TAC(ISPECL[`i:num`;`x:real^3 `;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` v:real^3`;` u:real^3`]IN2_ORBITS_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1360   THEN MP_TAC(ISPECL[`SUC(i:num)`;`x:real^3 `;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` v:real^3`;` u:real^3`]IN2_ORBITS_FAN) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1361   THEN REMOVE_THEN "1" (fun th-> MP_TAC(ISPEC`{(v:real^3),(u:real^3)}`th)THEN ASSUME_TAC(th))
1362   THEN POP_ASSUM (fun th-> MP_TAC(ISPEC`{(v:real^3),( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1363  (u:real^3) (i:num))}`th)) THEN ASM_REWRITE_TAC[SET_RULE`{a}UNION {b,c}={a,b,c}`]THEN DISCH_TAC THEN DISCH_TAC
1364   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1365  (u:real^3) (i:num))`; `x':real^3`]sum3_azim_fan) THEN ASM_REWRITE_TAC[]
1366   THEN DISCH_TAC THEN ASM_REWRITE_TAC[]
1367   THEN ASM_REWRITE_TAC[REAL_ARITH`(a:real) < a +b <=> &0 < b`; REAL_ARITH`(a:real) + c< a +b<=> c< b`;];
1368
1369 STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC 
1370   THEN DISCH_THEN(LABEL_TAC"ma1") THEN DISCH_THEN(LABEL_TAC"ma2") THEN DISCH_TAC
1371 THEN ASM_REWRITE_TAC[] THEN
1372 MP_TAC(REAL_ARITH`azim (x:real^3) (v:real^3) (u:real^3) ( power_map_points sigma_fan (x:real^3)
1373  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) < azim (x:real^3) (v:real^3) (u:real^3) 
1374 (x':real^3) 
1375 ==> azim (x:real^3) (v:real^3) (u:real^3) ( power_map_points sigma_fan (x:real^3)
1376  (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)) <= azim (x:real^3) (v:real^3) (u:real^3) 
1377 (x':real^3) 
1378 `)
1379   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1380 THEN
1381  MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`x':real^3`]collinear_fan) THEN ASM_REWRITE_TAC[]
1382   THEN DISCH_TAC
1383   THEN MP_TAC(ISPECL[`i:num`;`x:real^3 `;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` v:real^3`;` u:real^3`]IN2_ORBITS_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1384   THEN MP_TAC(ISPECL[`SUC(i:num)`;`x:real^3 `;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` v:real^3`;` u:real^3`]IN2_ORBITS_FAN) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1385   THEN REMOVE_THEN "1" (fun th-> MP_TAC(ISPEC`{(v:real^3),(u:real^3)}`th)THEN ASSUME_TAC(th))
1386   THEN POP_ASSUM (fun th-> MP_TAC(ISPEC`{(v:real^3),( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1387  (u:real^3) (i:num))}`th)) THEN ASM_REWRITE_TAC[SET_RULE`{a}UNION {b,c}={a,b,c}`]THEN DISCH_TAC THEN DISCH_TAC
1388   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1389  (u:real^3) (i:num))`; `x':real^3`]sum4_azim_fan) THEN ASM_REWRITE_TAC[]
1390   THEN DISCH_TAC 
1391   THEN REMOVE_THEN "ma1" MP_TAC THEN REMOVE_THEN "ma2" MP_TAC 
1392 THEN ASM_REWRITE_TAC[power_map_points] THEN REAL_ARITH_TAC]]);; 
1393
1394
1395
1396
1397
1398
1399
1400
1401 let UNION_FAN=prove(
1402 `!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (u:real^3).
1403 FAN(x,V,E)/\ ({v,u}IN E)
1404 ==> 
1405  (UNIV:real^3->bool) = aff {x,v} UNION (UNIONS {wedge3_fan x V E v u i|i| 0 <= i /\ i< CARD(set_of_edge v V E) })
1406 UNION
1407  (UNIONS {wedge2_fan x V E v u i|i| 0 <= i /\ i< CARD(set_of_edge v V E) } )
1408 `,
1409
1410 REPEAT STRIP_TAC THEN REWRITE_TAC[EXTENSION; UNION;IN_ELIM_THM] THEN  GEN_TAC THEN EQ_TAC
1411 THENL(*1*)[
1412 STRIP_TAC THEN DISJ_CASES_TAC(SET_RULE`(x':real^3) IN aff {(x:real^3),(v:real^3)} \/ ~((x':real^3) IN aff {x,v})`)
1413 THENL(*2*)[
1414 ASM_SET_TAC[];(*2*)
1415
1416 ASM_REWRITE_TAC[]
1417   THEN DISJ_CASES_TAC(SET_RULE`(x':real^3) IN (UNIONS {wedge2_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)|i| 0 <= i /\ i< CARD(set_of_edge v V E)} )
1418  \/ ~((x':real^3) IN (UNIONS {wedge2_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)|i| 0 <= i/\ i< CARD(set_of_edge v V E)}) )`)
1419 THENL(*3*)[
1420 ASM_REWRITE_TAC[];(*3*)
1421 ASM_REWRITE_TAC[]
1422   THEN POP_ASSUM MP_TAC THEN REWRITE_TAC[UNIONS;IN_ELIM_THM;NOT_EXISTS_THM;DE_MORGAN_THM;ARITH_RULE `(0 <= (i:num))`] 
1423   THEN DISCH_TAC THEN SUBGOAL_THEN`!i:num. ~((x':real^3) IN wedge2_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num))\/ ~(i< CARD(set_of_edge v V E)) ` ASSUME_TAC
1424 THENL(*4*)[
1425 ASM_SET_TAC[];(*4*)
1426
1427 POP_ASSUM MP_TAC THEN REWRITE_TAC[wedge2_fan;IN_ELIM_THM] THEN DISCH_THEN(LABEL_TAC"100")
1428   THEN SUBGOAL_THEN`(~((x':real^3) IN set_of_orbits_points_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)))` ASSUME_TAC
1429 THENL(*5*)[
1430 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`]SIMP_ORBITS_POINTS_FAN) THEN ASM_REWRITE_TAC[]
1431   THEN DISCH_TAC
1432   THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])
1433   THEN REWRITE_TAC[IN_ELIM_THM] THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"a") THEN STRIP_TAC
1434   THEN REMOVE_THEN "a"(fun th-> MP_TAC(ISPEC`i:num`th))
1435   THEN MP_TAC(ARITH_RULE`(i:num) < CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))==> ~(i=CARD(set_of_edge v V E))`) 
1436   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
1437   THEN ASM_REWRITE_TAC[if_azims_fan;complement_set; IN_ELIM_THM]
1438   THEN ASM_MESON_TAC[remark_power_map_points];(*5*)
1439
1440 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`]SIMP_ORBITS_POINTS_FAN) THEN ASM_REWRITE_TAC[]
1441   THEN DISCH_THEN(LABEL_TAC"a")
1442   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;`x':real^3`]exists_inverse_in_orbits_sigma_fan) THEN ASM_REWRITE_TAC[azim1]
1443   THEN STRIP_TAC
1444   THEN POP_ASSUM MP_TAC  THEN POP_ASSUM MP_TAC 
1445   THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"b")
1446 THEN DISCH_TAC THEN DISCH_TAC
1447   THEN   REMOVE_THEN "b" MP_TAC
1448   THEN REMOVE_THEN  "a"(fun th->REWRITE_TAC[SYM(th)] THEN ASSUME_TAC(th)) 
1449   THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"a") THEN DISCH_TAC
1450   THEN REWRITE_TAC[IN_ELIM_THM]
1451   THEN STRIP_TAC   
1452   THEN EXISTS_TAC`wedge3_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num)`
1453   THEN STRIP_TAC
1454 THENL(*6*)[
1455 EXISTS_TAC`i:num` THEN ASM_REWRITE_TAC[];(*6*)
1456
1457 ASM_REWRITE_TAC[wedge3_fan; complement_set; IN_ELIM_THM;]
1458   THEN SUBGOAL_THEN`if_azims_fan x (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3) (i:num) < azim (x:real^3) v u (x':real^3)` ASSUME_TAC
1459 THENL(*7*)[
1460 MP_TAC(ARITH_RULE`(i:num) < CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))==> ~(i=CARD(set_of_edge v V E))`) 
1461   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
1462   THEN ASM_REWRITE_TAC[if_azims_fan;complement_set; IN_ELIM_THM]
1463   THEN POP_ASSUM MP_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)] THEN ASSUME_TAC(th)) THEN POP_ASSUM MP_TAC
1464 THEN DISJ_CASES_TAC(ARITH_RULE`(i:num)=0 \/ 0< i`)
1465 THENL(*8*)[
1466
1467 ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC THEN ASM_REWRITE_TAC[AZIM_REFL] 
1468   THEN POP_ASSUM (fun th->REWRITE_TAC[])
1469   THEN POP_ASSUM (fun th->REWRITE_TAC[]) 
1470   THEN POP_ASSUM (fun th->REWRITE_TAC[])
1471   THEN POP_ASSUM (fun th->REWRITE_TAC[])
1472   THEN POP_ASSUM (fun th->REWRITE_TAC[])
1473   THEN POP_ASSUM (fun th->REWRITE_TAC[]) 
1474   THEN POP_ASSUM (fun th->REWRITE_TAC[])
1475   THEN POP_ASSUM (fun th->MP_TAC(ISPEC`0`th)) THEN DISCH_THEN(LABEL_TAC"a") 
1476   THEN DISCH_TAC THEN REMOVE_THEN "a" MP_TAC THEN ASM_REWRITE_TAC[if_azims_fan;power_map_points;DE_MORGAN_THM; complement_set; IN_ELIM_THM;AZIM_REFL;ARITH_RULE`(~(0<a)<=> (0=a))`] 
1477   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x':real^3`]azim ) THEN POP_ASSUM MP_TAC
1478   THEN REAL_ARITH_TAC;(*8*)
1479
1480 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;] u_IN_ORBITS_FAN) THEN  DISCH_TAC
1481   THEN SUBGOAL_THEN `~(u=(x':real^3))` ASSUME_TAC
1482 THENL(*9*)[
1483 ASM_SET_TAC[];(*9*)
1484
1485  DISCH_TAC  THEN REMOVE_THEN "a"(fun th-> MP_TAC(ISPEC`u:real^3`th)) THEN ASM_REWRITE_TAC[] 
1486 THEN REWRITE_TAC[REAL_ARITH`(b:real)- a<= b-c <=> c <= a`]  THEN DISCH_THEN(LABEL_TAC"b1")
1487    THEN MP_TAC(ARITH_RULE`0< (i:num)/\ i <CARD(set_of_edge (v:real^3) V E)==> ~(0=CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[]
1488   THEN DISCH_TAC
1489   THEN USE_THEN"100"(fun th-> MP_TAC(ISPEC`0`th)) THEN 
1490 REWRITE_TAC[if_azims_fan] THEN ASM_REWRITE_TAC[power_map_points;AZIM_REFL;complement_set; IN_ELIM_THM] 
1491    THEN MP_TAC(ARITH_RULE`i <CARD(set_of_edge (v:real^3) V E)==> ~(i=CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[]
1492   THEN DISCH_TAC
1493   THEN USE_THEN"100"(fun th-> MP_TAC(ISPEC`i:num`th)) THEN 
1494 REWRITE_TAC[if_azims_fan] THEN ASM_REWRITE_TAC[power_map_points;AZIM_REFL;complement_set; IN_ELIM_THM] 
1495
1496   THEN GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[SET_RULE`a=b <=> b=a`] THEN DISCH_TAC 
1497 THEN
1498 DISJ_CASES_TAC(SET_RULE`collinear {(x:real^3),v,x'} \/ ~collinear {x,v,x'}`)
1499 THENL(*10*)[
1500   
1501 POP_ASSUM MP_TAC THEN GEN_REWRITE_TAC( LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV) [SET_RULE`{a,b,c}= {a,c,b}`]
1502   THEN REWRITE_TAC[COLLINEAR_3_EXPAND;]
1503   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (u:real^3)`;` (v:real^3)`] remark1_fan) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1504   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
1505   THEN SUBGOAL_THEN `(x':real^3) IN aff {x,v}` ASSUME_TAC
1506 THENL(*11*)[
1507 REWRITE_TAC[aff; AFFINE_HULL_2; IN_ELIM_THM] THEN EXISTS_TAC`u':real` THEN EXISTS_TAC`&1 -(u':real)` THEN ASM_REWRITE_TAC[]
1508   THEN REAL_ARITH_TAC;(*11*)
1509 ASM_MESON_TAC[]](*11*);(*10*)
1510
1511 STRIP_TAC
1512 THENL(*11*)[
1513 POP_ASSUM MP_TAC THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (u:real^3)`;` (v:real^3)`] remark1_fan) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1514   THEN MP_TAC(ISPECL[`i:num`;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] remark_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1515 THEN
1516 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x':real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1517  (u:real^3) (i:num))`]AZIM_EQ_ALT) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1518   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1519  (u:real^3) (i:num))`;`x':real^3`]AZIM_EQ_0_ALT) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1520   THEN DISCH_TAC THEN  MP_TAC(ISPECL[`(x:real^3) `;`(v:real^3)`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1521  (u:real^3) (i:num))`;` (x':real^3)`] AZIM_COMPL) THEN  ASM_REWRITE_TAC[]  
1522   THEN MP_TAC(ISPECL[`(x:real^3) `;`(v:real^3)`;` (u:real^3)`;`(x':real^3)`] AZIM_COMPL) THEN  ASM_REWRITE_TAC[]  THEN DISCH_TAC THEN DISCH_TAC 
1523   THEN REMOVE_THEN"b1" MP_TAC THEN ASM_REWRITE_TAC[REAL_ARITH`b-a<= b-c <=> c<= a`]
1524   THEN DISCH_TAC 
1525   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`; `( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1526  (u:real^3) (i:num))`;` (x':real^3)`]sum5_azim_fan) 
1527   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1528   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1529  (u:real^3) (i:num))`;` (x':real^3)`]azim) THEN POP_ASSUM MP_TAC
1530   THEN POP_ASSUM(fun th->REWRITE_TAC[]) 
1531   THEN POP_ASSUM(fun th->REWRITE_TAC[]) 
1532   THEN POP_ASSUM(fun th->REWRITE_TAC[]) 
1533   THEN POP_ASSUM(fun th->REWRITE_TAC[]) 
1534   THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;(*11*)
1535 REPEAT (POP_ASSUM MP_TAC) THEN ARITH_TAC](*11*)](*10*)](*9*)](*8*);(*7*)
1536
1537
1538 ASM_REWRITE_TAC[] THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"b") THEN DISCH_THEN(LABEL_TAC"c")
1539   THEN  DISJ_CASES_TAC(ARITH_RULE`SUC (i:num)= CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))\/ ~(SUC (i)= CARD(set_of_edge v V E))`)
1540 THENL(*8*)[
1541
1542 ASM_REWRITE_TAC[if_azims_fan] THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x':real^3`]azim) THEN REAL_ARITH_TAC;
1543 (*8*)
1544 DISJ_CASES_TAC(ARITH_RULE`(i:num)=0 \/ 0<i `)
1545 THENL(*9*)[
1546 REMOVE_THEN "b" MP_TAC THEN 
1547 ASM_REWRITE_TAC[if_azims_fan;power_map_points] THEN DISCH_TAC 
1548   THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)]THEN ASSUME_TAC(SYM(th))) 
1549   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;] u_IN_ORBITS_FAN) THEN ASM_REWRITE_TAC[] THEN  DISCH_TAC
1550 THEN
1551 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;`w:real^3`] IN_ORBITS_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1552   THEN SUBGOAL_THEN `~(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1553  (w:real^3)=(x':real^3))` ASSUME_TAC
1554 THENL(*10*)[ASM_SET_TAC[];(*10*)
1555  
1556 REMOVE_THEN "a" (fun th -> MP_TAC(ISPEC`sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1557  (w:real^3)`th)) THEN ASM_REWRITE_TAC[REAL_ARITH`b-a<= b-c <=> c<= a`]THEN DISCH_THEN(LABEL_TAC"b1")
1558    THEN MP_TAC(ARITH_RULE`(i:num)=0/\ i <CARD(set_of_edge (v:real^3) V E)==> ~(0=CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[]
1559   THEN DISCH_TAC
1560   THEN USE_THEN"100"(fun th-> MP_TAC(ISPEC`i:num`th)) THEN 
1561 REWRITE_TAC[if_azims_fan] THEN ASM_REWRITE_TAC[power_map_points;AZIM_REFL;complement_set; IN_ELIM_THM] 
1562
1563   THEN GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[SET_RULE`a=b <=> b=a`] THEN DISCH_TAC
1564
1565    THEN MP_TAC(ARITH_RULE`(i:num)=0/\ ~(SUC(i) =CARD(set_of_edge (v:real^3) V E))==> ~(SUC(0)=CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[]
1566   THEN DISCH_TAC
1567   THEN USE_THEN"100"(fun th-> MP_TAC(ISPEC`SUC(0):num`th)) THEN 
1568 REWRITE_TAC[if_azims_fan] THEN ASM_REWRITE_TAC[power_map_points;AZIM_REFL;complement_set; IN_ELIM_THM] 
1569
1570   THEN GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[SET_RULE`a=b <=> b=a`] THEN REWRITE_TAC[power_map_points] 
1571 THEN
1572 DISJ_CASES_TAC(SET_RULE`collinear {(x:real^3),v,x'} \/ ~collinear {x,v,x'}`)
1573 THENL(*11*)[
1574 POP_ASSUM MP_TAC THEN GEN_REWRITE_TAC( LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV) [SET_RULE`{a,b,c}= {a,c,b}`]
1575   THEN REWRITE_TAC[COLLINEAR_3_EXPAND;]
1576   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (u:real^3)`;` (v:real^3)`] remark1_fan) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1577   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
1578   THEN SUBGOAL_THEN `(x':real^3) IN aff {x,v}` ASSUME_TAC
1579 THENL(*12*)[
1580 REWRITE_TAC[aff; AFFINE_HULL_2; IN_ELIM_THM] THEN EXISTS_TAC`u':real` THEN EXISTS_TAC`&1 -(u':real)` THEN ASM_REWRITE_TAC[]
1581   THEN REAL_ARITH_TAC;(*12*)
1582 ASM_MESON_TAC[]](*12*);(*11*)
1583
1584 STRIP_TAC THENL(*12*)[
1585
1586 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (u:real^3)`;` (v:real^3)`] remark1_fan) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1587   THEN MP_TAC(SET_RULE`(u:real^3)=(w:real^3) /\ {v,u} IN (E:(real^3->bool)->bool)==> {v,w} IN E`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1588
1589   THEN MP_TAC(ISPECL[`SUC(0):num`;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`] remark_power_map_points) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1590 THEN
1591 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x':real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1592  (u:real^3) (SUC(0):num))`]AZIM_EQ_ALT) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1593   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1594  (u:real^3) (SUC(0):num))`;`x':real^3`]AZIM_EQ_0_ALT) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1595   THEN MP_TAC(ISPECL[`(x:real^3) `;`(v:real^3)`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1596  (u:real^3) (SUC(0):num))`;` (x':real^3)`] AZIM_COMPL) THEN  ASM_REWRITE_TAC[power_map_points]  
1597   THEN MP_TAC(ISPECL[`(x:real^3) `;`(v:real^3)`;` (u:real^3)`;`(x':real^3)`] AZIM_COMPL) THEN  ASM_REWRITE_TAC[]  THEN DISCH_TAC THEN DISCH_TAC
1598   THEN REMOVE_THEN"b1" MP_TAC THEN ASM_REWRITE_TAC[REAL_ARITH`b-a<= b-c <=> c<= a`]
1599   THEN DISCH_TAC 
1600   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1601  (u:real^3) (SUC(0):num))`;`w:real^3`;` (x':real^3)`]sum5_azim_fan) 
1602   THEN ASM_REWRITE_TAC[power_map_points;REAL_ARITH`a=b+c <=> c=a-b`] THEN 
1603 DISCH_TAC THEN ASM_REWRITE_TAC[REAL_ARITH`a-b<c <=> a< b+c`]
1604   THEN MP_TAC(ARITH_RULE` (i:num) < (CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))) /\ ~(SUC(i)=CARD(set_of_edge v V E)) ==> SUC(i) < CARD(set_of_edge v V E)`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1605   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`; `SUC(i):num`; `i:num`] cyclic_power_sigma_fan) THEN ASM_REWRITE_TAC[power_map_points;ARITH_RULE`0< SUC 0`; ] THEN DISCH_TAC
1606   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1607  (u:real^3))`; `w:real^3`; ] UNIQUE_AZIM_0_POINT_FAN) THEN ASM_REWRITE_TAC[power_map_points; ]
1608   THEN DISCH_TAC THEN MP_TAC(ISPECL[`x:real^3`; `v:real^3`;` (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1609  (u:real^3))`; `w:real^3`]AZIM_COMPL) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[REAL_ARITH`c<a+b-a <=> c<b`] THEN MESON_TAC[azim];(*12*)
1610
1611 REPEAT(POP_ASSUM MP_TAC) THEN ARITH_TAC](*12*)](*11*)](*10*);(*9*)
1612
1613 REMOVE_THEN "b" MP_TAC THEN 
1614 ASM_REWRITE_TAC[if_azims_fan;power_map_points] THEN DISCH_TAC 
1615   THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)]THEN ASSUME_TAC(SYM(th))) 
1616   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;`i:num`] i_IN_ORBITS_FAN) THEN ASM_REWRITE_TAC[] THEN  DISCH_TAC
1617 THEN
1618 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;`w:real^3`] IN_ORBITS_FAN) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1619   THEN SUBGOAL_THEN `~(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1620  (w:real^3)=(x':real^3))` ASSUME_TAC
1621 THENL(*10*)[ ASM_SET_TAC[];(*10*)
1622    
1623 REMOVE_THEN "a" (fun th -> MP_TAC(ISPEC`sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1624  (w:real^3)`th)) THEN ASM_REWRITE_TAC[REAL_ARITH`b-a<= b-c <=> c<= a`]THEN DISCH_THEN(LABEL_TAC"b1")
1625    THEN MP_TAC(ARITH_RULE`i <CARD(set_of_edge (v:real^3) V E)==> ~(i=CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[]
1626   THEN DISCH_TAC
1627   THEN USE_THEN"100"(fun th-> MP_TAC(ISPEC`i:num`th)) THEN 
1628 REWRITE_TAC[if_azims_fan] THEN ASM_REWRITE_TAC[power_map_points;AZIM_REFL;complement_set; IN_ELIM_THM] 
1629
1630   THEN GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[SET_RULE`a=b <=> b=a`] THEN DISCH_TAC
1631   THEN USE_THEN"100"(fun th-> MP_TAC(ISPEC`SUC(i):num`th)) THEN 
1632 REWRITE_TAC[if_azims_fan] THEN ASM_REWRITE_TAC[power_map_points;AZIM_REFL;complement_set; IN_ELIM_THM] 
1633
1634   THEN GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[SET_RULE`a=b <=> b=a`] THEN REWRITE_TAC[power_map_points] 
1635 THEN
1636 DISJ_CASES_TAC(SET_RULE`collinear {(x:real^3),v,x'} \/ ~collinear {x,v,x'}`)
1637 THENL(*11*)[
1638 POP_ASSUM MP_TAC THEN GEN_REWRITE_TAC( LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV) [SET_RULE`{a,b,c}= {a,c,b}`]
1639   THEN REWRITE_TAC[COLLINEAR_3_EXPAND;]
1640   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (u:real^3)`;` (v:real^3)`] remark1_fan) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1641   THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
1642   THEN SUBGOAL_THEN `(x':real^3) IN aff {x,v}` ASSUME_TAC
1643 THENL(*12*)[
1644 REWRITE_TAC[aff; AFFINE_HULL_2; IN_ELIM_THM] THEN EXISTS_TAC`u':real` THEN EXISTS_TAC`&1 -(u':real)` THEN ASM_REWRITE_TAC[]
1645   THEN REAL_ARITH_TAC;(*12*)
1646 ASM_MESON_TAC[]](*12*);(*11*)
1647
1648 STRIP_TAC THENL(*12*)[
1649 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (u:real^3)`;` (v:real^3)`] remark1_fan) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1650   THEN MP_TAC(ISPECL[`i:num`;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] remark_power_map_points) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1651   THEN MP_TAC(ISPECL[`SUC(i):num`;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] remark_power_map_points) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1652 THEN
1653 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x':real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1654  (u:real^3) (SUC(i):num))`]AZIM_EQ_ALT) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1655   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1656  (u:real^3) (SUC(i):num))`;`x':real^3`]AZIM_EQ_0_ALT) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1657   THEN 
1658 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x':real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1659  (u:real^3) ((i):num))`]AZIM_EQ_ALT) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1660   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1661  (u:real^3) ((i):num))`;`x':real^3`]AZIM_EQ_0_ALT) THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC
1662  THEN MP_TAC(ISPECL[`(x:real^3) `;`(v:real^3)`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1663  (u:real^3) (SUC(i):num))`;` (x':real^3)`] AZIM_COMPL) THEN  ASM_REWRITE_TAC[power_map_points]  
1664   THEN MP_TAC(ISPECL[`(x:real^3) `;`(v:real^3)`;` (w:real^3)`;`(x':real^3)`] AZIM_COMPL) THEN  ASM_REWRITE_TAC[]  THEN DISCH_TAC THEN DISCH_TAC
1665 THEN
1666   REMOVE_THEN "c" MP_TAC THEN ASM_REWRITE_TAC[if_azims_fan] THEN DISCH_TAC THEN
1667 MP_TAC(REAL_ARITH`azim x v u w< azim (x:real^3) v u x'==> azim x v u w<= azim (x:real^3) v u x'`) THEN ASM_REWRITE_TAC[]
1668   THEN DISCH_TAC
1669     THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`(u:real^3)`;`w:real^3`;` (x':real^3)`]sum4_azim_fan) 
1670   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1671   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;`i:num`] SUM_IF_AZIMS_FAN) THEN ASM_REWRITE_TAC[if_azims_fan;power_map_points] THEN DISCH_TAC
1672  THEN ASM_REWRITE_TAC[REAL_ARITH`a+b<a+c <=> b<c`] 
1673 THEN REMOVE_THEN"b1" MP_TAC THEN ASM_REWRITE_TAC[REAL_ARITH`b-a<= b-c <=> c<= a`]
1674   THEN DISCH_TAC 
1675   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1676  (u:real^3) (SUC(i):num))`;`w:real^3`;` (x':real^3)`]sum5_azim_fan) 
1677   THEN ASM_REWRITE_TAC[power_map_points;REAL_ARITH`a=b+c <=> c=a-b`]
1678 THEN DISCH_TAC THEN ASM_REWRITE_TAC[REAL_ARITH`a-b<c <=> a< b+c`]
1679 THEN MP_TAC(ARITH_RULE` (i:num) < (CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))) /\ ~(SUC(i)=CARD(set_of_edge v V E)) ==> SUC(i) < CARD(set_of_edge v V E)`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1680   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`; `SUC(i):num`; `i:num`] cyclic_power_sigma_fan) THEN ASM_REWRITE_TAC[power_map_points;ARITH_RULE`i< SUC i`; ] THEN DISCH_TAC
1681   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1682  (w:real^3))`; `w:real^3`; ] UNIQUE_AZIM_0_POINT_FAN) THEN ASM_REWRITE_TAC[power_map_points; ]
1683   THEN DISCH_TAC THEN MP_TAC(ISPECL[`x:real^3`; `v:real^3`;` (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1684  (w:real^3))`; `w:real^3`]AZIM_COMPL) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[REAL_ARITH`c<a+b-a <=> c<b`] 
1685 THEN MESON_TAC[azim];(*12*)
1686
1687 REPEAT(POP_ASSUM MP_TAC) THEN ARITH_TAC](*12*)](*11*)]]]]]]]]];
1688 ASM_SET_TAC[]]);;
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711 let aff_subset_aff_ge=prove(`!x:real^3 v:real^3 w:real^3.
1712 DISJOINT {x,v} {w}
1713 ==> aff {x,v} SUBSET aff_ge {x,v} {w}`,
1714
1715 REPEAT GEN_TAC THEN STRIP_TAC THEN
1716 MP_TAC(ISPECL[`(x:real^3) `;` (v:real^3)`;` (w:real^3)`]AFF_GE_2_1) THEN ASM_REWRITE_TAC[] 
1717   THEN DISCH_TAC
1718 THEN ASM_REWRITE_TAC[aff; AFFINE_HULL_2; SUBSET; AFF_GE_2_1; IN_ELIM_THM]
1719   THEN GEN_TAC THEN STRIP_TAC
1720   THEN EXISTS_TAC`u:real` THEN EXISTS_TAC`v':real` THEN EXISTS_TAC`&0`
1721   THEN ASM_REWRITE_TAC[VECTOR_ARITH`a=b +c + &0 % d<=>a=b+c`]
1722   THEN REPEAT (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC);;
1723
1724
1725
1726
1727 let eq_set_wdart_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (u:real^3).
1728 FAN(x,V,E)/\ ({v,u}IN E)
1729 ==>
1730 ({w_dart_fan x V E (x,v,w,(sigma_fan x V E v w))|w| {v,w} IN E }
1731 = {wedge3_fan x V E v u i|i| 0 <= i/\ i< CARD(set_of_edge v V E) })
1732 `,
1733
1734 (let lem= prove(`!x v u w. 
1735 (&0 < azim x v u w) <=> ~(azim x v u w= &0)`,
1736 MESON_TAC[azim; REAL_ARITH`&0 <= a==> (&0 < a) <=> ~(a= &0)`]) in
1737 ( let lem1=prove(`!x v. ~(x = v)==>(!u. ~(u IN aff {x, v}) <=> ~collinear {x, v, u})`,
1738 MESON_TAC[collinear_fan]) in
1739 (let lem2=prove(`!v0 v1 w.
1740         ~collinear{v0,v1,w}  ==>
1741 !x. ( ~(azim v0 v1 w x = &0)/\ ~collinear{v0,v1,x} <=> ~(x IN aff_ge {v0,v1} {w}) /\ ~collinear{v0,v1,x})`,
1742 MESON_TAC[AZIM_EQ_0_GE_ALT]) in
1743
1744 REPEAT STRIP_TAC THEN REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN EQ_TAC
1745 THENL(*1*)[
1746 REWRITE_TAC[GSYM(EXTENSION)] THEN STRIP_TAC 
1747   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`] properties_of_set_of_edge_fan) 
1748   THEN ASM_REWRITE_TAC[] THEN 
1749 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] ORBITS_EQ_SET_EDGE_FAN) 
1750   THEN ASM_REWRITE_TAC[] THEN 
1751 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] SIMP_ORBITS_POINTS_FAN) 
1752   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])THEN DISCH_TAC 
1753 THEN POP_ASSUM(fun th->GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[th])
1754   THEN REWRITE_TAC[IN_ELIM_THM;] THEN STRIP_TAC THEN EXISTS_TAC `i:num` THEN
1755 ASM_REWRITE_TAC[ARITH_RULE`0<= (i:num)`]
1756   THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC 
1757 THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`]CARD_SET_OF_ORBITS_POINTS_FAN) 
1758   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
1759 THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC
1760 THEN
1761 DISJ_CASES_TAC(ARITH_RULE`(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))>1 \/ ~((CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))> 1)`)
1762 THENL[
1763 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;`i:num`] w_dart_eq_wedge3_fan) 
1764   THEN ASM_REWRITE_TAC[power_map_points];
1765
1766 MP_TAC(ARITH_RULE`(i:num)<CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) /\ ~(CARD(set_of_edge v V E)>1)==> i=0`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN 
1767 ASM_REWRITE_TAC[w_dart_fan;wedge3_fan;if_azims_fan;power_map_points]
1768   THEN DISJ_CASES_TAC(ARITH_RULE` 0= CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) \/ ~(0=CARD(set_of_edge v V E))`)
1769 THENL[
1770
1771 REPEAT (POP_ASSUM MP_TAC) THEN ARITH_TAC;
1772
1773 MP_TAC(ARITH_RULE`~(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))>1) /\ ~(0=CARD(set_of_edge v V E))==> SUC (0)=CARD(set_of_edge v V E)`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN 
1774 ASM_REWRITE_TAC[complement_set;IN_ELIM_THM;AZIM_REFL;azim]
1775
1776   THEN ASM_REWRITE_TAC[] THEN 
1777 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] ORBITS_EQ_SET_EDGE_FAN) 
1778   THEN ASM_REWRITE_TAC[] THEN 
1779 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] SIMP_ORBITS_POINTS_FAN) 
1780   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])THEN 
1781  POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)]) THEN REWRITE_TAC[ARITH_RULE`(a:num) < SUC 0 <=> a=0`;SET_RULE`{f i| i=0}={f 0}`;
1782 power_map_points] THEN DISCH_TAC THEN
1783 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (u:real^3)`;` (v:real^3)`] remark1_fan) 
1784   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
1785 MP_TAC(ISPECL[`x:real^3`;`v:real^3`]lem1) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1786 THEN ASM_REWRITE_TAC[lem] THEN POP_ASSUM (fun th-> REWRITE_TAC[]) 
1787   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]lem2) THEN POP_ASSUM (fun th-> REWRITE_TAC[th] THEN ASSUME_TAC(th))
1788 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]aff_subset_aff_ge)
1789   THEN  POP_ASSUM (fun th-> REWRITE_TAC[th] THEN ASSUME_TAC(th)) THEN DISCH_TAC
1790   THEN DISCH_TAC THEN POP_ASSUM (fun th-> REWRITE_TAC[th;collinear_fan;]) THEN ASM_REWRITE_TAC[GSYM(DE_MORGAN_THM);]
1791   THEN ASM_SET_TAC[]]];
1792
1793 REWRITE_TAC[GSYM(EXTENSION)] THEN STRIP_TAC
1794 THEN EXISTS_TAC`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1795  (u:real^3) ((i):num)) ` THEN
1796 MP_TAC(ISPECL[`i:num`;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] remark_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th->REWRITE_TAC[th])
1797   THEN DISJ_CASES_TAC(ARITH_RULE`(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))>1 \/ ~((CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))> 1)`)
1798 THENL[
1799 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;`i:num`] w_dart_eq_wedge3_fan) 
1800   THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC THEN POP_ASSUM(fun th->REWRITE_TAC[th]); 
1801
1802 MP_TAC(ARITH_RULE`(i:num)<CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) /\ ~(CARD(set_of_edge v V E)>1)==> i=0`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN 
1803 ASM_REWRITE_TAC[w_dart_fan;wedge3_fan;if_azims_fan;power_map_points]
1804   THEN DISJ_CASES_TAC(ARITH_RULE` 0= CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) \/ ~(0=CARD(set_of_edge v V E))`)
1805 THENL[
1806 REPEAT (POP_ASSUM MP_TAC) THEN ARITH_TAC;
1807
1808 MP_TAC(ARITH_RULE`~(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))>1) /\ ~(0=CARD(set_of_edge v V E))==> SUC (0)=CARD(set_of_edge v V E)`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN 
1809 ASM_REWRITE_TAC[complement_set;IN_ELIM_THM;AZIM_REFL;azim]
1810
1811   THEN ASM_REWRITE_TAC[] THEN 
1812 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] ORBITS_EQ_SET_EDGE_FAN) 
1813   THEN ASM_REWRITE_TAC[] THEN 
1814 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] SIMP_ORBITS_POINTS_FAN) 
1815   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])THEN 
1816  POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)]) THEN REWRITE_TAC[ARITH_RULE`(a:num) < SUC 0 <=> a=0`;SET_RULE`{f i| i=0}={f 0}`;
1817 power_map_points] THEN DISCH_TAC THEN
1818 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (u:real^3)`;` (v:real^3)`] remark1_fan) 
1819   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
1820 MP_TAC(ISPECL[`x:real^3`;`v:real^3`]lem1) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1821 THEN ASM_REWRITE_TAC[lem] THEN POP_ASSUM (fun th-> REWRITE_TAC[]) 
1822   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]lem2) THEN POP_ASSUM (fun th-> REWRITE_TAC[th] THEN ASSUME_TAC(th))
1823 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]aff_subset_aff_ge)
1824   THEN  POP_ASSUM (fun th-> REWRITE_TAC[th] THEN ASSUME_TAC(th)) THEN DISCH_TAC
1825   THEN DISCH_TAC THEN POP_ASSUM (fun th-> REWRITE_TAC[th;collinear_fan;]) THEN ASM_REWRITE_TAC[GSYM(DE_MORGAN_THM);]
1826   THEN ASM_SET_TAC[]]]]))));; 
1827
1828
1829
1830
1831 let eq_set_aff_gt=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (u:real^3).
1832 FAN(x,V,E)/\ ({v,u}IN E)
1833 ==> {aff_gt {x,v} {w} |w| {v,w} IN E}
1834 ={wedge2_fan x V E v u i|i| 0 <= i /\ i< CARD(set_of_edge v V E) }`,
1835
1836 REPEAT STRIP_TAC THEN REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN EQ_TAC
1837 THENL[
1838 REWRITE_TAC[GSYM(EXTENSION)] THEN STRIP_TAC
1839   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`] properties_of_set_of_edge_fan) 
1840   THEN ASM_REWRITE_TAC[] THEN 
1841 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] ORBITS_EQ_SET_EDGE_FAN) 
1842   THEN ASM_REWRITE_TAC[] THEN 
1843 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] SIMP_ORBITS_POINTS_FAN) 
1844   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])THEN DISCH_TAC 
1845 THEN POP_ASSUM(fun th->GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[th])
1846   THEN REWRITE_TAC[IN_ELIM_THM;] THEN STRIP_TAC THEN EXISTS_TAC `i:num` THEN
1847   ASM_REWRITE_TAC[ARITH_RULE`0 <= i`]
1848
1849   THEN MP_TAC(ARITH_RULE`(i:num) < CARD(set_of_edge v V E) ==> ~(i= CARD(set_of_edge (v:real^3) (V:real^3->bool)(E:(real^3->bool)->bool)))`) 
1850   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
1851   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;`i:num`] wedge_fan2_equal_aff_gt_fan)
1852
1853   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)]);
1854
1855 REWRITE_TAC[GSYM(EXTENSION)] THEN STRIP_TAC
1856 THEN EXISTS_TAC`( power_map_points sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3)
1857  (u:real^3) ((i):num)) ` THEN
1858 MP_TAC(ISPECL[`i:num`;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`] remark_power_map_points) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th->REWRITE_TAC[th])
1859
1860   THEN MP_TAC(ARITH_RULE`(i:num) < CARD(set_of_edge v V E) ==> ~(i= CARD(set_of_edge (v:real^3) (V:real^3->bool)(E:(real^3->bool)->bool)))`) 
1861   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
1862   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`;`i:num`] wedge_fan2_equal_aff_gt_fan)
1863
1864   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])]);;
1865
1866
1867
1868
1869
1870
1871 let UNION1_FAN=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (u:real^3).
1872
1873 FAN(x,V,E)/\ ({v,u}IN E)
1874 ==> 
1875  (UNIV:real^3->bool) = aff {x,v} UNION (UNIONS {w_dart_fan x V E (x,v,w,(sigma_fan x V E v w))|w| {v,w} IN E })
1876 UNION
1877  (UNIONS {aff_gt {x,v} {w} |w| {v,w} IN E} )
1878 `,  
1879
1880 REPEAT STRIP_TAC 
1881   THEN MP_TAC (ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`]UNION_FAN) THEN ASM_REWRITE_TAC[]
1882   THEN MP_TAC (ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`]eq_set_wdart_fan) THEN ASM_REWRITE_TAC[]
1883   THEN DISCH_TAC THEN POP_ASSUM (fun th -> REWRITE_TAC[th])
1884   THEN MP_TAC (ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (u:real^3)`]eq_set_aff_gt   ) THEN ASM_REWRITE_TAC[]
1885   THEN DISCH_TAC THEN POP_ASSUM (fun th -> REWRITE_TAC[th]) THEN ASM_SET_TAC[]);;
1886   
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896 let CARD_SING=prove(`!x:real^3 s:real^3->bool. 
1897  FINITE s 
1898 /\ s={x}
1899 ==>
1900 CARD s = 1`,
1901 REPEAT STRIP_TAC THEN 
1902 MP_TAC(SET_RULE`(s:real^3->bool)={(x:real^3)} ==> ~(s={}) /\ x IN s /\ s DELETE x ={}`)
1903   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1904   THEN MP_TAC(ISPEC`s:real^3->bool`CARD_EQ_0) THEN ASM_REWRITE_TAC[]
1905   THEN MP_TAC(ISPECL[`x:real^3`;`s:real^3->bool`]CARD_DELETE) THEN ASM_REWRITE_TAC[CARD_CLAUSES]
1906   THEN ARITH_TAC);;
1907
1908
1909
1910 let disjoint_set_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3) (w1:real^3).
1911 FAN(x,V,E)/\ ({v,w}IN E) /\ ({v,w1}IN E)
1912 ==> 
1913  w_dart_fan x V E (x,v,w,(sigma_fan x V E v w)) INTER
1914  aff_gt {x,v} {w1}={}`, 
1915
1916 (let lem =prove(`!x:real^3.
1917  FINITE {x}
1918 ==>
1919 CARD {x} = 1`,MESON_TAC[CARD_SING]) in
1920 (let lem1=prove(`!x v. ~(x = v)==>(!u. ~(u IN aff {x, v}) <=> ~collinear {x, v, u})`,
1921 MESON_TAC[collinear_fan]) in
1922 (let lem2=prove(`!v0 v1 w.
1923         ~collinear{v0,v1,w}  ==>
1924 !x. ( &0 = azim v0 v1 w x /\ ~collinear{v0,v1,x} <=> (x IN aff_ge {v0,v1} {w}) /\ ~collinear{v0,v1,x})`,
1925 MESON_TAC[AZIM_EQ_0_GE_ALT]) in
1926
1927
1928 REPEAT STRIP_TAC    THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w1:real^3)`] properties_of_set_of_edge_fan) 
1929   THEN ASM_REWRITE_TAC[] THEN 
1930 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`] ORBITS_EQ_SET_EDGE_FAN) 
1931   THEN ASM_REWRITE_TAC[] THEN 
1932 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`] SIMP_ORBITS_POINTS_FAN) 
1933   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])THEN DISCH_TAC 
1934 THEN POP_ASSUM(fun th->GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[th])
1935   THEN REWRITE_TAC[IN_ELIM_THM;] THEN STRIP_TAC
1936   THEN ASM_REWRITE_TAC[] 
1937   THEN MP_TAC(ARITH_RULE`i< CARD(set_of_edge (v:real^3) V E)==> ~(i=CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[] 
1938   THEN DISCH_TAC
1939   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`i:num`] wedge_fan2_equal_aff_gt_fan)
1940
1941   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])
1942   THEN DISJ_CASES_TAC(ARITH_RULE`(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))>1 \/ ~((CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))> 1)`)
1943 THENL(*1*)[
1944  MP_TAC(ARITH_RULE`CARD(set_of_edge (v:real^3) V E)>1==> 0< CARD(set_of_edge v V E)`) THEN ASM_REWRITE_TAC[] 
1945    THEN DISCH_TAC THEN
1946   MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`0:num`] w_dart_eq_wedge3_fan) 
1947   THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC THEN ASM_REWRITE_TAC[]
1948 THEN REWRITE_TAC[wedge2_fan;wedge3_fan;EXTENSION] THEN GEN_TAC THEN 
1949 REWRITE_TAC[INTER; EMPTY;IN_ELIM_THM]
1950    THEN DISJ_CASES_TAC(ARITH_RULE`(i:num)=0 \/ (0< i)`)
1951 THENL(*2*)[
1952 ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC;(*2*)
1953
1954  MP_TAC(ARITH_RULE`CARD(set_of_edge (v:real^3) V E)>1==> ~(0= CARD(set_of_edge v V E))/\  ~(SUC 0= CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[] 
1955    THEN DISCH_TAC THEN
1956 ASM_REWRITE_TAC[if_azims_fan]
1957 THEN
1958 MP_TAC(ARITH_RULE` (0< i)==> SUC (0)= i \/ SUC 0 <i`) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
1959 THENL(*3*)[
1960 ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC;(*3*)
1961
1962 DISJ_CASES_TAC(SET_RULE`set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)={w} \/ ~(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)={w})`)
1963 THENL(*4*)[
1964  MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w1:real^3)`;` (v:real^3)`]remark1_fan)
1965     THEN ASM_REWRITE_TAC[IN_SING] THEN DISCH_TAC THEN ASM_REWRITE_TAC[power_map_points] THEN REAL_ARITH_TAC;(*4*)
1966
1967 MP_TAC(ISPECL[`i:num`;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`SUC (0):num`]  AZIM_LE_POWER_SIGMA_FAN) 
1968   THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC](*4*)](*3*)](*2*);(*1*)
1969
1970
1971  MP_TAC(ARITH_RULE`~(CARD(set_of_edge (v:real^3) V E)>1) /\ (i< CARD(set_of_edge v V E))==> i=0/\ ~(0=CARD(set_of_edge (v:real^3) V E))`) THEN ASM_REWRITE_TAC[] 
1972  THEN STRIP_TAC THEN ASM_REWRITE_TAC[] 
1973 THEN ASM_REWRITE_TAC[wedge2_fan;w_dart_fan;if_azims_fan;power_map_points;complement_set;AZIM_REFL;EXTENSION] THEN GEN_TAC THEN 
1974 REWRITE_TAC[DIFF;INTER;IN_ELIM_THM;GSYM(EXTENSION);COND_ELIM_THM] 
1975  THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w:real^3)`;` (v:real^3)`] remark1_fan)
1976   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
1977   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;]lem1) THEN ASM_REWRITE_TAC[]
1978   THEN DISCH_TAC THEN POP_ASSUM (fun th-> REWRITE_TAC[th])
1979
1980   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`w:real^3`]lem2) THEN ASM_REWRITE_TAC[] 
1981 THEN DISCH_TAC THEN POP_ASSUM (fun th-> REWRITE_TAC[th] ) THEN ASM_REWRITE_TAC[collinear_fan]
1982 THEN
1983 DISJ_CASES_TAC(SET_RULE`set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)={w} \/ ~(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)={w})`)
1984
1985
1986 THENL(*2*)[
1987 ASM_SET_TAC[];(*2*)
1988
1989 MP_TAC(ARITH_RULE`~(CARD(set_of_edge (v:real^3) V E)>1) /\ ~(0= CARD(set_of_edge v V E))==> (1=CARD(set_of_edge (v:real^3) V E))`) THEN ASM_REWRITE_TAC[] 
1990      THEN DISCH_TAC 
1991   THEN MP_TAC(SET_RULE`w IN set_of_edge (v:real^3) V E==> {w} SUBSET set_of_edge (v:real^3) V E`) THEN ASM_REWRITE_TAC[]
1992   THEN DISCH_TAC
1993   THEN MP_TAC(ISPECL[`{(w:real^3)}`;`set_of_edge (v:real^3) V E`] FINITE_SUBSET) THEN ASM_REWRITE_TAC[] 
1994  THEN DISCH_TAC THEN
1995 MP_TAC(ISPEC`w:real^3`lem) THEN ASM_REWRITE_TAC[]
1996   THEN DISCH_TAC
1997   THEN MP_TAC(ISPECL[`{(w:real^3)}`;`set_of_edge (v:real^3) V E`]CARD_SUBSET_EQ)
1998   THEN ASM_REWRITE_TAC[]]]))));;
1999
2000
2001 let disjiont1_cor6dot1 = prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 i:num. 
2002 wedge3_fan x V E v u i INTER aff {x,v}={}`,
2003 REPEAT GEN_TAC THEN REWRITE_TAC[wedge3_fan; INTER] THEN REWRITE_TAC[complement_set; FUN_EQ_THM; EMPTY] THEN
2004 GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC
2005   THEN MESON_TAC[]);;
2006
2007
2008
2009 let disjoint_fan1=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3).
2010 FAN(x,V,E)/\ ({v,w}IN E)
2011 ==> 
2012  w_dart_fan x V E (x,v,w,(sigma_fan x V E v w)) INTER aff {x,v}={}`,
2013 REPEAT STRIP_TAC    
2014   THEN DISJ_CASES_TAC(ARITH_RULE`(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))>1 \/ ~((CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))> 1)`)
2015
2016 THENL[
2017  MP_TAC(ARITH_RULE`CARD(set_of_edge (v:real^3) V E)>1==> (0<CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[] 
2018    THEN DISCH_TAC THEN
2019 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`0:num`] w_dart_eq_wedge3_fan) 
2020   THEN ASM_REWRITE_TAC[power_map_points;] THEN DISCH_TAC THEN ASM_REWRITE_TAC[disjiont1_cor6dot1];
2021
2022  MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w:real^3)`;` (v:real^3)`] remark1_fan)
2023   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
2024   THEN ASM_REWRITE_TAC[w_dart_fan;INTER; IN_ELIM_THM;COND_ELIM_THM]
2025   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`w:real^3`]aff_subset_aff_ge) THEN ASM_REWRITE_TAC[]
2026    THEN ASM_SET_TAC[]]);;
2027
2028
2029
2030
2031
2032
2033
2034 let disjoint_fan2=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3) (w1:real^3).
2035 FAN(x,V,E)/\ ({v,w}IN E) /\ ({v,w1}IN E) /\ ~(w=w1)
2036 ==> 
2037  w_dart_fan x V E (x,v,w,(sigma_fan x V E v w)) INTER
2038  w_dart_fan x V E (x,v,w1,(sigma_fan x V E v w1))={}`,
2039 REPEAT STRIP_TAC    THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w1:real^3)`] properties_of_set_of_edge_fan) 
2040   THEN ASM_REWRITE_TAC[] THEN 
2041 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`] ORBITS_EQ_SET_EDGE_FAN) 
2042   THEN ASM_REWRITE_TAC[] THEN 
2043 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`] SIMP_ORBITS_POINTS_FAN) 
2044   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])THEN DISCH_TAC 
2045 THEN POP_ASSUM(fun th->GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[th])
2046   THEN REWRITE_TAC[IN_ELIM_THM;] THEN STRIP_TAC
2047   THEN ASM_REWRITE_TAC[]
2048 THEN DISJ_CASES_TAC(ARITH_RULE`(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))>1 \/ ~((CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)))> 1)`)
2049 THENL(*1*)[
2050  MP_TAC(ARITH_RULE`CARD(set_of_edge (v:real^3) V E)>1==> 0< CARD(set_of_edge v V E)`) THEN ASM_REWRITE_TAC[] 
2051    THEN DISCH_TAC THEN
2052   MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`0:num`] w_dart_eq_wedge3_fan) 
2053   THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC THEN ASM_REWRITE_TAC[]
2054    THEN
2055   MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`i:num`] w_dart_eq_wedge3_fan) 
2056   THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC THEN ASM_REWRITE_TAC[wedge3_fan;INTER]
2057    THEN POP_ASSUM(fun th -> REWRITE_TAC[])
2058    THEN POP_ASSUM(fun th -> REWRITE_TAC[])
2059    THEN POP_ASSUM MP_TAC
2060    THEN POP_ASSUM MP_TAC
2061    THEN POP_ASSUM MP_TAC THEN DISJ_CASES_TAC(ARITH_RULE`i:num =0 \/ SUC(0) <= i`)
2062 THENL(*2*)[
2063 ASM_REWRITE_TAC[power_map_points];(*2*)
2064
2065 DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[if_azims_fan] THEN 
2066 MP_TAC(ARITH_RULE`CARD(set_of_edge (v:real^3) V E)>1==> ~(SUC 0= CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[] 
2067    THEN DISCH_TAC THEN
2068 MP_TAC(ARITH_RULE`i<CARD(set_of_edge (v:real^3) V E)==> ~(i= CARD(set_of_edge v V E))`) THEN ASM_REWRITE_TAC[] 
2069    THEN DISCH_TAC THEN ASM_REWRITE_TAC[IN_ELIM_THM]
2070   THEN MP_TAC(ARITH_RULE`SUC 0<= i ==> i:num = SUC 0 \/ SUC(0) < i`) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
2071 THENL(*3*)[
2072 ASM_REWRITE_TAC[EMPTY;EXTENSION;IN_ELIM_THM] THEN GEN_TAC THEN REAL_ARITH_TAC;(*3*)
2073
2074  MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w:real^3)`;` (v:real^3)`] remark1_fan)
2075   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
2076 DISJ_CASES_TAC(SET_RULE`set_of_edge (v:real^3) V E ={w} \/ ~(set_of_edge (v:real^3) V E ={w})`)
2077 THENL(*4*)[
2078 MP_TAC(ISPECL[`w:real^3`;`set_of_edge (v:real^3) V E`]CARD_SING) THEN ASM_REWRITE_TAC[] THEN
2079 POP_ASSUM(fun th->REWRITE_TAC[SYM(th)]) THEN REPEAT(POP_ASSUM MP_TAC) THEN ARITH_TAC;(*4*)
2080
2081 MP_TAC(ISPECL[`i:num`;`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`SUC (0):num`]  AZIM_LE_POWER_SIGMA_FAN) 
2082   THEN ASM_REWRITE_TAC[] THEN ASM_REWRITE_TAC[EMPTY;EXTENSION;IN_ELIM_THM]  THEN REAL_ARITH_TAC]]];
2083
2084 POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"a") THEN DISCH_TAC THEN
2085 MP_TAC(ARITH_RULE`~(CARD(set_of_edge (v:real^3) V E)>1) /\ (i < CARD(set_of_edge v V E))
2086 ==> (i:num =0)`) THEN ASM_REWRITE_TAC[]
2087      THEN DISCH_TAC THEN REMOVE_THEN "a" MP_TAC THEN ASM_REWRITE_TAC[power_map_points]]);;
2088
2089
2090 let disjoint_fan3=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3).
2091 FAN(x,V,E)/\ ({v,w}IN E)
2092 ==>aff{x,v} INTER aff_gt {x,v} {w}={}`,
2093 REPEAT STRIP_TAC THEN  MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w:real^3)`;` (v:real^3)`] remark1_fan)
2094 THEN ASM_REWRITE_TAC[]  THEN DISCH_TAC 
2095   THEN DISJ_CASES_TAC(SET_RULE`aff{(x:real^3),(v:real^3)} INTER aff_gt {x,v} {(w:real^3)}={} \/ (?(u:real^3). u IN aff{x,v} INTER aff_gt {x,v} {w})`)
2096   THENL[
2097 ASM_SET_TAC[];
2098
2099 POP_ASSUM MP_TAC THEN STRIP_TAC THEN POP_ASSUM MP_TAC
2100 THEN
2101                 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`w:real^3`]AFF_GT_2_1)
2102                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
2103                   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`]affine_hull_2_fan)
2104                 THEN ASM_REWRITE_TAC[] THEN DISCH_THEN(LABEL_TAC"a") THEN ASM_REWRITE_TAC[INTER;IN_ELIM_THM;]
2105   THEN STRIP_TAC 
2106 THEN POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[VECTOR_ARITH`t1 % x + t2 % v = t1' % x + t2' % v + t3 % w <=>  t3 % w = (t1 - t1') % x +  (t2 -t2') % v`]
2107   THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM (fun th-> REWRITE_TAC[])
2108   THEN POP_ASSUM (fun th -> REWRITE_TAC[SYM(th);REAL_ARITH`a+b+c=d+e <=>  c = (d-a)+ (e-b)`]) 
2109 THEN DISCH_TAC THEN MP_TAC(REAL_ARITH`&0 < (t3:real) ==> ~(t3= &0)`)
2110     THEN ASM_REWRITE_TAC[]THEN DISCH_TAC 
2111   THEN MP_TAC(ISPEC`t3:real`REAL_MUL_LINV) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
2112   THEN  DISCH_TAC
2113   THEN MP_TAC(SET_RULE` (t3:real) = (t1- t1') + (t2-t2') ==> (inv t3) *(t3:real) = (inv t3) * ((t1- t1')+ (t2-t2'))`)
2114  THEN ASM_REWRITE_TAC[REAL_ARITH`a*(b+c)= a *b + a*c`] THEN POP_ASSUM (fun th-> REWRITE_TAC[SYM(th)])
2115   THEN DISCH_TAC THEN DISCH_TAC
2116  THEN MP_TAC(SET_RULE` (t3:real) % w= (t1- t1') % (x:real^3) + (t2-t2') % v ==> (inv t3) % ((t3:real)% w) = (inv t3) % ((t1- t1') %x+ (t2-t2') % v)`)
2117 THEN ASM_REWRITE_TAC[VECTOR_ARITH`m% (n% p)=a%(b % x + c % v)<=> (m*n) %p = (a *b)%x + (a*c)% v`]
2118 THEN POP_ASSUM (fun th-> REWRITE_TAC[SYM(th)]) 
2119   THEN POP_ASSUM(fun th->REWRITE_TAC[SYM(th)] THEN ASSUME_TAC(SYM(th))) THEN REWRITE_TAC[VECTOR_ARITH`&1 %w=w`]
2120   THEN DISCH_TAC
2121   THEN SUBGOAL_THEN`w IN aff{(x:real^3),v}` ASSUME_TAC
2122 THENL[
2123 REMOVE_THEN"a"(fun th-> REWRITE_TAC[th;IN_ELIM_THM]) THEN EXISTS_TAC`inv t3 * (t1-t1')` THEN EXISTS_TAC`inv t3 * (t2-t2')`
2124   THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
2125   THEN POP_ASSUM(fun th-> REWRITE_TAC[th]);
2126 ASM_SET_TAC[]]]);;
2127
2128
2129 let remark3_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3) (w1:real^3).
2130 FAN(x,V,E)/\ ({v,w}IN E) /\ ({v,w1}IN E) /\ ~(w=w1)
2131 ==> 
2132  aff_gt{x,v} {w} INTER
2133  aff_gt {x,v} {w1}={}`,
2134 REPEAT STRIP_TAC    THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w1:real^3)`] properties_of_set_of_edge_fan) 
2135   THEN ASM_REWRITE_TAC[] THEN 
2136 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`] ORBITS_EQ_SET_EDGE_FAN) 
2137   THEN ASM_REWRITE_TAC[] THEN 
2138 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`] SIMP_ORBITS_POINTS_FAN) 
2139   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])THEN DISCH_TAC 
2140 THEN POP_ASSUM(fun th->GEN_REWRITE_TAC(LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[th])
2141   THEN REWRITE_TAC[IN_ELIM_THM;] THEN STRIP_TAC
2142   THEN ASM_REWRITE_TAC[] THEN POP_ASSUM MP_TAC THEN  DISJ_CASES_TAC(ARITH_RULE`i:num =0 \/ 0 < i`)
2143 THENL[
2144 ASM_REWRITE_TAC[power_map_points];
2145
2146  MP_TAC(ARITH_RULE`i<CARD(set_of_edge (v:real^3) V E)/\ (0<i)==> ~(i= CARD(set_of_edge v V E)) /\ ~(0=CARD(set_of_edge (v:real^3) V E))`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
2147   THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`i:num`] wedge_fan2_equal_aff_gt_fan)
2148    THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`0:num`] wedge_fan2_equal_aff_gt_fan)
2149    THEN ASM_REWRITE_TAC[power_map_points] THEN DISCH_TAC THEN DISCH_TAC 
2150    THEN POP_ASSUM(fun th->REWRITE_TAC[SYM(th)])
2151    THEN POP_ASSUM(fun th->REWRITE_TAC[SYM(th)])
2152
2153    THEN ASM_REWRITE_TAC[wedge2_fan;if_azims_fan;power_map_points;INTER;IN_ELIM_THM;AZIM_REFL;]
2154    THEN DISCH_TAC THEN POP_ASSUM(fun th->REWRITE_TAC[SYM(th)])
2155  THEN DISJ_CASES_TAC(REAL_ARITH`azim x v w w1 = &0 \/ ~(azim x v w w1 = &0)`)
2156 THENL[
2157  MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w:real^3)`;`w1:real^3`] UNIQUE_AZIM_0_POINT_FAN) 
2158    THEN ASM_REWRITE_TAC[];
2159 ASM_REWRITE_TAC[EMPTY;EXTENSION;IN_ELIM_THM] THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC]]);;
2160
2161
2162
2163
2164
2165 (* (!x:real^3  (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 w:real^3 w1:real^3. 
2166 a IN a_node_fan x V E (x,v,w,w1)==>(?n. a=(x,v,(power_map_points sigma_fan x V E v w n),(power_map_points sigma_fan x V E v w (SUC n)))))
2167
2168 /\ *)
2169
2170 let VBTIKLP=prove(`(!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (u:real^3).
2171 FAN(x,V,E)/\ ({v,u}IN E)
2172 ==> 
2173  (UNIV:real^3->bool) = aff {x,v} UNION (UNIONS {w_dart_fan x V E (x,v,w,(sigma_fan x V E v w))|w| {v,w} IN E })
2174 UNION
2175  (UNIONS {aff_gt {x,v} {w} |w| {v,w} IN E} ))
2176 /\
2177 (!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3).
2178 FAN(x,V,E)/\ ({v,w}IN E)
2179 ==> 
2180  w_dart_fan x V E (x,v,w,(sigma_fan x V E v w)) INTER aff {x,v}={})
2181 /\
2182 (!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3) (w1:real^3).
2183 FAN(x,V,E)/\ ({v,w}IN E) /\ ({v,w1}IN E)
2184 ==> 
2185  w_dart_fan x V E (x,v,w,(sigma_fan x V E v w)) INTER
2186  (aff_gt {x,v} {w1})={})
2187 /\
2188 (!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3) (w1:real^3).
2189 FAN(x,V,E)/\ ({v,w}IN E) /\ ({v,w1}IN E) /\ ~(w=w1)
2190 ==> 
2191  w_dart_fan x V E (x,v,w,(sigma_fan x V E v w)) INTER
2192  w_dart_fan x V E (x,v,w1,(sigma_fan x V E v w1))={})
2193 /\
2194 (!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3) (w1:real^3).
2195 FAN(x,V,E)/\ ({v,w}IN E) /\ ({v,w1}IN E) /\ ~(w=w1)
2196 ==> 
2197  aff_gt{x,v} {w} INTER
2198  aff_gt {x,v} {w1}={})
2199 /\ (!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3).
2200 FAN(x,V,E)/\ ({v,w}IN E)
2201 ==>aff{x,v} INTER aff_gt {x,v} {w}={})
2202 `,
2203 MESON_TAC[UNION1_FAN;disjoint_set_fan;disjoint_fan1;disjoint_fan2;remark3_fan;disjoint_fan3]);;
2204
2205 (*lemma62*)
2206
2207
2208 (*******************[cor:W]*************************)
2209
2210
2211
2212 let disjiont_union_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3) (w1:real^3).
2213 FAN(x,V,E)/\ ({v,w}IN E) /\ ({v,w1}IN E)
2214 ==> 
2215  w_dart_fan x V E (x,v,w,(sigma_fan x V E v w)) INTER
2216  (aff{x,v} UNION aff_gt {x,v} {w1})={}`,
2217
2218 REPEAT STRIP_TAC THEN REWRITE_TAC[UNION_OVER_INTER]
2219   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`  (v:real^3)`;` (w:real^3)`;` (w1:real^3)`] disjoint_set_fan) THEN ASM_REWRITE_TAC[]
2220   THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`  (v:real^3)`;` (w:real^3)`;] disjoint_fan1) THEN ASM_REWRITE_TAC[]
2221   THEN ASM_SET_TAC[]);;
2222
2223
2224 let aff_ge_subset_aff_gt_union_aff=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3).
2225 FAN(x,V,E)/\ {v,w} IN E 
2226 ==>
2227 aff_ge {x} {v , w} SUBSET  (aff_gt {x , v} {w}) UNION (aff {x, v})`,
2228
2229 REPEAT STRIP_TAC THEN  MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w:real^3)`;` (v:real^3)`] remark1_fan)
2230   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC
2231   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`w:real^3`]AFF_GE_1_2)
2232                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
2233                 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`w:real^3`]AFF_GT_2_1)
2234                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
2235                 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`]affine_hull_2_fan)
2236                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[SUBSET; UNION;IN_ELIM_THM]
2237   THEN GEN_TAC THEN
2238 REWRITE_TAC[REAL_ARITH `(&0 <= (t3:real)) <=> (&0 < t3) \/ ( t3 = &0)`; TAUT `(a \/ b) /\ (c \/ d) /\ e /\ f <=> ((a \/ b)/\ c /\ e /\ f) \/ ((a \/ b) /\ d /\ e /\ f)`; EXISTS_OR_THM] THEN
2239 MATCH_MP_TAC MONO_OR THEN
2240 SUBGOAL_THEN `((?t1:real t2:real t3:real.
2241        (&0 < t2 \/ t2 = &0) /\
2242         &0< t3 /\
2243        t1 + t2 + t3 = &1 /\
2244        (x':real^3) = t1 % x + t2 % v + t3 % w)
2245   ==> (?t1 t2 t3.
2246             &0< t3 /\ t1 + t2 + t3 = &1 /\ x' = t1 % x + t2 % v + t3 % w))` ASSUME_TAC
2247 THENL  
2248 [MESON_TAC[];
2249      ASM_REWRITE_TAC[] THEN MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN
2250      REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN GEN_TAC THEN
2251      REWRITE_TAC[REAL_ARITH `(&0< (t2:real) \/ (t2 = &0)) <=> ( &0<= t2)`] THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN
2252      POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[] THEN
2253      REWRITE_TAC [REAL_ARITH `(a:real)+ &0 = a`; VECTOR_ARITH  `&0 % (w:real^3) = vec 0`; 
2254      VECTOR_ARITH `  ((x':real^3) = (t1:real) % (x:real^3) + (t2:real) % (v:real^3) + vec 0)<=> ( x' = t1 % x + t2 % v )` ]
2255        THEN MESON_TAC[]]);;     
2256
2257
2258
2259
2260
2261
2262 let IBZWFFH=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)  (v:real^3) (w:real^3) (w1:real^3).
2263 FAN(x,V,E)/\ ({v,w}IN E) /\ ({v,w1}IN E)
2264 ==> 
2265  w_dart_fan x V E (x,v,w,(sigma_fan x V E v w)) INTER
2266 aff_ge {x} {v , w1}={}`,
2267 REPEAT STRIP_TAC THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;` (w1:real^3)`] aff_ge_subset_aff_gt_union_aff)
2268   THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN
2269 MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (v:real^3)`;`w:real^3`;` (w1:real^3)`] disjiont_union_fan)
2270   THEN ASM_REWRITE_TAC[] THEN ASM_SET_TAC[]);;
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280 (*---------------------------------------------------------------------------------*)
2281 (*     aff_ge {x} {v , w}) = (aff_ge {x , v} {w}) INTER (aff_ge {x , w} {v})       *)
2282 (*---------------------------------------------------------------------------------*)
2283
2284 let aff_ge_inter_aff_ge=prove(`!(x:real^3) (v:real^3) (w:real^3).
2285 ~collinear {x,v,w}
2286 ==>
2287 aff_ge {x} {v , w} = aff_ge {x , v} {w} INTER aff_ge {x , w} {v}`,
2288
2289  REPEAT STRIP_TAC THEN MRESA_TAC th3 [`x:real^3`;`v:real^3`;`w:real^3`]
2290    THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`w:real^3`]AFF_GE_1_2)
2291                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
2292                 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`w:real^3`]AFF_GE_2_1)
2293                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
2294                 THEN MP_TAC(ISPECL[`x:real^3`;`w:real^3`;`v:real^3`]AFF_GE_2_1)
2295                 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC 
2296    THEN ASM_REWRITE_TAC[INTER;IN_ELIM_THM;EXTENSION]THEN GEN_TAC THEN EQ_TAC 
2297 THENL(*1*)[
2298 STRIP_TAC THEN STRIP_TAC
2299 THENL(*2*)[
2300     EXISTS_TAC `t1:real` THEN EXISTS_TAC `t2:real` THEN EXISTS_TAC `t3:real` THEN ASM_MESON_TAC[];
2301 EXISTS_TAC `(t1:real)` THEN
2302          EXISTS_TAC `(t3:real)` THEN EXISTS_TAC `(t2:real)` 
2303 THEN
2304          ASM_MESON_TAC[REAL_ARITH `(t1:real)+ (t3:real) +(t2:real)=t1 + t2 + t3`;VECTOR_ARITH ` t1 % x + t2 % v + t3 % w = (t1:real) % (x:real^3) + (t3:real) % (w:real^3) + (t2:real) % (v:real^3)`]](*2*);
2305
2306          STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC 
2307            THEN POP_ASSUM(fun th-> GEN_REWRITE_TAC(PATH_CONV "rrlr" o ONCE_DEPTH_CONV )[th] THEN ASSUME_TAC(th)) THEN POP_ASSUM MP_TAC 
2308            THEN POP_ASSUM(fun th-> GEN_REWRITE_TAC(PATH_CONV "rrlr" o ONCE_DEPTH_CONV )[SYM(th)] THEN ASSUME_TAC(th))
2309 THEN DISJ_CASES_TAC(SET_RULE`t3 - t2' = &0 \/ ~((t3:real) - (t2':real) = &0) `)
2310 THENL[POP_ASSUM MP_TAC
2311 THEN REWRITE_TAC[REAL_ARITH`A-B= &0 <=> A=B`]
2312 THEN REPEAT STRIP_TAC
2313 THEN EXISTS_TAC`t1':real`
2314 THEN EXISTS_TAC`t3':real`
2315 THEN EXISTS_TAC`t2':real`
2316 THEN ASM_REWRITE_TAC[VECTOR_ARITH`t1' % x + t2' % w + t3' % v = t1' % x + t3' % v + t2' % w`;
2317 REAL_ARITH`t1' + t3' + t2'=t1' + t2' + t3'`]
2318 THEN ASM_TAC THEN REAL_ARITH_TAC;
2319
2320 REWRITE_TAC[VECTOR_ARITH
2321  `a % x + b % y + c % z= a1 % x + b1 % z + c1 % y <=> (c-b1) % z = (a1-a) % x + (c1-b)% y`]        
2322            THEN REWRITE_TAC[REAL_ARITH`a+b+c=a1+b1+c1<=> c1-b=(a-a1)+(c-b1)`]
2323 THEN MRESA1_TAC REAL_MUL_LINV`t3 - t2'`
2324            THEN DISCH_TAC THEN DISCH_TAC           THEN DISCH_TAC THEN DISCH_TAC 
2325 THEN MP_TAC(SET_RULE`
2326 (t3 - t2') % w = (t1' - t1) % x + (t3' - t2) %  v:real^3
2327 ==> (inv (t3 - t2'))%((t3 - t2') % w ) = (inv (t3 - t2'))%((t1' - t1) % x + (t3' - t2) %  v:real^3)`)
2328 THEN POP_ASSUM (fun th->GEN_REWRITE_TAC(LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV)[th])
2329 THEN POP_ASSUM(fun th-> ASM_REWRITE_TAC[VECTOR_ARITH`A%B%C= (A*B)%C`;VECTOR_ARITH`&1 %A=A`;VECTOR_ARITH`A%(B+C)=A%B+A%C`] THEN ASSUME_TAC(SYM(th)))
2330 THEN STRIP_TAC
2331 THEN SUBGOAL_THEN`w IN aff{(x:real^3),v}` ASSUME_TAC
2332 THENL[REWRITE_TAC[aff;AFFINE_HULL_2;IN_ELIM_THM;] THEN EXISTS_TAC`inv(t3-t2') *(t1'-t1)`
2333 THEN EXISTS_TAC`inv(t3-t2') *(t3'-t2)` THEN ASM_REWRITE_TAC[REAL_ARITH`A*B+A*C=A*(B+C)`];
2334
2335 ASM_SET_TAC[]]]]);;
2336
2337
2338
2339
2340
2341
2342
2343 (*************JGIYDLE*******************)
2344 (* rcone^0(x,v,h) *)
2345
2346 let rcone_fan = new_definition `rcone_fan  (x:real^3) (v:real^3) (h:real) = {y:real^3 | (y-x) dot (v-x) >(dist(y,x)*dist(v,x)*h)}`;;
2347
2348
2349
2350
2351
2352 (*---------------------------------------------------------------------------------*)
2353 (*          aff_ge {x} {v , w} is closed   *)
2354 (*---------------------------------------------------------------------------------*)
2355
2356
2357
2358
2359 let exp_aff_ge_by_dot=prove(`!x:real^3 v:real^3 u:real^3.
2360 ~collinear {x,v,u}
2361 ==> aff_ge {x,v} {u}={w:real^3| (w-x) dot (e2_fan x v u)= &0 /\ &0 <= (w-x) dot (e1_fan x v u)  }`,
2362 (let CROSS_LAGRANGE1 = prove
2363  (`!x y z. (x cross y) cross z = (x dot z) % y - (z dot y) % x`,
2364   VEC3_TAC) in
2365
2366 REPEAT STRIP_TAC THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]th3) THEN RES_TAC
2367   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]AFF_GE_2_1) THEN RESA_TAC
2368   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]properties_coordinate) THEN RESA_TAC
2369   THEN REWRITE_TAC[EXTENSION;IN_ELIM_THM] THEN GEN_TAC THEN EQ_TAC
2370 THENL[
2371 STRIP_TAC THEN ASM_REWRITE_TAC[VECTOR_ARITH`(a % x + b +c) -x= (a- &1)% x + b + c `] THEN 
2372 REMOVE_ASSUM_TAC THEN SYM_ASSUM_TAC THEN REWRITE_TAC[VECTOR_ARITH`((a-(a+b+c)) % x + b % v +c % u)=  b % (v-x) + c % (u-x)`] 
2373 THEN ASM_REWRITE_TAC[DOT_LADD;DOT_LMUL]
2374    THEN REDUCE_ARITH_TAC
2375   THEN ASM_MESON_TAC[REAL_LE_MUL] ; 
2376
2377 STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"a")
2378   THEN DISCH_THEN(LABEL_TAC"b")
2379 THEN MP_TAC(ISPECL[`e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3)( v:real^3) (u:real^3)`;
2380 `e3_fan (x:real^3) (v:real^3) (u:real^3)`;]ORTHONORMAL_IMP_SPANNING) THEN ASM_REWRITE_TAC[SPAN_3;EXTENSION] 
2381   THEN DISCH_TAC THEN POP_ASSUM(fun th-> MP_TAC(ISPEC`(x':real^3)-(x:real^3)`th)) THEN REWRITE_TAC[SET_RULE`(a:real^3) IN (:real^3)`;IN_ELIM_THM] THEN RES_TAC THEN REMOVE_THEN "a" MP_TAC THEN ASM_REWRITE_TAC[DOT_LADD;DOT_LMUL]
2382   THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"c")
2383   THEN FIND_ASSUM(MP_TAC)`orthonormal (e1_fan (x:real^3) (v:real^3) (u:real^3)) (e2_fan x v u) (e3_fan x v u)`
2384   THEN REWRITE_TAC[orthonormal] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]  THEN ASM_REWRITE_TAC[DOT_SYM]
2385   THEN REDUCE_ARITH_TAC
2386   THEN DISCH_TAC THEN REMOVE_THEN "c" MP_TAC THEN ASM_REWRITE_TAC[] THEN REDUCE_VECTOR_TAC THEN DISCH_THEN (LABEL_TAC"a")
2387   THEN REMOVE_THEN "b" MP_TAC THEN ASM_REWRITE_TAC[DOT_LADD;DOT_LMUL;] THEN REWRITE_TAC[DOT_SYM] THEN ASM_REWRITE_TAC[]
2388   THEN REDUCE_ARITH_TAC
2389   THEN DISCH_TAC THEN REMOVE_THEN "a" MP_TAC
2390   THEN ASM_REWRITE_TAC[e1_fan;e2_fan;CROSS_LMUL;VECTOR_ARITH`a% b% v=(a*b)%v`;CROSS_LAGRANGE1] 
2391   THEN REDUCE_VECTOR_TAC THEN REWRITE_TAC[VECTOR_ARITH`a%(x- b % v)+ c % v=(c- a* b) % v+  a % x `;
2392 e3_fan;VECTOR_ARITH`a% b% v=(a*b)%v`]
2393   THEN STRIP_TAC THEN
2394 EXISTS_TAC
2395 `&1 - ((((w:real) -
2396    ((u':real) * inv (norm (inv (norm ((v:real^3) - (x:real^3))) % (v - x) cross ((u:real^3) - x)))) *
2397    (inv (norm (v - x)) % (v - x) dot (u - x))) *
2398   inv (norm (v - x)))+
2399 ((u':real) * inv (norm (e3_fan (x:real^3) (v:real^3) (u:real^3) cross (u - x)))))`
2400   THEN EXISTS_TAC
2401 `(((w:real) -
2402    ((u':real) * inv (norm (inv (norm ((v:real^3) - (x:real^3))) % (v - x) cross ((u:real^3) - x)))) *
2403    (inv (norm (v - x)) % (v - x) dot (u - x))) *
2404   inv (norm (v - x)))`
2405   THEN EXISTS_TAC
2406 ` ((u':real) * inv (norm (e3_fan (x:real^3) (v:real^3) (u:real^3) cross (u - x))))`
2407 THEN
2408 STRIP_TAC
2409 THENL[
2410
2411 SUBGOAL_THEN `~(collinear {vec 0, v-x, u-x})==> ~((e3_fan (x:real^3) (v:real^3) (u:real^3)) cross ((u:real^3)-(x:real^3))= vec 0)` ASSUME_TAC
2412 THENL[
2413  MATCH_MP_TAC MONO_NOT THEN REWRITE_TAC[e3_fan;CROSS_LMUL] 
2414 THEN DISCH_TAC THEN MP_TAC(ISPECL [`v:real^3`; `x:real^3`] imp_inv_norm_not_zero_fan) 
2415 THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN 
2416 MP_TAC(ISPECL [`inv(norm((v:real^3)-(x:real^3)))`; `((v:real^3) -(x:real^3)) cross ((u:real^3)-(x:real^3))`; `(vec 0):real^3`] VECTOR_MUL_LCANCEL_IMP) 
2417 THEN ASM_REWRITE_TAC[VECTOR_MUL_RZERO;CROSS_EQ_0 ];
2418
2419 POP_ASSUM MP_TAC THEN REWRITE_TAC[GSYM COLLINEAR_3] 
2420 THEN GEN_REWRITE_TAC(LAND_CONV o LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[SET_RULE`{a,b,c}={b,a,c}`] THEN RED_TAC
2421 THEN
2422 MP_TAC(ISPECL [`(e3_fan (x:real^3) (v:real^3) (u:real^3)) cross ((u:real^3)-(x:real^3))`; `((vec 0):real^3)`] imp_norm_ge_zero_fan)
2423   THEN REDUCE_VECTOR_TAC THEN RES_TAC THEN 
2424 MP_TAC(ISPECL[`u':real`;`inv (norm ((e3_fan (x:real^3) (v:real^3) (u:real^3)) cross ((u:real^3)-(x:real^3))))`] 
2425 REAL_LE_MUL) THEN RES_TAC THEN POP_ASSUM MATCH_MP_TAC THEN POP_ASSUM MP_TAC
2426  THEN REAL_ARITH_TAC];
2427
2428 STRIP_TAC THENL[REAL_ARITH_TAC;
2429 REWRITE_TAC[e3_fan] THEN POP_ASSUM MP_TAC THEN VECTOR_ARITH_TAC]]]));;
2430
2431
2432
2433
2434 let closed_aff_ge_2_1=prove(`!x:real^3 v:real^3 u:real^3.
2435 ~collinear {x,v,u}
2436 ==>
2437 closed (aff_ge {x,v} {u})`,
2438 (let lemma=prove(`!x:real^3 v:real^3 u:real^3.
2439 {w:real^3| (w-x) dot (e2_fan x v u)= &0 /\ &0 <= (w-x) dot (e1_fan x v u)  }
2440 ={w:real^3| (w-x) dot (e2_fan x v u)= &0} INTER {w:real^3| (w-x) dot (e1_fan x v u) >= &0 }`,
2441 REWRITE_TAC[INTER; IN_ELIM_THM;REAL_ARITH`&0<=a <=> a >= &0`]) in
2442 (
2443 let lemma1=prove(`!x:real^3 v:real^3 u:real^3.
2444 closed {w:real^3| (w-x) dot (e2_fan x v u)= &0}`,
2445 REWRITE_TAC[ DOT_SYM] THEN REWRITE_TAC[DOT_RSUB;REAL_ARITH`a-b= &0<=> a=b`;] 
2446  THEN REPEAT GEN_TAC THEN MP_TAC(ISPECL[`e2_fan (x:real^3) (v:real^3) (u:real^3)`;
2447 ` e2_fan (x:real^3) (v:real^3) (u:real^3) dot x`]CLOSED_HYPERPLANE) THEN ASM_SET_TAC[]) in
2448  (
2449 let lemma2=prove(`!x:real^3 v:real^3 u:real^3.
2450 closed {w:real^3| (w-x) dot (e1_fan x v u) >= &0 }`,
2451 REWRITE_TAC[ DOT_SYM] THEN REWRITE_TAC[DOT_RSUB;REAL_ARITH`a-b>= &0<=> a>=b`;] 
2452  THEN REPEAT GEN_TAC THEN MP_TAC(ISPECL[`e1_fan (x:real^3) (v:real^3) (u:real^3)`;
2453 ` e1_fan (x:real^3) (v:real^3) (u:real^3) dot x`]CLOSED_HALFSPACE_GE) THEN ASM_SET_TAC[]) in
2454
2455 REPEAT STRIP_TAC THEN
2456 ASM_MESON_TAC[exp_aff_ge_by_dot;lemma;lemma1;lemma2;CLOSED_INTER]))));;
2457
2458
2459
2460
2461
2462 let closed_aff_ge_1_2=prove(`!(x:real^3)  (v:real^3) (w:real^3).
2463 ~collinear {x, v, w}
2464 ==>
2465 closed (aff_ge {x} {v , w})`,
2466 REPEAT STRIP_TAC 
2467 THEN POP_ASSUM (fun th-> MP_TAC (th) THEN ONCE_REWRITE_TAC[SET_RULE`{A,B,C}={A,C,B}`] THEN ASSUME_TAC(th))
2468 THEN MRESA_TAC aff_ge_inter_aff_ge[`x:real^3`;`v:real^3`;`w:real^3`]
2469 THEN  MRESA_TAC closed_aff_ge_2_1[`x:real^3`;`w:real^3`;`v:real^3`]
2470 THEN  MRESA_TAC closed_aff_ge_2_1[`x:real^3`;`v:real^3`;`w:real^3`]
2471 THEN ASM_MESON_TAC[CLOSED_INTER]);;
2472
2473
2474 (*--------------------------------------------------------------------------------------------*)
2475 (*       closed_halfline_fan   closed  aff_ge {x} {v}                                         *)
2476 (*--------------------------------------------------------------------------------------------*) 
2477
2478 let AFF_GE_1_1=prove(`!x:real^3 v:real^3. 
2479 ~(x=v)
2480 ==> aff_ge {x} {v} = {y:real^3 | ?t1:real t2:real. (&0 <= t2 ) /\ (t1 + t2 = &1) /\ (y = t1 % x + t2 % v )}`,
2481 (let lemma=prove(`!x v.  ~(x=v) <=> DISJOINT {x} {v} `,
2482
2483 REWRITE_TAC[DISJOINT; INTER; IN_SING; EXTENSION; EMPTY; IN_ELIM_THM] THEN ASM_SET_TAC[]) in
2484
2485 REWRITE_TAC[lemma] THEN AFF_TAC));;
2486
2487
2488 let exp_aff_ge_by_dot_1_1=prove(`!x:real^3 v:real^3 u:real^3.
2489 ~collinear {x,v,u}
2490 ==>
2491 aff_ge {x} {v}={w:real^3| (w-x) dot (e2_fan x v u)= &0 /\ &0 <= (w-x) dot (e3_fan x v u) 
2492 /\ (w-x) dot (e1_fan x v u)= &0 }`,
2493
2494 REPEAT STRIP_TAC THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]th3) 
2495   THEN RES_TAC THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`]AFF_GE_1_1) THEN RESA_TAC
2496   THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]properties_coordinate) THEN RESA_TAC
2497   THEN REWRITE_TAC[EXTENSION;IN_ELIM_THM] THEN GEN_TAC THEN EQ_TAC
2498 THENL[
2499 STRIP_TAC THEN ASM_REWRITE_TAC[VECTOR_ARITH`(a % x + b) -x= (a- &1)% x + b  `] 
2500 THEN 
2501 REMOVE_ASSUM_TAC THEN SYM_ASSUM_TAC THEN REWRITE_TAC[VECTOR_ARITH`((a-(a+b)) % x + b % v)=  b % (v-x)`] 
2502 THEN ASM_REWRITE_TAC[DOT_LADD;DOT_LMUL]
2503    THEN REDUCE_ARITH_TAC THEN POP_ASSUM MP_TAC
2504   THEN FIND_ASSUM(fun th-> REWRITE_TAC[SYM(th)])`dist (v,x) % e3_fan x v u = v- x:real^3`
2505   THEN REWRITE_TAC[DOT_LMUL] 
2506     THEN FIND_ASSUM(MP_TAC)`orthonormal (e1_fan (x:real^3) (v:real^3) (u:real^3)) (e2_fan x v u) (e3_fan x v u)`
2507   THEN REWRITE_TAC[orthonormal] THEN RESA_TAC THEN REDUCE_ARITH_TAC THEN MP_TAC(ISPECL[`v:real^3`;`x:real^3`]DIST_POS_LE)
2508   THEN MESON_TAC[REAL_LE_MUL];
2509
2510 STRIP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"a")
2511   THEN DISCH_THEN(LABEL_TAC"b") THEN DISCH_THEN (LABEL_TAC "c")
2512 THEN MP_TAC(ISPECL[`e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3)( v:real^3) (u:real^3)`;
2513 `e3_fan (x:real^3) (v:real^3) (u:real^3)`;]ORTHONORMAL_IMP_SPANNING) THEN ASM_REWRITE_TAC[SPAN_3;EXTENSION] 
2514   THEN DISCH_TAC THEN POP_ASSUM(fun th-> MP_TAC(ISPEC`(x':real^3)-(x:real^3)`th)) THEN REWRITE_TAC[SET_RULE`(a:real^3) IN (:real^3)`;IN_ELIM_THM] THEN RES_TAC THEN REMOVE_THEN "a" MP_TAC THEN ASM_REWRITE_TAC[DOT_LADD;DOT_LMUL]
2515   THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"d")
2516   THEN FIND_ASSUM(MP_TAC)`orthonormal (e1_fan (x:real^3) (v:real^3) (u:real^3)) (e2_fan x v u) (e3_fan x v u)`
2517   THEN REWRITE_TAC[orthonormal] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]  THEN ASM_REWRITE_TAC[DOT_SYM]
2518   THEN REDUCE_ARITH_TAC
2519   THEN REMOVE_THEN "c" MP_TAC THEN ASM_REWRITE_TAC[DOT_LADD;DOT_LMUL]
2520   THEN ASM_REWRITE_TAC[DOT_SYM]
2521   THEN REDUCE_ARITH_TAC THEN DISCH_TAC
2522   THEN DISCH_TAC THEN REMOVE_THEN "d" MP_TAC THEN ASM_REWRITE_TAC[] THEN REDUCE_VECTOR_TAC 
2523   THEN  DISCH_TAC
2524   THEN REMOVE_THEN "b" MP_TAC THEN ASM_REWRITE_TAC[DOT_LADD;DOT_LMUL;] THEN REWRITE_TAC[DOT_SYM] THEN ASM_REWRITE_TAC[]
2525   THEN REDUCE_ARITH_TAC THEN POP_ASSUM MP_TAC THEN REWRITE_TAC[e3_fan;VECTOR_ARITH`a% b% v=(a*b)%v`;
2526 VECTOR_ARITH`a-b=c %(v-b)<=> a= (&1-c) % b + c % v`] THEN DISCH_THEN (LABEL_TAC"a")
2527   THEN STRIP_TAC THEN
2528 EXISTS_TAC
2529 `&1 - (w:real) * (inv (norm ((v:real^3) - (x:real^3))))`
2530   THEN EXISTS_TAC
2531 `(w:real) * (inv (norm ((v:real^3) - (x:real^3))))`
2532 THEN
2533 STRIP_TAC
2534 THENL[
2535 MP_TAC(ISPECL[`v:real^3`;`x:real^3`]imp_norm_ge_zero_fan) THEN RES_TAC THEN MATCH_MP_TAC REAL_LE_MUL 
2536 THEN ASM_REWRITE_TAC[]  THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
2537 STRIP_TAC THENL[REAL_ARITH_TAC;
2538 ASM_REWRITE_TAC[]]]]);;
2539
2540
2541
2542
2543 let closed_halfline_fan=prove(`!(x:real^3) (v:real^3) (u:real^3). 
2544 ~collinear {x,v,u}
2545 ==>
2546 closed (aff_ge {x} { v})`,
2547
2548
2549 (let lemma=prove(`!x v u :real^3.
2550 {w:real^3| (w-x) dot (e2_fan x v u)= &0 /\ &0 <= (w-x) dot (e3_fan x v u) 
2551 /\ (w-x) dot (e1_fan x v u)= &0 }= {w:real^3| (w-x) dot (e2_fan x v u)= &0} INTER
2552 ({w:real^3| (w-x) dot (e1_fan x v u)= &0} INTER {w:real^3| &0 <= (w-x) dot (e3_fan x v u)})`,
2553 REWRITE_TAC[INTER;IN_ELIM_THM] THEN ASM_SET_TAC[]) in
2554
2555
2556 (let lemma1=prove(`!x:real^3 v:real^3 u:real^3.
2557 closed {w:real^3| (w-x) dot (e2_fan x v u)= &0}`,
2558 REWRITE_TAC[ DOT_SYM] THEN REWRITE_TAC[DOT_RSUB;REAL_ARITH`a-b= &0<=> a=b`;] 
2559  THEN REPEAT GEN_TAC THEN MP_TAC(ISPECL[`e2_fan (x:real^3) (v:real^3) (u:real^3)`;
2560 ` e2_fan (x:real^3) (v:real^3) (u:real^3) dot x`]CLOSED_HYPERPLANE) THEN ASM_SET_TAC[]) in
2561
2562 (let lemma3=prove(`!x:real^3 v:real^3 u:real^3.
2563 closed {w:real^3| (w-x) dot (e1_fan x v u)= &0}`,
2564 REWRITE_TAC[ DOT_SYM] THEN REWRITE_TAC[DOT_RSUB;REAL_ARITH`a-b= &0<=> a=b`;] 
2565  THEN REPEAT GEN_TAC THEN MP_TAC(ISPECL[`e1_fan (x:real^3) (v:real^3) (u:real^3)`;
2566 ` e1_fan (x:real^3) (v:real^3) (u:real^3) dot x`]CLOSED_HYPERPLANE) THEN ASM_SET_TAC[]) in
2567  
2568 (let lemma2=prove(`!x:real^3 v:real^3 u:real^3.
2569 closed {w:real^3| &0 <= (w-x) dot (e3_fan x v u)  }`,
2570 REWRITE_TAC[ DOT_SYM] THEN REWRITE_TAC[DOT_RSUB;REAL_ARITH`&0 <= a-b<=> a>=b`;] 
2571  THEN REPEAT GEN_TAC THEN MP_TAC(ISPECL[`e3_fan (x:real^3) (v:real^3) (u:real^3)`;
2572 ` e3_fan (x:real^3) (v:real^3) (u:real^3) dot x`]CLOSED_HALFSPACE_GE) THEN ASM_SET_TAC[]) in
2573 REPEAT STRIP_TAC THEN MP_TAC(ISPECL[`x:real^3`;` v:real^3`; `u:real^3`]exp_aff_ge_by_dot_1_1)
2574   THEN REWRITE_TAC[lemma]
2575 THEN RESA_TAC THEN ASSUME_TAC(ISPECL[`x:real^3`;` v:real^3`; `u:real^3`]lemma1) THEN ASSUME_TAC(ISPECL[`x:real^3`;` v:real^3`; `u:real^3`]lemma2) THEN ASSUME_TAC(ISPECL[`x:real^3`;` v:real^3`; `u:real^3`]lemma3)
2576   THEN SUBGOAL_THEN`closed({w:real^3| (w-x) dot (e1_fan x v u)= &0} INTER {w:real^3| &0 <= (w-x) dot (e3_fan x v u)})`
2577 ASSUME_TAC
2578 THENL[ASM_MESON_TAC[CLOSED_INTER];
2579 ASM_MESON_TAC[CLOSED_INTER]])))));;
2580
2581
2582
2583
2584 (*--------------------------------------------------------------------------------------------*)
2585 (*       The properties of      ballnorm_fan (x:real^3)={y:real^3 | dist(x,y) = &1}           *)
2586 (*--------------------------------------------------------------------------------------------*) 
2587
2588
2589
2590
2591
2592 let ballnorm_fan=new_definition`ballnorm_fan (x:real^3)={y:real^3 | dist(x,y) = &1}`;;
2593
2594
2595 let closed_ballnorm_fan=prove(`!x:real^3. closed (ballnorm_fan x)`,
2596 GEN_TAC THEN REWRITE_TAC[ballnorm_fan] THEN
2597 SUBGOAL_THEN  `{y:real^3 | dist((x:real^3),(y:real^3)) = &1} = frontier( ball((x:real^3), &1))` ASSUME_TAC
2598  THENL [ASSUME_TAC(REAL_ARITH `&0 < &1`) THEN POP_ASSUM MP_TAC THEN
2599         SIMP_TAC[frontier; CLOSURE_BALL; INTERIOR_OPEN; OPEN_BALL;
2600            REAL_LT_IMP_LE] THEN
2601   REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM; IN_BALL; IN_CBALL] THEN
2602   REAL_ARITH_TAC;
2603    ASM_REWRITE_TAC[] THEN MESON_TAC[FRONTIER_CLOSED]]);;
2604
2605 let bounded_ballnorm_fan=prove(`!x:real^3 . bounded(ballnorm_fan x)`,
2606 REPEAT GEN_TAC THEN REWRITE_TAC[ballnorm_fan;bounded] THEN
2607  EXISTS_TAC `norm(x:real^3) + &1`  THEN REWRITE_TAC[ dist; IN_ELIM_THM] 
2608   THEN GEN_TAC THEN STRIP_TAC THEN ASSUME_TAC(NORM_TRIANGLE_SUB) THEN
2609 POP_ASSUM (MP_TAC o ISPECL [`(x':real^3)`; `(x:real^3)`]  o INST_TYPE [`:real^3`,`:real^3`])
2610   THEN REWRITE_TAC[NORM_SUB] THEN ASM_REWRITE_TAC[]);;
2611
2612 let bounded_ballnorm_fans=prove(`!x:real^3 v:real^3 w:real^3. bounded (aff_ge {x} {v, w} INTER ballnorm_fan x)`,
2613 REPEAT GEN_TAC THEN ASSUME_TAC (bounded_ballnorm_fan) THEN
2614 POP_ASSUM (MP_TAC o ISPEC `x:real^3`) THEN DISCH_TAC THEN
2615 SUBGOAL_THEN `aff_ge {x} {(v:real^3), (w:real^3)} INTER ballnorm_fan x SUBSET ballnorm_fan (x:real^3)` ASSUME_TAC THENL
2616 [ASM_SET_TAC[];
2617 ASM_MESON_TAC[BOUNDED_SUBSET ]]);;
2618
2619
2620
2621 (*--------------------------------------------------------------------------------------------*)
2622 (*       The properties of sets in norm ball                                                  *)
2623 (*--------------------------------------------------------------------------------------------*) 
2624
2625
2626
2627
2628 let closed_aff_ge_ballnorm_fan=prove(`!(x:real^3)   (v:real^3) (w:real^3).
2629 ~collinear{x,v,w}
2630 ==>
2631 closed (aff_ge {x} {v, w} INTER ballnorm_fan x)`,
2632 ASM_MESON_TAC[closed_aff_ge_1_2; closed_ballnorm_fan;CLOSED_INTER]);;
2633
2634
2635
2636
2637
2638 let compact_aff_ge_ballnorm_fan=prove(`
2639 !(x:real^3) (v:real^3) (w:real^3).
2640 ~collinear{x,v,w}
2641 ==>
2642 compact (aff_ge {x} {v, w} INTER ballnorm_fan x)`,
2643 REPEAT GEN_TAC THEN DISCH_TAC THEN
2644 SUBGOAL_THEN `closed (aff_ge {x} {v, w} INTER ballnorm_fan x)` ASSUME_TAC 
2645 THENL
2646   [ASM_MESON_TAC[closed_aff_ge_ballnorm_fan];
2647     ASSUME_TAC(bounded_ballnorm_fans) 
2648     THEN
2649    POP_ASSUM (MP_TAC o ISPECL [`x:real^3`; `v:real^3`; `w:real^3`]) THEN
2650     ASM_MESON_TAC[BOUNDED_CLOSED_IMP_COMPACT ]]);;
2651
2652
2653
2654
2655
2656
2657
2658 let closed_point_fan=prove(`
2659 (!x:real^3 v:real^3 u:real^3. 
2660 ~collinear {x,v,u}
2661 ==>
2662 closed (aff_ge {x} {v} INTER ballnorm_fan x) )`,
2663 REPEAT GEN_TAC THEN DISCH_TAC THEN
2664 SUBGOAL_THEN `closed (aff_ge {(x:real^3)} {(v:real^3)})` ASSUME_TAC THENL
2665    [ASM_MESON_TAC[ closed_halfline_fan]; 
2666     SUBGOAL_THEN `closed (ballnorm_fan (x:real^3))` ASSUME_TAC THENL
2667        [ASM_MESON_TAC[closed_ballnorm_fan];
2668         ASM_MESON_TAC[CLOSED_INTER]]]);;
2669
2670
2671
2672 let exist_fan=prove(`(!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) (v1:real^3) (w1:real^3).
2673
2674 FAN(x,V,E) /\ ~(v IN {v1,w1}) /\ {v1,w1} IN E /\ {v,w} IN E
2675 ==>
2676 ?h:real.
2677 (&0 < h)
2678 /\ 
2679 (!y1:real^3 y2:real^3. (y1 IN aff_ge {x} {v} INTER ballnorm_fan x) /\ y2 IN (aff_ge {x} {v1, w1} INTER ballnorm_fan x)
2680 ==> h  <= dist(y1,y2) ))`,
2681 REPEAT STRIP_TAC 
2682 THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w:real^3)`;
2683 ` (v:real^3)`] remark1_fan)
2684 THEN RES_TAC 
2685 THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w1:real^3)`;
2686 ` (v1:real^3)`] remark1_fan)
2687 THEN RES_TAC 
2688 THEN MATCH_MP_TAC( ISPECL [`aff_ge {(x:real^3)} {(v:real^3)} INTER ballnorm_fan x`; 
2689  `aff_ge {(x:real^3)} {(v1:real^3), (w1:real^3)} INTER ballnorm_fan x`] SEPARATE_CLOSED_COMPACT)
2690   THEN MP_TAC(ISPECL[`(x:real^3) `;` (v:real^3)`;` (w:real^3)`]closed_point_fan) 
2691 THEN RESA_TAC
2692   THEN MP_TAC(ISPECL[`(x:real^3) `;` (v1:real^3)`;` (w1:real^3)`]compact_aff_ge_ballnorm_fan) THEN RESA_TAC
2693   THEN FIND_ASSUM(MP_TAC)`FAN(x:real^3,V,E)`
2694   THEN REWRITE_TAC[FAN;fan7] THEN STRIP_TAC
2695   THEN POP_ASSUM(fun th-> MP_TAC(ISPECL[`{(v:real^3)}`;`{(v1:real^3),(w1:real^3)}`]th))
2696                    THEN ASM_REWRITE_TAC[UNION; IN_ELIM_THM;]
2697   THEN GEN_REWRITE_TAC(LAND_CONV o LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[EXTENSION;]
2698   THEN ASM_REWRITE_TAC[IN_SING; SET_RULE`(!x. x = v <=> x = v') <=> v =v'`;SET_RULE`(?v'. v' IN V /\ v = v')<=> v IN V`]
2699   THEN SUBGOAL_THEN `{v:real^3} INTER {v1,w1} ={}` ASSUME_TAC
2700 THENL[
2701 REWRITE_TAC[INTER;IN_SING; EXTENSION; EMPTY; IN_ELIM_THM] THEN ASM_SET_TAC[];
2702
2703 ASM_REWRITE_TAC[AFF_GE_EQ_AFFINE_HULL; SET_RULE`(A INTER C) INTER (B INTER C)= (A INTER B) INTER C`;] 
2704 THEN ASSUME_TAC(AFFINE_SING) THEN MP_TAC(ISPEC`{ (x:real^3) }` AFFINE_HULL_EQ )
2705   THEN RESA_TAC THEN RESA_TAC THEN REWRITE_TAC[ballnorm_fan;INTER; IN_SING; EXTENSION;EMPTY;IN_ELIM_THM;
2706 ] THEN GEN_TAC THEN STRIP_TAC THEN POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[DIST_REFL ] THEN REAL_ARITH_TAC]);;
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722 let ballsets_fan=new_definition`ballsets_fan (s:real^3->bool) (h:real)= {y:real^3| ?x:real^3. dist(x,y) < h /\ x IN s} `;;
2723
2724
2725 let exists_ballsets_fan =prove(
2726 `(!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) (v1:real^3) (w1:real^3).
2727 FAN(x,V,E) /\ ~(v IN {v1,w1}) /\ {v1,w1} IN E /\ {v,w} IN E
2728 ==>
2729 ?h:real.
2730 (&0 < h)
2731 /\ (ballsets_fan (aff_ge {x} {v} INTER ballnorm_fan x) h INTER (aff_ge {x} {v1, w1} INTER ballnorm_fan x) = {})
2732 )`,
2733  REPEAT GEN_TAC THEN DISCH_TAC THEN
2734    MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`;` (v1:real^3)`;` (w1:real^3)`] exist_fan)  THEN RES_TAC
2735    THEN POP_ASSUM MP_TAC  THEN REWRITE_TAC[ballsets_fan; INTER; IN_ELIM_THM]
2736    THEN DISCH_TAC THEN EXISTS_TAC`h:real`
2737    THEN ASM_REWRITE_TAC[EXTENSION;IN_ELIM_THM;] THEN GEN_TAC THEN EQ_TAC
2738 THENL[
2739  POP_ASSUM MP_TAC
2740    THEN DISCH_THEN(LABEL_TAC"a") 
2741    THEN STRIP_TAC THEN REMOVE_THEN "a"(fun th-> MP_TAC(ISPECL[`x'':real^3`;`x':real^3`]th))    
2742 THEN ASM_REWRITE_TAC[EMPTY;IN_ELIM_THM] THEN REPEAT (POP_ASSUM MP_TAC)
2743    THEN REAL_ARITH_TAC;
2744 REWRITE_TAC[EMPTY;IN_ELIM_THM]]);;
2745
2746
2747
2748
2749 (*-------------------------------------------------------------------------------------------*)
2750 (* cone_ge_fan_inter_aff_ge_is_empty                                                         *)
2751 (*-------------------------------------------------------------------------------------------*)
2752
2753
2754
2755 let cone_ge_fan=new_definition`cone_ge_fan (x:real^3) (s:real^3->bool)= {y:real^3| ?a:real z:real^3. (&0 <= a)/\(z IN s) /\ (y =a % (z - x) + x)}`;;
2756
2757
2758
2759
2760
2761 let cone_ge_fan_inter_aff_ge_is_empty=prove(
2762 `(!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) (v1:real^3) (w1:real^3).
2763 FAN(x,V,E) /\ ~(v IN {v1,w1}) /\ {v1,w1} IN E /\ {v,w} IN E
2764 ==>
2765
2766 ?h:real.
2767 (h > &0)
2768 /\ (cone_ge_fan x ((ballsets_fan (aff_ge {x} {v} INTER ballnorm_fan x) h)INTER ballnorm_fan x ) INTER aff_ge {x} {v1, w1} = {x})
2769 )`,
2770  
2771 REPEAT STRIP_TAC 
2772 THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w:real^3)`;
2773 `(v:real^3)`] remark1_fan)
2774   THEN RES_TAC 
2775 THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool)`;` (E:(real^3->bool)->bool) `;` (w1:real^3)`;
2776 `(v1:real^3)`] remark1_fan)
2777   THEN RES_TAC 
2778 THEN  MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3)`;
2779 `(w:real^3)`;` (v1:real^3)`;` (w1:real^3)`] exists_ballsets_fan)  
2780 THEN ASM_REWRITE_TAC[]
2781    THEN MATCH_MP_TAC MONO_EXISTS 
2782 THEN GEN_TAC THEN STRIP_TAC THEN STRIP_TAC
2783 THENL(*1*)[
2784
2785 ASM_REWRITE_TAC[REAL_ARITH`a> &0 <=> &0< a`];(*1*)
2786  REWRITE_TAC [cone_ge_fan; EXTENSION; IN_SING; INTER; IN_ELIM_THM] THEN GEN_TAC THEN EQ_TAC
2787 THENL(*2*)[
2788  ASM_CASES_TAC `(x':real^3)=(x:real^3)`
2789 THENL(*3*)[ASM_REWRITE_TAC[];(*3*)
2790                        MP_TAC (ISPECL [`x':real^3`; `x:real^3`] imp_norm_not_zero_fan) 
2791                                    THEN RES_TAC THEN STRIP_TAC THEN                    
2792                                            POP_ASSUM MP_TAC THEN  DISCH_THEN(LABEL_TAC "a")
2793                                               THEN REPEAT STRIP_TAC 
2794                                               THEN ASM_REWRITE_TAC[]
2795                                               THEN ABBREV_TAC `(x1:real^3)= inv (norm ((x':real^3)-(x:real^3))) % (x'-x) + x`
2796                                               THEN SUBGOAL_THEN `(x1:real^3) IN ballnorm_fan (x:real^3)` ASSUME_TAC
2797 THENL(*4*)[                     REWRITE_TAC[ballnorm_fan; IN_ELIM_THM] 
2798                                                         THEN EXPAND_TAC "x1"
2799                                                         THEN REWRITE_TAC[dist]
2800                                                         THEN REWRITE_TAC[VECTOR_ARITH `(x:real^3)-((a:real^3)+(x:real^3))= --(a)`; VECTOR_ARITH `-- ((a:real)% (v:real^3))=(-- a) % v`; NORM_MUL;REAL_ABS_NEG; REAL_ABS_INV; REAL_ABS_NORM]
2801                                                         THEN USE_THEN "a"  MP_TAC
2802                                                         THEN MP_TAC(ISPEC `norm ((x':real^3)-(x:real^3))` REAL_MUL_LINV)
2803                                                         THEN ASM_MESON_TAC[];(*4*)
2804               SUBGOAL_THEN `(x1:real^3) IN aff_ge {(x:real^3)} {(v1:real^3),(w1:real^3)}` ASSUME_TAC
2805 THENL(*5*)[REMOVE_THEN "a" MP_TAC THEN
2806 MP_TAC(ISPECL[`x:real^3`;`v1:real^3`;`w1:real^3`]AFF_GE_1_2) THEN RESA_TAC 
2807                                                         THEN REWRITE_TAC[IN_ELIM_THM]
2808   THEN STRIP_TAC THEN
2809                                                         EXISTS_TAC `&1 - inv (norm((x':real^3)-(x:real^3))) + inv (norm (x' - x)) * (t1:real) `
2810                                                         THEN EXISTS_TAC `inv (norm((x':real^3)-(x:real^3))) * (t2:real) `
2811                                                         THEN EXISTS_TAC `inv (norm((x':real^3)-(x:real^3))) * (t3:real) `
2812                                                         THEN EXPAND_TAC "x1"
2813                                                         THEN REWRITE_TAC[VECTOR_ARITH`((a:real)-(b:real)+(c:real))%(v:real^3)=(a:real) % v -(b:real)% v+(c:real) %(v:real^3)`;
2814 VECTOR_ARITH `&1 % (x:real^3)=x`; VECTOR_ARITH `((a:real)*(b:real)) % (v:real^3)= (a % (b % v))`;
2815 VECTOR_ARITH `(x - inv (norm (x' - x)) % x + inv (norm (x' - x)) % t1 % x) +
2816  inv (norm (x' - x)) % t2 % v1 +
2817  inv (norm (x' - x)) % t3 % w1 =(inv (norm ((x':real^3)- x))) % ( t1 % x + t2 % v1+ t3% w1 -x)+ (x:real^3)` 
2818
2819 ]
2820                                                         THEN STRIP_TAC 
2821 THENL(*6*)[SUBGOAL_THEN `&0 <= inv (norm ((x':real^3)-(x:real^3))) ` ASSUME_TAC 
2822 THENL(*7*)[                                                                MATCH_MP_TAC REAL_LE_INV 
2823                                                                                  THEN MESON_TAC[NORM_POS_LE];(*7*)
2824                                                                                ASM_MESON_TAC[REAL_LE_MUL]](*7*);(*6*)
2825                                                                     
2826 STRIP_TAC
2827 THENL(*7*)[ SUBGOAL_THEN `&0 <= inv (norm ((x':real^3)-(x:real^3))) ` ASSUME_TAC
2828 THENL(*8*)[                                                                 MATCH_MP_TAC REAL_LE_INV
2829                                                                           THEN MESON_TAC[NORM_POS_LE];(*8*)
2830    ASM_MESON_TAC[REAL_LE_MUL; REAL_ARITH `(a:real)>= &0 <=> &0 <= a`]](*8*);(*7*)
2831
2832 REWRITE_TAC[REAL_ARITH `(&1 - inv (norm (x' - x)) + inv (norm (x' - x)) * t1) +
2833  inv (norm (x' - x)) * t2 +
2834  inv (norm (x' - x)) * t3= &1 - inv (norm (x' - x)) + inv (norm (x' - x)) * (t1 + t2 + t3)`]
2835     THEN STRIP_TAC
2836 THENL(*8*)[
2837 ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_ARITH `(a:real) * &1 = a`; REAL_ARITH `&1 - (a:real) +(a:real) = &1`];(*8*)
2838                                                                                                                 
2839 SUBGOAL_THEN `(x':real^3) -(x:real^3)= (t1:real) % (x:real^3) + (t2:real) % (v1:real^3) + (t3:real) % (w1:real^3) -(x:real^3)` ASSUME_TAC
2840 THENL(*9*)[ ASM_REWRITE_TAC[] THEN VECTOR_ARITH_TAC;(*9*)
2841     SUBGOAL_THEN `inv (norm   ((x':real^3) -(x:real^3)) )  % ((x':real^3) -(x:real^3)) = inv (norm   ((x':real^3) -(x:real^3)) ) % ((t1:real) % (x:real^3) + (t2:real) % (v1:real^3) + (t3:real) % (w1:real^3) -(x:real^3))` ASSUME_TAC
2842 THENL(*10*)[ASM_MESON_TAC[ VECTOR_MUL_LCANCEL ];(*10*)
2843 ASM_MESON_TAC[]](*10*)](*9*)](*8*)](*7*)](*6*); (*5*)
2844                                                                      
2845 SUBGOAL_THEN `(x1:real^3) IN ballsets_fan (aff_ge {(x:real^3)} {(v:real^3)} INTER ballnorm_fan x) (h:real)` ASSUME_TAC
2846 THENL(*6*)[                                                                                   
2847  SUBGOAL_THEN `norm ((z:real^3)-(x:real^3))= &1` ASSUME_TAC
2848 THENL(*7*)[FIND_ASSUM(MP_TAC)`z IN ballnorm_fan (x:real^3)` 
2849     THEN REWRITE_TAC[ballnorm_fan; IN_ELIM_THM; dist; NORM_SUB];(*7*)
2850     POP_ASSUM MP_TAC 
2851     THEN DISCH_THEN (LABEL_TAC "k") 
2852     THEN SUBGOAL_THEN `(x':real^3)- (x:real^3)= (a:real) % ((z:real^3)-x )` ASSUME_TAC
2853 THENL(*8*)[ FIND_ASSUM(MP_TAC)`x'=a %(z-x) +x:real^3`  THEN VECTOR_ARITH_TAC;(*8*)
2854                                                                        
2855 SUBGOAL_THEN `norm((x':real^3)- (x:real^3))= norm((a:real) % ((z:real^3)-x ))` ASSUME_TAC
2856 THENL(*9*)[ASM_SET_TAC[];(*9*)
2857                                                                 
2858 POP_ASSUM MP_TAC                                                
2859 THEN REWRITE_TAC[NORM_MUL] 
2860 THEN     POP_ASSUM MP_TAC
2861          THEN USE_THEN "k" (fun th -> REWRITE_TAC[th]) 
2862   THEN REDUCE_ARITH_TAC
2863          THEN SUBGOAL_THEN `abs (a:real)=a`ASSUME_TAC
2864     THENL(*10*)[FIND_ASSUM(MP_TAC)`&0 <= a:real` THEN REAL_ARITH_TAC;(*10*)
2865 POP_ASSUM (fun th-> REWRITE_TAC[th]) THEN DISCH_THEN(LABEL_TAC"l")
2866     THEN DISCH_THEN (LABEL_TAC "n")
2867      THEN REMOVE_THEN "l" MP_TAC                                                                                                                     THEN USE_THEN "n" (fun th-> REWRITE_TAC[SYM th])
2868                             THEN DISCH_THEN (LABEL_TAC "l")
2869                                                                              THEN SUBGOAL_THEN `(inv (norm (x'- x))) % ((x':real^3)- (x:real^3)) = (inv (norm (x' - x))) % (norm (x' - x) % ((z:real^3)- x ))` ASSUME_TAC
2870 THENL(*11*)[POP_ASSUM MP_TAC THEN MESON_TAC[];(*11*)
2871                 POP_ASSUM MP_TAC 
2872                  THEN REWRITE_TAC[VECTOR_ARITH `(a:real)%(b:real)%(v:real^3)=(a*b)%v`] 
2873                   THEN MP_TAC(ISPEC`norm((x':real^3)-(x:real^3))`REAL_MUL_LINV)
2874                   THEN FIND_ASSUM(fun th ->REWRITE_TAC[th]) `~(norm((x':real^3)-(x:real^3))= &0)`
2875                   THEN DISCH_TAC THEN POP_ASSUM(fun th-> REWRITE_TAC[th]) THEN REDUCE_VECTOR_TAC
2876                  THEN REWRITE_TAC[VECTOR_ARITH `((a:real^3)=(z:real^3)-(x:real^3))<=>(a+x=z)`]
2877                   THEN FIND_ASSUM(fun th-> REWRITE_TAC[th])`inv (norm (x' - x)) % (x' - x) + x = x1:real^3`
2878     THEN DISCH_TAC THEN ASM_REWRITE_TAC[INTER]](*11*)](*10*)](*9*)](*8*)](*7*);(*6*)
2879 ASM_SET_TAC[]](*6*)](*5*)](*4*)](*3*);(*2*)
2880
2881 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN STRIP_TAC
2882 THENL(*2*)[ EXISTS_TAC `&0`  THEN EXISTS_TAC`inv (norm ((v:real^3)-(x:real^3))) % (v-x) + x` THEN REDUCE_VECTOR_TAC
2883   THEN STRIP_TAC
2884 THENL(*3*)[ REAL_ARITH_TAC;(*3*)
2885               STRIP_TAC
2886 THENL(*4*)[            REWRITE_TAC[ballsets_fan; IN_ELIM_THM]
2887                      THEN EXISTS_TAC `inv(norm((v:real^3)-(x:real^3))) % (v-x)+x` 
2888                      THEN REWRITE_TAC[dist; VECTOR_ARITH `(a)-a= vec 0`; NORM_0]
2889                      THEN STRIP_TAC
2890 THENL(*5*)[    ASM_SET_TAC[];(*5*)
2891                                                                                          
2892 STRIP_TAC
2893 THENL(*6*)[
2894 MP_TAC(ISPECL[`x:real^3`;`v:real^3`]AFF_GE_1_1) THEN RESA_TAC
2895  THEN REWRITE_TAC[IN_ELIM_THM]
2896   THEN EXISTS_TAC `&1 - inv (norm ((v:real^3)-(x:real^3)))`
2897   THEN EXISTS_TAC `inv (norm ((v:real^3)-(x:real^3)))`  
2898  THEN STRIP_TAC
2899 THENL(*7*)[
2900  MP_TAC(ISPECL[`v:real^3`;`x:real^3`]imp_norm_ge_zero_fan) THEN RES_TAC THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;(*7*)
2901 STRIP_TAC 
2902 THENL(*8*)[ REAL_ARITH_TAC;(*8*)
2903 VECTOR_ARITH_TAC](*8*)](*7*);(*6*)
2904
2905   REWRITE_TAC[ballnorm_fan; IN_ELIM_THM; dist; VECTOR_ARITH `(x:real^3)-((a:real^3)+(x:real^3))= --a`; NORM_NEG; NORM_MUL ]
2906          THEN SUBGOAL_THEN `inv(norm((v:real^3)-(x:real^3))) > &0 ` ASSUME_TAC
2907 THENL(*7*)[MP_TAC(ISPECL[`v:real^3`;`x:real^3`]imp_norm_gl_zero_fan) THEN RESA_TAC;(*7*)
2908
2909 SUBGOAL_THEN `abs(inv(norm((v:real^3)-(x:real^3))))=inv(norm((v:real^3)-(x:real^3)))` ASSUME_TAC
2910 THENL(*8*)[ASM_REWRITE_TAC[REAL_ABS_REFL] THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;(*8*)
2911
2912 POP_ASSUM (fun th -> REWRITE_TAC[th]) THEN SUBGOAL_THEN `~ (norm ((v:real^3)-(x:real^3))= &0)` ASSUME_TAC
2913 THENL(*9*)[MP_TAC(ISPECL[`v:real^3`;`x:real^3`]imp_norm_not_zero_fan) THEN RESA_TAC;(*9*)
2914  POP_ASSUM MP_TAC THEN MESON_TAC[REAL_MUL_RINV;REAL_MUL_SYM]](*9*)](*8*)](*7*)](*6*)](*5*);(*4*)
2915 REWRITE_TAC[ballnorm_fan; IN_ELIM_THM; dist; VECTOR_ARITH `(x:real^3)-((a:real^3)+(x:real^3))= --a`; NORM_NEG; NORM_MUL ] 
2916              THEN SUBGOAL_THEN `inv(norm((v:real^3)-(x:real^3))) > &0 ` ASSUME_TAC 
2917 THENL(*5*)[ MP_TAC(ISPECL[`v:real^3`;`x:real^3`]imp_norm_gl_zero_fan) THEN RESA_TAC;(*5*)
2918  SUBGOAL_THEN `abs(inv(norm((v:real^3)-(x:real^3))))=inv(norm((v:real^3)-(x:real^3)))` ASSUME_TAC
2919 THENL(*6*)[ASM_REWRITE_TAC[REAL_ABS_REFL] THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;(*6*)
2920 POP_ASSUM (fun th -> REWRITE_TAC[th]) 
2921       THEN SUBGOAL_THEN `~ (norm ((v:real^3)-(x:real^3))= &0)` ASSUME_TAC
2922 THENL(*7*)[ MP_TAC(ISPECL[`v:real^3`;`x:real^3`]imp_norm_not_zero_fan) THEN RESA_TAC;(*7*)
2923         POP_ASSUM MP_TAC  THEN MESON_TAC[REAL_MUL_RINV;REAL_MUL_SYM]](*7*)](*6*)](*5*)](*4*)](*3*);(*2*)
2924
2925 MP_TAC(ISPECL[`x:real^3`;`v1:real^3`;`w1:real^3`]AFF_GE_1_2) THEN RESA_TAC THEN REWRITE_TAC[IN_ELIM_THM]
2926 THEN
2927 EXISTS_TAC `&1` THEN EXISTS_TAC `&0` THEN EXISTS_TAC `&0`
2928   THEN STRIP_TAC THENL [REAL_ARITH_TAC; STRIP_TAC THENL [REAL_ARITH_TAC; STRIP_TAC THENL [REAL_ARITH_TAC; VECTOR_ARITH_TAC]]]]]]);;
2929
2930
2931 let subset_by_inequality_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) (v1:real^3) (w1:real^3) (h:real) (h1:real).
2932 FAN(x,V,E) /\ ~(v IN {v1,w1}) /\ {v1,w1} IN E /\ {v,w} IN E /\ h < h1
2933 ==>
2934  cone_ge_fan x ((ballsets_fan (aff_ge {x} {v} INTER ballnorm_fan x) h)INTER ballnorm_fan x ) INTER aff_ge {x} {v1, w1} SUBSET  cone_ge_fan x ((ballsets_fan (aff_ge {x} {v} INTER ballnorm_fan x) h1)INTER ballnorm_fan x ) INTER aff_ge {x} {v1, w1} 
2935 `,
2936 REPEAT STRIP_TAC 
2937 THEN  SUBGOAL_THEN` cone_ge_fan x ((ballsets_fan (aff_ge {x} {v} INTER ballnorm_fan x) h)INTER ballnorm_fan x) SUBSET  cone_ge_fan x ((ballsets_fan (aff_ge {x} {v} INTER ballnorm_fan x) h1)INTER ballnorm_fan x ) ` ASSUME_TAC
2938 THENL[
2939 REWRITE_TAC[cone_ge_fan; SUBSET;IN_ELIM_THM]
2940 THEN GEN_TAC
2941 THEN STRIP_TAC
2942 THEN EXISTS_TAC`a:real`
2943 THEN EXISTS_TAC`z:real^3`
2944 THEN ASM_REWRITE_TAC[]
2945 THEN POP_ASSUM (fun th-> REWRITE_TAC[])
2946 THEN POP_ASSUM MP_TAC
2947 THEN REWRITE_TAC[ballsets_fan;INTER; IN_ELIM_THM]
2948 THEN RESA_TAC
2949 THEN EXISTS_TAC`x'':real^3`
2950 THEN ASM_REWRITE_TAC[]
2951 THEN REPEAT (POP_ASSUM MP_TAC)
2952 THEN REAL_ARITH_TAC;
2953 ASM_SET_TAC[]]);;
2954
2955
2956
2957 let cone_ge_fan_inter_aff_ge_is_empty_fan=prove( `(!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) (v1:real^3) (w1:real^3).
2958 FAN(x,V,E) /\ ~(v IN {v1,w1}) /\ {v1,w1} IN E /\ {v,w} IN E
2959 ==>
2960
2961 ?h:real.
2962 (&1> h)
2963 /\ (h > &0)
2964 /\ (cone_ge_fan x ((ballsets_fan (aff_ge {x} {v} INTER ballnorm_fan x) h)INTER ballnorm_fan x ) INTER aff_ge {x} {v1, w1} SUBSET {x})
2965 )`,
2966
2967 REPEAT STRIP_TAC
2968 THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3) `;
2969 `(w:real^3) `;`(v1:real^3)`;` (w1:real^3)`]cone_ge_fan_inter_aff_ge_is_empty)
2970 THEN RESA_TAC
2971 THEN DISJ_CASES_TAC(REAL_ARITH `(h >= &1) \/ (&1 > h)` )
2972 THENL[
2973 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3) `;
2974 `(w:real^3) `;`(v1:real^3)`;` (w1:real^3)`; `&1/ &2`; `(h:real)`]subset_by_inequality_fan)
2975 THEN RESA_TAC
2976 THEN POP_ASSUM MP_TAC
2977 THEN MP_TAC(REAL_ARITH`h>= &1==> &1 / &2 <h`)
2978 THEN ASM_REWRITE_TAC[]
2979 THEN DISCH_TAC
2980 THEN ASM_REWRITE_TAC[]
2981 THEN DISCH_TAC
2982 THEN EXISTS_TAC `&1/ &2`
2983 THEN ASM_REWRITE_TAC[]
2984 THEN REAL_ARITH_TAC;
2985
2986 EXISTS_TAC      `h:real`
2987 THEN ASM_REWRITE_TAC[]
2988 THEN ASM_SET_TAC[]]);;
2989
2990
2991
2992
2993 let rcone_subset_cone=prove(
2994 `!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) h:real.
2995 FAN(x,V,E) /\ {v,w} IN E /\(&0< h) /\ (h< &1)
2996 ==>
2997 ?h1:real.
2998 &1 > h1 /\ 
2999 h1> &0 /\
3000 (rcone_fan x v h1) SUBSET cone_ge_fan x ((ballsets_fan (aff_ge {x} {v} INTER ballnorm_fan x) h)INTER ballnorm_fan x )`,
3001
3002 REWRITE_TAC[rcone_fan;cone_ge_fan; SUBSET;IN_ELIM_THM;dist] 
3003   THEN REPEAT STRIP_TAC 
3004   THEN EXISTS_TAC`(&2 -(h:real) pow 2)/ &2`
3005 THEN STRIP_TAC
3006 THENL[
3007 REWRITE_TAC[REAL_ARITH`&1 > (&2 -(h:real) pow 2)/ &2 <=> h pow 2> &0`]
3008 THEN MP_TAC (ISPECL[`h:real`;`2`]REAL_POW_LT)
3009 THEN REPEAT(POP_ASSUM MP_TAC)
3010 THEN REAL_ARITH_TAC;
3011
3012 STRIP_TAC
3013 THENL[
3014 REWRITE_TAC[REAL_ARITH`(&2 -h pow 2)/ &2> &0<=> &2 > h pow 2`]
3015 THEN MATCH_MP_TAC(REAL_ARITH` h pow 2<= &1 ==> &2 > h pow 2`)
3016 THEN MATCH_MP_TAC (ISPECL[`2`;`h:real`;]REAL_POW_1_LE)
3017 THEN POP_ASSUM MP_TAC 
3018 THEN POP_ASSUM MP_TAC 
3019 THEN REAL_ARITH_TAC;
3020
3021  REPEAT STRIP_TAC 
3022   THEN EXISTS_TAC `norm ((x':real^3)-(x:real^3))`
3023   THEN EXISTS_TAC `inv(norm ((x':real^3)-(x:real^3)))%(x'-x)+x`
3024   THEN REWRITE_TAC[NORM_POS_LE]
3025   THEN POP_ASSUM MP_TAC
3026   THEN DISJ_CASES_TAC(SET_RULE`((x':real^3)-(x:real^3)= vec 0) \/ ~((x':real^3)-(x:real^3)= vec 0)`)
3027 THENL(*1*)[
3028
3029 ASM_REWRITE_TAC[NORM_0;DOT_LZERO;] THEN REDUCE_ARITH_TAC THEN REAL_ARITH_TAC;(*1*)
3030
3031 REWRITE_TAC[VECTOR_ARITH`(A+B)-B=A:real^3`;VECTOR_MUL_ASSOC]
3032   THEN MP_TAC(ISPEC`x':real^3- x`NORM_EQ_0)
3033   THEN RESA_TAC
3034   THEN MP_TAC(ISPEC`norm(x':real^3- x)`REAL_MUL_LINV)
3035   THEN ASM_REWRITE_TAC[REAL_MUL_SYM] 
3036   THEN RESA_TAC
3037   THEN REDUCE_VECTOR_TAC
3038   THEN REWRITE_TAC[VECTOR_ARITH`A-B+B=A:real^3`]
3039   THEN SUBGOAL_THEN` inv (norm (x' - x)) % (x' - x) + x IN ballnorm_fan (x:real^3)` ASSUME_TAC
3040 THENL(*2*)[
3041   REWRITE_TAC[ballnorm_fan; IN_ELIM_THM; dist; VECTOR_ARITH `(x:real^3)-((a:real^3)+(x:real^3))= --a`; NORM_NEG; NORM_MUL ]
3042     THEN MP_TAC(ISPECL[`x':real^3`;`x:real^3`]imp_norm_ge_zero_fan)
3043     THEN GEN_REWRITE_TAC(LAND_CONV o LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[VECTOR_ARITH`(a:real^3)=b <=> a - b = vec 0`]
3044     THEN RESA_TAC
3045     THEN MP_TAC(ISPEC`inv(norm((x':real^3)-(x:real^3)))`REAL_ABS_REFL)
3046     THEN GEN_REWRITE_TAC( LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[REAL_ARITH`&0<= (a:real) <=> a >= &0`]     
3047    THEN RESA_TAC;(*2*)
3048
3049 STRIP_TAC 
3050   THEN SUBGOAL_THEN` inv (norm (x' - x)) % (x' - x) + x IN ballsets_fan (aff_ge {x} {v} INTER ballnorm_fan (x:real^3)) (h:real)` ASSUME_TAC
3051 THENL(*3*)[
3052
3053 REWRITE_TAC[ballsets_fan;IN_ELIM_THM;dist]
3054   THEN EXISTS_TAC`inv (norm (v - x)) % (v - x) + (x:real^3)`
3055   THEN STRIP_TAC 
3056 THENL(*4*)[
3057
3058 REWRITE_TAC[VECTOR_ARITH`((v:real^3)+b)-(u+b)= (v-u)`;]
3059  THEN SUBGOAL_THEN`norm(inv(norm(v-x))%(v:real^3-x)-inv(norm(x'-x))%(x'-x)) pow 2< h pow 2` ASSUME_TAC
3060 THENL(*5*)[
3061 REWRITE_TAC[NORM_POW_2;DOT_LSUB;DOT_RSUB] 
3062 THEN REWRITE_TAC[DOT_RMUL;DOT_LMUL;DOT_SQUARE_NORM; REAL_ARITH`a-b-(c-d)=a+d-b-c`;
3063 REAL_ARITH`a*a*b pow 2=(a*b) pow 2`;DOT_SYM;REAL_ARITH`a+b-e*d*c-d*e*c=a+b- &2 * d*e *c`]
3064 THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;`(w:real^3)`;
3065 `(v:real^3)`;] remark1_fan)  
3066 THEN RES_TAC
3067 THEN MP_TAC(ISPECL[`(x:real^3)`;`(v:real^3)`;] imp_norm_not_zero_fan)
3068 THEN REWRITE_TAC[NORM_SUB]
3069  THEN RES_TAC
3070   THEN MP_TAC(ISPEC`norm(v:real^3- x)`REAL_MUL_LINV)
3071 THEN RES_TAC
3072 THEN ASM_REWRITE_TAC[REAL_ARITH`&1 pow 2= &1`;
3073 REAL_ARITH`&1+ &1 - &2 * a< h pow 2 <=> a > (&2- h pow 2)/ &2`]
3074 THEN MP_TAC (ISPEC `(v:real^3)-(x:real^3)` NORM_POS_LE)
3075  THEN DISCH_TAC
3076 THEN SUBGOAL_THEN `norm((v:real^3)-(x:real^3))> &0` ASSUME_TAC
3077 THENL(*6*)[
3078
3079 REPEAT( POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;(*6*)
3080  
3081  MP_TAC (ISPEC `(x':real^3)-(x:real^3)` NORM_POS_LE)
3082  THEN DISCH_TAC
3083 THEN SUBGOAL_THEN ` norm((x:real^3)-(x':real^3))> &0 ` ASSUME_TAC
3084 THENL(*7*)[
3085
3086 ONCE_REWRITE_TAC[NORM_ARITH`norm (x:real^3- x')> &0 <=> norm(x'-x)> &0`]
3087 THEN REPEAT( POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;(*7*)
3088
3089 MP_TAC(ISPECL[`(&2 - (h:real) pow 2) / &2`;
3090 `inv (norm (x:real^3 - x')) * inv (norm (v - x)) * ((v - x) dot (x' - x))`;
3091 `norm (x:real^3 - x')`]REAL_LT_LMUL_EQ)
3092 THEN REWRITE_TAC[REAL_ARITH`a<b <=> b>a`]
3093 THEN POP_ASSUM(fun th->REWRITE_TAC[th])
3094 THEN POP_ASSUM(fun th->REWRITE_TAC[])
3095 THEN GEN_REWRITE_TAC(LAND_CONV o ONCE_DEPTH_CONV)[SET_RULE`(A<=>B)<=>(B<=>A)`]
3096 THEN DISCH_TAC 
3097 THEN POP_ASSUM(fun th->REWRITE_TAC[th])
3098 THEN MP_TAC(ISPECL[`norm (x:real^3 - x') * (&2 - (h:real) pow 2) / &2`;
3099 `norm (x:real^3 - x')*inv (norm (x:real^3 - x')) * inv (norm (v - x)) * ((v - x) dot (x' - x))`;
3100 `norm (v:real^3 - x)`]REAL_LT_LMUL_EQ)
3101 THEN REWRITE_TAC[REAL_ARITH`a<b <=> b>a`]
3102 THEN POP_ASSUM(fun th->REWRITE_TAC[th])
3103 THEN POP_ASSUM(fun th->REWRITE_TAC[])
3104 THEN GEN_REWRITE_TAC(LAND_CONV o ONCE_DEPTH_CONV)[SET_RULE`(A<=>B)<=>(B<=>A)`]
3105 THEN DISCH_TAC 
3106 THEN POP_ASSUM(fun th->REWRITE_TAC[th]) 
3107 THEN ASM_REWRITE_TAC[REAL_ARITH`A*B*C*D*E>a*b*c<=>(C*B)*(D*A)*E>b*c*a`]
3108 THEN ONCE_REWRITE_TAC[NORM_ARITH`norm (x:real^3- x')= norm(x'-x)`]
3109 THEN ASM_REWRITE_TAC[]
3110 THEN REDUCE_ARITH_TAC
3111 THEN GEN_REWRITE_TAC(RAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[NORM_SUB]
3112 THEN GEN_REWRITE_TAC(LAND_CONV o ONCE_DEPTH_CONV)[DOT_SYM]
3113 THEN ASM_REWRITE_TAC[]](*7*)](*6*)(*5*);
3114
3115 ASM_REWRITE_TAC[NORM_LT_SQUARE;DOT_SQUARE_NORM]](*5*);(*4*)
3116
3117
3118 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;`(w:real^3)`;
3119 `(v:real^3)`;] remark1_fan)  
3120 THEN RES_TAC
3121 THEN
3122 SUBGOAL_THEN`inv(norm(v-x:real^3)) % (v-x) +x IN aff_ge {x} {v}` ASSUME_TAC
3123 THENL(*5*)[
3124 MP_TAC(ISPECL[`x:real^3`;`v:real^3`]AFF_GE_1_1) THEN RESA_TAC
3125  THEN REWRITE_TAC[IN_ELIM_THM]
3126   THEN EXISTS_TAC `&1 - inv (norm ((v:real^3)-(x:real^3)))`
3127   THEN EXISTS_TAC `inv (norm ((v:real^3)-(x:real^3)))`  
3128  THEN STRIP_TAC
3129 THENL(*6*)[
3130
3131
3132  MP_TAC(ISPECL[`v:real^3`;`x:real^3`]imp_norm_ge_zero_fan) THEN RES_TAC THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;(*6*)
3133 STRIP_TAC 
3134 THENL(*7*)[
3135  REAL_ARITH_TAC;
3136 VECTOR_ARITH_TAC]](*6*);(*5*)
3137
3138 SUBGOAL_THEN` inv (norm (v- x)) % (v - x) + x IN ballnorm_fan (x:real^3)` ASSUME_TAC
3139 THENL(*6*)[
3140   REWRITE_TAC[ballnorm_fan; IN_ELIM_THM; dist; VECTOR_ARITH `(x:real^3)-((a:real^3)+(x:real^3))= --a`; NORM_NEG; NORM_MUL ]
3141     THEN MP_TAC(ISPECL[`v:real^3`;`x:real^3`]imp_norm_ge_zero_fan)
3142 THEN ASM_REWRITE_TAC[VECTOR_ARITH`v-x=vec 0<=> v=x`]
3143
3144     THEN GEN_REWRITE_TAC(LAND_CONV o LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[VECTOR_ARITH`(a:real^3)=b <=> a - b = vec 0`]
3145     THEN RESA_TAC
3146     THEN MP_TAC(ISPEC`inv(norm((v:real^3)-(x:real^3)))`REAL_ABS_REFL)
3147     THEN GEN_REWRITE_TAC( LAND_CONV o RAND_CONV o ONCE_DEPTH_CONV)[REAL_ARITH`&0<= (a:real) <=> a >= &0`]     
3148    THEN RESA_TAC
3149 THEN MP_TAC(ISPECL[`(x:real^3)`;`(v:real^3)`;] imp_norm_not_zero_fan)
3150 THEN REWRITE_TAC[NORM_SUB]
3151  THEN RES_TAC
3152   THEN MP_TAC(ISPEC`norm(v:real^3- x)`REAL_MUL_LINV)
3153 THEN RES_TAC
3154 THEN ASM_REWRITE_TAC[];(*6*)
3155 ASM_SET_TAC[]](*6*)](*5*)](*4*);(*3*)
3156 ASM_SET_TAC[]]]]]]);;
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167 let origin_not_in_rcone_fan=prove(`!(x:real^3) (v:real^3) (h:real). ~(x IN rcone_fan x v h)`,
3168 REPEAT GEN_TAC 
3169 THEN REWRITE_TAC[rcone_fan; IN_ELIM_THM; VECTOR_ARITH`x-x= vec 0`; DOT_LZERO;DIST_REFL] 
3170 THEN REDUCE_ARITH_TAC 
3171 THEN REAL_ARITH_TAC);;
3172  
3173
3174
3175 let inter_is_empty=prove(`
3176 !(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) (v1:real^3) (w1:real^3).
3177 FAN(x,V,E) /\ ~(v IN {v1,w1}) /\ {v1,w1} IN E /\ {v,w} IN E
3178 ==>
3179 ?h1:real.
3180 &1 > h1 /\
3181 h1> &0 /\
3182 rcone_fan x v h1 INTER aff_ge {x} {v1, w1} = {}
3183 `,
3184 REPEAT STRIP_TAC 
3185 THEN MP_TAC(ISPECL[`(x:real^3)`; `(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;` (v:real^3) `
3186 ;`(w:real^3)`;` (v1:real^3) `;`(w1:real^3)`]cone_ge_fan_inter_aff_ge_is_empty_fan)
3187 THEN RESA_TAC
3188 THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool) `;`(v:real^3)`;
3189 `(w:real^3)`;` h:real`]rcone_subset_cone)
3190 THEN RESA_TAC
3191 THEN POP_ASSUM MP_TAC
3192 THEN REWRITE_TAC[REAL_ARITH`&0<h<=> h> &0`; REAL_ARITH`h< &1 <=> &1 >h`]
3193 THEN RES_TAC
3194 THEN SUBGOAL_THEN`(rcone_fan x v h1 INTER aff_ge {x} {v1, w1}) SUBSET
3195       {x:real^3}` ASSUME_TAC 
3196 THENL[
3197 ASM_SET_TAC[];
3198 MP_TAC(ISPECL[`(x:real^3)`;` (v:real^3)`;` (h1:real)`]origin_not_in_rcone_fan)
3199 THEN REPEAT STRIP_TAC
3200 THEN EXISTS_TAC`h1:real`
3201 THEN ASM_REWRITE_TAC[]
3202 THEN POP_ASSUM MP_TAC 
3203 THEN POP_ASSUM MP_TAC 
3204 THEN REWRITE_TAC[SUBSET; IN_SING;EXTENSION;EMPTY]
3205 THEN REPEAT STRIP_TAC
3206 THEN EQ_TAC
3207 THENL[
3208  POP_ASSUM MP_TAC 
3209 THEN POP_ASSUM MP_TAC 
3210 THEN DISCH_THEN(LABEL_TAC"a")
3211 THEN DISCH_TAC
3212 THEN DISCH_TAC
3213 THEN REMOVE_THEN "a" (fun th->MP_TAC(ISPEC`x':real^3`th))
3214 THEN ASM_REWRITE_TAC[]
3215 THEN POP_ASSUM MP_TAC 
3216 THEN DISCH_THEN(LABEL_TAC"a")
3217 THEN DISCH_TAC
3218 THEN REMOVE_THEN "a" MP_TAC
3219 THEN ASM_REWRITE_TAC[]
3220 THEN DISCH_TAC
3221 THEN SUBGOAL_THEN`x:real^3 IN rcone_fan x v h1` ASSUME_TAC
3222 THENL[ASM_SET_TAC[];
3223 ASM_SET_TAC[]];
3224 ASM_SET_TAC[]]]);;
3225
3226
3227 (*
3228 W^0_{dart}(x,epsilon)
3229 *)
3230
3231 let rw_dart_fan= new_definition`rw_dart_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) ((y:real^3),(v:real^3),(w:real^3),(w1:real^3)) (h:real)= w_dart_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) ((y:real^3),(v:real^3),(w:real^3),(w1:real^3)) INTER rcone_fan x v h`;;
3232
3233
3234
3235 let avoids_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) (v1:real^3) (w1:real^3)(w2:real^3).
3236 FAN(x,V,E) /\ ~(v IN {v1,w1}) /\ {v1,w1} IN E /\ {v,w} IN E
3237 ==>
3238 ?h:real.
3239 &1 >h /\
3240 h> &0
3241 /\ rw_dart_fan x V E ((x:real^3),(v:real^3),(w:real^3),(w2:real^3)) h INTER aff_ge {x} {v1, w1} = {}
3242 `,
3243
3244 REPEAT STRIP_TAC 
3245 THEN REWRITE_TAC[rw_dart_fan]
3246 THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`;` (v1:real^3)` ;`(w1:real^3)`]inter_is_empty)
3247 THEN RESA_TAC
3248 THEN EXISTS_TAC`h1:real`
3249 THEN ASM_SET_TAC[]
3250
3251 );;
3252
3253
3254 let avoids1_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)  (w1:real^3).
3255 FAN(x,V,E) /\ {v,w} IN E /\ {v,w1} IN E
3256 ==>
3257 ?h:real.
3258 &1 > h /\
3259 h > &0 /\
3260  rw_dart_fan x V E ((x:real^3),(v:real^3),(w:real^3),sigma_fan x V E v w) h INTER aff_ge {x} {v, w1} = {}`,
3261 REPEAT STRIP_TAC 
3262 THEN REWRITE_TAC[rw_dart_fan]
3263 THEN MP_TAC(ISPECL[`(x:real^3) `;`(V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3)`;
3264 ` (w:real^3)`;`(w1:real^3)`]IBZWFFH)
3265 THEN RESA_TAC
3266 THEN EXISTS_TAC`&1/ &2`
3267 THEN REWRITE_TAC[REAL_ARITH`&1/ &2 > &0`;REAL_ARITH`&1 > &1/ &2`]
3268 THEN ASM_SET_TAC[]);;
3269
3270
3271 let finish_avoids_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) (v1:real^3) (w1:real^3).
3272 FAN(x,V,E) /\ {v,w} IN E /\ {v1,w1} IN E
3273 ==>
3274 ?h:real.
3275 &1 >h /\
3276 h> &0/\ 
3277 rw_dart_fan x V E ((x:real^3),(v:real^3),(w:real^3),sigma_fan x V E v w) h INTER aff_ge {x} {v1, w1} = {}`,
3278
3279 REPEAT STRIP_TAC 
3280 THEN DISJ_CASES_TAC(SET_RULE`~(v:real^3 IN {v1,w1})\/ (v=v1\/ v=w1)`)
3281 THENL[
3282 MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3) `;`(w:real^3) `;`(v1:real^3)`;`w1:real^3`;` (sigma_fan x V E v w:real^3)`]avoids_fan)
3283 THEN RESA_TAC
3284 THEN ASM_SET_TAC[];
3285
3286 POP_ASSUM MP_TAC
3287 THEN STRIP_TAC
3288 THENL[
3289 POP_ASSUM MP_TAC
3290 THEN POP_ASSUM MP_TAC
3291 THEN DISCH_THEN(LABEL_TAC"A")
3292 THEN DISCH_TAC
3293 THEN REMOVE_THEN "A" MP_TAC
3294 THEN POP_ASSUM( fun th-> REWRITE_TAC[SYM(th)])
3295 THEN DISCH_TAC
3296 THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3) `;`(w:real^3) `;`w1:real^3`]avoids1_fan)
3297 THEN RESA_TAC;
3298
3299 POP_ASSUM MP_TAC
3300 THEN POP_ASSUM MP_TAC
3301 THEN DISCH_THEN(LABEL_TAC"A")
3302 THEN DISCH_TAC
3303 THEN REMOVE_THEN "A" MP_TAC
3304 THEN POP_ASSUM( fun th-> REWRITE_TAC[SYM(th)])
3305 THEN ONCE_REWRITE_TAC[SET_RULE`{X,Y}={Y,X}`]
3306 THEN DISCH_TAC
3307 THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` (v:real^3) `;`(w:real^3) `;`v1:real^3`]avoids1_fan)
3308 THEN RESA_TAC]]);;
3309
3310 let continuous_set_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3) (h:real) (h1:real).
3311 FAN(x,V,E) /\ {v,w} IN E /\ h1 <= h
3312 ==>
3313 rw_dart_fan x V E ((x:real^3),(v:real^3),(w:real^3),sigma_fan x V E v w) h SUBSET rw_dart_fan x V E ((x:real^3),(v:real^3),(w:real^3),sigma_fan x V E v w) h1`,
3314
3315 REPEAT STRIP_TAC
3316 THEN REWRITE_TAC[rw_dart_fan]
3317 THEN SUBGOAL_THEN `rcone_fan x v h SUBSET rcone_fan x v h1` ASSUME_TAC
3318 THENL[
3319 REWRITE_TAC[rcone_fan;SUBSET; IN_ELIM_THM]
3320 THEN REPEAT STRIP_TAC
3321 THEN ASSUME_TAC(ISPECL[`v:real^3`;`x:real^3`]DIST_POS_LE)
3322 THEN ASSUME_TAC(ISPECL[`x':real^3`;`x:real^3`]DIST_POS_LE)
3323 THEN MP_TAC(ISPECL[`dist((v:real^3),x)`;`h1:real`;`h:real`] REAL_LE_LMUL)
3324 THEN RESA_TAC
3325 THEN MP_TAC(ISPECL[`dist((x':real^3),x)`;`dist((v:real^3),x)* (h1:real)`;`dist((v:real^3),x)* (h:real)`] REAL_LE_LMUL)
3326 THEN RESA_TAC
3327 THEN REPEAT (POP_ASSUM MP_TAC)
3328 THEN REAL_ARITH_TAC;
3329 ASM_SET_TAC[]]);;
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339 let CTVTAQA=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (E1:(real^3->bool)->bool).
3340 FAN(x,V,E) /\ E1 SUBSET E  
3341 ==>
3342 FAN(x,V,E1)`,
3343 REPEAT GEN_TAC
3344 THEN REWRITE_TAC[FAN;fan1;fan2;fan6;fan7;graph]
3345 THEN ASM_SET_TAC[]);;
3346
3347
3348 let expand_edge_graph_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (e:real^3->bool).
3349 FAN(x,V,E) /\ e IN E
3350 ==> ?v:real^3 w:real^3. e={v,w}`,
3351 REPEAT GEN_TAC
3352 THEN REWRITE_TAC[FAN;IN]
3353 THEN STRIP_TAC
3354 THEN FIND_ASSUM MP_TAC `graph (E:(real^3->bool)->bool)`
3355 THEN REWRITE_TAC[graph]
3356 THEN DISCH_TAC
3357 THEN POP_ASSUM(fun th-> MP_TAC(ISPEC`e:real^3->bool`th))
3358 THEN RESA_TAC
3359 THEN POP_ASSUM MP_TAC
3360 THEN REWRITE_TAC[HAS_SIZE]
3361 THEN STRIP_TAC
3362 THEN SUBGOAL_THEN `~((e:real^3->bool)={})` ASSUME_TAC
3363 THENL[
3364 STRIP_TAC
3365 THEN MP_TAC(ISPEC`(e:real^3->bool)`CARD_EQ_0)
3366 THEN RESA_TAC
3367 THEN POP_ASSUM MP_TAC 
3368 THEN ARITH_TAC;
3369 MP_TAC(SET_RULE `~((e:real^3->bool)={})==> ?v:real^3. v IN e`)
3370 THEN RESA_TAC
3371 THEN SUBGOAL_THEN`~((e:real^3->bool) DELETE v={})` ASSUME_TAC
3372 THENL[
3373 STRIP_TAC
3374 THEN MP_TAC(ISPECL[`v:real^3`;`(e:real^3->bool)`;]CARD_DELETE)
3375 THEN RESA_TAC
3376 THEN MP_TAC(ISPECL[`(e:real^3->bool)`;`v:real^3`] FINITE_DELETE)
3377 THEN RESA_TAC
3378 THEN MP_TAC(ISPEC`(e:real^3->bool) DELETE v`CARD_EQ_0)
3379 THEN RESA_TAC
3380 THEN POP_ASSUM MP_TAC
3381 THEN ARITH_TAC;
3382 MP_TAC(SET_RULE `~((e:real^3->bool)DELETE v={})==> ?w:real^3. w IN (e:real^3->bool)DELETE v/\ w IN e`)
3383 THEN RESA_TAC
3384 THEN MP_TAC(SET_RULE `(v IN (e:real^3->bool))/\ (w IN (e:real^3->bool))==> {v,w} SUBSET e`)
3385 THEN RESA_TAC
3386 THEN MP_TAC(SET_RULE `(w IN (e:real^3->bool)DELETE v)==> ~(v=w)`)
3387 THEN RESA_TAC
3388 THEN MP_TAC(ISPECL [`{v:real^3,w:real^3}`;`(e:(real^3->bool))`] FINITE_SUBSET)
3389 THEN RESA_TAC
3390 THEN ASSUME_TAC(SET_RULE `v:real^3 IN {v:real^3,w:real^3} `)
3391 THEN MP_TAC(ISPECL[`v:real^3`;`{v:real^3,w:real^3}`;]CARD_DELETE)
3392 THEN RESA_TAC
3393 THEN MP_TAC(SET_RULE `v IN {v,w}==>{v:real^3,w:real^3} DELETE v PSUBSET {v,w}`)
3394 THEN RESA_TAC
3395 THEN MP_TAC(ISPECL[`{v:real^3,w:real^3} DELETE v`;`{v:real^3,w:real^3}`]CARD_PSUBSET)
3396 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3397 THEN FIND_ASSUM MP_TAC`FINITE {v:real^3,w:real^3}`
3398 THEN DISCH_TAC
3399 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3400 THEN DISCH_TAC
3401 THEN MP_TAC(ARITH_RULE`CARD ({v, w} DELETE v) < CARD {v, w}/\ CARD ({v, w} DELETE v) = CARD {v, w}-1
3402 <=>CARD ({v, w} DELETE v) +1= CARD {v:real^3, w:real^3}`)
3403 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3404 THEN POP_ASSUM (fun th->GEN_REWRITE_TAC(LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV)[th;])
3405 THEN REWRITE_TAC[ARITH_RULE`A=A`]
3406 THEN DISCH_TAC
3407 THEN SUBGOAL_THEN `w:real^3 IN ({v:real^3,w:real^3} DELETE v)` ASSUME_TAC
3408 THENL[
3409 ASM_SET_TAC[];
3410 MP_TAC(ISPECL[`{v:real^3,w:real^3}`;`v:real^3`] FINITE_DELETE)
3411 THEN RESA_TAC
3412 THEN MP_TAC(ISPECL[`w:real^3`;`{v:real^3,w:real^3} DELETE v`;]CARD_DELETE)
3413 THEN RESA_TAC
3414 THEN MP_TAC(SET_RULE `w IN ({v,w} DELETE v)==>{v:real^3,w:real^3} DELETE v DELETE w PSUBSET {v,w} DELETE v`)
3415 THEN RESA_TAC
3416 THEN MP_TAC(ISPECL[`{v:real^3,w:real^3} DELETE v DELETE w`;`{v:real^3,w:real^3} DELETE v`]CARD_PSUBSET)
3417 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3418 THEN FIND_ASSUM MP_TAC`FINITE ({v:real^3,w:real^3} DELETE v)`
3419 THEN DISCH_TAC
3420 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3421 THEN DISCH_TAC
3422 THEN MP_TAC(ARITH_RULE`CARD ({v, w} DELETE v DELETE w) < CARD ({v, w} DELETE v)/\ CARD ({v, w} DELETE v DELETE w) = CARD ({v, w} DELETE v)-1
3423 <=>CARD ({v, w} DELETE v DELETE w) +1= CARD ({v:real^3, w:real^3} DELETE v)`)
3424 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3425 THEN POP_ASSUM (fun th->GEN_REWRITE_TAC(LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV)[th;])
3426 THEN REWRITE_TAC[ARITH_RULE`A=A`]
3427 THEN DISCH_TAC
3428 THEN POP_ASSUM MP_TAC
3429 THEN POP_ASSUM (fun th->REWRITE_TAC[])
3430 THEN POP_ASSUM (fun th->REWRITE_TAC[])
3431 THEN ASSUME_TAC(SET_RULE `{v, w} DELETE v:real^3 DELETE w:real^3={}`)
3432 THEN POP_ASSUM (fun th->REWRITE_TAC[th;CARD_CLAUSES; ARITH_RULE `0+1=1`])
3433 THEN POP_ASSUM MP_TAC
3434 THEN DISCH_THEN(LABEL_TAC"B")
3435 THEN DISCH_TAC
3436 THEN REMOVE_THEN "B" MP_TAC
3437 THEN POP_ASSUM (fun th->REWRITE_TAC[SYM(th);ARITH_RULE` 1+1=2`])
3438 THEN FIND_ASSUM MP_TAC`CARD (e:real^3->bool)=2`
3439 THEN DISCH_TAC
3440 THEN POP_ASSUM (fun th->REWRITE_TAC[SYM(th)])
3441 THEN DISCH_TAC
3442 THEN MP_TAC(ISPECL[`{v:real^3,w:real^3}`;`e:real^3->bool`]CARD_SUBSET_EQ)
3443 THEN POP_ASSUM (fun th->REWRITE_TAC[SYM(th)])
3444 THEN RESA_TAC
3445 THEN EXISTS_TAC`v:real^3`
3446 THEN EXISTS_TAC`w:real^3`
3447 THEN POP_ASSUM (fun th->REWRITE_TAC[SYM(th)])]]]);; 
3448
3449
3450
3451
3452
3453 let finish_avoids1_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (E':(real^3->bool)->bool) (v:real^3) (w:real^3).
3454 FAN(x,V,E) /\ {v,w} IN E /\ E' SUBSET E
3455 ==>
3456 ?h:real.
3457 &1> h /\
3458 h> &0 /\
3459 rw_dart_fan x V E ((x:real^3),(v:real^3),(w:real^3),sigma_fan x V E v w) h INTER {v | ?e. e IN E' /\ v IN aff_ge {x} e}={}`,
3460
3461 REPEAT STRIP_TAC 
3462 THEN REWRITE_TAC[xfan; IN_ELIM_THM]
3463 THEN MP_TAC(ISPECL[`x:real^3`;`V:real^3->bool`;`E:(real^3->bool)->bool`]set_edges_is_finite_fan)
3464 THEN RESA_TAC
3465 THEN MP_TAC(ISPECL [`(E':(real^3->bool)->bool)`;`(E:(real^3->bool)->bool)`] FINITE_SUBSET)
3466 THEN RESA_TAC
3467 THEN ABBREV_TAC`n=CARD (E':(real^3->bool)->bool)`
3468 THEN REPEAT(POP_ASSUM MP_TAC)
3469 THEN SPEC_TAC (`(E':(real^3->bool)->bool)`,`(E':(real^3->bool)->bool)`)
3470 THEN SPEC_TAC (`n:num`,`n:num`)
3471 THEN INDUCT_TAC
3472 THENL(*1*)[
3473 REPEAT STRIP_TAC 
3474 THEN MP_TAC(ISPECL[`E':(real^3->bool)->bool`]CARD_EQ_0)
3475 THEN RESA_TAC
3476 THEN EXISTS_TAC`&1 / &2`
3477 THEN REWRITE_TAC[REAL_ARITH`&1/ &2 > &0`;REAL_ARITH`&1 > &1/ &2`]
3478 THEN ASM_SET_TAC[];(*1*)
3479
3480 REPEAT GEN_TAC
3481 THEN POP_ASSUM MP_TAC
3482 THEN DISCH_THEN (LABEL_TAC "A")
3483 THEN REPEAT STRIP_TAC
3484 THEN MP_TAC(ISPEC`(E':(real^3->bool)->bool)` CHOOSE_SUBSET)
3485 THEN RESA_TAC
3486 THEN POP_ASSUM(fun th-> MP_TAC(ISPEC`n:num `th))
3487 THEN REWRITE_TAC[ARITH_RULE `n:num <= SUC n`; HAS_SIZE]
3488 THEN STRIP_TAC
3489 THEN MP_TAC(SET_RULE` t SUBSET E' /\ E' SUBSET E ==> (t:(real^3->bool)->bool) SUBSET E`)
3490 THEN RESA_TAC
3491 THEN REMOVE_THEN "A" (fun th-> MP_TAC(ISPEC`(t:(real^3->bool)->bool)`th))
3492 THEN RESA_TAC
3493 THEN SUBGOAL_THEN `~((E':(real^3->bool)->bool) DIFF (t:(real^3->bool)->bool)= {})` ASSUME_TAC
3494 THENL(*2*)[
3495 STRIP_TAC
3496 THEN MP_TAC(SET_RULE`(E':(real^3->bool)->bool) DIFF (t:(real^3->bool)->bool)={} /\ t SUBSET E' ==>  t= E'`)
3497 THEN RESA_TAC
3498 THEN FIND_ASSUM MP_TAC`CARD (t:(real^3->bool)->bool)=n`
3499 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
3500 THEN ASM_REWRITE_TAC[]
3501 THEN ARITH_TAC;(*2*)
3502
3503 SUBGOAL_THEN`?e. e IN (E':(real^3->bool)->bool) DIFF (t:(real^3->bool)->bool)`
3504 ASSUME_TAC
3505 THENL(*3*)[
3506 ASM_SET_TAC[];(*3*)
3507
3508 POP_ASSUM MP_TAC
3509 THEN STRIP_TAC
3510 THEN MP_TAC(SET_RULE`e IN (E':(real^3->bool)->bool) DIFF (t:(real^3->bool)->bool)/\
3511 (E':(real^3->bool)->bool) SUBSET (E:(real^3->bool)->bool) /\ t SUBSET E' ==> e IN E'/\ e IN E/\ ~(e IN t) /\ {e} UNION t SUBSET E'`)
3512 THEN RESA_TAC
3513 THEN MP_TAC(ISPECL [`{e:(real^3->bool)} UNION (t:(real^3->bool)->bool)`;`(E':(real^3->bool)->bool)`] FINITE_SUBSET)
3514 THEN RESA_TAC
3515 THEN ASSUME_TAC(SET_RULE`e IN {e:(real^3->bool)} UNION (t:(real^3->bool)->bool)`)
3516 THEN MP_TAC(ISPECL[`e:real^3->bool`;`{e:(real^3->bool)} UNION (t:(real^3->bool)->bool)`;]CARD_DELETE)
3517 THEN RESA_TAC
3518 THEN MP_TAC(SET_RULE `e IN {e:(real^3->bool)} UNION (t:(real^3->bool)->bool) 
3519 ==> ({e:(real^3->bool)} UNION (t:(real^3->bool)->bool)) DELETE e PSUBSET {e:(real^3->bool)} UNION (t:(real^3->bool)->bool)`)
3520 THEN RESA_TAC
3521 THEN MP_TAC(ISPECL[`({e:(real^3->bool)} UNION (t:(real^3->bool)->bool))DELETE e`;`{e:(real^3->bool)} UNION (t:(real^3->bool)->bool)`]CARD_PSUBSET)
3522 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3523 THEN FIND_ASSUM MP_TAC`FINITE ( {e:(real^3->bool)} UNION (t:(real^3->bool)->bool))`
3524 THEN DISCH_TAC
3525 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3526 THEN DISCH_TAC
3527 THEN MP_TAC(ARITH_RULE`CARD (({e:(real^3->bool)} UNION (t:(real^3->bool)->bool)) DELETE e) < CARD ( {e:(real^3->bool)} UNION (t:(real^3->bool)->bool))
3528 /\ CARD (({e:(real^3->bool)} UNION (t:(real^3->bool)->bool)) DELETE e) = CARD ({e:(real^3->bool)} UNION (t:(real^3->bool)->bool))-1
3529 <=>CARD (({e:(real^3->bool)} UNION (t:(real^3->bool)->bool)) DELETE e) +1= CARD ({e:(real^3->bool)} UNION (t:(real^3->bool)->bool))`)
3530 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3531 THEN POP_ASSUM (fun th->GEN_REWRITE_TAC(LAND_CONV o LAND_CONV o ONCE_DEPTH_CONV)[th;])
3532 THEN REWRITE_TAC[ARITH_RULE`A=A`; ]
3533 THEN MP_TAC(SET_RULE`~(e IN t)==>({e:(real^3->bool)} UNION (t:(real^3->bool)->bool)) DELETE e=t`)
3534 THEN RESA_TAC
3535 THEN POP_ASSUM (fun th->REWRITE_TAC[th])
3536 THEN FIND_ASSUM MP_TAC`(CARD (E':(real^3->bool)->bool)=SUC n)`
3537 THEN REWRITE_TAC[ARITH_RULE`SUC n=(n:num) +1`]
3538 THEN DISCH_TAC
3539 THEN POP_ASSUM (fun th->REWRITE_TAC[SYM(th)])
3540 THEN DISCH_TAC
3541 THEN MP_TAC(ISPECL[`{e:(real^3->bool)} UNION (t:(real^3->bool)->bool)`;`E':(real^3->bool)->bool`]CARD_SUBSET_EQ)
3542 THEN POP_ASSUM (fun th->REWRITE_TAC[SYM(th)])
3543 THEN RESA_TAC
3544 THEN POP_ASSUM MP_TAC
3545 THEN DISCH_THEN(LABEL_TAC"MA")
3546 THEN MP_TAC(ISPECL[`(x:real^3)`;` (V:real^3->bool) `;`(E:(real^3->bool)->bool)`;`(e:real^3->bool)`]expand_edge_graph_fan)
3547 THEN RESA_TAC
3548 THEN MP_TAC(ISPECL[`(x:real^3)`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;` (v:real^3)`;`(w:real^3)`; `(v':real^3)`;` (w':real^3)`]finish_avoids_fan)
3549 THEN RESA_TAC
3550 THEN POP_ASSUM MP_TAC
3551 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)] THEN ASSUME_TAC(th))
3552 THEN POP_ASSUM MP_TAC
3553 THEN RESA_TAC
3554 THEN STRIP_TAC
3555 THEN ABBREV_TAC`h1= max (h:real) (h':real)` 
3556 THEN EXISTS_TAC`h1:real`
3557 THEN STRIP_TAC
3558 THENL(*4*)[
3559 POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])
3560 THEN REPEAT(POP_ASSUM MP_TAC)
3561 THEN REAL_ARITH_TAC;(*4*)
3562
3563 STRIP_TAC
3564 THENL(*5*)[
3565 POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)])
3566 THEN REPEAT(POP_ASSUM MP_TAC)
3567 THEN REAL_ARITH_TAC;(*5*)
3568
3569 REMOVE_THEN "MA" MP_TAC
3570 THEN DISCH_TAC
3571 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)] THEN ASSUME_TAC(th))
3572 THEN REWRITE_TAC[UNION;IN_ELIM_THM;EXTENSION; INTER;]
3573 THEN GEN_TAC
3574 THEN EQ_TAC
3575 THENL(*6*)[
3576
3577 ASM_REWRITE_TAC[IN_SING]
3578 THEN STRIP_TAC
3579 THENL[
3580  POP_ASSUM MP_TAC
3581 THEN ASM_REWRITE_TAC[]
3582 THEN DISCH_TAC
3583 THEN MP_TAC(ISPECL[`(x:real^3)`;`(V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)` ;`(h1:real)`;` (h':real)`]continuous_set_fan)
3584 THEN RESA_TAC
3585 THEN POP_ASSUM MP_TAC
3586 THEN EXPAND_TAC"h1"
3587 THEN REWRITE_TAC[REAL_ARITH`h'<= max (h:real) (h':real)`]
3588 THEN RESA_TAC
3589 THEN ASM_SET_TAC[];
3590
3591  POP_ASSUM MP_TAC
3592 THEN ASM_REWRITE_TAC[]
3593 THEN DISCH_TAC
3594 THEN MP_TAC(ISPECL[`(x:real^3)`;`(V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)` ;`(h1:real)`;` (h:real)`]continuous_set_fan)
3595 THEN RESA_TAC
3596 THEN POP_ASSUM MP_TAC
3597 THEN EXPAND_TAC"h1"
3598 THEN REWRITE_TAC[REAL_ARITH`h<= max (h:real) (h':real)`]
3599 THEN RESA_TAC
3600 THEN ASM_SET_TAC[]];
3601
3602 ASM_SET_TAC[]]]]]]]);;
3603
3604
3605
3606
3607
3608
3609
3610 let rw_dart_avoids_fan=prove(`!(x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3).
3611 FAN(x,V,E) /\ {v,w} IN E 
3612 ==>
3613 ?h:real.
3614 &1> h /\
3615 h> &0 /\
3616 rw_dart_fan x V E ((x:real^3),(v:real^3),(w:real^3),sigma_fan x V E v w) h  SUBSET yfan(x,V,E) `,
3617
3618 REPEAT STRIP_TAC
3619 THEN MP_TAC(ISPECL[`(x:real^3)`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`(E:(real^3->bool)->bool)`;` (v:real^3)`;` (w:real^3)`]finish_avoids1_fan)
3620 THEN RESA_TAC
3621 THEN POP_ASSUM MP_TAC
3622 THEN REWRITE_TAC[SET_RULE`A SUBSET A`;yfan;xfan]
3623 THEN RESA_TAC
3624 THEN EXISTS_TAC`h:real`
3625 THEN ASM_REWRITE_TAC[]
3626 THEN ASM_SET_TAC[]);;
3627
3628
3629
3630  
3631
3632 (*------------------------------------------------------------------------*)
3633 (*------------------------------------------------------------------------*)
3634
3635
3636
3637 let r_fan=new_definition`r_fan (a:real) (b:real) (c:real) = { y:real^3 | y$1 > &0  /\  y$2 > a  /\ y$2 < b /\ y$3 > &0 /\ y$3 < c}`;;
3638
3639
3640
3641 let r1_le_fan=new_definition`r1_le_fan (a:real)={ y:real^3 | y$1 > a}`;; 
3642
3643
3644 let r2_le_fan=new_definition`r2_le_fan (a:real)={ y:real^3 |  y$2 > a}`;; 
3645
3646
3647
3648 let r3_le_fan=new_definition`r3_le_fan (a:real)={ y:real^3 | y$3 > a}`;; 
3649
3650
3651
3652 let r1_ge_fan=new_definition`r1_ge_fan (a:real)={ y:real^3 |  y$1 < a}`;;
3653
3654
3655 let r2_ge_fan=new_definition`r2_ge_fan (a:real)={ y:real^3 |  y$2 < a}`;;
3656
3657 let r3_ge_fan=new_definition`r3_ge_fan (a:real)={ y:real^3 |  y$3 < a}`;;
3658
3659
3660
3661
3662 let r_fan_is_inter_halfspace=prove(`!a:real b:real c:real. 
3663 r_fan a b c = r1_le_fan (&0) INTER r2_le_fan a INTER r2_ge_fan b INTER r3_le_fan (&0) INTER r3_ge_fan c`,
3664 REWRITE_TAC[r_fan; r1_le_fan; r2_le_fan; r2_ge_fan; r3_le_fan; r3_ge_fan; INTER; IN_ELIM_THM]);;
3665
3666   
3667
3668  
3669
3670 let r1_ge_is_convex_fan = prove(`!a:real. convex (r1_ge_fan a)/\ open (r1_ge_fan a) `,REWRITE_TAC[r1_ge_fan] THEN REWRITE_TAC[CONVEX_HALFSPACE_COMPONENT_LT;OPEN_HALFSPACE_COMPONENT_LT]);;
3671
3672
3673 let r2_ge_is_convex_fan = prove(`!a:real. convex (r2_ge_fan a)/\ open (r2_ge_fan a)`,
3674 REWRITE_TAC[r2_ge_fan] THEN REWRITE_TAC[CONVEX_HALFSPACE_COMPONENT_LT;OPEN_HALFSPACE_COMPONENT_LT]);;
3675
3676 let r3_ge_is_convex_fan = prove(`!a:real. convex (r3_ge_fan a) /\ open(r3_ge_fan a)`,
3677 REWRITE_TAC[r3_ge_fan] THEN REWRITE_TAC[CONVEX_HALFSPACE_COMPONENT_LT;OPEN_HALFSPACE_COMPONENT_LT]);;
3678
3679 let r1_le_is_convex_fan = prove(`!a:real. convex (r1_le_fan a)/\  open (r1_le_fan a) `,
3680 REWRITE_TAC[r1_le_fan] THEN REWRITE_TAC[CONVEX_HALFSPACE_COMPONENT_GT;OPEN_HALFSPACE_COMPONENT_GT]);;
3681
3682 let r2_le_is_convex_fan = prove(`!a:real. convex (r2_le_fan a)/\ open (r2_le_fan a) `,
3683 REWRITE_TAC[r2_le_fan] THEN REWRITE_TAC[CONVEX_HALFSPACE_COMPONENT_GT;OPEN_HALFSPACE_COMPONENT_GT]);;
3684
3685 let r3_le_is_convex_fan = prove(`!a:real. convex (r3_le_fan a)/\ open (r3_le_fan a) `,
3686 REWRITE_TAC[r3_le_fan] THEN REWRITE_TAC[CONVEX_HALFSPACE_COMPONENT_GT;OPEN_HALFSPACE_COMPONENT_GT]);;
3687
3688 let r_is_connected_fan=prove(`!a:real b:real c:real. connected (r_fan a b c)/\convex (r_fan a b c) /\ open (r_fan a b c)`,
3689    (let lemma = prove(`!a:real b:real c:real. convex (r_fan a b c)/\ open (r_fan a b c)`,
3690 ASSUME_TAC (r_fan_is_inter_halfspace) THEN ASM_REWRITE_TAC[] THEN
3691 ASSUME_TAC (r1_ge_is_convex_fan) THEN ASSUME_TAC ( r2_ge_is_convex_fan) THEN
3692 ASSUME_TAC (r3_ge_is_convex_fan) THEN ASSUME_TAC(r1_le_is_convex_fan) THEN
3693 ASSUME_TAC(r2_le_is_convex_fan) THEN ASSUME_TAC( r3_le_is_convex_fan) THEN
3694 ASM_MESON_TAC[CONVEX_INTER;OPEN_INTER]) 
3695     in
3696 SUBGOAL_THEN `!a:real b:real c:real. convex (r_fan a b c)/\ open (r_fan a b c) ` ASSUME_TAC 
3697 THENL [MESON_TAC[lemma];
3698        ASM_MESON_TAC[CONVEX_CONNECTED]]));;
3699
3700
3701
3702
3703 (*------------------------------------------------------------*)
3704 (* change spherical coordinate in fan                         *)
3705 (*------------------------------------------------------------*)
3706
3707
3708
3709 let change_spherical_coordinate_fan= new_definition`change_spherical_coordinate_fan (x:real^3) (v:real^3) (u:real^3) = ((\t. let r = t$1 and theta = t$2 and phi = t$3 in        
3710            x +(r * cos theta * sin phi) % e1_fan x v u +                       
3711            (r * sin theta * sin phi) % e2_fan x v u +                          
3712            (r * cos phi) % e3_fan x v u):real^3->real^3) ` ;;
3713
3714
3715
3716
3717
3718 (*---------------------------------------------------------------------------------------*)
3719 (* the function of change coordinate is(spherecial) continuous                     *)
3720 (*---------------------------------------------------------------------------------------*)
3721
3722
3723 let REAL_CONTINUOUS_AT_COMPONENT = prove 
3724    (`!i a. 1 <= i /\ i <= dimindex(:N)        
3725            ==> (\x:real^N. x$i) real_continuous at a`,
3726     REWRITE_TAC[REAL_CONTINUOUS_CONTINUOUS1; o_DEF; 
3727                 CONTINUOUS_AT_LIFT_COMPONENT]);;          
3728                                      
3729
3730   let continuous_change_spherical_coordinate_fan = prove                              
3731    (`!x':real^3 v:real^3 u:real^3 x:real^3.
3732 ((\t. let r = t$1 and theta = t$2 and phi = t$3 in        
3733            (r * cos theta * sin phi) % e1_fan x' v u +                       
3734            (r * sin theta * sin phi) % e2_fan x' v u +                          
3735            (r * cos phi) % e3_fan x' v u))                    
3736      continuous at x`,                                                    
3737 REPEAT STRIP_TAC THEN    
3738 CONV_TAC(TOP_DEPTH_CONV let_CONV) THEN
3739     REPEAT(MATCH_MP_TAC CONTINUOUS_ADD THEN CONJ_TAC) THEN
3740     MATCH_MP_TAC CONTINUOUS_VMUL THEN
3741     REWRITE_TAC[GSYM REAL_CONTINUOUS_CONTINUOUS1] THEN
3742     REPEAT(MATCH_MP_TAC REAL_CONTINUOUS_MUL THEN CONJ_TAC) THEN
3743     SIMP_TAC[REAL_CONTINUOUS_AT_COMPONENT; DIMINDEX_3; ARITH] THEN
3744     MATCH_MP_TAC(REWRITE_RULE[o_DEF] REAL_CONTINUOUS_AT_COMPOSE) THEN
3745     SIMP_TAC[REAL_CONTINUOUS_AT_COMPONENT; DIMINDEX_3; ARITH] THEN
3746     REWRITE_TAC[REAL_CONTINUOUS_WITHIN_SIN; REAL_CONTINUOUS_WITHIN_COS]);;
3747
3748
3749 let one_edge_fan=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3.
3750 FAN(x,V,E)/\ {v,u} IN E /\ ~(CARD (set_of_edge v V E) > 1)
3751 ==> set_of_edge v V E={u}`,
3752 REPEAT STRIP_TAC
3753 THEN MP_TAC(ISPECL[`x:real^3 `;`(V:real^3->bool) `;`(E:(real^3->bool)->bool) `;`u:real^3 `;`v:real^3`]remark1_fan)
3754 THEN RESA_TAC
3755 THEN MP_TAC(SET_RULE`(u:real^3) IN set_of_edge v V E==> ~(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)={})/\ {(u:real^3)} SUBSET set_of_edge v V E`)
3756 THEN RESA_TAC
3757 THEN MP_TAC(ISPECL [`{(u:real^3)}`;`set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)`] FINITE_SUBSET)
3758 THEN RESA_TAC
3759 THEN ASSUME_TAC(SET_RULE`u IN {(u:real^3)} /\ {(u:real^3)} DELETE u= {} /\ {} PSUBSET {(u:real^3)}`)
3760 THEN MP_TAC(ISPECL[`(u:real^3)`;`{(u:real^3)}`;]CARD_DELETE)
3761 THEN RESA_TAC
3762 THEN MP_TAC(ISPECL[`{}:real^3->bool`;`{(u:real^3)}`]CARD_PSUBSET)
3763 THEN RESA_TAC
3764 THEN POP_ASSUM MP_TAC
3765 THEN POP_ASSUM(fun th-> REWRITE_TAC[SYM(th)] THEN ASSUME_TAC(th))
3766 THEN POP_ASSUM MP_TAC
3767 THEN REWRITE_TAC[CARD_CLAUSES]
3768 THEN REPEAT DISCH_TAC
3769 THEN MP_TAC(ARITH_RULE` 0 = CARD ({(u:real^3)}) - 1 /\  0 < CARD ({u}) <=>  1= CARD {u}`)
3770 THEN RESA_TAC
3771 THEN MP_TAC(ARITH_RULE`~(CARD (set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) > 1)==> CARD (set_of_edge v V E) <= 1`)
3772 THEN RESA_TAC
3773 THEN MP_TAC(ISPECL[`{u:real^3}`;`set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)`]CARD_SUBSET_LE)
3774 THEN ASM_SET_TAC[]);;
3775
3776 (*
3777 azim(x), x dart.
3778 *)
3779
3780
3781 let azim_fan=new_definition`azim_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (w:real^3)
3782 = if (CARD (set_of_edge v V E) > 1) then azim x v w (sigma_fan x V E v w) else &2* pi`;;
3783
3784
3785
3786 let expand_elements_by_azim_fan=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 x1:real x2:real x3:real.
3787 FAN(x,V,E)/\ {v,u} IN E /\ &0 < x1 /\ &0<= x2
3788 /\ x2 < &2 * pi
3789 /\ &0< x3 
3790 /\ x3 < pi/ &2
3791 ==>
3792 azim x v u
3793  (x +
3794   (x1 * cos (x2) * sin (x3)) % e1_fan x v u +
3795   (x1 * sin (x2) * sin (x3)) % e2_fan x v u +
3796   (x1 * cos (x3)) % e3_fan x v u) = x2`,
3797
3798 (let lem=prove(`!x v u. {x,v,u}= {x,u,v}`,SET_TAC[]) in
3799  (let lem1=prove(`!x v u. {x,v,u}= {v,x,u}`,SET_TAC[]) in
3800
3801 REPEAT STRIP_TAC
3802 THEN MP_TAC(ISPECL[`x:real^3 `;`(V:real^3->bool) `;
3803 `(E:(real^3->bool)->bool)`;` u:real^3`;` v:real^3`]remark1_fan)
3804 THEN RESA_TAC
3805 THEN FIND_ASSUM MP_TAC`~collinear {(x:real^3),(v:real^3),(u:real^3)}`
3806 THEN GEN_REWRITE_TAC( LAND_CONV  o ONCE_DEPTH_CONV)[lem1]
3807 THEN ONCE_REWRITE_TAC[COLLINEAR_3]
3808 THEN RESA_TAC
3809 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]orthonormal_e1_e2_e3_fan)
3810 THEN RESA_TAC
3811 THEN POP_ASSUM(fun th-> MP_TAC(th) THEN ASSUME_TAC(th))
3812 THEN REWRITE_TAC[orthonormal]
3813 THEN STRIP_TAC
3814 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]properties_coordinate)
3815 THEN RESA_TAC
3816 THEN MP_TAC(ISPEC`x3:real`SIN_POS_PI2)
3817 THEN RESA_TAC
3818 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`(x +
3819   (x1 * cos (x2) * sin (x3)) % e1_fan x v u +
3820   (x1 * sin (x2) * sin (x3)) % e2_fan x v u +
3821   (x1 * cos (x3)) % e3_fan (x:real^3) (v:real^3) (u:real^3))`;
3822   `((u-x) dot (e3_fan (x:real^3) (v:real^3) (u:real^3))) *inv (norm((v:real^3)-(x:real^3)))`;
3823   `(x1 * cos (x3)) * (inv (norm((v:real^3)-(x:real^3))))`;
3824 `((u-x) dot (e1_fan (x:real^3) (v:real^3) (u:real^3)))`;
3825 `x1 * sin (x3:real)`;
3826 `e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`&0`;`x2:real`]AZIM_UNIQUE)
3827 THEN DISCH_TAC
3828 THEN POP_ASSUM MATCH_MP_TAC
3829 THEN ASM_REWRITE_TAC[REAL_ARITH`&0+a=a`;]
3830 THEN STRIP_TAC
3831 THENL[
3832 MATCH_MP_TAC REAL_LT_MUL
3833 THEN REPEAT(POP_ASSUM MP_TAC)
3834 THEN REAL_ARITH_TAC;
3835
3836 STRIP_TAC
3837 THENL[
3838
3839 REWRITE_TAC[SIN_0;COS_0;VECTOR_ARITH`(A*B)%C=A%(B%C)`]
3840 THEN REDUCE_ARITH_TAC
3841 THEN REDUCE_VECTOR_TAC
3842 THEN ONCE_REWRITE_TAC[GSYM e3_fan]
3843 THEN MATCH_MP_TAC(ISPECL[`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`(u:real^3)-(x:real^3)`;`
3844 ((u - x) dot e1_fan x v u) % (e1_fan (x:real^3) (v:real^3) (u:real^3)) +
3845  ((u - x) dot e3_fan x v u) % (e3_fan x v u)`]CROSS_DOT_CANCEL)
3846 THEN ASM_REWRITE_TAC[DOT_RADD;DOT_RMUL;DOT_SYM]
3847 THEN REDUCE_ARITH_TAC
3848 THEN REWRITE_TAC[CROSS_RADD;CROSS_RMUL;CROSS_REFL]
3849 THEN REDUCE_VECTOR_TAC
3850 THEN MP_TAC(ISPECL[`e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`]ORTHONORMAL_CROSS)
3851 THEN RESA_TAC
3852 THEN ASM_REWRITE_TAC[]
3853 THEN REWRITE_TAC[e1_fan]
3854 THEN ONCE_REWRITE_TAC[CROSS_TRIPLE;e2_fan]
3855 THEN REWRITE_TAC[VECTOR_ARITH`A%(B%C)=(B*A)%C`]
3856 THEN ONCE_REWRITE_TAC[DOT_SYM]
3857 THEN ONCE_REWRITE_TAC[GSYM DOT_RMUL]
3858 THEN ONCE_REWRITE_TAC[GSYM e2_fan]
3859 THEN ASM_REWRITE_TAC[]
3860 THEN REDUCE_VECTOR_TAC
3861 THEN STRIP_TAC
3862 THEN FIND_ASSUM MP_TAC`&0<(e1_fan x v u cross e2_fan x v u) dot e3_fan (x:real^3) (v:real^3) (u:real^3)`
3863 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
3864 THEN REWRITE_TAC[DOT_RZERO]
3865 THEN REAL_ARITH_TAC;
3866 REWRITE_TAC[e3_fan]
3867 THEN VECTOR_ARITH_TAC]])));;
3868
3869
3870
3871
3872 let rw_dart_is_image_set_spherical_coordinate=prove(`(!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 h:real.
3873 FAN(x,V,E)/\ {v,u} IN E/\ &0 <h /\  h< pi/ &2
3874 ==>
3875   IMAGE (change_spherical_coordinate_fan x v u) 
3876 (r_fan (azim x v u u) (azim_fan x V E v u) h)= 
3877       rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(h))) `,
3878 (let lem=prove(`!x v u. {x,v,u}= {x,u,v}`,ASM_SET_TAC[]) in
3879 ( let lem1=prove(`!x v u. {x,v,u}= {v,x,u}`,SET_TAC[]) in
3880
3881 REWRITE_TAC[azim_fan;r_fan; rw_dart_fan; change_spherical_coordinate_fan;IMAGE;INTER;
3882 w_dart_fan;rcone_fan;EXTENSION;IN_ELIM_THM]
3883 THEN CONV_TAC(TOP_DEPTH_CONV let_CONV) 
3884 THEN REPEAT STRIP_TAC
3885 THEN MP_TAC(ISPECL[`x:real^3 `;`(V:real^3->bool) `;
3886 `(E:(real^3->bool)->bool)`;` u:real^3`;` v:real^3`]remark1_fan)
3887 THEN RESA_TAC
3888 THEN FIND_ASSUM MP_TAC`~collinear {(x:real^3),(v:real^3),(u:real^3)}`
3889 THEN GEN_REWRITE_TAC( LAND_CONV  o ONCE_DEPTH_CONV)[lem1]
3890 THEN ONCE_REWRITE_TAC[COLLINEAR_3]
3891 THEN RESA_TAC
3892 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]orthonormal_e1_e2_e3_fan)
3893 THEN RESA_TAC
3894 THEN POP_ASSUM(fun th-> MP_TAC(th) THEN ASSUME_TAC(th))
3895 THEN REWRITE_TAC[orthonormal]
3896 THEN STRIP_TAC
3897 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]properties_coordinate)
3898 THEN RESA_TAC
3899 THEN EQ_TAC
3900 THENL(*1*)[
3901 STRIP_TAC
3902 THEN MP_TAC(ISPEC`(x'':real^3)$3`SIN_POS_PI2)
3903 THEN RESA_TAC
3904 THEN ONCE_REWRITE_TAC[SET_RULE`A /\ B <=> B /\ A`]
3905 THEN STRIP_TAC
3906 THENL(*2*)[
3907
3908
3909
3910
3911 REWRITE_TAC[dist;vector_norm;VECTOR_ARITH`(A+B)-A=(B:real^3)`; DOT_LADD;DOT_RADD;DOT_RMUL;DOT_LMUL;]
3912 THEN ONCE_REWRITE_TAC[DOT_SYM]
3913 THEN ASM_REWRITE_TAC[]
3914 THEN REDUCE_ARITH_TAC
3915 THEN ONCE_REWRITE_TAC[DOT_SYM]
3916 THEN ASM_REWRITE_TAC[]
3917 THEN REDUCE_ARITH_TAC
3918 THEN REWRITE_TAC[REAL_ARITH`((x'':real^3)$1 * cos (x''$2) * sin (x''$3)) * x''$1 * cos (x''$2) * sin (x''$3) +
3919   (x''$1 * sin (x''$2) * sin (x''$3)) * x''$1 * sin (x''$2) * sin (x''$3) +
3920   (x''$1 * cos (x''$3)) * x''$1 * cos (x''$3)=(x''$1 * x''$1)* (( sin (x''$2) pow 2 +(cos (x''$2) pow 2)) * (sin (x''$3) pow 2)+ cos (x''$3) pow 2)`]
3921 THEN ASSUME_TAC(ISPEC`(x'':real^3)$2`SIN_CIRCLE)
3922 THEN ASM_REWRITE_TAC[]
3923 THEN REDUCE_ARITH_TAC
3924 THEN ASSUME_TAC(ISPEC`(x'':real^3)$3`SIN_CIRCLE)
3925 THEN ASM_REWRITE_TAC[]
3926 THEN REDUCE_ARITH_TAC
3927 THEN MP_TAC(ISPEC`(x'':real^3)$1`SQRT_POW_2)
3928 THEN MP_TAC(REAL_ARITH`(x'':real^3)$1> &0==> &0 <= (x'':real^3)$1`)
3929 THEN RESA_TAC
3930 THEN RESA_TAC
3931 THEN MP_TAC(ISPECL[`(x'':real^3)$1`;`(x'':real^3)$1`]SQRT_MUL)
3932 THEN RESA_TAC
3933 THEN REWRITE_TAC[REAL_ARITH`A*(A:real)=A pow 2`]
3934 THEN ASM_REWRITE_TAC[e3_fan;DOT_LMUL]
3935 THEN ONCE_REWRITE_TAC[GSYM vector_norm;]
3936 THEN ASSUME_TAC(ISPEC`(v:real^3)-(x:real^3)`DOT_SQUARE_NORM)
3937 THEN POP_ASSUM (fun th-> REWRITE_TAC[th])
3938 THEN REWRITE_TAC[REAL_ARITH`(A*B)*C *D pow 2=A*D*B *(C*D)`]
3939 THEN SUBGOAL_THEN`~(norm((v:real^3)-(x:real^3))= &0)` ASSUME_TAC
3940 THENL(*3*)[
3941
3942 ASM_REWRITE_TAC[NORM_EQ_0;VECTOR_ARITH`v-x=vec 0<=> x=v`];(*3*) 
3943
3944 MP_TAC(ISPEC`norm((v:real^3)-(x:real^3))`REAL_MUL_LINV)
3945 THEN RESA_TAC
3946 THEN ASM_REWRITE_TAC[]
3947 THEN REDUCE_ARITH_TAC
3948 THEN MP_TAC(ISPEC`((v:real^3)-(x:real^3))`NORM_POS_LT)
3949 THEN ASM_REWRITE_TAC[VECTOR_ARITH`v-x=vec 0<=> x=v`;REAL_ARITH`A>B<=> B<A`]
3950 THEN DISCH_TAC
3951 THEN MATCH_MP_TAC REAL_LT_LMUL
3952 THEN ASM_REWRITE_TAC[REAL_ARITH`&0 < A<=> A> &0`]
3953 THEN MATCH_MP_TAC REAL_LT_LMUL
3954 THEN ASM_REWRITE_TAC[]
3955 THEN MATCH_MP_TAC COS_MONO_LT
3956 THEN REPEAT(POP_ASSUM MP_TAC)
3957 THEN REAL_ARITH_TAC];(*2*)
3958
3959
3960
3961 SUBGOAL_THEN`azim (x:real^3) (v:real^3) (u:real^3)
3962  (x +
3963   (x''$1 * cos (x''$2) * sin (x''$3)) % e1_fan x v u +
3964   (x''$1 * sin (x''$2) * sin (x''$3)) % e2_fan x v u +
3965   (x''$1 * cos (x''$3)) % e3_fan x v u)= (x'':real^3)$2 ` ASSUME_TAC
3966 THENL(*3*)[
3967
3968 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`(x +
3969   (x''$1 * cos (x''$2) * sin (x''$3)) % e1_fan x v u +
3970   (x''$1 * sin (x''$2) * sin ((x'':real^3)$3)) % e2_fan x v u +
3971   (x''$1 * cos (x''$3)) % e3_fan (x:real^3) (v:real^3) (u:real^3))`;
3972   `((u-x) dot (e3_fan (x:real^3) (v:real^3) (u:real^3))) *inv (norm((v:real^3)-(x:real^3)))`;
3973   `(x''$1 * cos ((x'':real^3)$3)) * (inv (norm((v:real^3)-(x:real^3))))`;
3974 `((u-x) dot (e1_fan (x:real^3) (v:real^3) (u:real^3)))`;
3975 `x''$1 * sin ((x'':real^3)$3)`;
3976 `e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`&0`;`(x'':real^3)$2`]AZIM_UNIQUE)
3977 THEN DISCH_TAC
3978 THEN POP_ASSUM MATCH_MP_TAC
3979 THEN ASM_REWRITE_TAC[REAL_ARITH`&0+a=a`;]
3980 THEN STRIP_TAC
3981 THENL(*4*)[
3982
3983 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;]AZIM_REFL)
3984 THEN REPEAT(POP_ASSUM MP_TAC)
3985 THEN REAL_ARITH_TAC;(*4*)
3986
3987 STRIP_TAC
3988 THENL(*5*)[
3989
3990 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)`] azim)
3991 THEN REPEAT(POP_ASSUM MP_TAC)
3992 THEN REAL_ARITH_TAC;(*5*)
3993
3994 STRIP_TAC
3995 THENL(*6*)[
3996
3997 MATCH_MP_TAC REAL_LT_MUL
3998 THEN REPEAT(POP_ASSUM MP_TAC)
3999 THEN REAL_ARITH_TAC;(*6*)
4000
4001 STRIP_TAC
4002 THENL(*7*)[
4003
4004 REWRITE_TAC[SIN_0;COS_0;VECTOR_ARITH`(A*B)%C=A%(B%C)`]
4005 THEN REDUCE_ARITH_TAC
4006 THEN REDUCE_VECTOR_TAC
4007 THEN ONCE_REWRITE_TAC[GSYM e3_fan]
4008 THEN MATCH_MP_TAC(ISPECL[`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`(u:real^3)-(x:real^3)`;`
4009 ((u - x) dot e1_fan x v u) % (e1_fan (x:real^3) (v:real^3) (u:real^3)) +
4010  ((u - x) dot e3_fan x v u) % (e3_fan x v u)`]CROSS_DOT_CANCEL)
4011 THEN ASM_REWRITE_TAC[DOT_RADD;DOT_RMUL;DOT_SYM]
4012 THEN REDUCE_ARITH_TAC
4013 THEN REWRITE_TAC[CROSS_RADD;CROSS_RMUL;CROSS_REFL]
4014 THEN REDUCE_VECTOR_TAC
4015 THEN MP_TAC(ISPECL[`e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`]ORTHONORMAL_CROSS)
4016 THEN RESA_TAC
4017 THEN ASM_REWRITE_TAC[]
4018 THEN REWRITE_TAC[e1_fan]
4019 THEN ONCE_REWRITE_TAC[CROSS_TRIPLE;e2_fan]
4020 THEN REWRITE_TAC[VECTOR_ARITH`A%(B%C)=(B*A)%C`]
4021 THEN ONCE_REWRITE_TAC[DOT_SYM]
4022 THEN ONCE_REWRITE_TAC[GSYM DOT_RMUL]
4023 THEN ONCE_REWRITE_TAC[GSYM e2_fan]
4024 THEN ASM_REWRITE_TAC[]
4025 THEN REDUCE_VECTOR_TAC
4026 THEN STRIP_TAC
4027 THEN FIND_ASSUM MP_TAC`&0<(e1_fan x v u cross e2_fan x v u) dot e3_fan (x:real^3) (v:real^3) (u:real^3)`
4028 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
4029 THEN REWRITE_TAC[DOT_RZERO]
4030 THEN REAL_ARITH_TAC;(*7*)
4031
4032 REWRITE_TAC[e3_fan]
4033 THEN VECTOR_ARITH_TAC](*7*)](*6*)](*5*)](*4*);(*3*)
4034
4035
4036
4037
4038 SUBGOAL_THEN`~collinear
4039   {(x:real^3), (v:real^3), x +
4040          (x''$1 * cos (x''$2) * sin (x''$3)) % e1_fan x v (u:real^3) +
4041          (x''$1 * sin (x''$2) * sin ((x'':real^3)$3)) % e2_fan x v u +
4042          (x''$1 * cos (x''$3)) % e3_fan x v u}`ASSUME_TAC
4043 THENL(*4*)[
4044
4045 ONCE_REWRITE_TAC[lem]
4046 THEN REWRITE_TAC[collinear1_fan]
4047 THEN ASM_REWRITE_TAC[aff;AFFINE_HULL_2; IN_ELIM_THM; REAL_ARITH`A+B= &1<=>A= &1-B`]
4048 THEN STRIP_TAC
4049 THEN POP_ASSUM MP_TAC
4050 THEN POP_ASSUM (fun th-> REWRITE_TAC[th])
4051 THEN REWRITE_TAC[VECTOR_ARITH`A+B=(&1-c) % A+ c % D<=>B=c%(D-A)`]
4052 THEN STRIP_TAC
4053 THEN SUBGOAL_THEN`((x''$1 * cos (x''$2) * sin (x''$3)) % e1_fan x v u +
4054       (x''$1 * sin (x''$2) * sin (x''$3)) % e2_fan x v u +
4055       (x''$1 * cos ((x'':real^3)$3)) % e3_fan x v (u:real^3)) dot e1_fan x v u =
4056       ((v':real) % ((v:real^3) - (x:real^3))) dot e1_fan x v u` ASSUME_TAC
4057 THENL(*5*)[
4058 ASM_REWRITE_TAC[];(*5*)
4059
4060 POP_ASSUM MP_TAC
4061 THEN REWRITE_TAC[DOT_LADD;DOT_LMUL]
4062 THEN ASM_REWRITE_TAC[DOT_SYM]
4063 THEN REDUCE_ARITH_TAC
4064 THEN SUBGOAL_THEN`((x''$1 * cos (x''$2) * sin (x''$3)) % e1_fan x v u +
4065       (x''$1 * sin (x''$2) * sin (x''$3)) % e2_fan x v u +
4066       (x''$1 * cos ((x'':real^3)$3)) % e3_fan x v (u:real^3)) dot e2_fan x v u =
4067       ((v':real) % ((v:real^3) - (x:real^3))) dot e2_fan x v u` ASSUME_TAC
4068 THENL(*6*)[
4069 ASM_REWRITE_TAC[];(*6*)
4070
4071 POP_ASSUM MP_TAC
4072 THEN REWRITE_TAC[DOT_LADD;DOT_LMUL]
4073 THEN ASM_REWRITE_TAC[DOT_SYM]
4074 THEN REDUCE_ARITH_TAC
4075 THEN REWRITE_TAC[REAL_ENTIRE]
4076 THEN STRIP_TAC
4077 THENL(*7*)[
4078
4079 REPEAT (POP_ASSUM MP_TAC)
4080 THEN REAL_ARITH_TAC;(*7*)
4081
4082 STRIP_TAC
4083 THENL(*8*)[
4084
4085 REPEAT (POP_ASSUM MP_TAC)
4086 THEN REAL_ARITH_TAC;(*8*)
4087
4088
4089 MP_TAC(ISPEC`(x'':real^3)$2`SIN_CIRCLE)
4090 THEN ASM_REWRITE_TAC[]
4091 THEN REAL_ARITH_TAC;
4092
4093 REPEAT (POP_ASSUM MP_TAC)
4094 THEN REAL_ARITH_TAC];
4095
4096 REPEAT (POP_ASSUM MP_TAC)
4097 THEN REAL_ARITH_TAC](*7*)](*6*)](*5*);(*4*)
4098
4099
4100 REPEAT(POP_ASSUM MP_TAC)
4101 THEN DISJ_CASES_TAC(ARITH_RULE`CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))>1 
4102 \/ ~(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) >1)`)
4103 THENL(*5*)[
4104 ASM_REWRITE_TAC[]
4105 THEN REPEAT STRIP_TAC
4106 THEN REWRITE_TAC[wedge;IN_ELIM_THM]
4107 THEN ASM_REWRITE_TAC[]
4108 THEN POP_ASSUM (fun th-> REWRITE_TAC[th])
4109 THEN ASM_REWRITE_TAC[]
4110 THEN FIND_ASSUM MP_TAC`(x'':real^3)$2 > azim (x:real^3) (v:real^3) u (u:real^3)`
4111 THEN REWRITE_TAC[AZIM_REFL]
4112 THEN REAL_ARITH_TAC;(*5*)
4113
4114         
4115 ASM_REWRITE_TAC[]
4116 THEN REPEAT STRIP_TAC
4117 THEN ONCE_REWRITE_TAC[GSYM EXTENSION]
4118 THEN MP_TAC(ISPECL[`x:real^3`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;` u:real^3`]one_edge_fan)
4119 THEN RESA_TAC
4120 THEN REWRITE_TAC[DIFF;IN_ELIM_THM]
4121 THEN STRIP_TAC
4122 THENL(*6*)[
4123
4124 ASM_SET_TAC[];(*6*)
4125
4126 STRIP_TAC
4127 THEN  MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`(x:real^3) +
4128   (x''$1 * cos (x''$2) * sin ((x'':real^3)$3)) % e1_fan x (v:real^3) (u:real^3) +
4129   (x''$1 * sin (x''$2) * sin (x''$3)) % e2_fan x v u +
4130   (x''$1 * cos (x''$3)) % e3_fan x v u`]AZIM_EQ_0_GE_ALT)
4131 THEN RESA_TAC
4132 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;]AZIM_REFL)
4133 THEN REPEAT(POP_ASSUM MP_TAC)
4134 THEN REAL_ARITH_TAC](*6*)](*5*)](*4*)](*3*)](*2*);(*1*)
4135
4136
4137
4138 ONCE_REWRITE_TAC[GSYM EXTENSION]
4139 THEN DISJ_CASES_TAC(ARITH_RULE`CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool))>1 
4140 \/ ~(CARD(set_of_edge (v:real^3) (V:real^3->bool) (E:(real^3->bool)->bool)) >1)`)
4141 THENL(*2*)[
4142 ASM_REWRITE_TAC[wedge;IN_ELIM_THM]
4143 THEN STRIP_TAC
4144 THEN POP_ASSUM MP_TAC 
4145 THEN DISCH_THEN(LABEL_TAC"A")
4146 THEN EXISTS_TAC`vector[(dist((x:real^3),(x':real^3)));(azim (x:real^3) (v:real^3) (u:real^3) (x':real^3));(arcV (x:real^3) (x':real^3) (v:real^3))]:real^3`
4147 THEN ASM_REWRITE_TAC[VECTOR_3;AZIM_REFL;REAL_ARITH`A> &0 <=> &0 <A`]
4148 THEN SUBGOAL_THEN `~((x:real^3)=(x':real^3))` ASSUME_TAC
4149 THENL(*3*)[
4150
4151
4152  STRIP_TAC
4153 THEN REMOVE_THEN "A" MP_TAC
4154 THEN ASM_REWRITE_TAC[DIST_REFL;VECTOR_ARITH`A-A= vec 0`;DOT_LZERO]
4155 THEN REDUCE_ARITH_TAC
4156 THEN REAL_ARITH_TAC;(*3*)
4157
4158
4159 MP_TAC(ISPECL[`x:real^3`;`x':real^3`]DIST_EQ_0)
4160 THEN RESA_TAC
4161 THEN ASSUME_TAC(ISPECL[`x:real^3`;`x':real^3`]DIST_POS_LE)
4162 THEN MP_TAC(REAL_ARITH`~(dist((x:real^3),(x':real^3))= &0)/\ &0 <= dist((x:real^3),(x':real^3))==> &0 < dist((x:real^3),(x':real^3))`)
4163 THEN RESA_TAC
4164 THEN ASM_REWRITE_TAC[]
4165 THEN STRIP_TAC
4166 THENL(*4*)[
4167 STRIP_TAC
4168 THENL(*5*)[
4169
4170 REWRITE_TAC[ARCV_ANGLE; angle;]
4171 THEN MP_TAC(ISPECL[`((x':real^3) - (x:real^3)) `;`((v:real^3) - (x:real^3))`]VECTOR_ANGLE_RANGE)
4172 THEN STRIP_TAC
4173 THEN MP_TAC(ISPECL[`((x':real^3) - (x:real^3)) `;`((v:real^3) - (x:real^3))`]COLLINEAR_VECTOR_ANGLE)
4174 THEN ASM_REWRITE_TAC[VECTOR_ARITH`A-B= vec 0<=> B=A`;]
4175 THEN ONCE_REWRITE_TAC[GSYM COLLINEAR_3;]
4176 THEN ONCE_REWRITE_TAC[SET_RULE`{A,B,C}={B,C,A}`]
4177 THEN DISCH_TAC
4178 THEN FIND_ASSUM MP_TAC `~collinear {(x:real^3),(v:real^3),(x':real^3)}`
4179 THEN POP_ASSUM (fun th-> REWRITE_TAC[th])
4180 THEN REWRITE_TAC[DE_MORGAN_THM]
4181 THEN REPEAT(POP_ASSUM MP_TAC)
4182 THEN REAL_ARITH_TAC;(*5*)
4183
4184 MP_TAC(ISPECL[`v:real^3`;`x:real^3`]DIST_EQ_0)
4185 THEN RESA_TAC
4186 THEN ASSUME_TAC(ISPECL[`v:real^3`;`x:real^3`]DIST_POS_LE)
4187 THEN MP_TAC(REAL_ARITH`~(dist((v:real^3),(x:real^3))= &0)/\ &0 <= dist((v:real^3),(x:real^3))==> &0 < dist((v:real^3),(x:real^3))`)
4188 THEN RESA_TAC
4189 THEN MP_TAC(ISPECL[`x':real^3`;`x:real^3`]DIST_EQ_0)
4190 THEN RESA_TAC
4191 THEN ASSUME_TAC(ISPECL[`x':real^3`;`x:real^3`]DIST_POS_LE)
4192 THEN MP_TAC(REAL_ARITH`~(dist((x':real^3),(x:real^3))= &0)/\ &0 <= dist((x':real^3),(x:real^3))==> &0 < dist((x':real^3),(x:real^3))`)
4193 THEN RESA_TAC
4194 THEN MP_TAC(ISPECL[`dist ((v:real^3),(x:real^3)) * cos (h:real)`;`((x':real^3) - x) dot ((v:real^3) - (x:real^3))`; `dist((x':real^3),(x:real^3))`]REAL_LT_RDIV_EQ)
4195 THEN RESA_TAC
4196 THEN MP_TAC(ISPECL[`cos (h:real)`;`(((x':real^3) - x) dot ((v:real^3) - (x:real^3)) )/ dist ((x':real^3),(x:real^3)) `; `dist((v:real^3),(x:real^3))`]REAL_LT_RDIV_EQ)
4197 THEN ASM_REWRITE_TAC[]
4198 THEN ONCE_REWRITE_TAC[REAL_ARITH`A*B=B*A`]
4199 THEN ASM_REWRITE_TAC[]
4200 THEN ONCE_REWRITE_TAC[REAL_ARITH`(A*B)*C =C* A*B`]
4201 THEN REWRITE_TAC[REAL_ARITH`A<B <=> B>A`;]
4202 THEN ASM_REWRITE_TAC[real_div;REAL_ARITH`(A*B)*C =A*(B *C)`]
4203 THEN ONCE_REWRITE_TAC[GSYM REAL_INV_MUL;]
4204 THEN ONCE_REWRITE_TAC[GSYM real_div;]
4205 THEN REWRITE_TAC[dist;arcV]
4206 THEN STRIP_TAC
4207 THEN MP_TAC(REAL_ARITH`&0 < (h:real) /\ h< pi/ &2==> &0<= h /\ h<=pi`)
4208 THEN RESA_TAC
4209 THEN MP_TAC(ISPEC`h:real`ACS_COS)
4210 THEN RESA_TAC
4211 THEN MP_TAC(ISPECL[`cos (h:real)`;`(((x':real^3) - x) dot ((v:real^3) - (x:real^3))) / (norm (x' - x) * norm (v - x))` ;]ACS_MONO_LT)
4212 THEN RESA_TAC
4213 THEN REWRITE_TAC[REAL_ARITH`A>B<=> B<A`]
4214 THEN POP_ASSUM MATCH_MP_TAC
4215 THEN REWRITE_TAC[COS_BOUNDS]
4216 THEN ASM_REWRITE_TAC[REAL_ARITH`A<B<=> B>A`]
4217 THEN MP_TAC(ISPECL[`(x':real^3)-(x:real^3)`;`(v:real^3)-(x:real^3)`]NORM_CAUCHY_SCHWARZ_DIV)
4218 THEN MP_TAC(ISPEC`(((x':real^3)-(x:real^3)) dot ((v:real^3)-(x:real^3))) / (norm (x' - x) * norm (v - x))`REAL_ABS_LE)
4219 THEN REAL_ARITH_TAC](*5*);(*4*)
4220
4221
4222 MATCH_MP_TAC(ISPECL[`u:real^3`;`x:real^3`;`v:real^3`;`x':real^3`;`e1_fan (x:real^3) (v:real^3) (u:real^3)`;
4223 `e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`dist((x:real^3),(x':real^3))`;`arcV (x:real^3) (x':real^3) (v:real^3)`;`azim (x:real^3) (v:real^3) (u:real^3) (x':real^3)`]SPHERICAL_COORDINATES)
4224 THEN ASM_REWRITE_TAC[]
4225 THEN SUBGOAL_THEN`azim x v u (x+e1_fan (x:real^3) (v:real^3) (u:real^3))= &0` ASSUME_TAC
4226 THENL(*5*)[
4227
4228 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x + e1_fan (x:real^3) (v:real^3) (u:real^3)`;
4229   `((u-x) dot (e3_fan (x:real^3) (v:real^3) (u:real^3))) *inv (norm((v:real^3)-(x:real^3)))`;
4230   `&0`;
4231 `((u-x) dot (e1_fan (x:real^3) (v:real^3) (u:real^3)))`;`&1`;
4232 `e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`&0`;`&0`]AZIM_UNIQUE)
4233 THEN DISCH_TAC
4234 THEN POP_ASSUM MATCH_MP_TAC
4235 THEN ASM_REWRITE_TAC[REAL_ARITH`&0+a=a`;REAL_ARITH`&0<= &0/\ &0 < &1`]
4236 THEN STRIP_TAC
4237 THENL(*6*)[
4238 MP_TAC(PI_WORKS)
4239 THEN REAL_ARITH_TAC;(*6*)
4240
4241 STRIP_TAC
4242 THENL(*7*)[
4243
4244 REWRITE_TAC[SIN_0;COS_0;VECTOR_ARITH`(A*B)%C=A%(B%C)`]
4245 THEN REDUCE_ARITH_TAC
4246 THEN REDUCE_VECTOR_TAC
4247 THEN ONCE_REWRITE_TAC[GSYM e3_fan]
4248 THEN MATCH_MP_TAC(ISPECL[`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`(u:real^3)-(x:real^3)`;`
4249 ((u - x) dot e1_fan x v u) % (e1_fan (x:real^3) (v:real^3) (u:real^3)) +
4250  ((u - x) dot e3_fan x v u) % (e3_fan x v u)`]CROSS_DOT_CANCEL)
4251 THEN ASM_REWRITE_TAC[DOT_RADD;DOT_RMUL;DOT_SYM]
4252 THEN REDUCE_ARITH_TAC
4253 THEN REWRITE_TAC[CROSS_RADD;CROSS_RMUL;CROSS_REFL]
4254 THEN REDUCE_VECTOR_TAC
4255 THEN MP_TAC(ISPECL[`e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`]ORTHONORMAL_CROSS)
4256 THEN RESA_TAC
4257 THEN ASM_REWRITE_TAC[]
4258 THEN REWRITE_TAC[e1_fan]
4259 THEN ONCE_REWRITE_TAC[CROSS_TRIPLE;e2_fan]
4260 THEN REWRITE_TAC[VECTOR_ARITH`A%(B%C)=(B*A)%C`]
4261 THEN ONCE_REWRITE_TAC[DOT_SYM]
4262 THEN ONCE_REWRITE_TAC[GSYM DOT_RMUL]
4263 THEN ONCE_REWRITE_TAC[GSYM e2_fan]
4264 THEN ASM_REWRITE_TAC[]
4265 THEN REDUCE_VECTOR_TAC
4266 THEN STRIP_TAC
4267 THEN FIND_ASSUM MP_TAC`&0<(e1_fan x v u cross e2_fan x v u) dot e3_fan (x:real^3) (v:real^3) (u:real^3)`
4268 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
4269 THEN REWRITE_TAC[DOT_RZERO]
4270 THEN REAL_ARITH_TAC;(*7*)
4271
4272 REWRITE_TAC[SIN_0;COS_0]
4273 THEN REDUCE_ARITH_TAC
4274 THEN REDUCE_VECTOR_TAC
4275 THEN VECTOR_ARITH_TAC](*7*)](*6*);(*5*)
4276
4277
4278 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x + e1_fan (x:real^3) (v:real^3) (u:real^3)`]AZIM_EQ_0_ALT)
4279 THEN RESA_TAC
4280 THEN POP_ASSUM MATCH_MP_TAC
4281 THEN ONCE_REWRITE_TAC[SET_RULE`{A,B,C}={B,A,C}`]
4282 THEN ONCE_REWRITE_TAC[COLLINEAR_3]
4283 THEN REWRITE_TAC[ VECTOR_ARITH`((A:real^3)+(B:real^3))-A=B`;]
4284 THEN ONCE_REWRITE_TAC[GSYM DOT_CAUCHY_SCHWARZ_EQUAL]
4285 THEN ASM_REWRITE_TAC[REAL_ARITH`&0 pow 2= &0`;REAL_ARITH `A=B:real <=> B=A`]
4286 THEN REDUCE_ARITH_TAC
4287 THEN ASM_REWRITE_TAC[DOT_EQ_0;VECTOR_ARITH`A-B=vec 0<=> A=B:real^3`]](*5*)](*4*)](*3*);(*2*)
4288
4289
4290
4291
4292
4293
4294
4295 ASM_REWRITE_TAC[]
4296 THEN ONCE_REWRITE_TAC[GSYM EXTENSION]
4297 THEN MP_TAC(ISPECL[`x:real^3`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;` u:real^3`]one_edge_fan)
4298 THEN RESA_TAC
4299 THEN REWRITE_TAC[DIFF;IN_ELIM_THM]
4300 THEN STRIP_TAC
4301 THEN POP_ASSUM MP_TAC 
4302 THEN DISCH_THEN(LABEL_TAC"A")
4303 THEN EXISTS_TAC`vector[(dist((x:real^3),(x':real^3)));(azim (x:real^3) (v:real^3) (u:real^3) (x':real^3));(arcV (x:real^3) (x':real^3) (v:real^3))]:real^3`
4304 THEN ASM_REWRITE_TAC[VECTOR_3;AZIM_REFL;REAL_ARITH`A> &0 <=> &0 <A`]
4305 THEN SUBGOAL_THEN `~((x:real^3)=(x':real^3))` ASSUME_TAC
4306 THENL(*3*)[
4307
4308 STRIP_TAC
4309 THEN REMOVE_THEN "A" MP_TAC
4310 THEN ASM_REWRITE_TAC[DIST_REFL;VECTOR_ARITH`A-A= vec 0`;DOT_LZERO]
4311 THEN REDUCE_ARITH_TAC
4312 THEN REAL_ARITH_TAC;(*3*)
4313
4314 MP_TAC(ISPECL[`x:real^3`;`x':real^3`]DIST_EQ_0)
4315 THEN RESA_TAC
4316 THEN ASSUME_TAC(ISPECL[`x:real^3`;`x':real^3`]DIST_POS_LE)
4317 THEN MP_TAC(REAL_ARITH`~(dist((x:real^3),(x':real^3))= &0)/\ &0 <= dist((x:real^3),(x':real^3))==> &0 < dist((x:real^3),(x':real^3))`)
4318 THEN RESA_TAC
4319 THEN ASM_REWRITE_TAC[azim]
4320 THEN SUBGOAL_THEN`~collinear{(x:real^3),(v:real^3),(x':real^3)}` ASSUME_TAC
4321 THENL(*4*)[
4322
4323 POP_ASSUM (fun th-> REWRITE_TAC[])
4324 THEN POP_ASSUM (fun th-> REWRITE_TAC[])
4325 THEN POP_ASSUM (fun th-> REWRITE_TAC[])
4326 THEN POP_ASSUM (fun th-> REWRITE_TAC[])
4327 THEN POP_ASSUM (fun th-> REWRITE_TAC[])
4328 THEN POP_ASSUM MP_TAC
4329 THEN DISCH_THEN(LABEL_TAC"MA")
4330 THEN ONCE_REWRITE_TAC[lem1]
4331 THEN ASM_REWRITE_TAC[COLLINEAR_3;COLLINEAR_LEMMA;VECTOR_ARITH`v-x=vec 0<=> v=x`]
4332 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`]AFF_GE_2_1)
4333 THEN RESA_TAC
4334 THEN STRIP_TAC
4335 THENL(*5*)[
4336
4337 REMOVE_THEN "MA" MP_TAC
4338 THEN ASM_REWRITE_TAC[IN_ELIM_THM]
4339 THEN EXISTS_TAC`&1`
4340 THEN EXISTS_TAC`&0`
4341 THEN EXISTS_TAC`&0`
4342 THEN REDUCE_ARITH_TAC
4343 THEN REDUCE_VECTOR_TAC
4344 THEN REAL_ARITH_TAC;(*5*)
4345
4346 REMOVE_THEN "MA" MP_TAC
4347 THEN ASM_REWRITE_TAC[IN_ELIM_THM]
4348 THEN EXISTS_TAC`&1- (c:real)`
4349 THEN EXISTS_TAC`c:real`
4350 THEN EXISTS_TAC`&0`
4351 THEN REDUCE_ARITH_TAC
4352 THEN REDUCE_VECTOR_TAC
4353 THEN ASM_REWRITE_TAC[VECTOR_ARITH`(x':real^3)=(&1 - (c:real)) % (x:real^3)+ c % (v:real^3)<=>x'-x=c%(v-x)`]
4354 THEN REAL_ARITH_TAC](*5*);(*4*)
4355
4356
4357
4358 STRIP_TAC
4359 THENL(*5*)[
4360 STRIP_TAC
4361 THENL(*6*)[
4362
4363 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x':real^3`]AZIM_EQ_0_GE_ALT)
4364 THEN ASM_REWRITE_TAC[]
4365 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x':real^3`]azim)
4366 THEN REAL_ARITH_TAC;(*6*)
4367
4368
4369 STRIP_TAC
4370 THENL(*7*)[
4371
4372 REWRITE_TAC[ARCV_ANGLE; angle;]
4373 THEN MP_TAC(ISPECL[`((x':real^3) - (x:real^3)) `;`((v:real^3) - (x:real^3))`]VECTOR_ANGLE_RANGE)
4374 THEN STRIP_TAC
4375 THEN MP_TAC(ISPECL[`((x':real^3) - (x:real^3)) `;`((v:real^3) - (x:real^3))`]COLLINEAR_VECTOR_ANGLE)
4376 THEN ASM_REWRITE_TAC[VECTOR_ARITH`A-B= vec 0<=> B=A`;]
4377 THEN ONCE_REWRITE_TAC[GSYM COLLINEAR_3;]
4378 THEN ONCE_REWRITE_TAC[SET_RULE`{A,B,C}={B,C,A}`]
4379 THEN DISCH_TAC
4380 THEN FIND_ASSUM MP_TAC `~collinear {(x:real^3),(v:real^3),(x':real^3)}`
4381 THEN POP_ASSUM (fun th-> REWRITE_TAC[th])
4382 THEN REWRITE_TAC[DE_MORGAN_THM]
4383 THEN REPEAT(POP_ASSUM MP_TAC)
4384 THEN REAL_ARITH_TAC;(*7*)
4385
4386 MP_TAC(ISPECL[`v:real^3`;`x:real^3`]DIST_EQ_0)
4387 THEN RESA_TAC
4388 THEN ASSUME_TAC(ISPECL[`v:real^3`;`x:real^3`]DIST_POS_LE)
4389 THEN MP_TAC(REAL_ARITH`~(dist((v:real^3),(x:real^3))= &0)/\ &0 <= dist((v:real^3),(x:real^3))==> &0 < dist((v:real^3),(x:real^3))`)
4390 THEN RESA_TAC
4391 THEN MP_TAC(ISPECL[`x':real^3`;`x:real^3`]DIST_EQ_0)
4392 THEN RESA_TAC
4393 THEN ASSUME_TAC(ISPECL[`x':real^3`;`x:real^3`]DIST_POS_LE)
4394 THEN MP_TAC(REAL_ARITH`~(dist((x':real^3),(x:real^3))= &0)/\ &0 <= dist((x':real^3),(x:real^3))==> &0 < dist((x':real^3),(x:real^3))`)
4395 THEN RESA_TAC
4396 THEN MP_TAC(ISPECL[`dist ((v:real^3),(x:real^3)) * cos (h:real)`;`((x':real^3) - x) dot ((v:real^3) - (x:real^3))`; `dist((x':real^3),(x:real^3))`]REAL_LT_RDIV_EQ)
4397 THEN RESA_TAC
4398 THEN MP_TAC(ISPECL[`cos (h:real)`;`(((x':real^3) - x) dot ((v:real^3) - (x:real^3)) )/ dist ((x':real^3),(x:real^3)) `; `dist((v:real^3),(x:real^3))`]REAL_LT_RDIV_EQ)
4399 THEN ASM_REWRITE_TAC[]
4400 THEN ONCE_REWRITE_TAC[REAL_ARITH`A*B=B*A`]
4401 THEN ASM_REWRITE_TAC[]
4402 THEN ONCE_REWRITE_TAC[REAL_ARITH`(A*B)*C =C* A*B`]
4403 THEN REWRITE_TAC[REAL_ARITH`A<B <=> B>A`;]
4404 THEN ASM_REWRITE_TAC[real_div;REAL_ARITH`(A*B)*C =A*(B *C)`]
4405 THEN ONCE_REWRITE_TAC[GSYM REAL_INV_MUL;]
4406 THEN ONCE_REWRITE_TAC[GSYM real_div;]
4407 THEN REWRITE_TAC[dist;arcV]
4408 THEN STRIP_TAC
4409 THEN MP_TAC(REAL_ARITH`&0 < (h:real) /\ h< pi/ &2==> &0<= h /\ h<=pi`)
4410 THEN RESA_TAC
4411 THEN MP_TAC(ISPEC`h:real`ACS_COS)
4412 THEN RESA_TAC
4413 THEN MP_TAC(ISPECL[`cos (h:real)`;`(((x':real^3) - x) dot ((v:real^3) - (x:real^3))) / (norm (x' - x) * norm (v - x))` ;]ACS_MONO_LT)
4414 THEN RESA_TAC
4415 THEN REWRITE_TAC[REAL_ARITH`A>B<=> B<A`]
4416 THEN POP_ASSUM MATCH_MP_TAC
4417 THEN REWRITE_TAC[COS_BOUNDS]
4418 THEN ASM_REWRITE_TAC[REAL_ARITH`A<B<=> B>A`]
4419 THEN MP_TAC(ISPECL[`(x':real^3)-(x:real^3)`;`(v:real^3)-(x:real^3)`]NORM_CAUCHY_SCHWARZ_DIV)
4420 THEN MP_TAC(ISPEC`(((x':real^3)-(x:real^3)) dot ((v:real^3)-(x:real^3))) / (norm (x' - x) * norm (v - x))`REAL_ABS_LE)
4421 THEN REAL_ARITH_TAC](*7*)](*6*);(*5*)
4422
4423 MATCH_MP_TAC(ISPECL[`u:real^3`;`x:real^3`;`v:real^3`;`x':real^3`;`e1_fan (x:real^3) (v:real^3) (u:real^3)`;
4424 `e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`dist((x:real^3),(x':real^3))`;`arcV (x:real^3) (x':real^3) (v:real^3)`;`azim (x:real^3) (v:real^3) (u:real^3) (x':real^3)`]SPHERICAL_COORDINATES)
4425 THEN ASM_REWRITE_TAC[]
4426 THEN SUBGOAL_THEN`azim x v u (x+e1_fan (x:real^3) (v:real^3) (u:real^3))= &0` ASSUME_TAC
4427 THENL(*6*)[
4428
4429 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x + e1_fan (x:real^3) (v:real^3) (u:real^3)`;
4430   `((u-x) dot (e3_fan (x:real^3) (v:real^3) (u:real^3))) *inv (norm((v:real^3)-(x:real^3)))`;
4431   `&0`;
4432 `((u-x) dot (e1_fan (x:real^3) (v:real^3) (u:real^3)))`;`&1`;
4433 `e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`&0`;`&0`]AZIM_UNIQUE)
4434 THEN DISCH_TAC
4435 THEN POP_ASSUM MATCH_MP_TAC
4436 THEN ASM_REWRITE_TAC[REAL_ARITH`&0+a=a`;REAL_ARITH`&0<= &0/\ &0 < &1`]
4437 THEN STRIP_TAC
4438 THENL(*7*)[
4439 MP_TAC(PI_WORKS)
4440 THEN REAL_ARITH_TAC;(*7*)
4441
4442 STRIP_TAC
4443 THENL(*8*)[
4444
4445 REWRITE_TAC[SIN_0;COS_0;VECTOR_ARITH`(A*B)%C=A%(B%C)`]
4446 THEN REDUCE_ARITH_TAC
4447 THEN REDUCE_VECTOR_TAC
4448 THEN ONCE_REWRITE_TAC[GSYM e3_fan]
4449 THEN MATCH_MP_TAC(ISPECL[`e3_fan (x:real^3) (v:real^3) (u:real^3)`;`(u:real^3)-(x:real^3)`;`
4450 ((u - x) dot e1_fan x v u) % (e1_fan (x:real^3) (v:real^3) (u:real^3)) +
4451  ((u - x) dot e3_fan x v u) % (e3_fan x v u)`]CROSS_DOT_CANCEL)
4452 THEN ASM_REWRITE_TAC[DOT_RADD;DOT_RMUL;DOT_SYM]
4453 THEN REDUCE_ARITH_TAC
4454 THEN REWRITE_TAC[CROSS_RADD;CROSS_RMUL;CROSS_REFL]
4455 THEN REDUCE_VECTOR_TAC
4456 THEN MP_TAC(ISPECL[`e1_fan (x:real^3) (v:real^3) (u:real^3)`;`e2_fan (x:real^3) (v:real^3) (u:real^3)`;`e3_fan (x:real^3) (v:real^3) (u:real^3)`]ORTHONORMAL_CROSS)
4457 THEN RESA_TAC
4458 THEN ASM_REWRITE_TAC[]
4459 THEN REWRITE_TAC[e1_fan]
4460 THEN ONCE_REWRITE_TAC[CROSS_TRIPLE;e2_fan]
4461 THEN REWRITE_TAC[VECTOR_ARITH`A%(B%C)=(B*A)%C`]
4462 THEN ONCE_REWRITE_TAC[DOT_SYM]
4463 THEN ONCE_REWRITE_TAC[GSYM DOT_RMUL]
4464 THEN ONCE_REWRITE_TAC[GSYM e2_fan]
4465 THEN ASM_REWRITE_TAC[]
4466 THEN REDUCE_VECTOR_TAC
4467 THEN STRIP_TAC
4468 THEN FIND_ASSUM MP_TAC`&0<(e1_fan x v u cross e2_fan x v u) dot e3_fan (x:real^3) (v:real^3) (u:real^3)`
4469 THEN POP_ASSUM(fun th-> REWRITE_TAC[th])
4470 THEN REWRITE_TAC[DOT_RZERO]
4471 THEN REAL_ARITH_TAC;(*8*)
4472
4473 REWRITE_TAC[SIN_0;COS_0]
4474 THEN REDUCE_ARITH_TAC
4475 THEN REDUCE_VECTOR_TAC
4476 THEN VECTOR_ARITH_TAC](*8*)](*7*);(*6*)
4477
4478
4479 MP_TAC(ISPECL[`x:real^3`;`v:real^3`;`u:real^3`;`x + e1_fan (x:real^3) (v:real^3) (u:real^3)`]AZIM_EQ_0_ALT)
4480 THEN RESA_TAC
4481 THEN POP_ASSUM MATCH_MP_TAC
4482 THEN ONCE_REWRITE_TAC[SET_RULE`{A,B,C}={B,A,C}`]
4483 THEN ONCE_REWRITE_TAC[COLLINEAR_3]
4484 THEN REWRITE_TAC[ VECTOR_ARITH`((A:real^3)+(B:real^3))-A=B`;]
4485 THEN ONCE_REWRITE_TAC[GSYM DOT_CAUCHY_SCHWARZ_EQUAL]
4486 THEN ASM_REWRITE_TAC[REAL_ARITH`&0 pow 2= &0`;REAL_ARITH `A=B:real <=> B=A`]
4487 THEN REDUCE_ARITH_TAC
4488 THEN ASM_REWRITE_TAC[DOT_EQ_0;VECTOR_ARITH`A-B=vec 0<=> A=B:real^3`]](*6*)](*5*)](*4*)](*3*)](*2*)](*1*))));;
4489
4490
4491
4492
4493 let connected_rw_dart_fan=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 h:real.
4494 FAN(x,V,E)/\ {v,u} IN E/\ &0 <h /\  h< pi/ &2
4495 ==>connected(rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(h)))`,
4496 REPEAT STRIP_TAC
4497 THEN MP_TAC(ISPECL[`x:real^3`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool) `;`v:real^3`;
4498 ` u:real^3` ;`h:real`]rw_dart_is_image_set_spherical_coordinate)
4499 THEN RESA_TAC
4500 THEN ASM_REWRITE_TAC[]
4501 THEN ASSUME_TAC(ISPECL[`(azim (x:real^3) (v:real^3) (u:real^3) u)`; `(azim_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)) `;`h:real`] r_is_connected_fan)
4502 THEN MP_TAC(ISPECL[`change_spherical_coordinate_fan (x:real^3) (v:real^3) (u:real^3)`;`r_fan (azim x v u u) (azim_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)) (h:real)`]CONTINUOUS_ON_EQ_CONTINUOUS_AT)
4503 THEN RESA_TAC
4504 THEN MP_TAC(ISPECL[`change_spherical_coordinate_fan (x:real^3) (v:real^3) (u:real^3)`;`r_fan (azim x v u u) (azim_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)) (h:real)`] CONNECTED_CONTINUOUS_IMAGE)
4505 THEN RESA_TAC
4506 THEN POP_ASSUM MATCH_MP_TAC
4507 THEN GEN_TAC
4508 THEN STRIP_TAC
4509 THEN MP_TAC(ISPECL[`x:real^3`;`v:real^3`;
4510 `u:real^3`;`x':real^3`]continuous_change_spherical_coordinate_fan)
4511 THEN REWRITE_TAC[change_spherical_coordinate_fan]
4512 THEN CONV_TAC(TOP_DEPTH_CONV let_CONV)
4513 THEN DISCH_TAC
4514 THEN MATCH_MP_TAC CONTINUOUS_ADD
4515 THEN ASM_REWRITE_TAC[]
4516 THEN SIMP_TAC[CONTINUOUS_CONST]);;
4517
4518
4519 let not_empty_rw_dart_fan=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3.
4520 FAN(x,V,E)/\ {v,u} IN E
4521 ==> 
4522 (!h:real. &0<h /\ h< pi/ &2
4523 ==>
4524 ~(rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(h))={}))`,
4525 REPEAT STRIP_TAC
4526 THEN MRESA_TAC remark1_fan[`x:real^3 `;`(V:real^3->bool) `;`(E:(real^3->bool)->bool)`;` u:real^3`;`v:real^3`]
4527 THEN MRESA_TAC rw_dart_is_image_set_spherical_coordinate[`x:real^3`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;`u:real^3`;`h:real`]
4528 THEN POP_ASSUM MP_TAC
4529 THEN REWRITE_TAC[IMAGE_EQ_EMPTY;r_fan;EXTENSION;IN_ELIM_THM;IN;EMPTY;NOT_FORALL_THM;AZIM_REFL;azim_fan]
4530 THEN DISJ_CASES_TAC(ARITH_RULE`~(CARD (set_of_edge (v:real^3) V E) > 1)\/ CARD (set_of_edge v V E) > 1`)
4531 THENL[
4532 ASM_REWRITE_TAC[]
4533 THEN EXISTS_TAC`vector[&1; pi; h/ &2]:real^3`
4534 THEN SIMP_TAC[CART_EQ; DIMINDEX_3; FORALL_3; VEC_COMPONENT; VECTOR_3; ARITH]
4535 THEN MP_TAC PI_WORKS
4536 THEN ASM_TAC
4537 THEN REAL_ARITH_TAC;
4538
4539 ASM_REWRITE_TAC[]
4540 THEN DISJ_CASES_TAC(SET_RULE`(set_of_edge v V E = {u:real^3})\/  ~(set_of_edge v V E = {u})`)
4541 THENL[
4542 MRESA_TAC CARD_SING[`u:real^3`; `(set_of_edge v V E):real^3->bool`]
4543 THEN FIND_ASSUM MP_TAC `CARD ((set_of_edge v V E):real^3->bool) >1`
4544 THEN POP_ASSUM MP_TAC
4545 THEN POP_ASSUM (fun TH-> REWRITE_TAC[TH])
4546 THEN ARITH_TAC;
4547
4548 DISJ_CASES_TAC(REAL_ARITH `(azim (x:real^3)  (v:real^3) (u:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))= &0) \/ ~(azim (x:real^3)  (v:real^3) (u:real^3) (sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)) = &0)`)
4549 THENL[
4550 MRESA_TAC SIGMA_FAN[`(x:real^3)`;` (V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`(v:real^3)`;`(u:real^3)`]
4551 THEN MRESA_TAC UNIQUE_AZIM_0_POINT_FAN[`(x:real^3)`;` (V:real^3->bool)`;` (E:(real^3->bool)->bool)`;` (v:real^3)`;` (u:real^3)`;`(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))`]
4552 THEN MRESA_TAC remark1_fan[`x:real^3 `;`(V:real^3->bool) `;`(E:(real^3->bool)->bool)`;`(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))`;`v:real^3`];
4553
4554 MRESA_TAC azim[`(x:real^3)`;` (v:real^3)`;` (u:real^3)`;`(sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))`]
4555 THEN EXISTS_TAC`vector[&1; (azim x v u ((sigma_fan (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3))))/ &2;h/ &2]:real^3`
4556 THEN SIMP_TAC[CART_EQ; DIMINDEX_3; FORALL_3; VEC_COMPONENT; VECTOR_3; ARITH]
4557 THEN ASM_TAC
4558 THEN REAL_ARITH_TAC]]]);;
4559
4560
4561
4562 let JGIYDLE=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3.
4563 FAN(x,V,E)/\ {v,u} IN E
4564 ==> 
4565 (!h:real. &0<h /\ h< pi/ &2
4566 ==>
4567 ~(rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(h))={}))
4568 /\(!h:real h1:real. h1 <= h
4569 ==>
4570 (rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) h SUBSET rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) h1))
4571
4572 /\
4573 (?h:real.
4574 &1> h /\
4575 h> &0 /\
4576 rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) h  SUBSET yfan(x,V,E))
4577 /\
4578 (!h:real. &0 <h /\  h< pi/ &2
4579 ==> connected(rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(h))))`,
4580 MESON_TAC[not_empty_rw_dart_fan;continuous_set_fan;rw_dart_avoids_fan;connected_rw_dart_fan]);;
4581
4582
4583
4584 (****************************************************************************)
4585 (****************************LEADS INTO**************************************)
4586 (****************************************************************************)
4587
4588 let dart_leads_into=new_definition`dart_leads_into (x:real^3) (V:real^3->bool) (E:(real^3->bool)->bool) (v:real^3) (u:real^3)= 
4589 @(U:real^3->bool). ?h:real. &0<h /\
4590 (!(s:real) (y:real^3). &0 <s /\ s<h
4591 /\ y IN rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(s))
4592 ==> (rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(s)) SUBSET U /\  connected_component (yfan(x,V,E)) y=U))`;;
4593
4594
4595
4596
4597
4598
4599 let exists_leads_into_fan=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3.
4600 FAN(x,V,E)/\ {v,u} IN E
4601 ==> 
4602 ?(U:real^3->bool). ?h:real. &0<h /\
4603 (!(s:real) (y:real^3). &0 <s /\ s<h
4604 /\ y IN rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(s))
4605 ==> (rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(s)) SUBSET U /\  connected_component (yfan(x,V,E)) y=U))`,
4606 REPEAT STRIP_TAC
4607 THEN MRESA_TAC JGIYDLE[`x:real^3`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;`u:real^3`]
4608 THEN ASM_TAC
4609 THEN DISCH_TAC
4610 THEN DISCH_TAC
4611 THEN DISCH_THEN (LABEL_TAC "BE")
4612 THEN DISCH_THEN (LABEL_TAC "YEU")
4613 THEN DISCH_TAC
4614 THEN DISCH_TAC
4615 THEN DISCH_THEN (LABEL_TAC "EM")
4616 THEN DISCH_THEN (LABEL_TAC "NHIEU")
4617 THEN MP_TAC(REAL_ARITH`h> &0/\ &1>h ==> -- &1< (h:real)/\ -- &1<= (h:real) /\ h< &1 /\ &0 <h /\ h<= &1`)
4618 THEN RESA_TAC
4619 THEN MRESA1_TAC ACS_BOUNDS_LT`h:real`
4620 THEN REMOVE_ASSUM_TAC
4621 THEN MRESAL_TAC ACS_MONO_LT[`&0`;`h:real`][ACS_0;REAL_ARITH`-- &1 <= &0`]
4622 THEN MRESA1_TAC COS_ACS `h:real`
4623 THEN REMOVE_THEN "BE" (fun th-> MRESA1_TAC th `acs(h:real)`)
4624 THEN POP_ASSUM MP_TAC
4625 THEN GEN_REWRITE_TAC(LAND_CONV o ONCE_DEPTH_CONV)[EXTENSION]
4626 THEN REWRITE_TAC[EMPTY;IN;NOT_FORALL_THM]
4627 THEN STRIP_TAC
4628 THEN POP_ASSUM MP_TAC
4629 THEN GEN_REWRITE_TAC(LAND_CONV o ONCE_DEPTH_CONV)[GSYM IN]
4630 THEN STRIP_TAC
4631 THEN ONCE_REWRITE_TAC[GSYM FUN_EQ_THM]
4632 THEN EXISTS_TAC`(connected_component (yfan((x:real^3),(V:real^3->bool) ,(E:(real^3->bool)->bool))) (x':real^3)):real^3->bool`
4633 THEN EXISTS_TAC`acs(h:real)`
4634 THEN ASM_REWRITE_TAC[]
4635 THEN REPEAT GEN_TAC
4636 THEN STRIP_TAC
4637 THEN POP_ASSUM MP_TAC
4638 THEN GEN_REWRITE_TAC(LAND_CONV o ONCE_DEPTH_CONV)[GSYM IN]
4639 THEN DISCH_TAC
4640 THEN ASSUME_TAC(PI_WORKS)
4641 THEN MP_TAC(REAL_ARITH` &0< s /\ acs (h:real)< pi/ &2 /\ &0< pi ==>  &0<= (s:real)/\ acs h<= pi`)
4642 THEN RESA_TAC
4643 THEN MRESAL_TAC COS_MONO_LT[`s:real`;`acs(h:real)`][]
4644 THEN MP_TAC(REAL_ARITH` h< cos(s:real)==>h<= cos(s:real)`)
4645 THEN RESA_TAC
4646 THEN REMOVE_THEN "NHIEU"(fun th-> MRESA1_TAC th `acs(h:real)`)
4647 THEN REMOVE_THEN "YEU" (fun th-> MRESA_TAC th[`cos(s:real)`;`h:real`])
4648 THEN MRESA_TAC CONNECTED_COMPONENT_MAXIMAL [`yfan(x:real^3,(V:real^3->bool),(E:(real^3->bool)->bool))`;`rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (h:real)`;`x':real^3`]
4649 THEN STRIP_TAC
4650 THENL[
4651 POP_ASSUM MP_TAC
4652 THEN POP_ASSUM MP_TAC
4653 THEN SET_TAC[];
4654 MATCH_MP_TAC CONNECTED_COMPONENT_EQ
4655 THEN ASM_TAC
4656 THEN SET_TAC[]]);;
4657
4658
4659
4660
4661 let DART_LEADS_INTO=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3.
4662 FAN(x,V,E)/\ {v,u} IN E
4663 ==> 
4664 ?h:real. &0<h /\
4665 (!(s:real) (y:real^3). &0 <s /\ s<h
4666 /\ y IN rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(s))
4667 ==> (rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(s)) SUBSET dart_leads_into x V E v u /\  connected_component (yfan(x,V,E)) y=dart_leads_into x V E v u))`,
4668
4669 REPEAT STRIP_TAC 
4670 THEN ONCE_REWRITE_TAC[dart_leads_into]
4671 THEN MRESA_TAC exists_leads_into_fan[`x:real^3`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;` u:real^3`]
4672  THEN SELECT_ELIM_TAC 
4673 THEN EXISTS_TAC`U:real^3->bool`
4674 THEN EXISTS_TAC`h:real`
4675  THEN ASM_REWRITE_TAC[]);;
4676
4677
4678 let unique_dart_leads_into=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3 (U:real^3->bool).
4679 FAN(x,V,E)/\ {v,u} IN E
4680 /\(?h:real. &0<h /\
4681 (!(s:real) (y:real^3). &0 <s /\ s<h
4682 /\ y IN rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(s))
4683 ==> (rw_dart_fan x V E ((x:real^3),(v:real^3),(u:real^3),sigma_fan x V E v u) (cos(s)) SUBSET U /\  connected_component (yfan(x,V,E)) y=U)))
4684 ==> dart_leads_into x V E v u =U`,
4685 REPEAT STRIP_TAC 
4686 THEN POP_ASSUM MP_TAC
4687 THEN DISCH_THEN (LABEL_TAC"A")
4688 THEN MRESA_TAC DART_LEADS_INTO [`x:real^3`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;`u:real^3`]
4689 THEN POP_ASSUM MP_TAC
4690 THEN DISCH_THEN (LABEL_TAC "BE")
4691 THEN MRESA_TAC JGIYDLE[`x:real^3`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;`u:real^3`]
4692 THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC
4693 THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC
4694 THEN POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC
4695 THEN DISCH_THEN (LABEL_TAC "YEU")
4696 THEN DISCH_THEN (LABEL_TAC "EM")
4697 THEN DISCH_TAC THEN DISCH_TAC THEN DISCH_TAC
4698 THEN DISCH_THEN (LABEL_TAC "MAI")
4699 THEN ASSUME_TAC(PI_WORKS)
4700 THEN MP_TAC(REAL_ARITH`&0<h /\ &0<h' /\ &0 <pi==> 
4701 -- &1< (min (min (h:real) (h':real)/ &2) (pi/ &3))  /\
4702 -- &1<= (min (min (h:real) (h':real)/ &2) (pi/ &3))  /\
4703  (min (min (h:real) (h':real)/ &2) (pi/ &3))< pi/ &2  /\
4704  &0 <(min (min (h:real) (h':real)/ &2) (pi/ &3)) /\
4705  (min (min (h:real) (h':real)/ &2) (pi/ &3))<= pi/ &2 /\
4706  (min (min (h:real) (h':real)/ &2) (pi/ &3))< h /\
4707  (min (min (h:real) (h':real)/ &2) (pi/ &3))< h'
4708 `)
4709 THEN RESA_TAC
4710 THEN REMOVE_THEN "YEU" (fun th-> MRESA1_TAC th ` (min (min (h:real) (h':real)/ &2) (pi/ &3))`)
4711 THEN POP_ASSUM MP_TAC
4712 THEN GEN_REWRITE_TAC(LAND_CONV o ONCE_DEPTH_CONV)[EXTENSION]
4713 THEN REWRITE_TAC[EMPTY;IN;NOT_FORALL_THM]
4714 THEN STRIP_TAC
4715 THEN POP_ASSUM MP_TAC
4716 THEN GEN_REWRITE_TAC(LAND_CONV o ONCE_DEPTH_CONV)[GSYM IN]
4717 THEN STRIP_TAC
4718 THEN ONCE_REWRITE_TAC[GSYM FUN_EQ_THM]
4719 THEN REMOVE_THEN "BE" (fun th-> MRESA_TAC th[`(min ((min (h:real) (h':real))/ &2) (pi/ &3))`;`x':real^3`])
4720 THEN POP_ASSUM MP_TAC
4721 THEN REMOVE_THEN "A" (fun th-> MRESA_TAC th[`(min ((min (h:real) (h':real))/ &2) (pi/ &3))`;`x':real^3`])
4722 THEN POP_ASSUM MP_TAC
4723 THEN SET_TAC[]);;
4724
4725
4726 let dart_leads_into_fan_in_topological_component_yfan=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3.
4727 FAN(x,V,E)/\ {v,u} IN E
4728 ==> dart_leads_into x V E v u IN topological_component_yfan (x,V,E)`,
4729 REPEAT STRIP_TAC
4730 THEN MRESA_TAC not_empty_rw_dart_fan[`x:real^3`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;`u:real^3`]
4731 THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"EM")
4732 THEN MRESA_TAC DART_LEADS_INTO[`x:real^3`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;
4733 `v:real^3`;`u:real^3`;]
4734 THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"YEU")
4735 THEN MRESA_TAC rw_dart_avoids_fan[`(x:real^3)`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;`u:real^3`]
4736 THEN POP_ASSUM MP_TAC THEN DISCH_THEN(LABEL_TAC"OI")
4737 THEN MP_TAC(REAL_ARITH`&1> h' /\ h' > &0==> -- &1 < h' /\ h'< &1 /\ -- &1 <= h' /\ h'<= &1/\ &0 < h' /\ h' <= &1`) THEN RESA_TAC
4738 THEN MRESA1_TAC ACS_BOUNDS_LT`h':real`
4739 THEN MRESAL_TAC ACS_MONO_LT[`&0`;`h':real`][ACS_0;REAL_ARITH`-- &1 <= &0`]
4740 THEN MRESA1_TAC COS_ACS `h':real`
4741 THEN ABBREV_TAC`h1= min (h:real) (acs h')/ &2`
4742 THEN MP_TAC(REAL_ARITH`h1= min (h:real) (acs h')/ &2 /\ &0<h /\ &0< acs h' /\ acs h'< pi/ &2==> &0< h1 /\ h1< h /\ h1<pi/ &2/\ h1< acs h' /\ acs h' <= pi /\ &0<= h1`)
4743 THEN ASM_REWRITE_TAC[PI_WORKS] THEN STRIP_TAC
4744 THEN MRESAL_TAC COS_MONO_LT[`h1:real`;`acs h':real`][ACS_0;REAL_ARITH`-- &1 <= &0`]
4745 THEN MP_TAC(REAL_ARITH`h'< cos h1==> h'<= cos h1`) THEN RESA_TAC
4746 THEN REMOVE_THEN "EM"(fun th-> MRESAL1_TAC th `h1:real`[SET_RULE`~(A={})<=> ?y. y IN A`])
4747 THEN REMOVE_THEN "YEU"(fun th-> MRESA_TAC th [`h1:real`;`y:real^3`])
4748 THEN POP_ASSUM(fun th -> REWRITE_TAC[SYM(th);IN_ELIM_THM;topological_component_yfan;]) 
4749 THEN EXISTS_TAC`y:real^3`
4750 THEN ASM_REWRITE_TAC[]
4751 THEN MRESA_TAC continuous_set_fan[`(x:real^3)`;`(V:real^3->bool)`;`(E:(real^3->bool)->bool)`;`v:real^3`;`u:real^3`;`(cos h1:real)`;`(h':real)`]
4752 THEN ASM_TAC THEN SET_TAC[]);;
4753
4754 let in_topological_component_yfan_is_connected=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) U:real^3->bool.
4755 U IN topological_component_yfan (x,V,E)
4756 ==> connected U`,
4757 REWRITE_TAC[topological_component_yfan;IN_ELIM_THM]
4758 THEN REPEAT STRIP_TAC
4759 THEN ASM_REWRITE_TAC[CONNECTED_CONNECTED_COMPONENT]);;
4760
4761
4762 let connected_dart_leads_into_fan=prove(`!x:real^3 (V:real^3->bool) (E:(real^3->bool)->bool) v:real^3 u:real^3.
4763 FAN(x,V,E)/\ {v,u} IN E
4764 ==> connected(dart_leads_into x V E v u )`,
4765 REPEAT STRIP_TAC
4766 THEN MRESA_TAC dart_leads_into_fan_in_topological_component_yfan[`x:real^3`;`(V:real^3->bool)`;` (E:(real^3->bool)->bool)`;`v:real^3`;`u:real^3`]
4767 THEN MATCH_MP_TAC in_topological_component_yfan_is_connected
4768 THEN EXISTS_TAC`x:real^3`
4769 THEN EXISTS_TAC`V:real^3->bool`
4770 THEN EXISTS_TAC`E:(real^3->bool)->bool`
4771 THEN ASM_REWRITE_TAC[]);;
4772
4773
4774
4775 end;;